summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2016-04-25 02:51:34 -0700
committerYamaArashi <shadow962@live.com>2016-04-25 02:51:34 -0700
commit346ed7678fc0a02c1c93c066140f819789f039d9 (patch)
treefdd46f22c809c5c44fdd7fb10070fd5320078b85 /gcc
parentfa618cd10b1985bae42882f82346b646783892c6 (diff)
remove driver and cpp
Diffstat (limited to 'gcc')
-rwxr-xr-xgcc/.cvsignore95
-rwxr-xr-xgcc/INSTALL2188
-rwxr-xr-xgcc/LANGUAGES91
-rwxr-xr-xgcc/LITERATURE101
-rw-r--r--gcc/Makefile484
-rwxr-xr-xgcc/Makefile.in1773
-rwxr-xr-xgcc/NEWS1078
-rwxr-xr-xgcc/PROBLEMS117
-rwxr-xr-xgcc/PROJECTS435
-rwxr-xr-xgcc/README26
-rwxr-xr-xgcc/TESTS.FLUNK39
-rwxr-xr-xgcc/acconfig.h96
-rwxr-xr-xgcc/aclocal.m4237
-rwxr-xr-xgcc/build-make35
-rwxr-xr-xgcc/c-aux-info.c61
-rwxr-xr-xgcc/c-common.c148
-rwxr-xr-xgcc/c-decl.c146
-rwxr-xr-xgcc/c-lex.c324
-rw-r--r--gcc/c-parse.c4
-rwxr-xr-xgcc/c-pragma.c452
-rwxr-xr-xgcc/c-pragma.h100
-rwxr-xr-xgcc/c-tree.h14
-rwxr-xr-xgcc/config.guess4
-rwxr-xr-xgcc/config.in240
-rwxr-xr-xgcc/config.sub1225
-rwxr-xr-xgcc/config/arm/thumb.h14
-rwxr-xr-xgcc/configure4451
-rwxr-xr-xgcc/configure.bat21
-rwxr-xr-xgcc/configure.frag77
-rwxr-xr-xgcc/configure.in1656
-rwxr-xr-xgcc/configure.lang233
-rwxr-xr-xgcc/cpp.11
-rwxr-xr-xgcc/cpp.cps66
-rwxr-xr-xgcc/cpp.fns94
-rwxr-xr-xgcc/cpp.texi2936
-rwxr-xr-xgcc/cppalloc.c81
-rwxr-xr-xgcc/cpperror.c149
-rwxr-xr-xgcc/cppexp.c1001
-rwxr-xr-xgcc/cppfiles.c1065
-rwxr-xr-xgcc/cpphash.c200
-rwxr-xr-xgcc/cpphash.h53
-rwxr-xr-xgcc/cpplib.c5902
-rwxr-xr-xgcc/cpplib.h737
-rwxr-xr-xgcc/cppmain.c112
-rwxr-xr-xgcc/cross-make14
-rwxr-xr-xgcc/cstamp-h.in1
-rwxr-xr-xgcc/dwarf2out.c11
-rwxr-xr-xgcc/extend.texi3747
-rwxr-xr-xgcc/fixcpp109
-rwxr-xr-xgcc/flags.h16
-rwxr-xr-xgcc/gcc.14191
-rwxr-xr-xgcc/gcc.c5093
-rwxr-xr-xgcc/gcc.cps1964
-rwxr-xr-xgcc/gcc.texi4735
-rwxr-xr-xgcc/genmultilib269
-rw-r--r--gcc/ginclude/limits.h10
-rwxr-xr-xgcc/hash.h4
-rwxr-xr-xgcc/install.texi2381
-rwxr-xr-xgcc/install1.texi15
-rwxr-xr-xgcc/invoke.texi7000
-rwxr-xr-xgcc/listing227
-rwxr-xr-xgcc/mbchar.c290
-rwxr-xr-xgcc/mbchar.h41
-rwxr-xr-xgcc/md.texi4217
-rwxr-xr-xgcc/mkinstalldirs40
-rwxr-xr-xgcc/obstack.c427
-rwxr-xr-xgcc/obstack.h594
-rwxr-xr-xgcc/prefix.c317
-rwxr-xr-xgcc/prefix.h28
-rwxr-xr-xgcc/rtl.texi2946
-rwxr-xr-xgcc/splay-tree.c329
-rwxr-xr-xgcc/splay-tree.h102
-rwxr-xr-xgcc/system.h5
-rwxr-xr-xgcc/texinfo.tex5298
-rwxr-xr-xgcc/tm.texi7699
-rwxr-xr-xgcc/toplev.c77
-rwxr-xr-xgcc/varasm.c17
77 files changed, 2146 insertions, 78430 deletions
diff --git a/gcc/.cvsignore b/gcc/.cvsignore
deleted file mode 100755
index 384123b..0000000
--- a/gcc/.cvsignore
+++ /dev/null
@@ -1,95 +0,0 @@
-Makefile
-SYSCALLS.c.X
-bc-arity.h
-bc-opcode.h
-bc-opname.h
-bi-arity
-bi-opcode
-bi-opname
-bi-parser.c
-bi-parser.h
-c++
-c-parse.c
-c-parse.h
-c-parse.output
-c-parse.y
-cc1
-cc1chill
-cc1obj
-cc1plus
-cccp
-cexp.c
-cexp.output
-chill
-chill.ignore
-chill.info
-chill.install
-chill.log
-chill.plog
-chill.psum
-chill.sum
-collect2
-config.status
-cpp
-dbg.log
-deduced.h
-fix-header
-fixhdr.ready
-fixinc.ready
-fixproto.list
-fixtmp.?
-g++
-g++-cross
-g++.sum
-gcc
-gcc-cross
-gcc.sum
-gcov
-gen-protos
-genattr
-genattrtab
-gencodes
-genconfig
-genemit
-genextract
-genflags
-genopinit
-genoutput
-genpeep
-genrecog
-genrtl
-genrtl.h
-genrtl.c
-gfloat.h
-insn-attr.h
-insn-attrtab.c
-insn-codes.h
-insn-config.h
-insn-emit.c
-insn-extract.c
-insn-flags.h
-insn-opinit.c
-insn-output.c
-insn-peep.c
-insn-recog.c
-ld
-libgcc2.ready
-multilib.h
-objc-headers
-objc-parse.c
-objc-parse.output
-objc-parse.y
-patch-header
-protoize
-protoize.1
-scan-decls
-site.exp
-specs
-stamp-*
-stmp-*
-unprotoize
-unprotoize.1
-xgcc
-xlimits.h
-xsys-protos.h
-y.tab.c
diff --git a/gcc/INSTALL b/gcc/INSTALL
deleted file mode 100755
index a7c63d5..0000000
--- a/gcc/INSTALL
+++ /dev/null
@@ -1,2188 +0,0 @@
-This is Info file INSTALL, produced by Makeinfo version 1.68 from the
-input file install1.texi.
-
- 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.
-
-
-File: INSTALL, Node: Installation, Up: (dir)
-
-Installing GNU CC
-*****************
-
- Note most of this information is out of date and superceded by the
-EGCS install procedures. It is provided for historical reference only.
-
-* Menu:
-
-* Configurations:: Configurations Supported by GNU CC.
-* Other Dir:: Compiling in a separate directory (not where the source is).
-* Cross-Compiler:: Building and installing a cross-compiler.
-* Sun Install:: See below for installation on the Sun.
-* VMS Install:: See below for installation on VMS.
-* Collect2:: How `collect2' works; how it finds `ld'.
-* Header Dirs:: Understanding the standard header file directories.
-
- 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 `--host' option; the host and target will default to be
- the same as the host machine. (If you are building a
- cross-compiler, see *Note Cross-Compiler::.)
-
- Here is an example:
-
- ./configure --host=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.
-
- `--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-haifa'
- `--disable-haifa'
- Use `--enable-haifa' to enable use of an experimental
- instruction scheduler (from IBM Haifa). This may or may not
- produce better code. Some targets on which it is known to be
- a win enable it by default; use `--disable-haifa' to disable
- it in these cases. `configure' will print out whether the
- Haifa scheduler is enabled when it is run.
-
- `--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'.
-
- `--enable-checking'
- When you specify this option, the compiler is built to
- perform checking of tree node types when referencing fields
- of that node. This does not change the generated code, but
- adds error checking within the compiler. This will slow down
- the compiler and may only work properly if you are building
- the compiler with GNU C.
-
- 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 `--with-local-prefix' option below. The
- directory you specify need not exist, but its parent directory
- must exist.
-
- 5. Specify `--with-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 `--with-local-prefix' *only* if your site has a
- different convention (not `/usr/local') for where to put
- site-specific files.
-
- The default value for `--with-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 `--with-local-prefix'! The
- directory you use for `--with-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', a warning about a comparison always being zero in
- `enquire.o', and warnings about shift counts exceeding type widths
- in `cexp.y'. 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
- canonicalized form of 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.
-
- The standard C++ runtime library for GNU CC is called `libstdc++'.
- An obsolescent library `libg++' may also be available, but it's
- necessary only for older software that hasn't been converted yet;
- if you don't know whether you need `libg++' then you probably don't
- need it.
-
- Here's one way to build and install `libstdc++' 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.
-
-
-File: INSTALL, Node: Configurations, Next: Other Dir, Up: Installation
-
-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-*'
- MIPS-based DECstations can support three different personalities:
- Ultrix, DEC OSF/1, and OSF/rose. (Alpha-based DECstation products
- have a configuration name beginning with `alpha-dec'.) 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.
-
- On some versions of HP-UX, you will need to install GNU `sed'.
-
- You will need to be install GAS 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, 5.0.5, Internet FastStart 1.0, and Internet
- FastStart 1.1.
-
- GNU CC can generate COFF binaries if you specify `-mcoff' or ELF
- binaries, the default. A full `make bootstrap' is recommended
- so that an ELF compiler that builds ELF is generated.
-
- You must have TLS597 from `ftp://ftp.sco.com/TLS' installed for ELF
- C++ binaries to work correctly on releases before 5.0.4.
-
- The native SCO assembler that is provided with the OS at no charge
- is normally required. If, however, you must be able to use the GNU
- assembler (perhaps you have complex asms) you must configure this
- package `--with-gnu-as'. To do this, install (cp or symlink)
- gcc/as to your copy of the GNU assembler. You must use a recent
- version of GNU binutils; version 2.9.1 seems to work well. If you
- select this option, you will be unable to build COFF images.
- Trying to do so will result in non-obvious failures. In general,
- the "-with-gnu-as" option isn't as well tested as the native
- assembler.
-
- *NOTE:* If you are building C++, you must follow the instructions
- about invoking `make bootstrap' because the native OpenServer
- compiler may build 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*'
-`i386-sequent-ptx2*'
- You must install GNU `sed' before running `configure'.
-
-`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@cygnus.com' 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 find 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.
-
- Release 4.3.0 of AIX and ones 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 any 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.
-
-
-File: INSTALL, Node: Other Dir, Next: Cross-Compiler, Prev: Configurations, Up: Installation
-
-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.
-
-
-File: INSTALL, Node: Cross-Compiler, Next: Sun Install, Prev: Other Dir, Up: Installation
-
-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.
-
-* Menu:
-
-* Steps of Cross:: Using a cross-compiler involves several steps
- that may be carried out on different machines.
-* Configure Cross:: Configuring a cross-compiler.
-* Tools and Libraries:: Where to put the linker and assembler, and the C library.
-* Cross Headers:: Finding and installing header files
- for a cross-compiler.
-* Cross Runtime:: Supplying arithmetic runtime routines (`libgcc1.a').
-* Build Cross:: Actually compiling the cross-compiler.
-
-
-File: INSTALL, Node: Steps of Cross, Next: Configure Cross, Up: Cross-Compiler
-
-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.
-
-
-File: INSTALL, Node: Configure Cross, Next: Tools and Libraries, Prev: Steps of Cross, Up: Cross-Compiler
-
-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
-
-
-File: INSTALL, Node: Tools and Libraries, Next: Cross Headers, Prev: Configure Cross, Up: Cross-Compiler
-
-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
-
-
-File: INSTALL, Node: Cross Runtime, Next: Build Cross, Prev: Cross Headers, Up: Cross-Compiler
-
-`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'.
-
-
-File: INSTALL, Node: Cross Headers, Next: Cross Runtime, Prev: Tools and Libraries, Up: Cross-Compiler
-
-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
-
-
-File: INSTALL, Node: Build Cross, Prev: Cross Runtime, Up: Cross-Compiler
-
-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.
-
-
-File: INSTALL, Node: Sun Install, Next: VMS Install, Prev: Cross-Compiler, Up: Installation
-
-Installing GNU CC on the Sun
-============================
-
- On Solaris, do not use the linker or other tools in `/usr/ucb' to
-build GNU CC. Use `/usr/ccs/bin'.
-
- If the assembler reports `Error: misaligned data' when bootstrapping,
-you are probably using an obsolete version of the GNU assembler.
-Upgrade to the latest version of GNU `binutils', or use the Solaris
-assembler.
-
- 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.
-
-
-File: INSTALL, Node: VMS Install, Next: Collect2, Prev: Sun Install, Up: Installation
-
-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.
-
-
-File: INSTALL, Node: Collect2, Next: Header Dirs, Prev: VMS Install, Up: Installation
-
-`collect2'
-==========
-
- GNU CC uses a utility called `collect2' on nearly all systems to
-arrange to call various initialization 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'.
-
-
-File: INSTALL, Node: Header Dirs, Prev: Collect2, Up: Installation
-
-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.
-
-
-
-Tag Table:
-Node: Installation351
-Node: Configurations26618
-Node: Other Dir65739
-Node: Cross-Compiler67454
-Node: Steps of Cross69284
-Node: Configure Cross70401
-Node: Tools and Libraries71037
-Node: Cross Runtime73475
-Node: Cross Headers77555
-Node: Build Cross79553
-Node: Sun Install81428
-Node: VMS Install83099
-Node: Collect293028
-Node: Header Dirs95592
-
-End Tag Table
diff --git a/gcc/LANGUAGES b/gcc/LANGUAGES
deleted file mode 100755
index c3d4223..0000000
--- a/gcc/LANGUAGES
+++ /dev/null
@@ -1,91 +0,0 @@
-Right now there is no documentation for the GCC tree -> rtl interfaces
-(or more generally the interfaces for adding new languages).
-
-Such documentation would be of great benefit to the project. Until such
-time as we can formally start documenting the interface this file will
-serve as a repository for information on these interface and any incompatable
-changes we've made.
-
-Aug 31, 1998:
- The interface to HANDLE_PRAGMA has changed. It now takes three arguments.
- The first two are pointers to functions that should be used to read characters
- from the input stream, and to push them back into the input stream respectively.
- The third argument is a pointer to a null terminate string which is the first
- word after #pragma. The expression supplied by HANDLE_PRAGMA should return
- non-zero if it parsed and implemented the pragma. Otherwise it should return
- zero, and leave the input stream as it was before the expression was evaluated.
-
- A new back-end definable macro has been added: INSERT_ATTRIBUTES. This macro
- allows backend to add attributes to decls as they are created.
-
-Jun 10, 1998:
- The interface to lang_decode_option has changed. It now uses and argc/argv
- interface to allow for options that use more than one input string. The new
- declaration is: int lang_decode_option (int argc, char** argv). It now
- returns the number of input strings processed, or 0 if the option is
- unknown.
-
-Jun 7, 1998:
- Front-ends must now define lang_init_options. It is safe for this
- function to do nothing. See c-lang.c.
-
-Apr 21, 1998:
- Front ends which link with c-common or other files from the C/C++
- front-ends may need to handle TI types. Look for references to
- [unsigned]int_DI_type_node in your front end. If you have references
- to these variables, you'll need up update the front end.
-
- To update the front end you must mirror all the code which currently
- deals with intDI_type_node to also handle intTI_type_node.
-
-
-Apr 7, 1998:
- The interface between toplev.c and the language front ends for opening the
- source file has changed:
-
- o init_lex() has been renamed to init_parse (char *filename) where filename
- is the name of the source file.
- o The code in toplev.c which opened the source file should be moved to
- the new init_parse function.
- o toplev.c now calls finish_parse() instead of closing the source file
- using fclose(). This should now be done in finish_parse, if necessary.
-
-Apr 1, 1998:
- Front-ends must now define lang_print_xnode. It is safe for this
- function to do nothing. See c-lang.c.
-
-Feb 1, 1998:
-
- GCC used to store structure sizes & offsets to elements as bitsize
- quantities. This causes problems because a structure can only be
- (target memsize / 8) bytes long (this may effect arrays too). This
- is particularly problematical on machines with small address spaces.
-
- So:
-
- All trees that represent sizes in bits should have a TREE_TYPE of
- bitsizetype (rather than sizetype).
-
- Accordingly, when such values are computed / initialized, care has to
- be takes to use / compute the proper type.
-
- When a size in bits is converted into a size in bytes, which is expressed
- in trees, care should be taken to change the tree's type again to sizetype.
-
- We've updated C, C++, Fortran & Objective-C to work with the new
- scheme. Other languages will need to be updated accordingly.
- Contact amylaar@cygnus.com for additional information.
-
-?? 1997:
-
- In an effort to decrease cache thrashing and useless loads we've changed the
- third argument to the DEFTREECODE macro to be a single char. This will
- effect languages that defined their own tree codes (usually in a .def file).
-
- Old way:
-
- DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", "d", 0)
-
- New way:
-
- DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", 'd', 0)
diff --git a/gcc/LITERATURE b/gcc/LITERATURE
deleted file mode 100755
index 260a625..0000000
--- a/gcc/LITERATURE
+++ /dev/null
@@ -1,101 +0,0 @@
-Collected papers/sites on standards, compilers, optimization, etc.
-
-- Massively Scalar Compiler Project
-
- ftp://cs.rice.edu/public/preston/optimizer
-
-- Searchable article archive
-
- http://hypatia.dcs.qmw.ac.uk/SEL-HPC/Articles/CompilersArchive.html
-
-- David M Keaton's site
-
- http://www.dmk.com, ftp://ftp.dmk.com
- c9x stuff is in ftp://ftp.dmk.com/DMK/sc22wg14/c9x
-
-- Some information about optimizing for x86 processors, links to
- x86 manuals and documentation.
-
- http://www.goof.com/pcg/docs.html
- http://www.announce.com/agner/assem/
-
-- AMD site with optimization guide for x86
-
- http://www.amd.com/K6/k6docs/pdf/21828a.pdf
-
-- Links related to many compiler topics
-
- http://www.nullstone.com/htmls/connections.htm
-
-- HPPA information:
-
- http://www.hp.com/computing/framed/technology/micropro
-
-- New compiler book. Online appendix includes some compiler links
-
- http://www.mkp.com/books_catalog/1-55860-320-4.asp
-
-- Various MIPS stuff:
-
- http://www.sgi.com/MIPS/arch/mips4docs/mipsiv_3_2.pdf (*)
- http://www.sgi.com/MIPS/arch/MIPS16/MIPS16.whitepaper.pdf
- http://www.sgi.com/MIPS/arch/MIPS16/mips16.pdf
- http://www.sgi.com/MIPS/arch/ISA5/isa5_tech_brf.pdf
- http://www.sgi.com/MIPS/arch/ISA5/MDMXspec.pdf
- http://www.sgi.com/MIPS/arch/ISA5/MIPSVspec.pdf
-
-
-- IBM Journal of Research and Development
-
- http://www.almaden.ibm.com/journal/
-
-
-- System V PowerPC ABI
-
- http://www.esofta.com/softspecs.html
-
-- C9X draft
-
- http://www.dkuug.dk/JTC1/SC22/WG14/www/docs/n794.htm
-
-- DWARF v2 spec and sample implementation
-
- ftp://sgigate.sgi.com/pub/dwarf/
-
-
-- Various m68k info (including user guides in pdf format)
-
- http://www.mot.com/SPS/HPESD/prod/0X0
-
-
-- Modula 3 Stuff
-
- http://www.cmass.com
- http://www.cl.cam.ac.uk/m3doc/linux/cambridge.html
- ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/LOCAL_PORTS/m3-fbsd-m3cc-3.6.tar.gz
- http://www.m3.org
-
-- Comp.compilers archive
-
- http://www.iecc.com/compilers
-
-- Intel Pentium design info:
-
- http://developer.intel.com/design/litcentr/index.htm
-
-- comp.std.c++ FAQ:
-
- http://reality.sgi.com/employees/austern_mti/std-c++/faq.html
-
-- EG3 maintains a list of compiler Internet resources, including FAQ's,
-papers, hot list pages, potential software/shareware, all known companies, etc.
-
- http://www.eg3.com/ulc/compulc.htm
- http://www.eg3.com/softd/compiler.htm
- http://www.eg3.com/softdv/compiler.htm
-
- These resource pages are published as part of EG3's
- Free Electronic Engineers' Toolbox at:
-
- http://www.eg3.com/ebox.htm
-
diff --git a/gcc/Makefile b/gcc/Makefile
new file mode 100644
index 0000000..f97f677
--- /dev/null
+++ b/gcc/Makefile
@@ -0,0 +1,484 @@
+# Makefile for GNU C compiler.
+# Copyright (C) 1987, 88, 90-98, 1999 Free Software Foundation, Inc.
+
+#This file is part of GNU CC.
+
+#GNU CC is free software; you can redistribute it and/or modify
+#it under the terms of the GNU General Public License as published by
+#the Free Software Foundation; either version 2, or (at your option)
+#any later version.
+
+#GNU CC is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with GNU CC; see the file COPYING. If not, write to
+#the Free Software Foundation, 59 Temple Place - Suite 330,
+#Boston MA 02111-1307, USA.
+
+# Directory where sources are, from where we are.
+srcdir = .
+VPATH = $(srcdir)
+
+CFLAGS = -g
+
+CC = gcc
+
+out_file=$(srcdir)/config/arm/thumb.c
+out_object_file=thumb.o
+md_file=$(srcdir)/config/arm/thumb.md
+
+# End of variables for you to override.
+
+# This tells GNU Make version 3 not to put all variables in the environment.
+.NOEXPORT:
+
+HOST_RTL = rtl.o bitmap.o
+HOST_RTLANAL = rtlanal.o
+HOST_PRINT = print-rtl.o
+
+# Specify the directories to be searched for header files.
+# Both . and srcdir are used, in that order,
+# so that tm.h and config.h will be found in the compilation
+# subdirectory rather than in the source directory.
+INCLUDES = -I. -I$(srcdir) -I$(srcdir)/config -I$(srcdir)/../include
+
+# Always use -I$(srcdir)/config when compiling.
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCLUDES) $<
+
+# This tells GNU make version 3 not to export all the variables
+# defined in this file into the environment.
+.NOEXPORT:
+
+# Lists of files for various purposes.
+
+OBJS = toplev.o version.o tree.o print-tree.o stor-layout.o fold-const.o \
+ function.o stmt.o except.o expr.o calls.o expmed.o explow.o optabs.o \
+ varasm.o rtl.o print-rtl.o rtlanal.o emit-rtl.o genrtl.o real.o regmove.o \
+ dwarf2out.o bitmap.o alias.o \
+ integrate.o jump.o cse.o loop.o unroll.o flow.o stupid.o combine.o varray.o \
+ regclass.o local-alloc.o global.o reload.o reload1.o caller-save.o gcse.o \
+ insn-peep.o final.o recog.o \
+ insn-opinit.o insn-recog.o insn-extract.o insn-output.o insn-emit.o \
+ lcm.o \
+ insn-attrtab.o $(out_object_file) getpwd.o convert.o \
+ dyn-string.o splay-tree.o graph.o sbitmap.o resource.o \
+ c-parse.o c-lex.o c-decl.o c-typeck.o c-convert.o c-aux-info.o c-common.o \
+ c-iterate.o obstack.o
+
+GEN = genemit genoutput genrecog genextract genflags gencodes genconfig \
+ genpeep gengenrtl gencheck genattr
+
+# The files that "belong" in CONFIG_H are deliberately omitted
+# because having them there would not be useful in actual practice.
+# All they would do is cause complete recompilation every time
+# one of the machine description files is edited.
+# That may or may not be what one wants to do.
+# If it is, rm *.o is an easy way to do it.
+# CONFIG_H = $(host_xm_file) $(tm_file)
+CONFIG_H =
+RTL_BASE_H = rtl.h rtl.def machmode.h machmode.def
+RTL_H = $(RTL_BASE_H) genrtl.h
+TREE_H = tree.h real.h tree.def machmode.h machmode.def tree-check.h
+BASIC_BLOCK_H = basic-block.h bitmap.h sbitmap.h
+RECOG_H = recog.h
+EXPR_H = expr.h insn-codes.h
+REGS_H = regs.h varray.h machmode.h machmode.def
+
+# The only suffixes we want for implicit rules are .c and .o, so clear
+# the list and add them. This speeds up GNU Make, and allows -r to work.
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.PHONY: clean
+
+agbcc: $(OBJS)
+ $(CC) $(CFLAGS) -o $@ $(OBJS)
+
+clean:
+ $(RM) $(GEN) $(OBJS)
+
+# Compiling object files from source files.
+
+# C language specific files.
+
+# CYGNUS LOCAL: built in build directory
+c-parse.o : $(srcdir)/c-parse.c $(CONFIG_H) $(TREE_H) c-lex.h c-parse.h \
+ c-tree.h input.h flags.h system.h toplev.h
+ $(CC) $(CFLAGS) $(INCLUDES) -c $(srcdir)/c-parse.c
+
+# CYGNUS LOCAL: c-gperf.h really depends on c-parse.gperf.
+$(srcdir)/c-gperf.h:
+ gperf -L KR-C -F ', 0, 0' -p -j1 -i 1 -g -o -t -G -N is_reserved_word \
+ -k1,3,$$ $(srcdir)/c-parse.gperf >tmp-gperf.h
+ $(srcdir)/move-if-change tmp-gperf.h $(srcdir)/c-gperf.h
+
+c-decl.o : c-decl.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-lex.h flags.h \
+ output.h toplev.h
+c-typeck.o : c-typeck.c $(CONFIG_H) system.h $(TREE_H) c-tree.h flags.h \
+ output.h $(EXPR_H) $(RTL_H) toplev.h
+# CYGNUS LOCAL: built in build directory
+c-lex.o : c-lex.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) c-lex.h c-tree.h \
+ c-parse.h input.h flags.h c-gperf.h toplev.h output.h
+c-aux-info.o : c-aux-info.c $(CONFIG_H) system.h $(TREE_H) c-tree.h flags.h
+c-convert.o : c-convert.c $(CONFIG_H) system.h $(TREE_H) flags.h toplev.h
+c-iterate.o: c-iterate.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) c-tree.h \
+ flags.h toplev.h $(EXPR_H)
+graph.o: graph.c $(CONFIG_H) system.h toplev.h flags.h output.h $(RTL_H) \
+ hard-reg-set.h $(BASIC_BLOCK_H)
+sbitmap.o: sbitmap.c $(CONFIG_H) system.h $(RTL_H) flags.h $(BASIC_BLOCK_H)
+
+hash.o: hash.c hash.h system.h toplev.h
+
+splay-tree.o: splay-tree.c splay-tree.h
+
+# A file used by all variants of C.
+
+c-common.o : c-common.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-lex.h \
+ flags.h toplev.h output.h $(RTL_H)
+
+# Language-independent files.
+
+tree-check.h: s-check
+s-check : gencheck $(srcdir)/move-if-change
+ ./gencheck > tmp-check.h
+ $(srcdir)/move-if-change tmp-check.h tree-check.h
+ touch s-check
+
+gencheck : gencheck.o tree.def $(lang_tree_files)
+ $(CC) $(CFLAGS) -o $@ \
+ gencheck.o
+
+gencheck.o : gencheck.c config.h system.h
+ $(CC) -c $(CFLAGS) $(INCLUDES) $(srcdir)/gencheck.c
+
+dumpvers: dumpvers.c
+
+version.o: version.c
+obstack.o: obstack.c $(CONFIG_H)
+
+convert.o: convert.c $(CONFIG_H) $(TREE_H) flags.h convert.h toplev.h
+
+tree.o : tree.c $(CONFIG_H) system.h $(TREE_H) flags.h function.h toplev.h except.h
+print-tree.o : print-tree.c $(CONFIG_H) system.h $(TREE_H)
+stor-layout.o : stor-layout.c $(CONFIG_H) system.h $(TREE_H) flags.h \
+ function.h $(EXPR_H) $(RTL_H) toplev.h except.h
+fold-const.o : fold-const.c $(CONFIG_H) system.h $(TREE_H) flags.h toplev.h \
+ $(RTL_H)
+
+toplev.o : toplev.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) \
+ flags.h input.h insn-attr.h defaults.h output.h \
+ insn-codes.h insn-config.h $(RECOG_H) Makefile toplev.h \
+ dwarf2out.h $(EXPR_H)
+
+rtl.o : rtl.c $(CONFIG_H) system.h $(RTL_H) bitmap.h
+
+print-rtl.o : print-rtl.c $(CONFIG_H) system.h $(RTL_H) bitmap.h
+rtlanal.o : rtlanal.c $(CONFIG_H) system.h $(RTL_H)
+
+varasm.o : varasm.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) flags.h \
+ function.h defaults.h $(EXPR_H) hard-reg-set.h $(REGS_H) \
+ output.h toplev.h except.h
+function.o : function.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
+ function.h insn-flags.h insn-codes.h $(EXPR_H) $(REGS_H) hard-reg-set.h \
+ insn-config.h $(RECOG_H) output.h toplev.h except.h
+stmt.o : stmt.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h function.h \
+ insn-flags.h insn-config.h insn-codes.h hard-reg-set.h $(EXPR_H) except.h \
+ loop.h $(RECOG_H) toplev.h output.h varray.h
+except.o : except.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
+ function.h insn-flags.h $(EXPR_H) $(REGS_H) hard-reg-set.h \
+ insn-config.h $(RECOG_H) output.h except.h toplev.h
+expr.o : expr.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h function.h \
+ $(REGS_H) insn-flags.h insn-codes.h $(EXPR_H) insn-config.h $(RECOG_H) output.h \
+ typeclass.h hard-reg-set.h toplev.h hard-reg-set.h except.h
+calls.o : calls.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h $(EXPR_H) \
+ insn-flags.h $(REGS_H) toplev.h output.h
+expmed.o : expmed.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
+ insn-flags.h insn-config.h insn-codes.h $(EXPR_H) $(RECOG_H) real.h
+explow.o : explow.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
+ hard-reg-set.h insn-config.h $(EXPR_H) $(RECOG_H) insn-flags.h insn-codes.h
+optabs.o : optabs.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
+ insn-flags.h insn-config.h insn-codes.h $(EXPR_H) $(RECOG_H) reload.h
+dwarf2out.o : dwarf2out.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) dwarf2.h \
+ flags.h insn-config.h reload.h output.h defaults.h \
+ hard-reg-set.h $(REGS_H) $(EXPR_H) toplev.h dwarf2out.h dyn-string.h
+emit-rtl.o : emit-rtl.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
+ except.h function.h $(REGS_H) insn-config.h $(RECOG_H) real.h \
+ $(EXPR_H) obstack.h hard-reg-set.h bitmap.h
+real.o : real.c $(CONFIG_H) system.h $(TREE_H) toplev.h
+getpwd.o : getpwd.c $(CONFIG_H) system.h
+
+integrate.o : integrate.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
+ integrate.h insn-flags.h insn-config.h $(EXPR_H) real.h $(REGS_H) \
+ function.h output.h $(RECOG_H) except.h toplev.h
+
+jump.o : jump.c $(CONFIG_H) system.h $(RTL_H) flags.h hard-reg-set.h $(REGS_H) \
+ insn-config.h insn-flags.h $(RECOG_H) $(EXPR_H) real.h except.h \
+ toplev.h
+stupid.o : stupid.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) hard-reg-set.h \
+ $(BASIC_BLOCK_H) insn-config.h reload.h flags.h toplev.h
+
+cse.o : cse.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) hard-reg-set.h flags.h \
+ real.h insn-config.h $(RECOG_H) $(EXPR_H) toplev.h output.h
+gcse.o : gcse.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) hard-reg-set.h flags.h \
+ real.h insn-config.h $(RECOG_H) $(EXPR_H) $(BASIC_BLOCK_H) output.h
+resource.o : resource.c $(CONFIG_H) $(RTL_H) hard-reg-set.h system.h \
+ $(BASIC_BLOCK_H) $(REGS_H) flags.h output.h resource.h
+lcm.o : lcm.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) hard-reg-set.h flags.h \
+ real.h insn-config.h $(RECOG_H) $(EXPR_H) $(BASIC_BLOCK_H)
+loop.o : loop.c $(CONFIG_H) system.h $(RTL_H) flags.h loop.h insn-config.h \
+ insn-flags.h $(REGS_H) hard-reg-set.h $(RECOG_H) $(EXPR_H) real.h \
+ toplev.h varray.h
+unroll.o : unroll.c $(CONFIG_H) system.h $(RTL_H) insn-config.h \
+ integrate.h $(REGS_H) $(RECOG_H) flags.h $(EXPR_H) loop.h toplev.h varray.h
+flow.o : flow.c $(CONFIG_H) system.h $(RTL_H) flags.h insn-config.h \
+ $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h recog.h
+combine.o : combine.c $(CONFIG_H) system.h $(RTL_H) flags.h \
+ insn-config.h insn-flags.h insn-codes.h insn-attr.h $(REGS_H) $(EXPR_H) \
+ $(BASIC_BLOCK_H) $(RECOG_H) real.h hard-reg-set.h toplev.h
+regclass.o : regclass.c $(CONFIG_H) system.h $(RTL_H) hard-reg-set.h flags.h \
+ $(BASIC_BLOCK_H) $(REGS_H) insn-config.h $(RECOG_H) reload.h real.h toplev.h \
+ output.h
+local-alloc.o : local-alloc.c $(CONFIG_H) system.h $(RTL_H) flags.h \
+ $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h insn-config.h $(RECOG_H) output.h \
+ insn-attr.h toplev.h
+bitmap.o : bitmap.c $(CONFIG_H) system.h $(RTL_H) flags.h $(BASIC_BLOCK_H) \
+ $(REGS_H)
+global.o : global.c $(CONFIG_H) system.h $(RTL_H) flags.h reload.h \
+ $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h insn-config.h output.h toplev.h
+varray.o : varray.c $(CONFIG_H) system.h varray.h $(RTL_H) $(TREE_H) bitmap.h
+
+reload.o : reload.c $(CONFIG_H) system.h $(RTL_H) flags.h output.h $(EXPR_H) \
+ reload.h $(RECOG_H) hard-reg-set.h insn-config.h insn-codes.h $(REGS_H) \
+ real.h toplev.h
+reload1.o : reload1.c $(CONFIG_H) system.h $(RTL_H) real.h flags.h $(EXPR_H) \
+ reload.h $(REGS_H) hard-reg-set.h insn-config.h insn-flags.h insn-codes.h \
+ $(BASIC_BLOCK_H) $(RECOG_H) output.h toplev.h
+caller-save.o : caller-save.c $(CONFIG_H) system.h $(RTL_H) flags.h \
+ $(REGS_H) hard-reg-set.h insn-config.h $(BASIC_BLOCK_H) \
+ $(RECOG_H) reload.h $(EXPR_H) toplev.h
+alias.o : alias.c $(CONFIG_H) system.h $(RTL_H) flags.h hard-reg-set.h \
+ $(REGS_H) toplev.h output.h $(EXPR_H)
+regmove.o : regmove.c $(CONFIG_H) system.h $(RTL_H) insn-config.h \
+ $(RECOG_H) output.h reload.h $(REGS_H) hard-reg-set.h flags.h \
+ $(EXPR_H) insn-flags.h $(BASIC_BLOCK_H) toplev.h
+final.o : final.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h $(REGS_H) \
+ $(RECOG_H) conditions.h insn-config.h insn-attr.h except.h real.h output.h \
+ hard-reg-set.h insn-flags.h insn-codes.h defaults.h \
+ toplev.h reload.h dwarf2out.h
+recog.o : recog.c $(CONFIG_H) system.h $(RTL_H) \
+ $(REGS_H) $(RECOG_H) hard-reg-set.h flags.h insn-config.h insn-attr.h \
+ insn-flags.h insn-codes.h real.h toplev.h
+dyn-string.o: dyn-string.c dyn-string.h $(CONFIG_H) system.h
+
+$(out_object_file): $(out_file) $(CONFIG_H) $(TREE_H) \
+ $(RTL_H) $(REGS_H) hard-reg-set.h real.h insn-config.h conditions.h \
+ insn-flags.h output.h insn-attr.h insn-codes.h system.h toplev.h
+ $(CC) -c $(CFLAGS) $(INCLUDES) $(out_file)
+
+# Generate header and source files from the machine description,
+# and compile them.
+
+.PRECIOUS: insn-config.h insn-flags.h insn-codes.h \
+ insn-emit.c insn-recog.c insn-extract.c insn-output.c insn-peep.c \
+ insn-attr.h insn-attrtab.c
+
+# The following pair of rules has this effect:
+# genconfig is run only if the md has changed since genconfig was last run;
+# but the file insn-config.h is touched only when its contents actually change.
+
+# Each of the other insn-* files is handled by a similar pair of rules.
+
+# This causes an anomaly in the results of make -n
+# because insn-* is older than s-*
+# and thus make -n thinks that insn-* will be updated
+# and force recompilation of things that depend on it.
+# We use move-if-change precisely to avoid such recompilation.
+# But there is no way to teach make -n that it will be avoided.
+
+insn-config.h: s-config
+s-config : $(md_file) genconfig $(srcdir)/move-if-change
+ ./genconfig $(md_file) > tmp-config.h
+ $(srcdir)/move-if-change tmp-config.h insn-config.h
+ touch s-config
+
+insn-flags.h: s-flags
+s-flags : $(md_file) genflags $(srcdir)/move-if-change
+ ./genflags $(md_file) > tmp-flags.h
+ $(srcdir)/move-if-change tmp-flags.h insn-flags.h
+ touch s-flags
+
+insn-codes.h: s-codes
+s-codes : $(md_file) gencodes $(srcdir)/move-if-change
+ ./gencodes $(md_file) > tmp-codes.h
+ $(srcdir)/move-if-change tmp-codes.h insn-codes.h
+ touch s-codes
+
+insn-emit.o : insn-emit.c $(CONFIG_H) $(RTL_H) $(EXPR_H) real.h output.h \
+ insn-config.h insn-flags.h insn-codes.h system.h reload.h recog.h
+ $(CC) $(CFLAGS) $(INCLUDES) -c insn-emit.c
+
+insn-emit.c: s-emit
+s-emit : $(md_file) genemit $(srcdir)/move-if-change
+ ./genemit $(md_file) > tmp-emit.c
+ $(srcdir)/move-if-change tmp-emit.c insn-emit.c
+ touch s-emit
+
+insn-recog.o : insn-recog.c $(CONFIG_H) $(RTL_H) insn-config.h $(RECOG_H) \
+ real.h output.h flags.h system.h
+ $(CC) $(CFLAGS) $(INCLUDES) -c insn-recog.c
+
+insn-recog.c: s-recog
+s-recog : $(md_file) genrecog $(srcdir)/move-if-change
+ ./genrecog $(md_file) > tmp-recog.c
+ $(srcdir)/move-if-change tmp-recog.c insn-recog.c
+ touch s-recog
+
+insn-opinit.o : insn-opinit.c $(CONFIG_H) $(RTL_H) insn-codes.h insn-flags.h \
+ insn-config.h flags.h $(RECOG_H) $(EXPR_H) reload.h system.h
+ $(CC) $(CFLAGS) $(INCLUDES) -c insn-opinit.c
+
+insn-opinit.c: s-opinit
+s-opinit : $(md_file) genopinit $(srcdir)/move-if-change
+ ./genopinit $(md_file) > tmp-opinit.c
+ $(srcdir)/move-if-change tmp-opinit.c insn-opinit.c
+ touch s-opinit
+
+insn-extract.o : insn-extract.c $(CONFIG_H) $(RTL_H) system.h toplev.h \
+ insn-config.h recog.h
+ $(CC) $(CFLAGS) $(INCLUDES) -c insn-extract.c
+
+insn-extract.c: s-extract
+s-extract : $(md_file) genextract $(srcdir)/move-if-change
+ ./genextract $(md_file) > tmp-extract.c
+ $(srcdir)/move-if-change tmp-extract.c insn-extract.c
+ touch s-extract
+
+insn-peep.o : insn-peep.c $(CONFIG_H) $(RTL_H) $(REGS_H) output.h real.h \
+ system.h insn-config.h recog.h
+ $(CC) $(CFLAGS) $(INCLUDES) -c insn-peep.c
+
+insn-peep.c: s-peep
+s-peep : $(md_file) genpeep $(srcdir)/move-if-change
+ ./genpeep $(md_file) > tmp-peep.c
+ $(srcdir)/move-if-change tmp-peep.c insn-peep.c
+ touch s-peep
+
+insn-attrtab.o : insn-attrtab.c $(CONFIG_H) $(RTL_H) $(REGS_H) real.h \
+ output.h insn-attr.h insn-config.h system.h toplev.h
+ $(CC) $(CFLAGS) $(INCLUDES) -c insn-attrtab.c
+
+insn-attr.h: s-attr
+s-attr : $(md_file) genattr $(srcdir)/move-if-change
+ ./genattr $(md_file) > tmp-attr.h
+ $(srcdir)/move-if-change tmp-attr.h insn-attr.h
+ touch s-attr
+
+insn-attrtab.c: s-attrtab
+s-attrtab : $(md_file) genattrtab $(srcdir)/move-if-change
+ ./genattrtab $(md_file) > tmp-attrtab.c;
+ $(srcdir)/move-if-change tmp-attrtab.c insn-attrtab.c
+ touch s-attrtab
+
+insn-output.o : insn-output.c $(CONFIG_H) $(RTL_H) $(REGS_H) real.h conditions.h \
+ hard-reg-set.h insn-config.h insn-flags.h insn-attr.h output.h $(RECOG_H) \
+ insn-codes.h system.h
+ $(CC) $(CFLAGS) $(INCLUDES) -c insn-output.c
+
+insn-output.c: s-output
+s-output : $(md_file) genoutput $(srcdir)/move-if-change
+ ./genoutput $(md_file) > tmp-output.c
+ $(srcdir)/move-if-change tmp-output.c insn-output.c
+ touch s-output
+
+genrtl.o : genrtl.c $(CONFIG_H) $(RTL_H) system.h
+genrtl.c genrtl.h : s-genrtl
+ @true # force gnu make to recheck modification times.
+
+s-genrtl: gengenrtl $(srcdir)/move-if-change $(RTL_BASE_H)
+ ./gengenrtl tmp-genrtl.h tmp-genrtl.c
+ $(srcdir)/move-if-change tmp-genrtl.h genrtl.h
+ $(srcdir)/move-if-change tmp-genrtl.c genrtl.c
+ touch s-genrtl
+
+# Compile the programs that generate insn-* from the machine description.
+
+# $(CONFIG_H) is omitted from the deps of the gen*.o
+# because these programs don't really depend on anything
+# about the target machine. They do depend on config.h itself,
+# since that describes the host machine.
+
+genconfig : genconfig.o $(HOST_RTL) $(HOST_PRINT)
+ $(CC) $(CFLAGS) -o $@ \
+ genconfig.o $(HOST_RTL) $(HOST_PRINT)
+
+genconfig.o : genconfig.c $(RTL_H) config.h system.h
+
+genflags : genflags.o $(HOST_RTL) $(HOST_PRINT)
+ $(CC) $(CFLAGS) -o $@ \
+ genflags.o $(HOST_RTL) $(HOST_PRINT)
+
+genflags.o : genflags.c $(RTL_H) config.h system.h
+
+gencodes : gencodes.o $(HOST_RTL) $(HOST_PRINT)
+ $(CC) $(CFLAGS) -o $@ \
+ gencodes.o $(HOST_RTL) $(HOST_PRINT)
+
+gencodes.o : gencodes.c $(RTL_H) config.h system.h
+
+genemit : genemit.o $(HOST_RTL) $(HOST_PRINT)
+ $(CC) $(CFLAGS) -o $@ \
+ genemit.o $(HOST_RTL) $(HOST_PRINT)
+
+genemit.o : genemit.c $(RTL_H) config.h system.h
+
+genopinit : genopinit.o $(HOST_RTL) $(HOST_PRINT)
+ $(CC) $(CFLAGS) -o $@ \
+ genopinit.o $(HOST_RTL) $(HOST_PRINT)
+
+genopinit.o : genopinit.c $(RTL_H) config.h system.h
+
+genrecog : genrecog.o $(HOST_RTL) $(HOST_PRINT)
+ $(CC) $(CFLAGS) -o $@ \
+ genrecog.o $(HOST_RTL) $(HOST_PRINT)
+
+genrecog.o : genrecog.c $(RTL_H) config.h system.h
+
+genextract : genextract.o $(HOST_RTL) $(HOST_PRINT)
+ $(CC) $(CFLAGS) -o $@ \
+ genextract.o $(HOST_RTL) $(HOST_PRINT)
+
+genextract.o : genextract.c $(RTL_H) config.h system.h insn-config.h
+
+genpeep : genpeep.o $(HOST_RTL) $(HOST_PRINT)
+ $(CC) $(CFLAGS) -o $@ \
+ genpeep.o $(HOST_RTL) $(HOST_PRINT)
+
+genpeep.o : genpeep.c $(RTL_H) config.h system.h
+
+genattr : genattr.o $(HOST_RTL) $(HOST_PRINT)
+ $(CC) $(CFLAGS) -o $@ \
+ genattr.o $(HOST_RTL) $(HOST_PRINT)
+
+genattr.o : genattr.c $(RTL_H) config.h system.h
+
+genattrtab : genattrtab.o $(HOST_RTL) $(HOST_PRINT) $(HOST_RTLANAL)
+ $(CC) $(CFLAGS) -o $@ \
+ genattrtab.o $(HOST_RTL) $(HOST_PRINT) $(HOST_RTLANAL)
+
+genattrtab.o : genattrtab.c $(RTL_H) config.h system.h insn-config.h
+
+genoutput : genoutput.o $(HOST_RTL) $(HOST_PRINT)
+ $(CC) $(CFLAGS) -o $@ \
+ genoutput.o $(HOST_RTL) $(HOST_PRINT)
+
+genoutput.o : genoutput.c $(RTL_H) config.h system.h
+
+gengenrtl : gengenrtl.o
+ $(CC) $(CFLAGS) -o $@ \
+ gengenrtl.o
+
+gengenrtl.o : gengenrtl.c $(RTL_BASE_H) system.h
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
deleted file mode 100755
index 1d6b8d9..0000000
--- a/gcc/Makefile.in
+++ /dev/null
@@ -1,1773 +0,0 @@
-# Makefile for GNU C compiler.
-# Copyright (C) 1987, 88, 90-98, 1999 Free Software Foundation, Inc.
-
-#This file is part of GNU CC.
-
-#GNU CC is free software; you can redistribute it and/or modify
-#it under the terms of the GNU General Public License as published by
-#the Free Software Foundation; either version 2, or (at your option)
-#any later version.
-
-#GNU CC is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-#GNU General Public License for more details.
-
-#You should have received a copy of the GNU General Public License
-#along with GNU CC; see the file COPYING. If not, write to
-#the Free Software Foundation, 59 Temple Place - Suite 330,
-#Boston MA 02111-1307, USA.
-
-# The targets for external use include:
-# all, doc, install, install-cross, install-cross-rest,
-# uninstall, TAGS, mostlyclean, clean, distclean, maintainer-clean,
-# stage1, stage2, stage3, stage4.
-
-# Suppress smart makes who think they know how to automake Yacc files
-.y.c:
-
-# Directory where sources are, from where we are.
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-# Variables that exist for you to override.
-# See below for how to change them for certain systems.
-
-# List of language subdirectories.
-# This is overridden by configure.
-SUBDIRS =@subdirs@
-
-# Selection of languages to be made.
-# This is overridden by configure.
-CONFIG_LANGUAGES = @all_languages@
-LANGUAGES = c $(CONFIG_LANGUAGES)
-
-# Selection of languages to be made during stage1 build.
-# This is overridden by configure.
-BOOT_LANGUAGES = c @all_boot_languages@
-
-ALLOCA =
-ALLOCA_FLAGS =
-ALLOCA_FINISH = true
-
-# Various ways of specifying flags for compilations:
-# CFLAGS is for the user to override to, e.g., do a bootstrap with -O2.
-# BOOT_CFLAGS is the value of CFLAGS to pass
-# to the stage2 and stage3 compilations
-# WARN_CFLAGS are the warning flags to pass to stage2 and stage3.
-# (And for stage 1 if the native compiler is GCC.) It is
-# separate from BOOT_CFLAGS because people tend to override optimization
-# flags and we'd like them to still have warnings turned on. They are free
-# to explicitly turn warnings off if they wish.
-# XCFLAGS is used for most compilations but not when using the GCC just built.
-# TCFLAGS is used for compilations with the GCC just built.
-XCFLAGS =
-TCFLAGS =
-# CYGNUS LOCAL nowarnings/law
-CFLAGS = -g
-BOOT_CFLAGS = -O2 $(CFLAGS)
-WARN_CFLAGS =
-# END CYGNUS LOCAL
-# These exists to be overridden by the x-* and t-* files, respectively.
-X_CFLAGS =
-T_CFLAGS =
-
-X_CPPFLAGS =
-T_CPPFLAGS =
-
-CC = @CC@
-# srcdir might be a relative pathname which won't be valid in a subdirectory,
-# so we must use objdir/srcdir instead to make it safe. objdir is always
-# a full pathname.
-BISON = `if [ -f $(objdir)/../bison/bison ] ; then case $(srcdir) in \
- /*) echo $(objdir)/../bison/bison -L $(srcdir)/../bison/ ;; \
- *) echo $(objdir)/../bison/bison -L $(objdir)/$(srcdir)/../bison/ ;; \
- esac; else echo bison ; fi`
-BISONFLAGS =
-LEX = `if [ -f $(objdir)/../flex/flex ] ; then echo $(objdir)/../flex/flex ; else echo flex ; fi`
-LEXFLAGS =
-AR = ar
-AR_FLAGS = rc
-LN = @symbolic_link@
-DLLTOOL = dlltool
-SHELL = /bin/sh
-# on sysV, define this as cp.
-INSTALL = @INSTALL@
-# Some systems may be missing symbolic links, regular links, or both.
-# Allow configure to check this and use "ln -s", "ln", or "cp" as appropriate.
-LN=@LN@
-LN_S=@LN_S@
-# These permit overriding just for certain files.
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-MAKEINFO = makeinfo
-MAKEINFOFLAGS =
-TEXI2DVI = texi2dvi
-# For GNUmake: let us decide what gets passed to recursive makes.
-MAKEOVERRIDES =
-@SET_MAKE@
-
-# Define this as & to perform parallel make on a Sequent.
-# Note that this has some bugs, and it seems currently necessary
-# to compile all the gen* files first by hand to avoid erroneous results.
-P =
-
-# How to invoke ranlib.
-RANLIB = ranlib
-# Test to use to see whether ranlib exists on the system.
-RANLIB_TEST = \
- [ -f $(RANLIB) ] \
- || ( [ "$(host_canonical)" = "$(target)" ] \
- && [ -f /usr/bin/ranlib -o -f /bin/ranlib ] )
-
-# Compiler to use for compiling libgcc1.a.
-# OLDCC should not be the GNU C compiler,
-# since that would compile typical libgcc1.a functions such as mulsi3
-# into infinite recursions.
-OLDCC = cc
-
-# CFLAGS for use with OLDCC, for compiling libgcc1.a.
-# NOTE: -O does not work on some Unix systems!
-CCLIBFLAGS = -O
-
-# Version of ar to use when compiling libgcc1.a.
-OLDAR = ar
-OLDAR_FLAGS = qc
-
-# Target to use when installing include directory. Either
-# install-headers-tar or install-headers-cpio.
-INSTALL_HEADERS_DIR = @build_install_headers_dir@
-
-# Header files that are made available under the same name
-# to programs compiled with GCC.
-USER_H = $(srcdir)/ginclude/stdarg.h $(srcdir)/ginclude/stddef.h \
- $(srcdir)/ginclude/iso646.h $(srcdir)/ginclude/stdbool.h \
- $(srcdir)/ginclude/limits.h $(srcdir)/ginclude/float.h
-
-# The GCC to use for compiling libgcc2.a, and libgcc1-test.
-# Usually the one we just built.
-# Don't use this as a dependency--use $(GCC_PASSES) or $(GCC_PARTS).
-GCC_FOR_TARGET = ./xgcc -B./ -B$(build_tooldir)/bin/
-
-# This is used instead of ALL_CFLAGS when compiling with GCC_FOR_TARGET.
-# It omits XCFLAGS, and specifies -B./.
-# It also specifies -I./include to find, e.g., stddef.h.
-GCC_CFLAGS=$(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) -I./include $(TCFLAGS)
-
-# Sed command to transform gcc to installed name. Overwritten by configure.
-program_transform_name = @program_transform_name@
-program_transform_cross_name = s,^,$(target_alias)-,
-
-build_canonical = @build_canonical@
-host_canonical = @host_canonical@
-
-# Tools to use when building a cross-compiler.
-# These are used because `configure' appends `cross-make'
-# to the makefile when making a cross-compiler.
-
-# Use the tools from the build tree, if they are available.
-
-# objdir is set by configure.
-objdir = @objdir@
-
-AR_FOR_TARGET = ` \
- if [ -f $(objdir)/../binutils/ar ] ; then \
- echo $(objdir)/../binutils/ar ; \
- else \
- if [ "$(host_canonical)" = "$(target)" ] ; then \
- echo ar; \
- else \
- t='$(program_transform_name)'; echo ar | sed -e $$t ; \
- fi; \
- fi`
-AR_FLAGS_FOR_TARGET = rc
-RANLIB_FOR_TARGET = ` \
- if [ -f $(objdir)/../binutils/ranlib ] ; then \
- echo $(objdir)/../binutils/ranlib ; \
- else \
- if [ "$(host_canonical)" = "$(target)" ] ; then \
- echo ranlib; \
- else \
- t='$(program_transform_name)'; echo ranlib | sed -e $$t ; \
- fi; \
- fi`
-RANLIB_TEST_FOR_TARGET = \
- [ -f $(RANLIB_FOR_TARGET) ] \
- || ( [ "$(host_canonical)" = "$(target)" ] \
- && [ -f /usr/bin/ranlib -o -f /bin/ranlib ] )
-
-# Dir to search for system headers. Overridden by cross-make.
-SYSTEM_HEADER_DIR = /usr/include
-
-# There may be a premade insn-attrtab.c for this machine.
-# (You could rebuild it with genattrtab as usual, but it takes a long time.)
-# PREMADE_ATTRTAB is the file name of the file to use.
-# PREMADE_ATTRTAB_MD is the md file it corresponds to.
-PREMADE_ATTRTAB_MD = Makefile # Guaranteed not to cmp equal to md.
-PREMADE_ATTRTAB =
-
-target=@target@
-target_alias=@target_alias@
-xmake_file=@dep_host_xmake_file@
-tmake_file=@dep_tmake_file@
-out_file=$(srcdir)/config/@out_file@
-out_object_file=@out_object_file@
-md_file=$(srcdir)/config/@md_file@
-tm_file=@tm_file_list@
-build_xm_file=@build_xm_file_list@
-host_xm_file=@host_xm_file_list@
-lang_specs_files=@lang_specs_files@
-lang_options_files=@lang_options_files@
-lang_tree_files=@lang_tree_files@
-GCC_THREAD_FILE=@thread_file@
-OBJC_BOEHM_GC=@objc_boehm_gc@
-JAVAGC=@JAVAGC@
-GTHREAD_FLAGS=@gthread_flags@
-# Be prepared for gcc2 merges.
-gcc_version=@gcc_version@
-gcc_version_trigger=@gcc_version_trigger@
-version=$(gcc_version)
-mainversion=`sed -e 's/.*\"\([0-9]*\.[0-9]*\).*/\1/' < $(srcdir)/version.c`
-
-# Common prefix for installation directories.
-# NOTE: This directory must exist when you start installation.
-prefix = @prefix@
-# Directory in which to put localized header files. On the systems with
-# gcc as the native cc, `local_prefix' may not be `prefix' which is
-# `/usr'.
-# NOTE: local_prefix *should not* default from prefix.
-local_prefix = @local_prefix@
-# Directory in which to put host dependent programs and libraries
-exec_prefix = @exec_prefix@
-# Directory in which to put the executable for the command `gcc'
-bindir = @bindir@
-# Directory in which to put the directories used by the compiler.
-libdir = @libdir@
-# Directory in which the compiler finds executables, libraries, etc.
-libsubdir = $(libdir)/gcc-lib/$(target_alias)/$(version)
-# Used to produce a relative $(gcc_tooldir) in gcc.o
-unlibsubdir = ../../..
-# Directory in which to find other cross-compilation tools and headers.
-dollar = @dollar@
-# Used in install-cross.
-gcc_tooldir = @gcc_tooldir@
-# Since tooldir does not exist at build-time, use -B$(build_tooldir)/bin/
-build_tooldir = $(exec_prefix)/$(target_alias)
-# Directory in which the compiler finds g++ includes.
-gcc_gxx_include_dir= @gcc_gxx_include_dir@
-# Directory to search for site-specific includes.
-includedir = $(local_prefix)/include
-# Extension (if any) to put in installed man-page filename.
-manext = .1
-objext = .o
-exeext = @host_exeext@
-build_exeext = @build_exeext@
-
-# Directory in which to put man pages.
-mandir = @mandir@
-man1dir = $(mandir)/man1
-# Dir for temp files.
-tmpdir = /tmp
-
-# CYGNUS LOCAL texinfo
-# Directory where texinfo.tex lives
-texidir = $(srcdir)/../texinfo
-# END CYGNUS LOCAL
-
-# Additional system libraries to link with.
-CLIB=
-
-# Change this to a null string if obstacks are installed in the
-# system library.
-OBSTACK=obstack.o
-
-# Specify the rule for actually making libgcc.a,
-LIBGCC = libgcc.a
-# and the rule for installing it.
-INSTALL_LIBGCC = install-libgcc
-
-# Specify the rule for actually making libgcc1.a.
-# The value may be empty; that means to do absolutely nothing
-# with or for libgcc1.a.
-LIBGCC1 = libgcc1.a
-
-# Specify the rule for making libgcc1.a for a cross-compiler.
-# The default rule assumes that libgcc1.a is supplied by the user.
-CROSS_LIBGCC1 = libgcc1.cross
-
-# Specify the rule for actually making libgcc2.a.
-LIBGCC2 = libgcc2.a
-
-# Options to use when compiling libgcc2.a.
-# -g1 causes output of debug info only for file-scope entities.
-# we use this here because that should be enough, and also
-# so that -g1 will be tested.
-#
-LIBGCC2_DEBUG_CFLAGS = -g1
-LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) $(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS) -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED @inhibit_libc@
-
-# Additional options to use when compiling libgcc2.a.
-# Some targets override this to -Iinclude
-LIBGCC2_INCLUDES =
-
-# Additional target-dependent options for compiling libgcc2.a.
-TARGET_LIBGCC2_CFLAGS =
-
-# Things which must be built before building libgcc2.a.
-# Some targets override this to stmp-int-hdrs
-LIBGCC2_DEPS =
-
-# libgcc1-test target (must also be overridable for a target)
-LIBGCC1_TEST = libgcc1-test
-
-# List of extra C and assembler files to add to libgcc1.a.
-# Assembler files should have names ending in `.asm'.
-LIB1FUNCS_EXTRA =
-
-# List of extra C and assembler files to add to libgcc2.a.
-# Assembler files should have names ending in `.asm'.
-LIB2FUNCS_EXTRA =
-
-# Program to convert libraries.
-LIBCONVERT =
-
-# Control whether header files are installed.
-INSTALL_HEADERS=install-headers
-
-# Options for tar when copying trees. So HPUX can override it.
-TAROUTOPTS = xpBf
-
-# A list of all the language-specific executables.
-# This is overridden by configure.
-COMPILERS = cc1$(exeext) @all_compilers@
-
-# List of things which should already be built whenever we try to use xgcc
-# to compile anything (without linking).
-GCC_PASSES=xgcc$(exeext) cc1$(exeext) cpp$(exeext)
-
-# List of things which should already be built whenever we try to use xgcc
-# to link anything.
-GCC_PARTS=$(GCC_PASSES) $(LIBGCC)
-
-# Directory to link to, when using the target `maketest'.
-DIR = ../gcc
-
-# Guaranteed to not exist when not passing md through cpp.
-# This value is overridden directly by configure.
-MD_FILE = md-cpp-not-used
-
-# Flags to use when cross-building GCC.
-# Prefix to apply to names of object files when using them
-# to run on the machine we are compiling on.
-HOST_PREFIX=
-# Prefix to apply to names of object files when compiling them
-# to run on the machine we are compiling on.
-# The default for this variable is chosen to keep these rules
-# out of the way of the other rules for compiling the same source files.
-HOST_PREFIX_1=loser-
-HOST_CC=$(CC)
-HOST_CFLAGS=$(ALL_CFLAGS)
-HOST_CLIB=$(CLIB)
-HOST_LDFLAGS=$(LDFLAGS)
-HOST_CPPFLAGS=$(ALL_CPPFLAGS)
-
-# Actual name to use when installing a native compiler.
-GCC_INSTALL_NAME = `t='$(program_transform_name)'; echo gcc | sed -e $$t`
-
-# Actual name to use when installing a cross-compiler.
-GCC_CROSS_NAME = `t='$(program_transform_cross_name)'; echo gcc | sed -e $$t`
-
-# Choose the real install target.
-INSTALL_TARGET=install-normal
-
-# Setup the testing framework, if you have one
-EXPECT = `if [ -f $${rootme}/../expect/expect ] ; then \
- echo $${rootme}/../expect/expect ; \
- else echo expect ; fi`
-
-RUNTEST = `if [ -f $${srcdir}/../dejagnu/runtest ] ; then \
- echo $${srcdir}/../dejagnu/runtest ; \
- else echo runtest; fi`
-RUNTESTFLAGS =
-
-# End of variables for you to override.
-
-# Definition of `all' is here so that new rules inserted by sed
-# do not specify the default target.
-# The real definition is under `all.cross' (for cross compilers).
-all: all.cross
-
-# This tells GNU Make version 3 not to put all variables in the environment.
-.NOEXPORT:
-
-# sed inserts variable overrides after the following line.
-####target overrides
-@target_overrides@
-
-####host overrides
-@host_overrides@
-
-####cross overrides
-@cross_defines@
-@cross_overrides@
-
-####build overrides
-@build_overrides@
-
-# CYGNUS LOCAL --site
-####site overrides
-# END CYGNUS LOCAL
-#
-# Now figure out from those variables how to compile and link.
-
-all.indirect: $(ALL)
-
-# IN_GCC tells various files that system.h, toplev.c, etc are available.
-INTERNAL_CFLAGS = $(CROSS) -DIN_GCC @extra_c_flags@
-
-# This is the variable actually used when we compile.
-# If you change this line, you probably also need to change the definition
-# of HOST_CFLAGS in build-make to match.
-ALL_CFLAGS = $(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) $(XCFLAGS) \
- @DEFS@
-
-# Likewise.
-ALL_CPPFLAGS = $(CPPFLAGS) $(X_CPPFLAGS) $(T_CPPFLAGS)
-
-HOST_RTL = $(HOST_PREFIX)rtl.o $(HOST_PREFIX)bitmap.o
-HOST_RTLANAL = $(HOST_PREFIX)rtlanal.o
-HOST_PRINT = $(HOST_PREFIX)print-rtl.o
-
-# Specify the directories to be searched for header files.
-# Both . and srcdir are used, in that order,
-# so that tm.h and config.h will be found in the compilation
-# subdirectory rather than in the source directory.
-INCLUDES = -I. -I$(srcdir) -I$(srcdir)/config -I$(srcdir)/../include
-
-# Always use -I$(srcdir)/config when compiling.
-.c.o:
- $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
-
-# This tells GNU make version 3 not to export all the variables
-# defined in this file into the environment.
-.NOEXPORT:
-
-# Flags to pass to recursive makes.
-# CC is set by configure. Hosts without symlinks need special handling
-# because we need CC="stage1/xgcc -Bstage1/" to work in the language
-# subdirectories.
-# ??? The choices here will need some experimenting with.
-FLAGS_TO_PASS = \
- "AR_FLAGS_FOR_TARGET=$(AR_FLAGS_FOR_TARGET)" \
- "AR_FOR_TARGET=$(AR_FOR_TARGET)" \
- "BISON=$(BISON)" \
- "BISONFLAGS=$(BISONFLAGS)" \
- "CC=@cc_set_by_configure@" \
- "CFLAGS=$(CFLAGS)" \
- "CLIB=$(CLIB)" \
- "GCC_FOR_TARGET=$(GCC_FOR_TARGET)" \
- "LDFLAGS=$(LDFLAGS)" \
- "LEX=$(LEX)" \
- "LEXFLAGS=$(LEXFLAGS)" \
- "LN=$(LN)" \
- "LN_S=$(LN_S)" \
- "MAKEINFO=$(MAKEINFO)" \
- "MAKEINFOFLAGS=$(MAKEINFOFLAGS)" \
- "RANLIB_FOR_TARGET=$(RANLIB_FOR_TARGET)" \
- "RANLIB_TEST_FOR_TARGET=$(RANLIB_TEST_FOR_TARGET)" \
- "SHELL=$(SHELL)" \
- "STAGE_PREFIX=@stage_prefix_set_by_configure@" \
- "exeext=$(exeext)" \
- "build_exeext=$(build_exeext)" \
- "objext=$(objext)" \
- "exec_prefix=$(exec_prefix)" \
- "prefix=$(prefix)" \
- "local_prefix=$(local_prefix)" \
- "gxx_include_dir=$(gcc_gxx_include_dir)" \
- "tooldir=$(tooldir)" \
- "gcc_tooldir=$(gcc_tooldir)" \
- "bindir=$(bindir)" \
- "libsubdir=$(libsubdir)"
-#
-# Lists of files for various purposes.
-
-# Language-specific object files for C and Objective C.
-C_AND_OBJC_OBJS = c-lex.o c-pragma.o c-decl.o c-typeck.o c-convert.o \
- c-aux-info.o c-common.o c-iterate.o @extra_c_objs@
-
-# Language-specific object files for C.
-C_OBJS = c-parse.o $(C_AND_OBJC_OBJS)
-
-# Language-independent object files.
-OBJS = toplev.o version.o tree.o print-tree.o stor-layout.o fold-const.o \
- function.o stmt.o except.o expr.o calls.o expmed.o explow.o optabs.o \
- varasm.o rtl.o print-rtl.o rtlanal.o emit-rtl.o genrtl.o real.o regmove.o \
- dwarf2out.o bitmap.o alias.o \
- integrate.o jump.o cse.o loop.o unroll.o flow.o stupid.o combine.o varray.o \
- regclass.o local-alloc.o global.o reload.o reload1.o caller-save.o gcse.o \
- insn-peep.o final.o recog.o \
- insn-opinit.o insn-recog.o insn-extract.o insn-output.o insn-emit.o \
- $(CYGNUS-LOCAL-lcm) lcm.o \
- insn-attrtab.o $(out_object_file) getpwd.o convert.o \
- mbchar.o dyn-string.o splay-tree.o graph.o sbitmap.o resource.o
-
-# GEN files are listed separately, so they can be built before doing parallel
-# makes for cc1 or cc1plus. Otherwise sequent parallel make attempts to load
-# them before rtl.o is compiled.
-GEN= genemit genoutput genrecog genextract genflags gencodes genconfig \
- genpeep gengenrtl gencheck
-
-# Files to be copied away after each stage in building.
-STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \
- insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
- insn-attr.h insn-attrtab.c insn-opinit.c genrtl.c genrtl.h tree-check.h \
- s-flags s-config s-codes s-mlib s-under\
- s-output s-recog s-emit s-extract s-peep s-check \
- s-attr s-attrtab s-opinit \
- genemit$(build_exeext) genoutput$(build_exeext) genrecog$(build_exeext) \
- genextract$(build_exeext) genflags$(build_exeext) gencodes$(build_exeext) \
- genconfig$(build_exeext) genpeep$(build_exeext) genattrtab$(build_exeext) \
- genattr$(build_exeext) genopinit$(build_exeext) gengenrtl$(build_exeext) \
- gencheck$(build_exeext) \
- xgcc$(exeext) cc1$(exeext) cpp$(exeext) \
- gcc-cross$(exeext) \
- cc1obj$(exeext) \
- specs underscore.c \
- *.greg *.lreg *.combine *.flow *.cse *.jump *.rtl *.tree *.loop \
- *.dbr *.jump2 *.cse2 *.stack *.gcse \
- *.[si] libcpp.a \
- $(LANG_STAGESTUFF)
-
-
-# Members of libgcc1.a.
-LIB1FUNCS = _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 \
- _lshrsi3 _ashrsi3 _ashlsi3 \
- _divdf3 _muldf3 _negdf2 _adddf3 _subdf3 \
- _fixdfsi _fixsfsi _floatsidf _floatsisf _truncdfsf2 _extendsfdf2 \
- _addsf3 _negsf2 _subsf3 _mulsf3 _divsf3 \
- _eqdf2 _nedf2 _gtdf2 _gedf2 _ltdf2 _ledf2 \
- _eqsf2 _nesf2 _gtsf2 _gesf2 _ltsf2 _lesf2
-
-# Library members defined in libgcc2.c.
-LIB2FUNCS = _muldi3 _divdi3 _moddi3 _udivdi3 _umoddi3 _negdi2 \
- _lshrdi3 _ashldi3 _ashrdi3 _ffsdi2 \
- _udiv_w_sdiv _udivmoddi4 _cmpdi2 _ucmpdi2 _floatdidf _floatdisf \
- _fixunsdfsi _fixunssfsi _fixunsdfdi _fixdfdi _fixunssfdi _fixsfdi \
- _fixxfdi _fixunsxfdi _floatdixf _fixunsxfsi \
- _fixtfdi _fixunstfdi _floatditf \
- __gcc_bcmp _varargs __dummy _eprintf \
- _bb _shtab _clear_cache _trampoline __main _exit \
- _ctors _pure
-
-LIB2FUNCS_EH = _eh
-
-FPBIT_FUNCS = _pack_sf _unpack_sf _addsub_sf _mul_sf _div_sf \
- _fpcmp_parts_sf _compare_sf _eq_sf _ne_sf _gt_sf _ge_sf \
- _lt_sf _le_sf _si_to_sf _sf_to_si _negate_sf _make_sf \
- _sf_to_df
-
-DPBIT_FUNCS = _pack_df _unpack_df _addsub_df _mul_df _div_df \
- _fpcmp_parts_df _compare_df _eq_df _ne_df _gt_df _ge_df \
- _lt_df _le_df _si_to_df _df_to_si _negate_df _make_df \
- _df_to_sf
-
-# The files that "belong" in CONFIG_H are deliberately omitted
-# because having them there would not be useful in actual practice.
-# All they would do is cause complete recompilation every time
-# one of the machine description files is edited.
-# That may or may not be what one wants to do.
-# If it is, rm *.o is an easy way to do it.
-# CONFIG_H = $(host_xm_file) $(tm_file)
-CONFIG_H =
-RTL_BASE_H = rtl.h rtl.def machmode.h machmode.def
-RTL_H = $(RTL_BASE_H) genrtl.h
-TREE_H = tree.h real.h tree.def machmode.h machmode.def tree-check.h
-BASIC_BLOCK_H = basic-block.h bitmap.h sbitmap.h
-RECOG_H = recog.h
-EXPR_H = expr.h insn-codes.h
-REGS_H = regs.h varray.h machmode.h machmode.def
-
-# The only suffixes we want for implicit rules are .c and .o, so clear
-# the list and add them. This speeds up GNU Make, and allows -r to work.
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-Makefile: $(srcdir)/Makefile.in config.status $(srcdir)/version.c \
- $(xmake_file) $(tmake_file) $(LANG_MAKEFILES)
- $(SHELL) $(srcdir)/configure.frag $(srcdir) "$(SUBDIRS)" \
- "$(xmake_file)" "$(tmake_file)"
- cp config.status config.run
- LANGUAGES="$(CONFIG_LANGUAGES)" $(SHELL) config.run
- rm -f config.run
-
-# CYGNUS LOCAL: autoconf/wilson
-# Don't automatically run autoconf, since configure.in might be accidentally
-# newer than configure. Also, this writes into the source directory which
-# might be on a read-only file system.
-#$(srcdir)/configure: $(srcdir)/configure.in
-# cd $(srcdir); autoconf
-
-# cstamp-h.in controls rebuilding of config.in.
-# It is named cstamp-h.in and not stamp-h.in so the mostlyclean rule doesn't
-# delete it. A stamp file is needed as autoheader won't update the file if
-# nothing has changed.
-# It remains in the source directory and is part of the distribution.
-# This follows what is done in shellutils, fileutils, etc.
-# "echo timestamp" is used instead of touch to be consistent with other
-# packages that use autoconf (??? perhaps also to avoid problems with patch?).
-# ??? Newer versions have a maintainer mode that may be useful here.
-# CYGNUS LOCAL: autoheader/jason
-# Don't run autoheader automatically either.
-#$(srcdir)/config.in: $(srcdir)/cstamp-h.in
-#$(srcdir)/cstamp-h.in: $(srcdir)/configure.in $(srcdir)/acconfig.h
-# cd $(srcdir) && autoheader
-# @rm -f $(srcdir)/cstamp-h.in
-# echo timestamp > $(srcdir)/cstamp-h.in
-auto-host.h: cstamp-h ; @true
-cstamp-h: config.in config.status
- CONFIG_HEADERS=auto-host.h:config.in LANGUAGES="$(CONFIG_LANGUAGES)" $(SHELL) config.status
-
-# Really, really stupid make features, such as SUN's KEEP_STATE, may force
-# a target to build even if it is up-to-date. So we must verify that
-# config.status does not exist before failing.
-config.status: configure version.c
- @if [ ! -f config.status ] ; then \
- echo You must configure gcc. Look at the INSTALL file for details.; \
- false; \
- else \
- LANGUAGES="$(CONFIG_LANGUAGES)" $(SHELL) config.status --recheck; \
- fi
-
-# This is what to compile if making a cross-compiler.
-all.cross: native gcc-cross specs $(LIBGCC) $(LIBGCC1_TEST)
-# This is what is made with the host's compiler
-# whether making a cross compiler or not.
-native: config.status auto-host.h $(LANGUAGES)
-
-# Define the names for selecting languages in LANGUAGES.
-C c: cc1$(exeext)
-
-# Tell GNU make these are phony targets.
-.PHONY: C c
-
-# On the target machine, finish building a cross compiler.
-# This does the things that can't be done on the host machine.
-rest.cross: $(LIBGCC) specs
-
-# Verify that it works to compile and link libgcc1-test.
-# If it does, then there are sufficient replacements for libgcc1.a.
-libgcc1-test: libgcc1-test.o native $(GCC_PARTS)
- @echo "Testing libgcc1. Ignore linker warning messages."
- $(GCC_FOR_TARGET) $(GCC_CFLAGS) libgcc1-test.o -o libgcc1-test \
- -nostartfiles -nostdlib `$(GCC_FOR_TARGET) --print-libgcc-file-name`
-libgcc1-test.o: libgcc1-test.c native xgcc$(exeext)
- $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(ALL_CPPFLAGS) -c $(srcdir)/libgcc1-test.c
-
-# Recompile all the language-independent object files.
-# This is used only if the user explicitly asks for it.
-compilations: ${OBJS}
-
-# Create a list of the language-independent object files so the language
-# subdirectories needn't mention their names explicitly.
-stamp-objlist: $(OBJS)
- echo " $(OBJS)" | sed -e 's, \([a-z0-9]\), ../\1,g' -e 's/\.o/$(objext)/g' >stamp-objlist
-
-# We call this executable `xgcc' rather than `gcc'
-# to avoid confusion if the current directory is in the path
-# and CC is `gcc'. It is renamed to `gcc' when it is installed.
-xgcc$(exeext): gcc.o version.o choose-temp.o pexecute.o prefix.o version.o \
- mkstemp.o
- $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ gcc.o prefix.o version.o \
- choose-temp.o pexecute.o mkstemp.o
-
-# Dump a specs file to make -B./ read these specs over installed ones.
-specs: xgcc$(exeext)
- $(GCC_FOR_TARGET) -dumpspecs > tmp-specs
- mv tmp-specs specs
-
-# We do want to create an executable named `xgcc', so we can use it to
-# compile libgcc2.a.
-# Also create gcc-cross, so that install-common will install properly.
-gcc-cross: xgcc$(exeext)
- cp xgcc$(exeext) gcc-cross$(exeext)
-
-cc1$(exeext): $(P) $(OBJS) $(C_OBJS)
- $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(C_OBJS)
-
-# Build libgcc.a.
-# This is done in two parts because some functions, in libgcc1.c,
-# must be compiled with something other than GCC,
-# while the rest, in libgcc2.c, must be compiled with xgcc.
-# That means we can't do libgcc2.c until after xgcc, cc1, etc.
-
-# Use this as value of LIBGCC1 to cause conversion to GNU library format.
-# LIBCONVERT should put its output in libgcc1.conv.
-libgcc1.conv: libgcc1.a
- $(LIBCONVERT) libgcc1.a libgcc1.conv
-
-# Use this as value of LIBGCC1 to inhibit use of libgcc1.c entirely.
-# Make an empty file instead.
-libgcc1.null: $(GCC_PASSES)
- echo "void __foo () {}" > dummy.c
- $(GCC_FOR_TARGET) $(GCC_CFLAGS) -c dummy.c
- $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) libgcc1.null dummy$(objext)
- rm -f dummy$(objext) dummy.c
-
-# This is $(LIBGCC1) for a cross-compiler.
-# We have no automatic way of building libgcc1.a,
-# so it's up to the installer to find a way to do that.
-# This rule deliberately does not depend on libgcc1.a
-# so that it will fail if the installer hasn't provided it.
-libgcc1.cross:
- mv libgcc1.a libgcc1.cross || (echo You must find a way to make libgcc1.a; false)
-
-# Compile the library of arithmetic subroutines with the native compiler.
-# Don't compile it with GCC!
-# (That would cause most arithmetic functions to call themselves.)
-#
-# NOTE: If you modify these rules substantially, please be sure to
-# check at least config/i386/t-sco5 and possibly other makefile
-# fragments.
-libgcc1.a: libgcc1.c $(CONFIG_H) $(LIB1FUNCS_EXTRA) config.status
- -rm -f tmplibgcc1.a
-# Actually build it in tmplibgcc1.a, then rename at end,
-# so that libgcc1.a itself remains nonexistent if compilation is aborted.
-# -e causes any failing command to make this rule fail.
-# -e doesn't work in certain shells, so we test $$? as well.
-# lynx has a broken ar, it always complains when the initial library is
-# empty, thus this command works only if we don't do -e
-# There is a trailing backslash (\) deleted from the following line.
-# set -e;
- for name in $(LIB1FUNCS); \
- do \
- echo $${name}; \
- rm -f $${name}$(objext); \
- $(OLDCC) -DIN_LIBGCC1 $(CCLIBFLAGS) $(INCLUDES) -c -DL$${name} $(srcdir)/libgcc1.c; \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- mv libgcc1$(objext) $${name}$(objext); \
- $(OLDAR) $(OLDAR_FLAGS) tmplibgcc1.a $${name}$(objext); \
- rm -f $${name}$(objext); \
- done
-# Some shells crash when a loop has no items.
-# So make sure there is always at least one--`..'.
-# Then ignore it.
-# We don't use -e here because there are if statements
-# that should not make the command give up when the if condition is false.
-# Instead, we test for failure after each command where it matters.
- for file in .. $(LIB1FUNCS_EXTRA); \
- do \
- if [ x$${file} != x.. ]; then \
- name=`echo $${file} | sed -e 's/[.][cS]$$//' -e 's/[.]asm$$//'`; \
- echo $${name}; \
- if [ $${name}.asm = $${file} ]; then \
- cp $${file} $${name}.s || exit 1; file=$${name}.s; \
- else true; fi; \
- $(OLDCC) -DIN_LIBGCC1 $(CCLIBFLAGS) $(INCLUDES) -c $${file}; \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- $(OLDAR) $(OLDAR_FLAGS) tmplibgcc1.a $${name}$(objext); \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- rm -f $${name}.s $${name}$(objext); \
- else true; \
- fi; \
- done
- -if $(RANLIB_TEST_FOR_TARGET) ; then \
- $(RANLIB_FOR_TARGET) tmplibgcc1.a; \
- else true; fi
- mv tmplibgcc1.a libgcc1.a
-
-# Build libgcc1.a from assembler source. LIB1ASMFUNCS is the list of
-# functions. LIB1ASMSRC is the name of the source file in the config
-# subdirectory.
-libgcc1-asm.a: libgcc2.ready config.status $(srcdir)/config/$(LIB1ASMSRC)
- -rm -f tmplibgcc1.a libgcc1.S
- cp $(srcdir)/config/$(LIB1ASMSRC) libgcc1.S
-# Actually build it in tmplibgcc1.a, then rename at end,
-# so that libgcc1-asm.a itself remains nonexistent if compilation is aborted.
-# -e causes any failing command to make this rule fail.
-# -e doesn't work in certain shells, so we test $$? as well.
-# lynx has a broken ar, it always complains when the initial library is
-# empty, thus this command works only if we don't do -e
-# There is a trailing backslash (\) deleted from the following line.
-# set -e;
- for name in $(LIB1ASMFUNCS); \
- do \
- echo $${name}; \
- $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c -DL$${name} libgcc1.S; \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- mv libgcc1$(objext) $${name}$(objext); \
- $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) tmplibgcc1.a $${name}$(objext); \
- rm -f $${name}$(objext); \
- done
- -rm -f libgcc1.S
- mv tmplibgcc1.a libgcc1-asm.a
-
-# Generate assembly versions of the functions required for libgcc1.
-# You'll still need to massage the code by hand (possibly hacking
-# underscores and local labels) but this will get you started.
-libgcc1.S: libgcc1.c $(CONFIG_H) config.status
- -rm -f libgcc1.S
- touch libgcc1.S
- for name in $(LIB1FUNCS); \
- do \
- echo $${name}; \
- $(OLDCC) -DIN_LIBGCC1 $(CCLIBFLAGS) $(INCLUDES) -S -DL$${name} $(srcdir)/libgcc1.c; \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- echo '#ifdef ' L$${name} >> libgcc1.S; \
- cat libgcc1.s >> libgcc1.S; \
- echo '#endif /*' L$${name} '*/' >> libgcc1.S; \
- echo "" >> libgcc1.S; \
- done
-
-# Compiling libgcc2.a requires making sure that cc1, etc. have been compiled.
-# But recompiling cc1 should not force recompilation of libgcc2.a.
-# If you want to force recompilation, delete libgcc2.a.
-libgcc2.ready: $(GCC_PASSES) $(LIBGCC2_DEPS) stmp-int-hdrs
- -if [ -f libgcc2.ready ] ; then \
- true; \
- else \
- touch libgcc2.ready; \
- fi
-
-LIB2ADD = $(LIB2FUNCS_EXTRA) $(LANG_LIB2FUNCS)
-libgcc2.a: libgcc2.c libgcc2.ready $(CONFIG_H) $(FPBIT) $(DPBIT) $(LIB2ADD) \
- machmode.h longlong.h config.status
-# Actually build it in tmplibgcc2.a, then rename at end,
-# so that libgcc2.a itself remains nonexistent if compilation is aborted.
- -rm -f tmplibgcc2.a
-# -e causes any failing command to make this rule fail.
-# -e doesn't work in certain shells, so we test $$? as well.
-# lynx has a broken ar, it always complains when the initial library is
-# empty, thus this command works only if we don't do -e
-# There is a trailing backslash (\) deleted from the following line.
-# set -e;
- for name in $(LIB2FUNCS); \
- do \
- echo $${name}; \
- $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c -DL$${name} \
- $(srcdir)/libgcc2.c -o $${name}$(objext); \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) tmplibgcc2.a $${name}$(objext); \
- rm -f $${name}$(objext); \
- done
- for name in $(LIB2FUNCS_EH); \
- do \
- echo $${name}; \
- $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -fexceptions $(INCLUDES) -c \
- -DL$${name} $(srcdir)/libgcc2.c -o $${name}$(objext); \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) tmplibgcc2.a $${name}$(objext); \
- rm -f $${name}$(objext); \
- done
- if [ x$(FPBIT) != x ]; then \
- for name in $(FPBIT_FUNCS); \
- do \
- echo $${name}; \
- $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c -DL$${name} \
- -DFINE_GRAINED_LIBRARIES $(FPBIT) -o $${name}$(objext); \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) tmplibgcc2.a $${name}$(objext); \
- rm -f $${name}$(objext); \
- done; \
- else true; fi;
- if [ x$(DPBIT) != x ]; then \
- for name in $(DPBIT_FUNCS); \
- do \
- echo $${name}; \
- $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c -DL$${name} \
- -DFINE_GRAINED_LIBRARIES $(DPBIT) -o $${name}$(objext); \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) tmplibgcc2.a $${name}$(objext); \
- rm -f $${name}$(objext); \
- done; \
- else true; fi;
-# Some shells crash when a loop has no items.
-# So make sure there is always at least one--`..'.
-# Then ignore it.
-# We don't use -e here because there are if statements
-# that should not make the command give up when the if condition is false.
-# Instead, we test for failure after each command where it matters.
- for file in $(LIB2ADD); do \
- name=`echo $${file} | sed -e 's/[.][cSo]$$//' -e 's/[.]asm$$//' -e 's/[.]txt$$//'`; \
- oname=` echo $${name} | sed -e 's,.*/,,'`; \
- if [ $${name}.txt = $${file} ]; then \
- for f in .. `cat $${file}`; do if [ x$${f} != x.. ]; then \
- $(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
- AR_FOR_TARGET="$(AR_FOR_TARGET)" \
- AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" CC="$(CC)" \
- CFLAGS="$(CFLAGS)" HOST_PREFIX="$(HOST_PREFIX)" \
- HOST_PREFIX_1="$(HOST_PREFIX_1)" \
- LANGUAGES="$(LANGUAGES)" \
- LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)" $${f}; \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) tmplibgcc2.a $${f}; \
- rm -f $${f}; \
- else true; \
- fi; done; \
- else \
- echo $${name}; \
- if [ $${name}.asm = $${file} ]; then \
- cp $${file} $${name}.s || exit 1; file=$${name}.s; \
- else true; fi; \
- $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c $${file}; \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) tmplibgcc2.a $${oname}$(objext); \
- rm -f $${name}.s $${oname}$(objext); \
- fi; \
- done
- mv tmplibgcc2.a libgcc2.a
-# These lines were deleted from above the mv command
-# because ranlibing libgcc.a itself should suffice.
-# -if [ x${HPUX_GAS} = x ] ; then \
-# if $(RANLIB_TEST_FOR_TARGET) ; then \
-# $(RANLIB_FOR_TARGET) tmplibgcc2.a;
-# else true; fi; \
-# else true; fi
-
-# Combine the various libraries into a single library, libgcc.a.
-libgcc.a: $(LIBGCC1) $(LIBGCC2)
- -rm -rf tmplibgcc.a libgcc.a tmpcopy
- mkdir tmpcopy
- -if [ x$(LIBGCC1) != x ]; \
- then (cd tmpcopy; $(AR_FOR_TARGET) x ../$(LIBGCC1)); \
- else true; \
- fi
-# Some versions of ar (specifically the one in RISC/os 5.x), create an
-# unwritable table of contents file, and then print an error message when
-# the second ar command tries to overwrite this file. To avoid the error
-# message from ar, we make sure all files are writable.
- -(cd tmpcopy; chmod +w * > /dev/null 2>&1)
- (cd tmpcopy; $(AR_FOR_TARGET) x ../$(LIBGCC2))
- (cd tmpcopy; $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) ../tmplibgcc.a *$(objext))
- rm -rf tmpcopy
- -if $(RANLIB_TEST_FOR_TARGET) ; then \
- $(RANLIB_FOR_TARGET) tmplibgcc.a; \
- else true; fi
-# Actually build it in tmplibgcc.a, then rename at end,
-# so that libgcc.a itself remains nonexistent if compilation is aborted.
- mv tmplibgcc.a libgcc.a
-
-# Use the genmultilib shell script to generate the information the gcc
-# driver program needs to select the library directory based on the
-# switches.
-multilib.h: s-mlib; @true
-s-mlib: $(srcdir)/genmultilib Makefile
- $(SHELL) $(srcdir)/genmultilib \
- "$(MULTILIB_OPTIONS)" \
- "$(MULTILIB_DIRNAMES)" \
- "$(MULTILIB_MATCHES)" \
- "$(MULTILIB_EXCEPTIONS)" \
- "$(MULTILIB_EXTRA_OPTS)" > tmp-mlib.h
- $(srcdir)/move-if-change tmp-mlib.h multilib.h
- touch s-mlib
-
-# Build multiple copies of libgcc.a, one for each target switch.
-stmp-multilib: $(LIBGCC1) libgcc2.c libgcc2.ready $(CONFIG_H) \
- $(LIB2ADD) machmode.h longlong.h config.status
- for i in `$(GCC_FOR_TARGET) --print-multi-lib`; do \
- dir=`echo $$i | sed -e 's/;.*$$//'`; \
- flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \
- $(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
- AR_FOR_TARGET="$(AR_FOR_TARGET)" \
- AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
- CC="$(CC)" CFLAGS="$(CFLAGS)" \
- RANLIB_FOR_TARGET="$(RANLIB_FOR_TARGET)" \
- RANLIB_TEST_FOR_TARGET="$(RANLIB_TEST_FOR_TARGET)" \
- LANGUAGES="$(LANGUAGES)" \
- HOST_PREFIX="$(HOST_PREFIX)" HOST_PREFIX_1="$(HOST_PREFIX_1)" \
- LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) $${flags}" \
- MULTILIB_CFLAGS="$${flags}" \
- LIBGCC1="$(LIBGCC1)" LIBGCC2="$(LIBGCC2)" \
- dir="$${dir}" stmp-multilib-sub; \
- if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
- done
- touch stmp-multilib
-
-# Subroutine of stmp-multilib so make -n works.
-stmp-multilib-sub:
- rm -f $(LIBGCC2)
- if [ -d $(dir) ]; then \
- cd $(dir); \
- rm -f libgcc.a $(EXTRA_MULTILIB_PARTS); \
- else true; \
- fi
- $(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
- AR_FOR_TARGET="$(AR_FOR_TARGET)" \
- AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
- CC="$(CC)" CFLAGS="$(CFLAGS)" \
- HOST_PREFIX="$(HOST_PREFIX)" HOST_PREFIX_1="$(HOST_PREFIX_1)" \
- LANGUAGES="$(LANGUAGES)" \
- LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)" $(LIBGCC2)
- if [ x$(LIBGCC1) != xlibgcc1-asm.a ]; \
- then true; \
- else rm -f $(LIBGCC1); \
- fi
- if [ x$(LIBGCC1) != xlibgcc1-asm.a ]; \
- then true; \
- else \
- $(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
- AR_FOR_TARGET="$(AR_FOR_TARGET)" \
- AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
- CC="$(CC)" CFLAGS="$(CFLAGS)" \
- HOST_PREFIX="$(HOST_PREFIX)" HOST_PREFIX_1="$(HOST_PREFIX_1)" \
- LANGUAGES="$(LANGUAGES)" \
- LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)" $(LIBGCC1); \
- fi
- rm -rf tmplibgcc.a tmpcopy
- mkdir tmpcopy
- if [ x$(LIBGCC1) != x ]; \
- then (cd tmpcopy; $(AR_FOR_TARGET) x ../$(LIBGCC1)); \
- else true; \
- fi
- (cd tmpcopy; $(AR_FOR_TARGET) x ../$(LIBGCC2))
- (cd tmpcopy; $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) ../tmplibgcc.a *$(objext))
- rm -rf libgcc2.a tmpcopy
- if $(RANLIB_TEST_FOR_TARGET) ; then \
- $(RANLIB_FOR_TARGET) tmplibgcc.a; \
- else true; fi
- if [ -d $(dir) ]; then true; else mkdir $(dir); fi
- mv tmplibgcc.a $(dir)/libgcc.a
- for f in .. $(EXTRA_MULTILIB_PARTS); do if [ x$${f} != x.. ]; then \
- $(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
- AR_FOR_TARGET="$(AR_FOR_TARGET)" \
- AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
- CC="$(CC)" CFLAGS="$(CFLAGS)" \
- HOST_PREFIX="$(HOST_PREFIX)" HOST_PREFIX_1="$(HOST_PREFIX_1)" \
- LANGUAGES="$(LANGUAGES)" \
- MULTILIB_CFLAGS="$(MULTILIB_CFLAGS)" T="t" t$${f}; \
- mv t$${f} $(dir)/$${f}; \
- else true; \
- fi; done
-
-# Compiling object files from source files.
-
-# Note that dependencies on obstack.h are not written
-# because that file is not part of GCC.
-
-# C language specific files.
-
-# CYGNUS LOCAL: built in build directory
-c-parse.o : $(srcdir)/c-parse.c $(CONFIG_H) $(TREE_H) c-lex.h c-parse.h \
- c-tree.h input.h flags.h system.h toplev.h
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c $(srcdir)/c-parse.c
-c-parse.h : c-parse.c
-#c-parse.c : c-parse.y
-# @echo expect 46 shift/reduce conflicts.
-# $(BISON) $(BISONFLAGS) -d c-parse.y -o c-parse.c
-c-parse.y : $(srcdir)/c-parse.in
- echo '/*WARNING: This file is automatically generated!*/' >tmp-c-parse.y
- sed -e "/^ifobjc$$/,/^end ifobjc$$/d" \
- -e "/^ifc$$/d" -e "/^end ifc$$/d" \
- $(srcdir)/c-parse.in >>tmp-c-parse.y
- $(srcdir)/move-if-change tmp-c-parse.y c-parse.y
-
-# CYGNUS LOCAL: c-gperf.h really depends on c-parse.gperf.
-$(srcdir)/c-gperf.h:
- gperf -L KR-C -F ', 0, 0' -p -j1 -i 1 -g -o -t -G -N is_reserved_word \
- -k1,3,$$ $(srcdir)/c-parse.gperf >tmp-gperf.h
- $(srcdir)/move-if-change tmp-gperf.h $(srcdir)/c-gperf.h
-
-c-decl.o : c-decl.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-lex.h flags.h \
- output.h toplev.h
-c-typeck.o : c-typeck.c $(CONFIG_H) system.h $(TREE_H) c-tree.h flags.h \
- output.h $(EXPR_H) $(RTL_H) toplev.h
-# CYGNUS LOCAL: built in build directory
-c-lex.o : c-lex.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) c-lex.h c-tree.h \
- c-parse.h input.h flags.h c-gperf.h c-pragma.h \
- toplev.h output.h mbchar.h
-c-aux-info.o : c-aux-info.c $(CONFIG_H) system.h $(TREE_H) c-tree.h flags.h
-c-convert.o : c-convert.c $(CONFIG_H) system.h $(TREE_H) flags.h toplev.h
-c-pragma.o: c-pragma.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) except.h \
- function.h defaults.h c-pragma.h toplev.h
-c-iterate.o: c-iterate.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) c-tree.h \
- flags.h toplev.h $(EXPR_H)
-mbchar.o: mbchar.c $(CONFIG_H) system.h mbchar.h
-graph.o: graph.c $(CONFIG_H) system.h toplev.h flags.h output.h $(RTL_H) \
- hard-reg-set.h $(BASIC_BLOCK_H)
-sbitmap.o: sbitmap.c $(CONFIG_H) system.h $(RTL_H) flags.h $(BASIC_BLOCK_H)
-
-hash.o: hash.c hash.h system.h toplev.h
-
-pexecute.o: $(srcdir)/../libiberty/pexecute.c $(CONFIG_H) system.h
- rm -f pexecute.c
- $(LN_S) $(srcdir)/../libiberty/pexecute.c pexecute.c
- $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) pexecute.c
-
-splay-tree.o: $(srcdir)/../libiberty/splay-tree.c \
- $(srcdir)/../include/splay-tree.h $(srcdir)/../include/libiberty.h
- rm -f splay-tree.c
- $(LN_S) $(srcdir)/../libiberty/splay-tree.c splay-tree.c
- $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) splay-tree.c
-
-underscore.c: s-under ; @true
-
-s-under: $(GCC_PASSES)
- echo "int xxy_us_dummy;" >tmp-dum.c
- $(GCC_FOR_TARGET) -S tmp-dum.c
- echo '/*WARNING: This file is automatically generated!*/' >tmp-under.c
- if grep _xxy_us_dummy tmp-dum.s > /dev/null ; then \
- echo "int prepends_underscore = 1;" >>tmp-under.c; \
- else \
- echo "int prepends_underscore = 0;" >>tmp-under.c; \
- fi
- $(srcdir)/move-if-change tmp-under.c underscore.c
- -rm -f tmp-dum.c tmp-dum.s
- touch s-under
-
-# A file used by all variants of C.
-
-c-common.o : c-common.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-lex.h \
- flags.h toplev.h output.h c-pragma.h $(RTL_H)
-
-# Language-independent files.
-
-# CYGNUS LOCAL -- meissner/relative pathnames
-DRIVER_DEFINES = \
- -DSTANDARD_STARTFILE_PREFIX=\"$(unlibsubdir)/\" \
- -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc-lib/\" \
- -DDEFAULT_TARGET_VERSION=\"$(version)\" \
- -DDEFAULT_TARGET_MACHINE=\"$(target_alias)\" \
- -DSTANDARD_BINDIR_PREFIX=\"$(bindir)/\" \
- -DTOOLDIR_BASE_PREFIX=\"$(unlibsubdir)/../\"
-gcc.o: gcc.c $(CONFIG_H) system.h multilib.h Makefile prefix.h \
- $(lang_specs_files)
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
- $(DRIVER_DEFINES) \
- -c `echo $(srcdir)/gcc.c | sed 's,^\./,,'`
-# END CYGNUS LOCAL -- meissner/relative pathnames
-
-tree-check.h: s-check ; @true
-s-check : gencheck $(srcdir)/move-if-change
- ./gencheck > tmp-check.h
- $(srcdir)/move-if-change tmp-check.h tree-check.h
- touch s-check
-
-gencheck : gencheck.o tree.def $(lang_tree_files)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- gencheck.o
-
-gencheck.o : gencheck.c config.h system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/gencheck.c
-
-dumpvers: dumpvers.c
-
-version.o: version.c
-obstack.o: $(srcdir)/../libiberty/obstack.c $(CONFIG_H)
- rm -f obstack.c
- $(LN_S) $(srcdir)/../libiberty/obstack.c obstack.c
- $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) obstack.c
-
-choose-temp.o: $(srcdir)/../libiberty/choose-temp.c $(CONFIG_H) system.h
- rm -f choose-temp.c
- $(LN_S) $(srcdir)/../libiberty/choose-temp.c choose-temp.c
- $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) choose-temp.c
-
-mkstemp.o: $(srcdir)/../libiberty/mkstemp.c $(CONFIG_H) system.h
- rm -f mkstemp.c
- $(LN_S) $(srcdir)/../libiberty/mkstemp.c mkstemp.c
- $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) mkstemp.c
-
-prefix.o: prefix.c $(CONFIG_H) system.h Makefile prefix.h
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
- -DPREFIX=\"$(prefix)\" \
- -c `echo $(srcdir)/prefix.c | sed 's,^\./,,'`
-
-convert.o: convert.c $(CONFIG_H) $(TREE_H) flags.h convert.h toplev.h
-
-tree.o : tree.c $(CONFIG_H) system.h $(TREE_H) flags.h function.h toplev.h except.h
-print-tree.o : print-tree.c $(CONFIG_H) system.h $(TREE_H)
-stor-layout.o : stor-layout.c $(CONFIG_H) system.h $(TREE_H) flags.h \
- function.h $(EXPR_H) $(RTL_H) toplev.h except.h
-fold-const.o : fold-const.c $(CONFIG_H) system.h $(TREE_H) flags.h toplev.h \
- $(RTL_H)
-
-toplev.o : toplev.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) \
- flags.h input.h insn-attr.h defaults.h output.h \
- insn-codes.h insn-config.h $(RECOG_H) Makefile toplev.h \
- dwarf2out.h $(EXPR_H) \
- $(lang_options_files)
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
- -DTARGET_NAME=\"$(target_alias)\" \
- -c `echo $(srcdir)/toplev.c | sed 's,^\./,,'`
-
-
-rtl.o : rtl.c $(CONFIG_H) system.h $(RTL_H) bitmap.h
-
-print-rtl.o : print-rtl.c $(CONFIG_H) system.h $(RTL_H) bitmap.h
-rtlanal.o : rtlanal.c $(CONFIG_H) system.h $(RTL_H)
-
-varasm.o : varasm.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) flags.h \
- function.h defaults.h $(EXPR_H) hard-reg-set.h $(REGS_H) \
- output.h c-pragma.h toplev.h except.h
-function.o : function.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
- function.h insn-flags.h insn-codes.h $(EXPR_H) $(REGS_H) hard-reg-set.h \
- insn-config.h $(RECOG_H) output.h toplev.h except.h
-stmt.o : stmt.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h function.h \
- insn-flags.h insn-config.h insn-codes.h hard-reg-set.h $(EXPR_H) except.h \
- loop.h $(RECOG_H) toplev.h output.h varray.h
-except.o : except.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
- function.h insn-flags.h $(EXPR_H) $(REGS_H) hard-reg-set.h \
- insn-config.h $(RECOG_H) output.h except.h toplev.h
-expr.o : expr.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h function.h \
- $(REGS_H) insn-flags.h insn-codes.h $(EXPR_H) insn-config.h $(RECOG_H) output.h \
- typeclass.h hard-reg-set.h toplev.h hard-reg-set.h except.h
-calls.o : calls.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h $(EXPR_H) \
- insn-flags.h $(REGS_H) toplev.h output.h
-expmed.o : expmed.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
- insn-flags.h insn-config.h insn-codes.h $(EXPR_H) $(RECOG_H) real.h
-explow.o : explow.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
- hard-reg-set.h insn-config.h $(EXPR_H) $(RECOG_H) insn-flags.h insn-codes.h
-optabs.o : optabs.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
- insn-flags.h insn-config.h insn-codes.h $(EXPR_H) $(RECOG_H) reload.h
-dwarf2out.o : dwarf2out.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) dwarf2.h \
- flags.h insn-config.h reload.h output.h defaults.h \
- hard-reg-set.h $(REGS_H) $(EXPR_H) toplev.h dwarf2out.h dyn-string.h
-emit-rtl.o : emit-rtl.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
- except.h function.h $(REGS_H) insn-config.h $(RECOG_H) real.h \
- $(EXPR_H) $(srcdir)/../include/obstack.h hard-reg-set.h bitmap.h
-real.o : real.c $(CONFIG_H) system.h $(TREE_H) toplev.h
-getpwd.o : getpwd.c $(CONFIG_H) system.h
-
-integrate.o : integrate.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
- integrate.h insn-flags.h insn-config.h $(EXPR_H) real.h $(REGS_H) \
- function.h output.h $(RECOG_H) except.h toplev.h
-
-jump.o : jump.c $(CONFIG_H) system.h $(RTL_H) flags.h hard-reg-set.h $(REGS_H) \
- insn-config.h insn-flags.h $(RECOG_H) $(EXPR_H) real.h except.h \
- toplev.h
-stupid.o : stupid.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) hard-reg-set.h \
- $(BASIC_BLOCK_H) insn-config.h reload.h flags.h toplev.h
-
-cse.o : cse.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) hard-reg-set.h flags.h \
- real.h insn-config.h $(RECOG_H) $(EXPR_H) toplev.h output.h
-gcse.o : gcse.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) hard-reg-set.h flags.h \
- real.h insn-config.h $(RECOG_H) $(EXPR_H) $(BASIC_BLOCK_H) output.h
-resource.o : resource.c $(CONFIG_H) $(RTL_H) hard-reg-set.h system.h \
- $(BASIC_BLOCK_H) $(REGS_H) flags.h output.h resource.h
-# CYGNUS LOCAL lcm
-lcm.o : lcm.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) hard-reg-set.h flags.h \
- real.h insn-config.h $(RECOG_H) $(EXPR_H) $(BASIC_BLOCK_H)
-loop.o : loop.c $(CONFIG_H) system.h $(RTL_H) flags.h loop.h insn-config.h \
- insn-flags.h $(REGS_H) hard-reg-set.h $(RECOG_H) $(EXPR_H) real.h \
- toplev.h varray.h
-unroll.o : unroll.c $(CONFIG_H) system.h $(RTL_H) insn-config.h \
- integrate.h $(REGS_H) $(RECOG_H) flags.h $(EXPR_H) loop.h toplev.h varray.h
-flow.o : flow.c $(CONFIG_H) system.h $(RTL_H) flags.h insn-config.h \
- $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h recog.h
-combine.o : combine.c $(CONFIG_H) system.h $(RTL_H) flags.h \
- insn-config.h insn-flags.h insn-codes.h insn-attr.h $(REGS_H) $(EXPR_H) \
- $(BASIC_BLOCK_H) $(RECOG_H) real.h hard-reg-set.h toplev.h
-regclass.o : regclass.c $(CONFIG_H) system.h $(RTL_H) hard-reg-set.h flags.h \
- $(BASIC_BLOCK_H) $(REGS_H) insn-config.h $(RECOG_H) reload.h real.h toplev.h \
- output.h
-local-alloc.o : local-alloc.c $(CONFIG_H) system.h $(RTL_H) flags.h \
- $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h insn-config.h $(RECOG_H) output.h \
- insn-attr.h toplev.h
-bitmap.o : bitmap.c $(CONFIG_H) system.h $(RTL_H) flags.h $(BASIC_BLOCK_H) \
- $(REGS_H)
-global.o : global.c $(CONFIG_H) system.h $(RTL_H) flags.h reload.h \
- $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h insn-config.h output.h toplev.h
-varray.o : varray.c $(CONFIG_H) system.h varray.h $(RTL_H) $(TREE_H) bitmap.h
-
-reload.o : reload.c $(CONFIG_H) system.h $(RTL_H) flags.h output.h $(EXPR_H) \
- reload.h $(RECOG_H) hard-reg-set.h insn-config.h insn-codes.h $(REGS_H) \
- real.h toplev.h
-reload1.o : reload1.c $(CONFIG_H) system.h $(RTL_H) real.h flags.h $(EXPR_H) \
- reload.h $(REGS_H) hard-reg-set.h insn-config.h insn-flags.h insn-codes.h \
- $(BASIC_BLOCK_H) $(RECOG_H) output.h toplev.h
-caller-save.o : caller-save.c $(CONFIG_H) system.h $(RTL_H) flags.h \
- $(REGS_H) hard-reg-set.h insn-config.h $(BASIC_BLOCK_H) \
- $(RECOG_H) reload.h $(EXPR_H) toplev.h
-alias.o : alias.c $(CONFIG_H) system.h $(RTL_H) flags.h hard-reg-set.h \
- $(REGS_H) toplev.h output.h $(EXPR_H)
-regmove.o : regmove.c $(CONFIG_H) system.h $(RTL_H) insn-config.h \
- $(RECOG_H) output.h reload.h $(REGS_H) hard-reg-set.h flags.h \
- $(EXPR_H) insn-flags.h $(BASIC_BLOCK_H) toplev.h
-final.o : final.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h $(REGS_H) \
- $(RECOG_H) conditions.h insn-config.h insn-attr.h except.h real.h output.h \
- hard-reg-set.h insn-flags.h insn-codes.h defaults.h \
- toplev.h reload.h dwarf2out.h
-recog.o : recog.c $(CONFIG_H) system.h $(RTL_H) \
- $(REGS_H) $(RECOG_H) hard-reg-set.h flags.h insn-config.h insn-attr.h \
- insn-flags.h insn-codes.h real.h toplev.h
-dyn-string.o: dyn-string.c dyn-string.h $(CONFIG_H) system.h
-
-$(out_object_file): $(out_file) $(CONFIG_H) $(TREE_H) \
- $(RTL_H) $(REGS_H) hard-reg-set.h real.h insn-config.h conditions.h \
- insn-flags.h output.h insn-attr.h insn-codes.h system.h toplev.h
- $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(out_file)
-
-#
-# Generate header and source files from the machine description,
-# and compile them.
-
-.PRECIOUS: insn-config.h insn-flags.h insn-codes.h \
- insn-emit.c insn-recog.c insn-extract.c insn-output.c insn-peep.c \
- insn-attr.h insn-attrtab.c
-
-# The following pair of rules has this effect:
-# genconfig is run only if the md has changed since genconfig was last run;
-# but the file insn-config.h is touched only when its contents actually change.
-
-# Each of the other insn-* files is handled by a similar pair of rules.
-
-# This causes an anomaly in the results of make -n
-# because insn-* is older than s-*
-# and thus make -n thinks that insn-* will be updated
-# and force recompilation of things that depend on it.
-# We use move-if-change precisely to avoid such recompilation.
-# But there is no way to teach make -n that it will be avoided.
-
-# Each of the insn-*.[ch] rules has a semicolon at the end,
-# for otherwise the system Make on SunOS 4.1 never tries
-# to recompile insn-*.o. To avoid problems and extra noise from
-# versions of make which don't like empty commands (nothing after the
-# trailing `;'), we call true for each.
-
-insn-config.h: s-config ; @true
-s-config : $(md_file) genconfig $(srcdir)/move-if-change
- ./genconfig $(md_file) > tmp-config.h
- $(srcdir)/move-if-change tmp-config.h insn-config.h
- touch s-config
-
-insn-flags.h: s-flags ; @true
-s-flags : $(md_file) genflags $(srcdir)/move-if-change
- ./genflags $(md_file) > tmp-flags.h
- $(srcdir)/move-if-change tmp-flags.h insn-flags.h
- touch s-flags
-
-insn-codes.h: s-codes ; @true
-s-codes : $(md_file) gencodes $(srcdir)/move-if-change
- ./gencodes $(md_file) > tmp-codes.h
- $(srcdir)/move-if-change tmp-codes.h insn-codes.h
- touch s-codes
-
-insn-emit.o : insn-emit.c $(CONFIG_H) $(RTL_H) $(EXPR_H) real.h output.h \
- insn-config.h insn-flags.h insn-codes.h system.h reload.h recog.h
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-emit.c
-
-insn-emit.c: s-emit ; @true
-s-emit : $(md_file) genemit $(srcdir)/move-if-change
- ./genemit $(md_file) > tmp-emit.c
- $(srcdir)/move-if-change tmp-emit.c insn-emit.c
- touch s-emit
-
-insn-recog.o : insn-recog.c $(CONFIG_H) $(RTL_H) insn-config.h $(RECOG_H) \
- real.h output.h flags.h system.h
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-recog.c
-
-insn-recog.c: s-recog ; @true
-s-recog : $(md_file) genrecog $(srcdir)/move-if-change
- ./genrecog $(md_file) > tmp-recog.c
- $(srcdir)/move-if-change tmp-recog.c insn-recog.c
- touch s-recog
-
-insn-opinit.o : insn-opinit.c $(CONFIG_H) $(RTL_H) insn-codes.h insn-flags.h \
- insn-config.h flags.h $(RECOG_H) $(EXPR_H) reload.h system.h
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-opinit.c
-
-insn-opinit.c: s-opinit ; @true
-s-opinit : $(md_file) genopinit $(srcdir)/move-if-change
- ./genopinit $(md_file) > tmp-opinit.c
- $(srcdir)/move-if-change tmp-opinit.c insn-opinit.c
- touch s-opinit
-
-insn-extract.o : insn-extract.c $(CONFIG_H) $(RTL_H) system.h toplev.h \
- insn-config.h recog.h
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-extract.c
-
-insn-extract.c: s-extract ; @true
-s-extract : $(md_file) genextract $(srcdir)/move-if-change
- ./genextract $(md_file) > tmp-extract.c
- $(srcdir)/move-if-change tmp-extract.c insn-extract.c
- touch s-extract
-
-insn-peep.o : insn-peep.c $(CONFIG_H) $(RTL_H) $(REGS_H) output.h real.h \
- system.h insn-config.h recog.h
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-peep.c
-
-insn-peep.c: s-peep ; @true
-s-peep : $(md_file) genpeep $(srcdir)/move-if-change
- ./genpeep $(md_file) > tmp-peep.c
- $(srcdir)/move-if-change tmp-peep.c insn-peep.c
- touch s-peep
-
-insn-attrtab.o : insn-attrtab.c $(CONFIG_H) $(RTL_H) $(REGS_H) real.h \
- output.h insn-attr.h insn-config.h system.h toplev.h
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-attrtab.c
-
-insn-attr.h: s-attr ; @true
-s-attr : $(md_file) genattr $(srcdir)/move-if-change
- ./genattr $(md_file) > tmp-attr.h
- $(srcdir)/move-if-change tmp-attr.h insn-attr.h
- touch s-attr
-
-insn-attrtab.c: s-attrtab ; @true
-s-attrtab : $(md_file) genattrtab $(srcdir)/move-if-change
- if cmp -s $(PREMADE_ATTRTAB_MD) $(md_file); \
- then \
- echo Using $(PREMADE_ATTRTAB); \
- cp $(PREMADE_ATTRTAB) tmp-attrtab.c; \
- else \
- ./genattrtab $(md_file) > tmp-attrtab.c; \
- fi
- $(srcdir)/move-if-change tmp-attrtab.c insn-attrtab.c
- touch s-attrtab
-
-insn-output.o : insn-output.c $(CONFIG_H) $(RTL_H) $(REGS_H) real.h conditions.h \
- hard-reg-set.h insn-config.h insn-flags.h insn-attr.h output.h $(RECOG_H) \
- insn-codes.h system.h
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-output.c
-
-insn-output.c: s-output ; @true
-s-output : $(md_file) genoutput $(srcdir)/move-if-change
- ./genoutput $(md_file) > tmp-output.c
- $(srcdir)/move-if-change tmp-output.c insn-output.c
- touch s-output
-
-genrtl.o : genrtl.c $(CONFIG_H) $(RTL_H) system.h
-genrtl.c genrtl.h : s-genrtl
- @true # force gnu make to recheck modification times.
-
-s-genrtl: gengenrtl $(srcdir)/move-if-change $(RTL_BASE_H)
- ./gengenrtl tmp-genrtl.h tmp-genrtl.c
- $(srcdir)/move-if-change tmp-genrtl.h genrtl.h
- $(srcdir)/move-if-change tmp-genrtl.c genrtl.c
- touch s-genrtl
-
-#
-# Compile the programs that generate insn-* from the machine description.
-# They are compiled with $(HOST_CC), and associated libraries,
-# since they need to run on this machine
-# even if GCC is being compiled to run on some other machine.
-
-# $(CONFIG_H) is omitted from the deps of the gen*.o
-# because these programs don't really depend on anything
-# about the target machine. They do depend on config.h itself,
-# since that describes the host machine.
-
-# Pass the md file through cpp if the target requests it.
-$(MD_FILE): $(MD_DEPS)
- rm -f $@
- $(MD_CPP) $(MD_CPPFLAGS) $(md_file) | sed 's/^# /; /g' > tmp-$@
- mv tmp-$@ $@
-
-genconfig : genconfig.o $(HOST_RTL) $(HOST_PRINT)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- genconfig.o $(HOST_RTL) $(HOST_PRINT)
-
-genconfig.o : genconfig.c $(RTL_H) config.h system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genconfig.c
-
-genflags : genflags.o $(HOST_RTL) $(HOST_PRINT)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- genflags.o $(HOST_RTL) $(HOST_PRINT)
-
-genflags.o : genflags.c $(RTL_H) config.h system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genflags.c
-
-gencodes : gencodes.o $(HOST_RTL) $(HOST_PRINT)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- gencodes.o $(HOST_RTL) $(HOST_PRINT)
-
-gencodes.o : gencodes.c $(RTL_H) config.h system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/gencodes.c
-
-genemit : genemit.o $(HOST_RTL) $(HOST_PRINT)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- genemit.o $(HOST_RTL) $(HOST_PRINT)
-
-genemit.o : genemit.c $(RTL_H) config.h system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genemit.c
-
-genopinit : genopinit.o $(HOST_RTL) $(HOST_PRINT)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- genopinit.o $(HOST_RTL) $(HOST_PRINT)
-
-genopinit.o : genopinit.c $(RTL_H) config.h system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genopinit.c
-
-genrecog : genrecog.o $(HOST_RTL) $(HOST_PRINT)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- genrecog.o $(HOST_RTL) $(HOST_PRINT)
-
-genrecog.o : genrecog.c $(RTL_H) config.h system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genrecog.c
-
-genextract : genextract.o $(HOST_RTL) $(HOST_PRINT)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- genextract.o $(HOST_RTL) $(HOST_PRINT)
-
-genextract.o : genextract.c $(RTL_H) config.h system.h insn-config.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genextract.c
-
-genpeep : genpeep.o $(HOST_RTL) $(HOST_PRINT)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- genpeep.o $(HOST_RTL) $(HOST_PRINT)
-
-genpeep.o : genpeep.c $(RTL_H) config.h system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genpeep.c
-
-genattr : genattr.o $(HOST_RTL) $(HOST_PRINT)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- genattr.o $(HOST_RTL) $(HOST_PRINT)
-
-genattr.o : genattr.c $(RTL_H) config.h system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genattr.c
-
-genattrtab : genattrtab.o $(HOST_RTL) $(HOST_PRINT) $(HOST_RTLANAL)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- genattrtab.o $(HOST_RTL) $(HOST_PRINT) $(HOST_RTLANAL)
-
-genattrtab.o : genattrtab.c $(RTL_H) config.h system.h insn-config.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genattrtab.c
-
-genoutput : genoutput.o $(HOST_RTL) $(HOST_PRINT)
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- genoutput.o $(HOST_RTL) $(HOST_PRINT)
-
-genoutput.o : genoutput.c $(RTL_H) config.h system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genoutput.c
-
-gengenrtl : gengenrtl.o
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
- gengenrtl.o
-
-gengenrtl.o : gengenrtl.c $(RTL_BASE_H) system.h
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/gengenrtl.c
-
-#
-# Compile the libraries to be used by gen*.
-# If we are not cross-building, gen* use the same .o's that cc1 will use,
-# and HOST_PREFIX_1 is `foobar', just to ensure these rules don't conflict
-# with the rules for rtl.o, alloca.o, etc.
-$(HOST_PREFIX_1)rtl.o: $(srcdir)/rtl.c $(CONFIG_H) system.h $(RTL_H) bitmap.h
- cp $(srcdir)/rtl.c $(HOST_PREFIX)rtl.c
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)rtl.c
-
-$(HOST_PREFIX_1)print-rtl.o: $(srcdir)/print-rtl.c $(CONFIG_H) $(RTL_H)
- cp $(srcdir)/print-rtl.c $(HOST_PREFIX)print-rtl.c
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)print-rtl.c
-
-$(HOST_PREFIX_1)bitmap.o: $(srcdir)/bitmap.c $(CONFIG_H) system.h $(RTL_H) \
- flags.h $(BASIC_BLOCK_H) $(REGS_H)
- cp $(srcdir)/bitmap.c $(HOST_PREFIX)bitmap.c
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)bitmap.c
-
-$(HOST_PREFIX_1)rtlanal.o: $(srcdir)/rtlanal.c $(CONFIG_H) $(RTL_H)
- cp $(srcdir)/rtlanal.c $(HOST_PREFIX)rtlanal.c
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)rtlanal.c
-
-$(HOST_PREFIX_1)obstack.o: $(srcdir)/../libiberty/obstack.c
- cp $(srcdir)/../libiberty/obstack.c $(HOST_PREFIX)obstack.c
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)obstack.c
-
-# This satisfies the dependency that we get if you cross-compile a compiler
-# that does not need to compile alloca, malloc or whatever.
-$(HOST_PREFIX_1):
- touch $(HOST_PREFIX_1)
-
-#
-# Remake cpp.
-
-LIBCPP_OBJS = cpplib.o cpphash.o cppalloc.o cpperror.o cppexp.o cppfiles.o \
- prefix.o version.o \
- mbchar.o
-
-# All the other archives built/used by this makefile are for targets. This
-# one is strictly for the host.
-#
-libcpp.a: $(LIBCPP_OBJS)
- $(AR) $(AR_FLAGS) libcpp.a $(LIBCPP_OBJS)
- if $(RANLIB_TEST) ; then $(RANLIB) libcpp.a ; else true ; fi
-
-cpp$(exeext): cppmain.o libcpp.a $(LIBDEPS)
- $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o cpp$(exeext) cppmain.o \
- libcpp.a
-
-cppmain.o: cppmain.c $(CONFIG_H) cpplib.h machmode.h system.h
-
-cpplib.o: cpplib.c $(CONFIG_H) cpplib.h machmode.h cpphash.h config.status \
- system.h prefix.h Makefile
- $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
- -DGCC_INCLUDE_DIR=\"$(libsubdir)/include\" \
- -DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \
- -DLOCAL_INCLUDE_DIR=\"$(includedir)\" \
- -DCROSS_INCLUDE_DIR=\"$(gcc_tooldir)/sys-include\" \
- -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
- -c `echo $(srcdir)/cpplib.c | sed 's,^\./,,'`
-
-cpperror.o: cpperror.c $(CONFIG_H) cpplib.h machmode.h system.h
-
-cppexp.o: cppexp.c $(CONFIG_H) cpplib.h machmode.h system.h
-
-cppfiles.o: cppfiles.c $(CONFIG_H) cpplib.h machmode.h system.h
-
-cpphash.o: cpphash.c cpplib.h machmode.h cpphash.h $(CONFIG_H) system.h
-
-cppalloc.o: cppalloc.c $(CONFIG_H) cpplib.h machmode.h system.h
-
-# Build the include directory. The stamp files are stmp-* rather than
-# s-* so that mostlyclean does not force the include directory to
-# be rebuilt.
-
-# Build the include directory
-stmp-int-hdrs: $(USER_H)
-# Copy in the headers provided with gcc.
- rm -rf include
- mkdir include
- for file in .. $(USER_H); do \
- if [ X$$file != X.. ]; then \
- realfile=`basename $$file`; \
- cp $$file include; \
- chmod a+r include/$$realfile; \
- fi; \
- done
-
-# The semicolon is to prevent the install.sh -> install default rule
-# from doing anything. Having it run true helps avoid problems and
-# noise from versions of make which don't like to have null commands.
-install: $(INSTALL_TARGET) ; @true
-
-# Copy the compiler files into directories where they will be run.
-# Install the driver last so that the window when things are
-# broken is small.
-# CYGNUS LOCAL: install-info done separately.
-install-normal: install-common $(INSTALL_HEADERS) $(INSTALL_LIBGCC) install-driver
-
-# Do nothing while making gcc with a cross-compiler. The person who
-# makes gcc for the target machine has to know how to put a complete
-# gcc together by hand.
-install-build: force
- @echo You have to install gcc on your target machine by hand.
-
-# Create the installation directories.
-installdirs:
- -if [ -d $(prefix) ] ; then true ; else mkdir $(prefix) ; chmod a+rx $(prefix) ; fi
- -if [ -d $(exec_prefix) ] ; then true ; else mkdir $(exec_prefix) ; chmod a+rx $(exec_prefix) ; fi
- -if [ -d $(libdir) ] ; then true ; else mkdir $(libdir) ; chmod a+rx $(libdir) ; fi
- -if [ -d $(libdir)/gcc-lib ] ; then true ; else mkdir $(libdir)/gcc-lib ; chmod a+rx $(libdir)/gcc-lib ; fi
-# This dir isn't currently searched by cpp.
-# -if [ -d $(libdir)/gcc-lib/include ] ; then true ; else mkdir $(libdir)/gcc-lib/include ; chmod a+rx $(libdir)/gcc-lib/include ; fi
- -fdir= ; for dir in `echo $(libsubdir) | tr '/' ' '`; do \
- fdir=$${fdir}/$${dir}; \
- if [ -d $${fdir} ] ; then true ; else mkdir $${fdir}; chmod a+rx $${fdir}; fi ; \
- done
- -if [ -d $(bindir) ] ; then true ; else mkdir $(bindir) ; chmod a+rx $(bindir) ; fi
- -if [ -d $(includedir) ] ; then true ; else mkdir $(includedir) ; chmod a+rx $(includedir) ; fi
- -if [ -d $(gcc_tooldir) ] ; then true ; else mkdir $(gcc_tooldir) ; chmod a+rx $(gcc_tooldir) ; fi
-# We don't use mkdir -p to create the parents of man1dir,
-# because some systems don't support it.
-# Instead, we use this technique to create the immediate parent of man1dir.
- -parent=`echo $(man1dir)|sed -e 's@/[^/]*$$@@'`; \
- if [ -d $$parent ] ; then true ; else mkdir $$parent ; chmod a+rx $$parent ; fi
- -if [ -d $(man1dir) ] ; then true ; else mkdir $(man1dir) ; chmod a+rx $(man1dir) ; fi
-
-# Install the compiler executables built during cross compilation.
-install-common: native installdirs
- for file in $(COMPILERS); do \
- if [ -f $$file ] ; then \
- rm -f $(libsubdir)/$$file; \
- $(INSTALL_PROGRAM) $$file $(libsubdir)/$$file; \
- else true; \
- fi; \
- done
- -rm -f $(libsubdir)/cpp$(exeext)
- $(INSTALL_PROGRAM) cpp$(exeext) $(libsubdir)/cpp$(exeext)
-# Don't mess with specs if it doesn't exist yet.
- -if [ -f specs ] ; then \
- rm -f $(libsubdir)/specs; \
- $(INSTALL_DATA) specs $(libsubdir)/specs; \
- chmod a-x $(libsubdir)/specs; \
- fi
-
-# Install the driver program as $(target_alias)-gcc
-# and also as either gcc (if native) or $(gcc_tooldir)/bin/gcc.
-install-driver: xgcc$(exeext)
- -if [ -f gcc-cross$(exeext) ] ; then \
- rm -f $(bindir)/$(GCC_CROSS_NAME)$(exeext); \
- $(INSTALL_PROGRAM) gcc-cross$(exeext) $(bindir)/$(GCC_CROSS_NAME)$(exeext); \
- if [ -d $(gcc_tooldir)/bin/. ] ; then \
- rm -f $(gcc_tooldir)/bin/gcc$(exeext); \
- $(INSTALL_PROGRAM) gcc-cross$(exeext) $(gcc_tooldir)/bin/gcc$(exeext); \
- else true; fi; \
- else \
- rm -f $(bindir)/$(GCC_INSTALL_NAME)$(exeext); \
- $(INSTALL_PROGRAM) xgcc$(exeext) $(bindir)/$(GCC_INSTALL_NAME)$(exeext); \
- rm -f $(bindir)/$(target_alias)-gcc-1$(exeext); \
- $(LN) $(bindir)/$(GCC_INSTALL_NAME)$(exeext) $(bindir)/$(target_alias)-gcc-1$(exeext); \
- mv $(bindir)/$(target_alias)-gcc-1$(exeext) $(bindir)/$(target_alias)-gcc$(exeext); \
- fi
-
-# Install the library.
-install-libgcc: libgcc.a installdirs
- -if [ -f libgcc.a ] ; then \
- rm -f $(libsubdir)/libgcc.a; \
- $(INSTALL_DATA) libgcc.a $(libsubdir)/libgcc.a; \
- if $(RANLIB_TEST_FOR_TARGET) ; then \
- (cd $(libsubdir); $(RANLIB_FOR_TARGET) libgcc.a); else true; fi; \
- chmod a-x $(libsubdir)/libgcc.a; \
- else true; fi
-
-# Install multiple versions of libgcc.a.
-install-multilib: stmp-multilib installdirs
- for i in `$(GCC_FOR_TARGET) --print-multi-lib`; do \
- dir=`echo $$i | sed -e 's/;.*$$//'`; \
- if [ -d $(libsubdir)/$${dir} ]; then true; else mkdir $(libsubdir)/$${dir}; fi; \
- for f in libgcc.a $(EXTRA_MULTILIB_PARTS); do \
- rm -f $(libsubdir)/$${dir}/$${f}; \
- $(INSTALL_DATA) $${dir}/$${f} $(libsubdir)/$${dir}/$${f}; \
- done; \
- if $(RANLIB_TEST_FOR_TARGET); then \
- (cd $(libsubdir)/$${dir}; $(RANLIB_FOR_TARGET) libgcc.a); \
- else true; fi; \
- chmod a-x $(libsubdir)/$${dir}/libgcc.a; \
- done
-
-# Install all the header files built in the include subdirectory.
-install-headers: install-include-dir $(INSTALL_HEADERS_DIR)
-# Fix symlinks to absolute paths in the installed include directory to
-# point to the installed directory, not the build directory.
-# Don't need to use LN_S here since we really do need ln -s and no substitutes.
- -files=`cd $(libsubdir)/include; find . -type l -print 2>/dev/null`; \
- if [ $$? -eq 0 ]; then \
- dir=`cd include; pwd`; \
- for i in $$files; do \
- dest=`ls -ld $(libsubdir)/include/$$i | sed -n 's/.*-> //p'`; \
- if expr "$$dest" : "$$dir.*" > /dev/null; then \
- rm -f $(libsubdir)/include/$$i; \
- ln -s `echo $$i | sed "s|/[^/]*|/..|g" | sed 's|/..$$||'``echo "$$dest" | sed "s|$$dir||"` $(libsubdir)/include/$$i; \
- fi; \
- done; \
- fi
-
-# Create or recreate the gcc private include file directory.
-install-include-dir: installdirs
- -rm -rf $(libsubdir)/include
- mkdir $(libsubdir)/include
- -chmod a+rx $(libsubdir)/include
-
-# Install the include directory using tar.
-install-headers-tar: stmp-int-hdrs install-include-dir
-# We use `pwd`/include instead of just include to problems with CDPATH
-# Unless a full pathname is provided, some shells would print the new CWD,
-# found in CDPATH, corrupting the output. We could just redirect the
-# output of `cd', but some shells lose on redirection within `()'s
- (cd `pwd`/include ; \
- tar -cf - .; exit 0) | (cd $(libsubdir)/include; tar xpf - )
-# /bin/sh on some systems returns the status of the first tar,
-# and that can lose with GNU tar which always writes a full block.
-# So use `exit 0' to ignore its exit status.
-
-# Cancel installation by deleting the installed files.
-uninstall:
- -rm -rf $(libsubdir)
- -rm -rf $(bindir)/$(GCC_INSTALL_NAME)$(exeext)
- -rm -rf $(bindir)/$(GCC_CROSS_NAME)$(exeext)
- -rm -rf $(man1dir)/$(GCC_INSTALL_NAME)$(manext)
- -rm -rf $(man1dir)/$(GCC_CROSS_NAME)$(manext)
-
-#In GNU Make, ignore whether `stage*' exists.
-.PHONY: stage1 stage2 stage3 stage4 clean maintainer-clean TAGS bootstrap
-.PHONY: risky-stage1 risky-stage2 risky-stage3 risky-stage4
-
-force:
diff --git a/gcc/NEWS b/gcc/NEWS
deleted file mode 100755
index af07d2d..0000000
--- a/gcc/NEWS
+++ /dev/null
@@ -1,1078 +0,0 @@
-Noteworthy Cygnus only changes for GCC.
-If you do not set the GCC_EXEC_PREFIX environment variable, the compiler will
-try to figure out an appropriate prefix to use from the pathname it was invoked
-by. This means as long as your shell fills in the entire pathname when
-starting gcc, you can move the entire installation tree (binaries, libraries,
-etc.) to another directory, without having to rebuild the compiler.
-
-Noteworthy changes in GCC after EGCS 1.1.
------------------------------------------
-
-Target specific NEWS
-
- RS6000/PowerPC: -mcpu=401 was added as an alias for -mcpu=403. -mcpu=e603e
- was added to do -mcpu=603e and -msoft-float.
-
-Noteworthy changes in GCC for EGCS 1.1.
----------------------------------------
-
-The compiler now implements global common subexpression elimination (gcse) as
-well as global constant/copy propagation. (link to gcse page).
-
-More major improvements have been made to the alias analysis code. A new
-option to allow front-ends to provide alias information to the optimizers
-has also been added (-fstrict-aliasing). -fstrict-aliasing is off by default
-now, but will be enabled by default in the future. (link to alias page)
-
-Major changes continue in the exception handling support. This release
-includes some changes to reduce static overhead for exception handling. It
-also includes some major changes to the setjmp/longjmp based EH mechanism to
-make it less pessimistic. And finally, major infrastructure improvements
-to the dwarf2 EH mechanism have been made to make our EH support extensible.
-
-We have fixed the infamous security problems with temporary files.
-
-The "regmove" optimization pass has been nearly completely rewritten. It now
-uses much more information about the target to determine profitability of
-transformations.
-
-The compiler now recomputes register usage information immediately before
-register allocation. Previously such information was only not kept up to
-date after instruction combination which led to poor register allocation
-choices by our priority based register allocator.
-
-The register reloading phase of the compiler has been improved to better
-optimize spill code. This primarily helps targets which generate lots of
-spills (like the x86 ports and many register poor embedded ports).
-
-A few changes in the heuristics used by the register allocator and scheduler
-have been made which can significantly improve performance for certain
-applications.
-
-The compiler's branch shortening algorithms have been significantly improved
-to work better on targets which align jump targets.
-
-The compiler now supports the "ADDRESSOF" optimization which can significantly
-reduce the overhead for certain inline calls (and inline calls in general).
-
-The compiler now supports a code size optimization switch (-Os). When enabled
-the compiler will prefer optimizations which improve code size over those
-which improve code speed.
-
-The compiler has been improved to completely eliminate library calls which
-compute constant values. This is particularly useful on machines which
-do not have integer mul/div or floating point support on-chip.
-
-GCC now supports a "--help" option to print detailed help information.
-
-cpplib has been greatly improved. It is probably useable for some sites now
-(major missing feature is trigraphs).
-
-Memory footprint for the compiler has been significantly reduced for certain
-pathalogical cases.
-
-Build time improvements for targets which support lots of sched parameters
-(alpha and mips primarily).
-
-Compile time for certain programs using large constant initializers has been
-improved (effects glibc significantly).
-
-Plus an incredible number of infrastructure changes, warning fixes, bugfixes
-and local optimizations.
-
-Various improvements have been made to better support cross compilations. They
-are still not easy, but they are improving.
-
-Target specific NEWS
-
- Sparc: Now includes V8 plus and V9 support, lots of tuning for Ultrasparcs
- and uses the Haifa scheduler by default.
-
- Alpha: EV6 tuned, optimized expansion of memcpy/bzero.
-
- x86: Data in the static store is aligned per Intel recommendations. Jump
- targets are aligned per Intel recommendations. Improved epilogue
- sequences for Pentium chips. Backend improvements which should help
- register allocation on all x86 variants. Support for PPro conditional
- move instructions has been fixed and enabled. Random changes
- throughout the port to make generated code more Pentium friendly.
- Improved support for 64bit integer operations.
- Unixware 7, a System V Release 5 target is now supported.
- SCO OpenServer targets can support GAS. See gcc/INSTALL for details.
-
- RS6000/PowerPC: Includes AIX4.3 support as well as PowerPC64 support.
- Haifa instruction scheduling is enabled by default now.
-
- MIPS: Multiply/Multiply-Add support has been largely rewritten to generate
- more efficient code. Includes mips16 support.
-
- M68K: Various micro-optimizations and Coldfire fixes.
-
- M32r: Major improvements to this port.
-
- Arm: Includes Thumb and super interworking support.
-
-EGCS includes all gcc2 changes up to and including the June 9, 1998 snapshot.
-
-
-Noteworthy changes in GCC version 2.8.1
----------------------------------------
-
-Numerous bugs have been fixed and some minor performance
-improvements (compilation speed) have been made.
-
-Noteworthy changes in GCC version 2.8.0
----------------------------------------
-
-A major change in this release is the addition of a framework for
-exception handling, currently used by C++. Many internal changes and
-optimization improvements have been made. These increase the
-maintainability and portability of GCC. GCC now uses autoconf to
-compute many host parameters.
-
-The following lists changes that add new features or targets.
-
-See cp/NEWS for new features of C++ in this release.
-
-New tools and features:
-
- The Dwarf 2 debugging information format is supported on ELF systems, and
- is the default for -ggdb where available. It can also be used for C++.
- The Dwarf version 1 debugging format is also permitted for C++, but
- does not work well.
-
- gcov.c is provided for test coverage analysis and branch profiling
- analysis is also supported; see -fprofile-arcs, -ftest-coverage,
- and -fbranch-probabilities.
-
- Support for the Checker memory checking tool.
-
- New switch, -fstack-check, to check for stack overflow on systems that
- don't have such built into their ABI.
-
- New switches, -Wundef and -Wno-undef to warn if an undefined identifier
- is evaluated in an #if directive.
-
- Options -Wall and -Wimplicit now cause GCC to warn about implicit int
- in declarations (e.g. `register i;'), since the C Standard committee
- has decided to disallow this in the next revision of the standard;
- -Wimplicit-function-declarations and -Wimplicit-int are subsets of
- this.
-
- Option -Wsign-compare causes GCC to warn about comparison of signed and
- unsigned values.
-
- Add -dI option of cccp for cxref.
-
-New features in configuration, installation and specs file handling:
-
- New option --enable-c-cpplib to configure script.
-
- You can use --with-cpu on the configure command to specify the default
- CPU that GCC should generate code for.
-
- The -specs=file switch allows you to override default specs used in
- invoking programs like cc1, as, etc.
-
- Allow including one specs file from another and renaming a specs
- variable.
-
- You can now relocate all GCC files with a single environment variable
- or a registry entry under Windows 95 and Windows NT.
-
-Changes in Objective-C:
-
- The Objective-C Runtime Library has been made thread-safe.
-
- The Objective-C Runtime Library contains an interface for creating
- mutexes, condition mutexes, and threads; it requires a back-end
- implementation for the specific platform and/or thread package.
- Currently supported are DEC/OSF1, IRIX, Mach, OS/2, POSIX, PCThreads,
- Solaris, and Windows32. The --enable-threads parameter can be used
- when configuring GCC to enable and select a thread back-end.
-
- Objective-C is now configured as separate front-end language to GCC,
- making it more convenient to conditionally build it.
-
- The internal structures of the Objective-C Runtime Library have
- changed sufficiently to warrant a new version number; now version 8.
- Programs compiled with an older version must be recompiled.
-
- The Objective-C Runtime Library can be built as a DLL on Windows 95
- and Windows NT systems.
-
- The Objective-C Runtime Library implements +load.
-
-The following new targets are supported (see also list under each
-individual CPU below):
-
- Embedded target m32r-elf.
- Embedded Hitachi Super-H using ELF.
- RTEMS real-time system on various CPU targets.
- ARC processor.
- NEC V850 processor.
- Matsushita MN10200 processor.
- Matsushita MN10300 processor.
- Sparc and PowerPC running on VxWorks.
- Support both glibc versions 1 and 2 on Linux-based GNU systems.
-
-New features for DEC Alpha systems:
-
- Allow detailed specification of IEEE fp support:
- -mieee, -mieee-with-inexact, and -mieee-conformant
- -mfp-trap-mode=xxx, -mfp-round-mode=xxx, -mtrap-precision=xxx
- -mcpu=xxx for CPU selection
- Support scheduling parameters for EV5.
- Add support for BWX, CIX, and MAX instruction set extensions.
- Support Linux-based GNU systems.
- Support VMS.
-
-Additional supported processors and systems for MIPS targets:
-
- MIPS4 instruction set.
- R4100, R4300 and R5000 processors.
- N32 and N64 ABI.
- IRIX 6.2.
- SNI SINIX.
-
-New features for Intel x86 family:
-
- Add scheduling parameters for Pentium and Pentium Pro.
- Support stabs on Solaris-x86.
- Intel x86 processors running the SCO OpenServer 5 family.
- Intel x86 processors running DG/UX.
- Intel x86 using Cygwin32 or Mingw32 on Windows 95 and Windows NT.
-
-New features for Motorola 68k family:
-
- Support for 68060 processor.
- More consistent switches to specify processor.
- Motorola 68k family running AUX.
- 68040 running pSOS, ELF object files, DBX debugging.
- Coldfire variant of Motorola m68k family.
-
-New features for the HP PA RISC:
-
- -mspace and -mno-space
- -mlong-load-store and -mno-long-load-store
- -mbig-switch -mno-big-switch
-
- GCC on the PA requires either gas-2.7 or the HP assembler; for best
- results using GAS is highly recommended. GAS is required for -g and
- exception handling support.
-
-New features for SPARC-based systems:
-
- The ultrasparc cpu.
- The sparclet cpu, supporting only a.out file format.
- Sparc running SunOS 4 with the GNU assembler.
- Sparc running the Linux-based GNU system.
- Embedded Sparc processors running the ELF object file format.
- -mcpu=xxx
- -mtune=xxx
- -malign-loops=xxx
- -malign-jumps=xxx
- -malign-functions=xxx
- -mimpure-text and -mno-impure-text
-
- Options -mno-v8 and -mno-sparclite are no longer supported on SPARC
- targets. Options -mcypress, -mv8, -msupersparc, -msparclite, -mf930,
- and -mf934 are deprecated and will be deleted in GCC 2.9. Use
- -mcpu=xxx instead.
-
-New features for rs6000 and PowerPC systems:
-
- Solaris 2.51 running on PowerPC's.
- The Linux-based GNU system running on PowerPC's.
- -mcpu=604e,602,603e,620,801,823,mpc505,821,860,power2
- -mtune=xxx
- -mrelocatable-lib, -mno-relocatable-lib
- -msim, -mmve, -memb
- -mupdate, -mno-update
- -mfused-madd, -mno-fused-madd
-
- -mregnames
- -meabi
- -mcall-linux, -mcall-solaris, -mcall-sysv-eabi, -mcall-sysv-noeabi
- -msdata, -msdata=none, -msdata=default, -msdata=sysv, -msdata=eabi
- -memb, -msim, -mmvme
- -myellowknife, -mads
- wchar_t is now of type long as per the ABI, not unsigned short.
- -p/-pg support
- -mcpu=403 now implies -mstrict-align.
- Implement System V profiling.
-
- Aix 4.1 GCC targets now default to -mcpu=common so that programs
- compiled can be moved between rs6000 and powerpc based systems. A
- consequence of this is that -static won't work, and that some programs
- may be slightly slower.
-
- You can select the default value to use for -mcpu=xxx on rs6000 and
- powerpc targets by using the --with-cpu=xxx option when configuring the
- compiler. In addition, a new options, -mtune=xxx was added that
- selects the machine to schedule for but does not select the
- architecture level.
-
- Directory names used for storing the multilib libraries on System V
- and embedded PowerPC systems have been shortened to work with commands
- like tar that have fixed limits on pathname size.
-
-New features for the Hitachi H8/300(H):
-
- -malign-300
- -ms (for the Hitachi H8/S processor)
- -mint32
-
-New features for the ARM:
-
- -march=xxx, -mtune=xxx, -mcpu=xxx
- Support interworking with Thumb code.
- ARM processor with a.out object format, COFF, or AOF assembler.
- ARM on "semi-hosted" platform.
- ARM running NetBSD.
- ARM running the Linux-based GNU system.
-
-New feature for Solaris systems:
-
- GCC installation no longer makes a copy of system include files,
- thus insulating GCC better from updates to the operating system.
-
-
-Noteworthy changes in GCC version 2.7.2
----------------------------------------
-
-A few bugs have been fixed (most notably the generation of an
-invalid assembler opcode on some RS/6000 systems).
-
-Noteworthy changes in GCC version 2.7.1
----------------------------------------
-
-This release fixes numerous bugs (mostly minor) in GCC 2.7.0, but
-also contains a few new features, mostly related to specific targets.
-
-Major changes have been made in code to support Windows NT.
-
-The following new targets are supported:
-
- 2.9 BSD on PDP-11
- Linux on m68k
- HP/UX version 10 on HP PA RISC (treated like version 9)
- DEC Alpha running Windows NT
-
-When parsing C, GCC now recognizes C++ style `//' comments unless you
-specify `-ansi' or `-traditional'.
-
-The PowerPC System V targets (powerpc-*-sysv, powerpc-*-eabi) now use the
-calling sequence specified in the System V Application Binary Interface
-Processor Supplement (PowerPC Processor ABI Supplement) rather than the calling
-sequence used in GCC version 2.7.0. That calling sequence was based on the AIX
-calling sequence without function descriptors. To compile code for that older
-calling sequence, either configure the compiler for powerpc-*-eabiaix or use
-the -mcall-aix switch when compiling and linking.
-
-Noteworthy changes in GCC version 2.7.0
----------------------------------------
-
-GCC now works better on systems that use ".obj" and ".exe" instead of
-".o" and no extension. This involved changes to the driver program,
-gcc.c, to convert ".o" names to ".obj" and to GCC's Makefile to use
-".obj" and ".exe" in filenames that are not targets. In order to
-build GCC on such systems, you may need versions of GNU make and/or
-compatible shells. At this point, this support is preliminary.
-
-Object file extensions of ".obj" and executable file extensions of
-".exe" are allowed when using appropriate version of GNU Make.
-
-Numerous enhancements were made to the __attribute__ facility including
-more attributes and more places that support it. We now support the
-"packed", "nocommon", "noreturn", "volatile", "const", "unused",
-"transparent_union", "constructor", "destructor", "mode", "section",
-"align", "format", "weak", and "alias" attributes. Each of these
-names may also be specified with added underscores, e.g., "__packed__".
-__attribute__ may now be applied to parameter definitions, function
-definitions, and structure, enum, and union definitions.
-
-GCC now supports returning more structures in registers, as specified by
-many calling sequences (ABIs), such as on the HP PA RISC.
-
-A new option '-fpack-struct' was added to automatically pack all structure
-members together without holes.
-
-There is a new library (cpplib) and program (cppmain) that at some
-point will replace cpp (aka cccp). To use cppmain as cpp now, pass
-the option CCCP=cppmain to make. The library is already used by the
-fix-header program, which should speed up the fixproto script.
-
-New options for supported targets:
-
- GNU on many targets.
- NetBSD on MIPS, m68k, VAX, and x86.
- LynxOS on x86, m68k, Sparc, and RS/6000.
- VxWorks on many targets.
-
- Windows/NT on x86 architecture. Initial support for Windows/NT on Alpha
- (not fully working).
-
- Many embedded targets, specifically UDI on a29k, aout, coff, elf,
- and vsta "operating systems" on m68k, m88k, mips, sparc, and x86.
-
-Additional support for x86 (i386, i486, and Pentium):
-
- Work with old and new linkers for Linux-based GNU systems,
- supporting both a.out and ELF.
- FreeBSD on x86.
- Stdcall convention.
- -malign-double, -mregparm=, -malign-loops= and -malign-jumps= switches.
- On ISC systems, support -Xp like -posix.
-
-Additions for RS/6000:
-
- Instruction scheduling information for PowerPC 403.
- AIX 4.1 on PowerPC.
- -mstring and -mno-string.
- -msoft-float and floating-point emulation included.
- Preliminary support for PowerPC System V.4 with or without the GNU as.
- Preliminary support for EABI.
- Preliminary support for 64-bit systems.
- Both big and little endian systems.
-
-New features for MIPS-based systems:
-
- r4650.
- mips4 and R8000.
- Irix 6.0.
- 64-bit ABI.
- Allow dollar signs in labels on SGI/Irix 5.x.
-
-New support for HP PA RISC:
-
- Generation of PIC (requires binutils-2.5.2.u6 or later).
- HP-UX version 9 on HP PA RISC (dynamically links even with -g).
- Processor variants for HP PA RISC: 700, 7100, and 7100LC.
- Automatic generation of long calls when needed.
- -mfast-indirect-calls for kernels and static binaries.
-
- The called routine now copies arguments passed by invisible reference,
- as required by the calling standard.
-
-Other new miscellaneous target-specific support:
-
- -mno-multm on a29k.
- -mold-align for i960.
- Configuration for "semi-hosted" ARM.
- -momit-leaf-frame-pointer for M88k.
- SH3 variant of Hitachi Super-H and support both big and little endian.
-
-Changes to Objective-C:
-
- Bare-bones implementation of NXConstantString has been added,
- which is invoked by the @"string" directive.
-
- Class * has been changed to Class to conform to the NextSTEP and
- OpenStep runtime.
-
- Enhancements to make dynamic loading easier.
-
- The module version number has been updated to Version 7, thus existing
- code will need to be recompiled to use the current run-time library.
-
-GCC now supports the ISO Normative Addendum 1 to the C Standard.
-As a result:
-
- The header <iso646.h> defines macros for C programs written
- in national variants of ISO 646.
-
- The following digraph tokens are supported:
- <: :> <% %> %: %:%:
- These behave like the following, respectively:
- [ ] { } # ##
-
- Digraph tokens are supported unless you specify the `-traditional'
- option; you do not need to specify `-ansi' or `-trigraphs'. Except
- for contrived and unlikely examples involving preprocessor
- stringizing, digraph interpretation doesn't change the meaning of
- programs; this is unlike trigraph interpretation, which changes the
- meanings of relatively common strings.
-
- The macro __STDC_VERSION__ has the value 199409L.
-
- As usual, for full conformance to the standard, you also need a
- C library that conforms.
-
-The following lists changes that have been made to g++. If some
-features mentioned below sound unfamiliar, you will probably want to
-look at the recently-released public review copy of the C++ Working
-Paper. For PostScript and PDF (Adobe Acrobat) versions, see the
-archive at ftp://research.att.com/dist/stdc++/WP. For HTML and ASCII
-versions, see ftp://ftp.cygnus.com/pub/g++. On the web, see
-http://www.cygnus.com/~mrs/wp-draft.
-
-The scope of variables declared in the for-init-statement has been changed
-to conform to http://www.cygnus.com/~mrs/wp-draft/stmt.html#stmt.for; as a
-result, packages such as groff 1.09 will not compile unless you specify the
--fno-for-scope flag. PLEASE DO NOT REPORT THIS AS A BUG; this is a change
-mandated by the C++ standardization committee.
-
-Binary incompatibilities:
-
- The builtin 'bool' type is now the size of a machine word on RISC targets,
- for code efficiency; it remains one byte long on CISC targets.
-
- Code that does not use #pragma interface/implementation will most
- likely shrink dramatically, as g++ now only emits the vtable for a
- class in the translation unit where its first non-inline, non-abstract
- virtual function is defined.
-
- Classes that do not define the copy constructor will sometimes be
- passed and returned in registers. This may illuminate latent bugs in
- your code.
-
-Support for automatic template instantiation has *NOT* been added, due
-to a disagreement over design philosophies.
-
-Support for exception handling has been improved; more targets are now
-supported, and throws will use the RTTI mechanism to match against the
-catch parameter type. Optimization is NOT SUPPORTED with
--fhandle-exceptions; no need to report this as a bug.
-
-Support for Run-Time Type Identification has been added with -frtti.
-This support is still in alpha; one major restriction is that any file
-compiled with -frtti must include <typeinfo.h>.
-
-Preliminary support for namespaces has been added. This support is far
-from complete, and probably not useful.
-
-Synthesis of compiler-generated constructors, destructors and
-assignment operators is now deferred until the functions are used.
-
-The parsing of expressions such as `a ? b : c = 1' has changed from
-`(a ? b : c) = 1' to `a : b ? (c = 1)'.
-
-The code generated for testing conditions, especially those using ||
-and &&, is now more efficient.
-
-The operator keywords and, and_eq, bitand, bitor, compl, not, not_eq,
-or, or_eq, xor and xor_eq are now supported. Use -ansi or
--foperator-names to enable them.
-
-The 'explicit' keyword is now supported. 'explicit' is used to mark
-constructors and type conversion operators that should not be used
-implicitly.
-
-g++ now accepts the typename keyword, though it currently has no
-semantics; it can be a no-op in the current template implementation.
-You may want to start using it in your code, however, since the
-pending rewrite of the template implementation to compile STL properly
-(perhaps for 2.8.0, perhaps not) will require you to use it as
-indicated by the current draft.
-
-Handling of user-defined type conversion has been overhauled so that
-type conversion operators are now found and used properly in
-expressions and function calls.
-
--fno-strict-prototype now only applies to function declarations with
-"C" linkage.
-
-g++ now warns about 'if (x=0)' with -Wparentheses or -Wall.
-
-#pragma weak and #pragma pack are supported on System V R4 targets, as
-are various other target-specific #pragmas supported by gcc.
-
-new and delete of const types is now allowed (with no additional
-semantics).
-
-Explicit instantiation of template methods is now supported. Also,
-'inline template class foo<int>;' can be used to emit only the vtable
-for a template class.
-
-With -fcheck-new, g++ will check the return value of all calls to
-operator new, and not attempt to modify a returned null pointer.
-
-The template instantiation code now handles more conversions when
-passing to a parameter that does not depend on template arguments.
-This means that code like 'string s; cout << s;' now works.
-
-Invalid jumps in a switch statement past declarations that require
-initializations are now caught.
-
-Functions declared 'extern inline' now have the same linkage semantics
-as inline member functions. On supported targets, where previously
-these functions (and vtables, and template instantiations) would have
-been defined statically, they will now be defined as weak symbols so
-that only one out-of-line definition is used.
-
-collect2 now demangles linker output, and c++filt has become part of
-the gcc distribution.
-
-Noteworthy changes in GCC version 2.6.3:
-
-A few more bugs have been fixed.
-
-Noteworthy changes in GCC version 2.6.2:
-
-A few bugs have been fixed.
-
-Names of attributes can now be preceded and followed by double underscores.
-
-Noteworthy changes in GCC version 2.6.1:
-
-Numerous (mostly minor) bugs have been fixed.
-
-The following new configurations are supported:
-
- GNU on x86 (instead of treating it like MACH)
- NetBSD on Sparc and Motorola 68k
- AIX 4.1 on RS/6000 and PowerPC systems
- Sequent DYNIX/ptx 1.x and 2.x.
- Both COFF and ELF configurations on AViiON without using /bin/gcc
- Windows/NT on x86 architecture; preliminary
- AT&T DSP1610 digital signal processor chips
- i960 systems on bare boards using COFF
- PDP11; target only and not extensively tested
-
-The -pg option is now supported for Alpha under OSF/1 V3.0 or later.
-
-Files with an extension of ".c++" are treated as C++ code.
-
-The -Xlinker and -Wl arguments are now passed to the linker in the
-position they were specified on the command line. This makes it
-possible, for example, to pass flags to the linker about specific
-object files.
-
-The use of positional arguments to the configure script is no longer
-recommended. Use --target= to specify the target; see the GCC manual.
-
-The 386 now supports two new switches: -mreg-alloc=<string> changes
-the default register allocation order used by the compiler, and
--mno-wide-multiply disables the use of the mul/imul instructions that
-produce 64 bit results in EAX:EDX from 32 bit operands to do long long
-multiplies and 32-bit division by constants.
-
-Noteworthy changes in GCC version 2.6.0:
-
-Numerous bugs have been fixed, in the C and C++ front-ends, as
-well as in the common compiler code.
-
-This release includes the C, Objective-C, and C++ compilers. However,
-we have moved the files for the C++ compiler (G++) files to a
-subdirectory, cp. Subsequent releases of GCC will split these files
-to a separate TAR file.
-
-The G++ team has been tracking the development of the ANSI standard for C++.
-Here are some new features added from the latest working paper:
-
- * built-in boolean type 'bool', with constants 'true' and 'false'.
- * array new and delete (operator new [] and delete []).
- * WP-conforming lifetime of temporaries.
- * explicit instantiation of templates (template class A<int>;),
- along with an option (-fno-implicit-templates) to disable emission
- of implicitly instantiated templates, obsoletes -fexternal-templates.
- * static member constants (static const int foo = 4; within the
- class declaration).
-
-Many error messages have been improved to tell the user more about the
-problem. Conformance checking with -pedantic-errors has been
-improved. G++ now compiles Fresco.
-
-There is now an experimental implementation of virtual functions using
-thunks instead of Cfront-style vtables, enabled with -fvtable-thunks.
-This option also enables a heuristic which causes the compiler to only
-emit the vtable in the translation unit where its first non-inline
-virtual function is defined; using this option and
--fno-implicit-templates, users should be able to avoid #pragma
-interface/implementation altogether.
-
-Signatures have been added as a GNU C++ extension. Using the option
--fhandle-signatures, users are able to turn on recognition of
-signatures. A short introduction on signatures is in the section
-`Extension to the C++ Language' in the manual.
-
-The `g++' program is now a C program, rather than a shell script.
-
-Lots and lots and lots of bugs fixes, in nested types, access control,
-pointers to member functions, the parser, templates, overload
-resolution, etc, etc.
-
-There have been two major enhancements to the Objective-C compiler:
-
-1) Added portability. It now runs on Alpha, and some problems with
- message forwarding have been addressed on other platforms.
-
-2) Selectors have been redefined to be pointers to structs like:
- { void *sel_id, char *sel_types }, where the sel_id is the unique
- identifier, the selector itself is no longer unique.
-
- Programmers should use the new function sel_eq to test selector
- equivalence.
-
-The following major changes have been made to the base compiler and
-machine-specific files.
-
-- The MIL-STD-1750A is a new port, but still preliminary.
-
-- The h8/300h is now supported; both the h8/300 and h8/300h ports come
- with 32 bit IEEE 754 software floating point support.
-
-- The 64-bit Sparc (v9) and 64-bit MIPS chips are supported.
-
-- NetBSD is supported on m68k, Intel x86, and pc523 systems and FreeBSD
- on x86.
-
-- COFF is supported on x86, m68k, and Sparc systems running LynxOS.
-
-- 68K systems from Bull and Concurrent are supported and System V
- Release 4 is supported on the Atari.
-
-- GCC supports GAS on the Motorola 3300 (sysV68) and debugging
- (assuming GAS) on the Plexus 68K system. (However, GAS does not yet
- work on those systems).
-
-- System V Release 4 is supported on MIPS (Tandem).
-
-- For DG/UX, an ELF configuration is now supported, and both the ELF
- and BCS configurations support ELF and COFF object file formats.
-
-- OSF/1 V2.0 is supported on Alpha.
-
-- Function profiling is also supported on Alpha.
-
-- GAS and GDB is supported for Irix 5 (MIPS).
-
-- "common mode" (code that will run on both POWER and PowerPC
- architectures) is now supported for the RS/6000 family; the
- compiler knows about more PPC chips.
-
-- Both NeXTStep 2.1 and 3 are supported on 68k-based architectures.
-
-- On the AMD 29k, the -msoft-float is now supported, as well as
- -mno-sum-in-toc for RS/6000, -mapp-regs and -mflat for Sparc, and
- -membedded-pic for MIPS.
-
-- GCC can now convert division by integer constants into the equivalent
- multiplication and shift operations when that is faster than the
- division.
-
-- Two new warning options, -Wbad-function-cast and
- -Wmissing-declarations have been added.
-
-- Configurations may now add machine-specific __attribute__ options on
- type; many machines support the `section' attribute.
-
-- The -ffast-math flag permits some optimization that violate strict
- IEEE rules, such as converting X * 0.0 to 0.0.
-
-Noteworthy changes in GCC version 2.5.8:
-
-This release only fixes a few serious bugs. These include fixes for a
-bug that prevented most programs from working on the RS/6000, a bug
-that caused invalid assembler code for programs with a `switch'
-statement on the NS32K, a G++ problem that caused undefined names in
-some configurations, and several less serious problems, some of which
-can affect most configuration.
-
-Noteworthy change in GCC version 2.5.7:
-
-This release only fixes a few bugs, one of which was causing bootstrap
-compare errors on some systems.
-
-Noteworthy change in GCC version 2.5.6:
-
-A few backend bugs have been fixed, some of which only occur on one
-machine.
-
-The C++ compiler in 2.5.6 includes:
-
- * fixes for some common crashes
- * correct handling of nested types that are referenced as `foo::bar'
- * spurious warnings about friends being declared static and never
- defined should no longer appear
- * enums that are local to a method in a class, or a class that's
- local to a function, are now handled correctly. For example:
- class foo { void bar () { enum { x, y } E; x; } };
- void bar () { class foo { enum { x, y } E; E baz; }; }
-
-Noteworthy change in GCC version 2.5.5:
-
-A large number of C++ bugs have been fixed.
-
-The fixproto script adds prototypes conditionally on __cplusplus.
-
-Noteworthy change in GCC version 2.5.4:
-
-A bug fix in passing of structure arguments for the HP-PA architecture
-makes code compiled with GCC 2.5.4 incompatible with code compiled
-with earlier versions (if it passes struct arguments of 33 to 64 bits,
-interspersed with other types of arguments).
-
-Noteworthy change in gcc version 2.5.3:
-
-The method of "mangling" C++ function names has been changed. So you
-must recompile all C++ programs completely when you start using GCC
-2.5. Also, GCC 2.5 requires libg++ version 2.5. Earlier libg++
-versions won't work with GCC 2.5. (This is generally true--GCC
-version M.N requires libg++ version M.N.)
-
-Noteworthy GCC changes in version 2.5:
-
-* There is now support for the IBM 370 architecture as a target.
-Currently the only operating system supported is MVS; GCC does not run
-on MVS, so you must produce .s files using GCC as a cross compiler,
-then transfer them to MVS to assemble them. This port is not reliable
-yet.
-
-* The Power PC is now supported.
-
-* The i860-based Paragon machine is now supported.
-
-* The Hitachi 3050 (an HP-PA machine) is now supported.
-
-* The variable __GNUC_MINOR__ holds the minor version number of GCC, as
-an integer. For version 2.5.X, the value is 5.
-
-* In C, initializers for static and global variables are now processed
-an element at a time, so that they don't need a lot of storage.
-
-* The C syntax for specifying which structure field comes next in an
-initializer is now `.FIELDNAME='. The corresponding syntax for
-array initializers is now `[INDEX]='. For example,
-
- char whitespace[256]
- = { [' '] = 1, ['\t'] = 1, ['\n'] = 1 };
-
-This was changed to accord with the syntax proposed by the Numerical
-C Extensions Group (NCEG).
-
-* Complex numbers are now supported in C. Use the keyword __complex__
-to declare complex data types. See the manual for details.
-
-* GCC now supports `long double' meaningfully on the Sparc (128-bit
-floating point) and on the 386 (96-bit floating point). The Sparc
-support is enabled on Solaris 2.x because earlier system versions
-(SunOS 4) have bugs in the emulation.
-
-* All targets now have assertions for cpu, machine and system. So you
-can now use assertions to distinguish among all supported targets.
-
-* Nested functions in C may now be inline. Just declare them inline
-in the usual way.
-
-* Packed structure members are now supported fully; it should be possible
-to access them on any supported target, no matter how little alignment
-they have.
-
-* To declare that a function does not return, you must now write
-something like this (works only in 2.5):
-
- void fatal () __attribute__ ((noreturn));
-
-or like this (works in older versions too):
-
- typedef void voidfn ();
-
- volatile voidfn fatal;
-
-It used to be possible to do so by writing this:
-
- volatile void fatal ();
-
-but it turns out that ANSI C requires that to mean something
-else (which is useless).
-
-Likewise, to declare that a function is side-effect-free
-so that calls may be deleted or combined, write
-something like this (works only in 2.5):
-
- int computation () __attribute__ ((const));
-
-or like this (works in older versions too):
-
- typedef int intfn ();
-
- const intfn computation;
-
-* The new option -iwithprefixbefore specifies a directory to add to
-the search path for include files in the same position where -I would
-put it, but uses the specified prefix just like -iwithprefix.
-
-* Basic block profiling has been enhanced to record the function the
-basic block comes from, and if the module was compiled for debugging,
-the line number and filename. A default version of the basic block
-support module has been added to libgcc2 that appends the basic block
-information to a text file 'bb.out'. Machine descriptions can now
-override the basic block support module in the target macro file.
-
-New features in g++:
-
-* The new flag `-fansi-overloading' for C++. Use a newly implemented
-scheme of argument matching for C++. It makes g++ more accurately
-obey the rules set down in Chapter 13 of the Annotated C++ Reference
-Manual (the ARM). This option will be turned on by default in a
-future release.
-
-* The -finline-debug flag is now gone (it was never really used by the
- compiler).
-
-* Recognizing the syntax for pointers to members, e.g., "foo::*bar", has been
- dramatically improved. You should not get any syntax errors or incorrect
- runtime results while using pointers to members correctly; if you do, it's
- a definite bug.
-
-* Forward declaration of an enum is now flagged as an error.
-
-* Class-local typedefs are now working properly.
-
-* Nested class support has been significantly improved. The compiler
- will now (in theory) support up to 240 nested classes before hitting
- other system limits (like memory size).
-
-* There is a new C version of the `g++' driver, to replace the old
- shell script. This should significantly improve the performance of
- executing g++ on a system where a user's PATH environment variable
- references many NFS-mounted filesystems. This driver also works
- under MS-DOS and OS/2.
-
-* The ANSI committee working on the C++ standard has adopted a new
- keyword `mutable'. This will allow you to make a specific member be
- modifiable in an otherwise const class.
-
-Noteworthy GCC changes in version 2.4.4:
-
- A crash building g++ on various hosts (including m68k) has been
- fixed. Also the g++ compiler no longer reports incorrect
- ambiguities in some situations where they do not exist, and
- const template member functions are now being found properly.
-
-Noteworthy GCC changes in version 2.4:
-
-* On each target, the default is now to return short structures
-compatibly with the "usual" compiler on that target.
-
-For most targets, this means the default is to return all structures
-in memory, like long structures, in whatever way is used on that
-target. Use -freg-struct-return to enable returning short structures
-(and unions) in registers.
-
-This change means that newly compiled binaries are incompatible with
-binaries compiled with previous versions of GCC.
-
-On some targets, GCC is itself the usual compiler. On these targets,
-the default way to return short structures is still in registers.
-Use -fpcc-struct-return to tell GCC to return them in memory.
-
-* There is now a floating point emulator which can imitate the way all
-supported target machines do floating point arithmetic.
-
-This makes it possible to have cross compilation to and from the VAX,
-and between machines of different endianness. However, this works
-only when the target machine description is updated to use the new
-facilities, and not all have been updated.
-
-This also makes possible support for longer floating point types.
-GCC 2.4 supports extended format on the 68K if you use `long double',
-for targets that have a 68881. (When we have run time library
-routines for extended floating point, then `long double' will use
-extended format on all 68K targets.)
-
-We expect to support extended floating point on the i386 and Sparc in
-future versions.
-
-* Building GCC now automatically fixes the system's header files.
-This should require no attention.
-
-* GCC now installs an unsigned data type as size_t when it fixes the
-header files (on all but a handful of old target machines).
-Therefore, the bug that size_t failed to be unsigned is fixed.
-
-* Building and installation are now completely separate.
-All new files are constructed during the build process;
-installation just copies them.
-
-* New targets supported: Clipper, Hitachi SH, Hitachi 8300, and Sparc
-Lite.
-
-* A totally new and much better Objective C run time system is included.
-
-* Objective C supports many new features. Alas, I can't describe them
-since I don't use that language; however, they are the same ones
-supported in recent versions of the NeXT operating system.
-
-* The builtin functions __builtin_apply_args, __builtin_apply and
-__builtin_return let you record the arguments and returned
-value of a function without knowing their number or type.
-
-* The builtin string variables __FUNCTION__ and __PRETTY_FUNCTION__
-give the name of the function in the source, and a pretty-printed
-version of the name. The two are the same in C, but differ in C++.
-
-* Casts to union types do not yield lvalues.
-
-* ## before an empty rest argument discards the preceding sequence
-of non-whitespace characters from the macro definition.
-(This feature is subject to change.)
-
-
-New features specific to C++:
-
-* The manual contains a new section ``Common Misunderstandings with
-GNU C++'' that C++ users should read.
-
-* #pragma interface and #pragma implementation let you use the same
-C++ source file for both interface and implementation.
-However, this mechanism is still in transition.
-
-* Named returned values let you avoid an extra constructor call
-when a function result has a class type.
-
-* The C++ operators <? and >? yield min and max, respectively.
-
-* C++ gotos can exit a block safely even if the block has
-aggregates that require destructors.
-
-* gcc defines the macro __GNUG__ when compiling C++ programs.
-
-* GNU C++ now correctly distinguishes between the prefix and postfix
-forms of overloaded operator ++ and --. To avoid breaking old
-code, if a class defines only the prefix form, the compiler
-accepts either ++obj or obj++, unless -pedantic is used.
-
-* If you are using version 2.3 of libg++, you need to rebuild it with
-`make CC=gcc' to avoid mismatches in the definition of `size_t'.
-
-Newly documented compiler options:
-
--fnostartfiles
- Omit the standard system startup files when linking.
-
--fvolatile-global
- Consider memory references to extern and global data items to
- be volatile.
-
--idirafter DIR
- Add DIR to the second include path.
-
--iprefix PREFIX
- Specify PREFIX for later -iwithprefix options.
-
--iwithprefix DIR
- Add PREFIX/DIR to the second include path.
-
--mv8
- Emit Sparc v8 code (with integer multiply and divide).
--msparclite
- Emit Sparclite code (roughly v7.5).
-
--print-libgcc-file-name
- Search for the libgcc.a file, print its absolute file name, and exit.
-
--Woverloaded-virtual
- Warn when a derived class function declaration may be an error
- in defining a C++ virtual function.
-
--Wtemplate-debugging
- When using templates in a C++ program, warn if debugging is
- not yet fully available.
-
-+eN
- Control how C++ virtual function definitions are used
- (like cfront 1.x).
-
diff --git a/gcc/PROBLEMS b/gcc/PROBLEMS
deleted file mode 100755
index bc532e6..0000000
--- a/gcc/PROBLEMS
+++ /dev/null
@@ -1,117 +0,0 @@
-3. When find_reloads is used to count number of spills needed
-it does not take into account the fact that a reload may
-turn out to be a dummy.
-
-I'm not sure this really happens any more. Doesn't it find
-all the dummies on both passes?
-
-10. movl a3@,a0
- movl a3@(16),a1
- clrb a0@(a1:l)
-is generated and may be worse than
- movl a3@,a0
- addl a3@(16),a0
- clrb a0@
-If ordering of operands is improved, many more
-such cases will be generated from typical array accesses.
-
-38. Hack expand_mult so that if there is no same-modes multiply
-it will use a widening multiply and then truncate rather than
-calling the library.
-
-39. Hack expanding of division to notice cases for
-long -> short division.
-
-40. Represent divide insns as (DIV:SI ...) followed by
-a separate lowpart extract. Represent remainder insns as DIV:SI
-followed by a separate highpart extract. Then cse can work on
-the DIV:SI part. Problem is, this may not be desirable on machines
-where computing the quotient alone does not necessarily give
-a remainder--such as the 68020 for long operands.
-
-52. Reloading can look at how reload_contents got set up.
-If it was copied from a register, just reload from that register.
-Otherwise, perhaps can change the previous insn to move the
-data via the reload reg, thus avoiding one memory ref.
-
-63. Potential problem in cc_status.value2, if it ever activates itself
-after a two-address subtraction (which currently cannot happen).
-It is supposed to compare the current value of the destination
-but eliminating it would use the results of the subtraction, equivalent
-to comparing the previous value of the destination.
-
-65. Should loops that neither start nor end with a break
-be rearranged to end with the last break?
-
-69. Define the floating point converting arithmetic instructions
-for the 68881.
-
-74. Combine loop opt with cse opt in one pass. Do cse on each loop,
-then loop opt on that loop, and go from innermost loops outward.
-Make loop invariants available for cse at end of loop.
-
-85. pea can force a value to be reloaded into an areg
-which can make it worse than separate adding and pushing.
-This can only happen for adding something within addql range
-and it only loses if the qty becomes dead at that point
-so it can be added to with no copying.
-
-93. If a pseudo doesn't get a hard reg everywhere,
-can it get one during a loop?
-
-96. Can do SImode bitfield insns without reloading, but must
-alter the operands in special ways.
-
-99. final could check loop-entry branches to see if they
-screw up deletion of a test instruction. If they do,
-can put another test instruction before the branch and
-make it conditional and redirect it.
-
-106. Aliasing may be impossible if data types of refs differ
-and data type of containing objects also differ.
-(But check this wrt unions.)
-
-108. Can speed up flow analysis by making a table saying which
-register is set and which registers are used by each instruction that
-only sets one register and only uses two. This way avoid the tree
-walk for such instructions (most instructions).
-
-109. It is desirable to avoid converting INDEX to SImode if a
-narrower mode suffices, as HImode does on the 68000.
-How can this be done?
-
-110. Possible special combination pattern:
-If the two operands to a comparison die there and both come from insns
-that are identical except for replacing one operand with the other,
-throw away those insns. Ok if insns being discarded are known 1 to 1.
-An andl #1 after a seq is 1 to 1, but how should compiler know that?
-
-112. Can convert float to unsigned int by subtracting a constant,
-converting to signed int, and changing the sign bit.
-
-117. Any number of slow zero-extensions in one loop, that have
-their clr insns moved out of the loop, can share one register
-if their original life spans are disjoint.
-But it may be hard to be sure of this since
-the life span data that regscan produces may be hard to interpret
-validly or may be incorrect after cse.
-
-118. In cse, when a bfext insn refers to a register, if the field
-corresponds to a halfword or a byte and the register is equivalent
-to a memory location, it would be possible to detect this and
-replace it with a simple memory reference.
-
-121. Insns that store two values cannot be moved out of loops.
-The code in scan_loop doesn't even try to deal with them.
-
-122. When insn-output.c turns a bit-test into a sign-test,
-it should see whether the cc is already set up with that sign.
-
-123. When a conditional expression is used as a function arg, it would
-be faster (and in some cases shorter) to push each alternative rather
-than compute in a register and push that. This would require
-being able to specify "push this" as a target for expand_expr.
-
-124. On the 386, bad code results from foo (bar ()) when bar
-returns a double, because the pseudo used fails to get preferenced
-into an fp reg because of the distinction between regs 8 and 9.
diff --git a/gcc/PROJECTS b/gcc/PROJECTS
deleted file mode 100755
index 6ff7a05..0000000
--- a/gcc/PROJECTS
+++ /dev/null
@@ -1,435 +0,0 @@
-Haifa scheduler (haifa-sched.c, loop.[ch], unroll.[ch], genattrtab.c):
-(contact law@cygnus.com before starting any serious haifa work)
-
- * Fix all the formatting problems. Simple, mindless work.
-
- * Fix/add comments throughout the code. Many of the comments are from
- the old scheduler and are out of date and misleading. Many new hunks
- of code don't have sufficient comments and documentation. Those which
- do have comments need to be rewritten to use complete sentences and
- proper formatting.
-
- * Someone needs make one (or more) passes over the scheduler as a whole to
- just clean it up. Try to move the machine dependent bits into the target
- files where they belong, avoid re-creating functions where or near
- equivalents already exist (ie is_conditional_branch and friends), etc., etc.
-
- * Document the new scheduling options. Remove those options which are
- not really useful (like reverse scheduling for example). In general
- the haifa scheduler adds _way_ too many options. I'm definitely of the
- opinion that gcc already has too many -foptions, and haifa doesn't help
- that situation.
-
- * Testing and benchmarking. We've converted a few ports to using the
- Haifa scheduler (hppa, sparc, ppc, alpha). We need to continue testing
- and benchmarking the new scheduler on additional targets.
-
- We need to have some kind of docs for how to best describe a machine to
- the haifa scheduler to get good performance. Some existing ports have
- been tuned to deal with the old scheduler -- they may need to be tuned
- to generate good schedules with haifa.
-
-
-
-Improvements to global cse and partial redundancy elimination:
-
-The current implementation of global cse uses partial redundancy elimination
-as described in Chow's thesis.
-
-Long term we want to use lazy code motion as the basis for partial redundancy
-elimination. lcm will find as many (or more) redunancies *and* it will
-place the remaining computations at computationally optimal placement points
-within the function. This reduces the number of redundant operations performed
-as well as reducing register lifetimes. My experiments have shown that the
-cases were the current PRE code hurts performance are greatly helped by using
-lazy code motion.
-
-lcm also provides the underlying framework for several additional optimizations
-such as shrink wrapping, spill code motion, dead store elimination, and generic
-load/store motion (all the other examples are subcases of load/store motion).
-
-It can probably also be used to improve the reg-stack pass of the compiler.
-
-Contact law@cygnus.com if you're interested in working on lazy code motion.
-
--------------
-
-The old PROJECTS file. Stuff I know has been done has been deleted.
-Stuff in progress has a contact name associated with it.
-has been
-
-1. Better optimization.
-
-* Constants in unused inline functions
-
-It would be nice to delay output of string constants so that string
-constants mentioned in unused inline functions are never generated.
-Perhaps this would also take care of string constants in dead code.
-
-The difficulty is in finding a clean way for the RTL which refers
-to the constant (currently, only by an assembler symbol name)
-to point to the constant and cause it to be output.
-
-* Optimize a sequence of if statements whose conditions are exclusive.
-
-It is possible to optimize
-
- if (x == 1) ...;
- if (x == 2) ...;
- if (x == 3) ...;
-
-into
-
- if (x == 1) ...;
- else if (x == 2) ...;
- else if (x == 3) ...;
-
-provided that x is not altered by the contents of the if statements.
-
-It's not certain whether this is worth doing. Perhaps programmers
-nearly always write the else's themselves, leaving few opportunities
-to improve anything.
-
-* Un-cse.
-
-Perhaps we should have an un-cse step right after cse, which tries to
-replace a reg with its value if the value can be substituted for the
-reg everywhere, if that looks like an improvement. Which is if the
-reg is used only a few times. Use rtx_cost to determine if the
-change is really an improvement.
-
-* Clean up how cse works.
-
-The scheme is that each value has just one hash entry. The
-first_same_value and next_same_value chains are no longer needed.
-
-For arithmetic, each hash table elt has the following slots:
-
-* Operation. This is an rtx code.
-* Mode.
-* Operands 0, 1 and 2. These point to other hash table elements.
-
-So, if we want to enter (PLUS:SI (REG:SI 30) (CONST_INT 104)), we
-first enter (CONST_INT 104) and find the entry that (REG:SI 30) now
-points to. Then we put these elts into operands 0 and 1 of a new elt.
-We put PLUS and SI into the new elt.
-
-Registers and mem refs would never be entered into the table as such.
-However, the values they contain would be entered. There would be a
-table indexed by regno which points at the hash entry for the value in
-that reg.
-
-The hash entry index now plays the role of a qty number.
-We still need qty_first_reg, reg_next_eqv, etc. to record which regs
-share a particular qty.
-
-When a reg is used whose contents are unknown, we need to create a
-hash table entry whose contents say "unknown", as a place holder for
-whatever the reg contains. If that reg is added to something, then
-the hash entry for the sum will refer to the "unknown" entry. Use
-UNKNOWN for the rtx code in this entry. This replaces make_new_qty.
-
-For a constant, a unique hash entry would be made based on the
-value of the constant.
-
-What about MEM? Each time a memory address is referenced, we need a
-qty (a hash table elt) to represent what is in it. (Just as for a
-register.) If this isn't known, create one, just as for a reg whose
-contents are unknown.
-
-We need a way to find all mem refs that still contain a certain value.
-Do this with a chain of hash elts (for memory addresses) that point to
-locations that hold the value. The hash elt for the value itself should
-point to the start of the chain. It would be good for the hash elt
-for an address to point to the hash elt for the contents of that address
-(but this ptr can be null if the contents have never been entered).
-
-With this data structure, nothing need ever be invalidated except
-the lists of which regs or mems hold a particular value. It is easy
-to see if there is a reg or mem that is equiv to a particular value.
-If the value is constant, it is always explicitly constant.
-
-* Support more general tail-recursion among different functions.
-
-This might be possible under certain circumstances, such as when
-the argument lists of the functions have the same lengths.
-Perhaps it could be done with a special declaration.
-
-You would need to verify in the calling function that it does not
-use the addresses of any local variables and does not use setjmp.
-
-* Put short statics vars at low addresses and use short addressing mode?
-
-Useful on the 68000/68020 and perhaps on the 32000 series,
-provided one has a linker that works with the feature.
-This is said to make a 15% speedup on the 68000.
-
-* Keep global variables in registers.
-
-Here is a scheme for doing this. A global variable, or a local variable
-whose address is taken, can be kept in a register for an entire function
-if it does not use non-constant memory addresses and (for globals only)
-does not call other functions. If the entire function does not meet
-this criterion, a loop may.
-
-The VAR_DECL for such a variable would have to have two RTL expressions:
-the true home in memory, and the pseudo-register used temporarily.
-It is necessary to emit insns to copy the memory location into the
-pseudo-register at the beginning of the function or loop, and perhaps
-back out at the end. These insns should have REG_EQUIV notes so that,
-if the pseudo-register does not get a hard register, it is spilled into
-the memory location which exists in any case.
-
-The easiest way to set up these insns is to modify the routine
-put_var_into_stack so that it does not apply to the entire function
-(sparing any loops which contain nothing dangerous) and to call it at
-the end of the function regardless of where in the function the
-address of a local variable is taken. It would be called
-unconditionally at the end of the function for all relevant global
-variables.
-
-For debugger output, the thing to do is to invent a new binding level
-around the appropriate loop and define the variable name as a register
-variable with that scope.
-
-* Live-range splitting.
-
-Currently a variable is allocated a hard register either for the full
-extent of its use or not at all. Sometimes it would be good to
-allocate a variable a hard register for just part of a function; for
-example, through a particular loop where the variable is mostly used,
-or outside of a particular loop where the variable is not used. (The
-latter is nice because it might let the variable be in a register most
-of the time even though the loop needs all the registers.)
-
-Contact meissner@cygnus.com before starting any work on live range
-splitting.
-
-* Detect dead stores into memory?
-
-A store into memory is dead if it is followed by another store into
-the same location; and, in between, there is no reference to anything
-that might be that location (including no reference to a variable
-address).
-
-This can be modeled as a partial redundancy elimination/lazy code motion
-problem. Contact law@cygnus.com before working on dead store elimination
-optimizations.
-
-* Loop optimization.
-
-Strength reduction and iteration variable elimination could be
-smarter. They should know how to decide which iteration variables are
-not worth making explicit because they can be computed as part of an
-address calculation. Based on this information, they should decide
-when it is desirable to eliminate one iteration variable and create
-another in its place.
-
-It should be possible to compute what the value of an iteration
-variable will be at the end of the loop, and eliminate the variable
-within the loop by computing that value at the loop end.
-
-When a loop has a simple increment that adds 1,
-instead of jumping in after the increment,
-decrement the loop count and jump to the increment.
-This allows aob insns to be used.
-
-* Using constraints on values.
-
-Many operations could be simplified based on knowledge of the
-minimum and maximum possible values of a register at any particular time.
-These limits could come from the data types in the tree, via rtl generation,
-or they can be deduced from operations that are performed. For example,
-the result of an `and' operation one of whose operands is 7 must be in
-the range 0 to 7. Compare instructions also tell something about the
-possible values of the operand, in the code beyond the test.
-
-Value constraints can be used to determine the results of a further
-comparison. They can also indicate that certain `and' operations are
-redundant. Constraints might permit a decrement and branch
-instruction that checks zeroness to be used when the user has
-specified to exit if negative.
-
-* Change the type of a variable.
-
-Sometimes a variable is declared as `int', it is assigned only once
-from a value of type `char', and then it is used only by comparison
-against constants. On many machines, better code would result if
-the variable had type `char'. If the compiler could detect this
-case, it could change the declaration of the variable and change
-all the places that use it.
-
-* Better handling for very sparse switches.
-
-There may be cases where it would be better to compile a switch
-statement to use a fixed hash table rather than the current
-combination of jump tables and binary search.
-
-* Order of subexpressions.
-
-It might be possible to make better code by paying attention
-to the order in which to generate code for subexpressions of an expression.
-
-* More code motion.
-
-Consider hoisting common code up past conditional branches or tablejumps.
-
-Contact law@cygnus.com before working on code hoisting.
-
-* Trace scheduling.
-
-This technique is said to be able to figure out which way a jump
-will usually go, and rearrange the code to make that path the
-faster one.
-
-* Distributive law.
-
-The C expression *(X + 4 * (Y + C)) compiles better on certain
-machines if rewritten as *(X + 4*C + 4*Y) because of known addressing
-modes. It may be tricky to determine when, and for which machines, to
-use each alternative.
-
-Some work has been done on this, in combine.c.
-
-* Can optimize by changing if (x) y; else z; into z; if (x) y;
-if z and x do not interfere and z has no effects not undone by y.
-This is desirable if z is faster than jumping.
-
-* For a two-insn loop on the 68020, such as
- foo: movb a2@+,a3@+
- jne foo
-it is better to insert dbeq d0,foo before the jne.
-d0 can be a junk register. The challenge is to fit this into
-a portable framework: when can you detect this situation and
-still be able to allocate a junk register?
-
-2. Simpler porting.
-
-Right now, describing the target machine's instructions is done
-cleanly, but describing its addressing mode is done with several
-ad-hoc macro definitions. Porting would be much easier if there were
-an RTL description for addressing modes like that for instructions.
-Tools analogous to genflags and genrecog would generate macros from
-this description.
-
-There would be one pattern in the address-description file for each
-kind of addressing, and this pattern would have:
-
- * the RTL expression for the address
- * C code to verify its validity (since that may depend on
- the exact data).
- * C code to print the address in assembler language.
- * C code to convert the address into a valid one, if it is not valid.
- (This would replace LEGITIMIZE_ADDRESS).
- * Register constraints for all indeterminates that appear
- in the RTL expression.
-
-3. Other languages.
-
-Front ends for Pascal, Fortran, Algol, Cobol, Modula-2 and Ada are
-desirable.
-
-Pascal, Modula-2 and Ada require the implementation of functions
-within functions. Some of the mechanisms for this already exist.
-
-4. More extensions.
-
-* Generated unique labels. Have some way of generating distinct labels
-for use in extended asm statements. I don't know what a good syntax would
-be.
-
-* A way of defining a structure containing a union, in which the choice of
-union alternative is controlled by a previous structure component.
-
-Here is a possible syntax for this.
-
-struct foo {
- enum { INT, DOUBLE } code;
- auto union { case INT: int i; case DOUBLE: double d;} value : code;
-};
-
-* Allow constructor expressions as lvalues, like this:
-
- (struct foo) {a, b, c} = foo();
-
-This would call foo, which returns a structure, and then store the
-several components of the structure into the variables a, b, and c.
-
-5. Generalize the machine model.
-
-* Some new compiler features may be needed to do a good job on machines
-where static data needs to be addressed using base registers.
-
-* Some machines have two stacks in different areas of memory, one used
-for scalars and another for large objects. The compiler does not
-now have a way to understand this.
-
-6. Useful warnings.
-
-* Warn about statements that are undefined because the order of
-evaluation of increment operators makes a big difference. Here is an
-example:
-
- *foo++ = hack (*foo);
-
-7. Better documentation of how GCC works and how to port it.
-
-Here is an outline proposed by Allan Adler.
-
-I. Overview of this document
-II. The machines on which GCC is implemented
- A. Prose description of those characteristics of target machines and
- their operating systems which are pertinent to the implementation
- of GCC.
- i. target machine characteristics
- ii. comparison of this system of machine characteristics with
- other systems of machine specification currently in use
- B. Tables of the characteristics of the target machines on which
- GCC is implemented.
- C. A priori restrictions on the values of characteristics of target
- machines, with special reference to those parts of the source code
- which entail those restrictions
- i. restrictions on individual characteristics
- ii. restrictions involving relations between various characteristics
- D. The use of GCC as a cross-compiler
- i. cross-compilation to existing machines
- ii. cross-compilation to non-existent machines
- E. Assumptions which are made regarding the target machine
- i. assumptions regarding the architecture of the target machine
- ii. assumptions regarding the operating system of the target machine
- iii. assumptions regarding software resident on the target machine
- iv. where in the source code these assumptions are in effect made
-III. A systematic approach to writing the files tm.h and xm.h
- A. Macros which require special care or skill
- B. Examples, with special reference to the underlying reasoning
-IV. A systematic approach to writing the machine description file md
- A. Minimal viable sets of insn descriptions
- B. Examples, with special reference to the underlying reasoning
-V. Uses of the file aux-output.c
-VI. Specification of what constitutes correct performance of an
- implementation of GCC
- A. The components of GCC
- B. The itinerary of a C program through GCC
- C. A system of benchmark programs
- D. What your RTL and assembler should look like with these benchmarks
- E. Fine tuning for speed and size of compiled code
-VII. A systematic procedure for debugging an implementation of GCC
- A. Use of GDB
- i. the macros in the file .gdbinit for GCC
- ii. obstacles to the use of GDB
- a. functions implemented as macros can't be called in GDB
- B. Debugging without GDB
- i. How to turn off the normal operation of GCC and access specific
- parts of GCC
- C. Debugging tools
- D. Debugging the parser
- i. how machine macros and insn definitions affect the parser
- E. Debugging the recognizer
- i. how machine macros and insn definitions affect the recognizer
-
-ditto for other components
-
-VIII. Data types used by GCC, with special reference to restrictions not
- specified in the formal definition of the data type
-IX. References to the literature for the algorithms used in GCC
-
diff --git a/gcc/README b/gcc/README
deleted file mode 100755
index fe0ac0b..0000000
--- a/gcc/README
+++ /dev/null
@@ -1,26 +0,0 @@
-This directory contains the egcs version 1.1 release of the GNU C
-compiler. It includes all of the support for compiling C++ and
-Objective C, including a run-time library for Objective C.
-
-The GNU C compiler is free software. See the file COPYING for copying
-permission.
-
-See the file gcc.texi (together with other files that it includes) for
-installation and porting information. The file INSTALL contains a
-copy of the installation information, as plain ASCII.
-
-Installing this package will create various files in subdirectories of
-/usr/local/lib, which are passes used by the compiler and a library
-named libgcc.a. It will also create /usr/local/bin/gcc, which is
-the user-level command to do a compilation.
-
-See the Bugs chapter of the GCC Manual for how to report bugs
-usefully. An online readable version of the manual is in the files
-gcc.info*.
-
-The files pself.c and pself1.c are not part of GCC.
-They are programs that print themselves on standard output.
-They were written by Dario Dariol and Giovanni Cozzi, and are
-included for your hacking pleasure. Likewise pself2.c
-(Who is the author of that?) and pself3.c (by Vlad Taeerov and Rashit
-Fakhreyev).
diff --git a/gcc/TESTS.FLUNK b/gcc/TESTS.FLUNK
deleted file mode 100755
index 04641e3..0000000
--- a/gcc/TESTS.FLUNK
+++ /dev/null
@@ -1,39 +0,0 @@
-This is a collection of things that test suites have
-said were "wrong" with GCC--but that I don't agree with.
-
-First, test suites sometimes test for compatibility with
-traditional C. GCC with -traditional is not completely
-compatible with traditional C, and in some ways I think it
-should not be.
-
-* K&R C allowed \x to appear in a string literal (or character
-literal?) even in cases where it is *not* followed by a sequence of
-hex digits. I'm not convinced this is desirable.
-
-* K&R compilers allow comments to cross over an inclusion boundary (i.e.
-started in an include file and ended in the including file).
-I think this would be quite ugly and can't imagine it could
-be needed.
-
-Sometimes tests disagree with GCC's interpretation of the ANSI standard.
-
-* One test claims that this function should return 1.
-
- enum {A, B} foo;
-
- func (enum {B, A} arg)
- {
- return B;
- }
-
-I think it should return 0, because the definition of B that
-applies is the one in func.
-
-* Some tests report failure when the compiler does not produce
-an error message for a certain program.
-
-ANSI C requires a "diagnostic" message for certain kinds of invalid
-programs, but a warning counts as a diagnostic. If GCC produces
-a warning but not an error, that is correct ANSI support.
-When test suites call this "failure", the tests are broken.
-
diff --git a/gcc/acconfig.h b/gcc/acconfig.h
deleted file mode 100755
index 0487570..0000000
--- a/gcc/acconfig.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Define if you can safely include both <string.h> and <strings.h>. */
-#undef STRING_WITH_STRINGS
-
-/* Define if printf supports "%p". */
-#undef HAVE_PRINTF_PTR
-
-/* Define if you want expensive run-time checks. */
-#undef ENABLE_CHECKING
-
-/* Define if your cpp understands the stringify operator. */
-#undef HAVE_CPP_STRINGIFY
-
-/* Define if your compiler understands volatile. */
-#undef HAVE_VOLATILE
-
-/* Define if your assembler supports specifying the maximum number
- of bytes to skip when using the GAS .p2align command. */
-#undef HAVE_GAS_MAX_SKIP_P2ALIGN
-
-/* Define if your assembler supports .balign and .p2align. */
-#undef HAVE_GAS_BALIGN_AND_P2ALIGN
-
-/* Define if your assembler supports .subsection and .subsection -1 starts
- emitting at the beginning of your section */
-#undef HAVE_GAS_SUBSECTION_ORDERING
-
-/* Define if you have a working <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Whether malloc must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_MALLOC
-
-/* Whether realloc must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_REALLOC
-
-/* Whether calloc must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_CALLOC
-
-/* Whether free must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_FREE
-
-/* Whether bcopy must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_BCOPY
-
-/* Whether bcmp must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_BCMP
-
-/* Whether bzero must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_BZERO
-
-/* Whether index must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_INDEX
-
-/* Whether rindex must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_RINDEX
-
-/* Whether getenv must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_GETENV
-
-/* Whether atol must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_ATOL
-
-/* Whether sbrk must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_SBRK
-
-/* Whether abort must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_ABORT
-
-/* Whether strerror must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_STRERROR
-
-/* Whether strsignal must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_STRSIGNAL
-
-/* Whether getcwd must be declared even if <unistd.h> is included. */
-#undef NEED_DECLARATION_GETCWD
-
-/* Whether getwd must be declared even if <unistd.h> is included. */
-#undef NEED_DECLARATION_GETWD
-
-/* Whether getrlimit must be declared even if <sys/resource.h> is included. */
-#undef NEED_DECLARATION_GETRLIMIT
-
-/* Whether setrlimit must be declared even if <sys/resource.h> is included. */
-#undef NEED_DECLARATION_SETRLIMIT
-
-/* Define if you want expensive run-time checks. */
-#undef ENABLE_CHECKING
-
-/* Define to enable the use of a default assembler. */
-#undef DEFAULT_ASSEMBLER
-
-/* Define to enable the use of a default linker. */
-#undef DEFAULT_LINKER
-
-@TOP@
diff --git a/gcc/aclocal.m4 b/gcc/aclocal.m4
deleted file mode 100755
index ce44ba1..0000000
--- a/gcc/aclocal.m4
+++ /dev/null
@@ -1,237 +0,0 @@
-dnl See whether we can include both string.h and strings.h.
-AC_DEFUN(GCC_HEADER_STRING,
-[AC_CACHE_CHECK([whether string.h and strings.h may both be included],
- gcc_cv_header_string,
-[AC_TRY_COMPILE([#include <string.h>
-#include <strings.h>], , gcc_cv_header_string=yes, gcc_cv_header_string=no)])
-if test $gcc_cv_header_string = yes; then
- AC_DEFINE(STRING_WITH_STRINGS)
-fi
-])
-
-dnl See whether we need a declaration for a function.
-dnl GCC_NEED_DECLARATION(FUNCTION [, EXTRA-HEADER-FILES])
-AC_DEFUN(GCC_NEED_DECLARATION,
-[AC_MSG_CHECKING([whether $1 must be declared])
-AC_CACHE_VAL(gcc_cv_decl_needed_$1,
-[AC_TRY_COMPILE([
-#include <stdio.h>
-#ifdef STRING_WITH_STRINGS
-# include <string.h>
-# include <strings.h>
-#else
-# ifdef HAVE_STRING_H
-# include <string.h>
-# else
-# ifdef HAVE_STRINGS_H
-# include <strings.h>
-# endif
-# endif
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifndef HAVE_RINDEX
-#define rindex strrchr
-#endif
-#ifndef HAVE_INDEX
-#define index strchr
-#endif
-$2],
-[char *(*pfn) = (char *(*)) $1],
-eval "gcc_cv_decl_needed_$1=no", eval "gcc_cv_decl_needed_$1=yes")])
-if eval "test \"`echo '$gcc_cv_decl_needed_'$1`\" = yes"; then
- AC_MSG_RESULT(yes)
- gcc_tr_decl=NEED_DECLARATION_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- AC_DEFINE_UNQUOTED($gcc_tr_decl)
-else
- AC_MSG_RESULT(no)
-fi
-])dnl
-
-dnl Check multiple functions to see whether each needs a declaration.
-dnl GCC_NEED_DECLARATIONS(FUNCTION... [, EXTRA-HEADER-FILES])
-AC_DEFUN(GCC_NEED_DECLARATIONS,
-[for ac_func in $1
-do
-GCC_NEED_DECLARATION($ac_func, $2)
-done
-])
-
-dnl Check if we have vprintf and possibly _doprnt.
-dnl Note autoconf checks for vprintf even though we care about vfprintf.
-AC_DEFUN(GCC_FUNC_VFPRINTF_DOPRNT,
-[AC_FUNC_VPRINTF
-vfprintf=
-doprint=
-if test $ac_cv_func_vprintf != yes ; then
- vfprintf=vfprintf.o
- if test $ac_cv_func__doprnt != yes ; then
- doprint=doprint.o
- fi
-fi
-AC_SUBST(vfprintf)
-AC_SUBST(doprint)
-])
-
-dnl See if the printf functions in libc support %p in format strings.
-AC_DEFUN(GCC_FUNC_PRINTF_PTR,
-[AC_CACHE_CHECK(whether the printf functions support %p,
- gcc_cv_func_printf_ptr,
-[AC_TRY_RUN([#include <stdio.h>
-
-main()
-{
- char buf[64];
- char *p = buf, *q = NULL;
- sprintf(buf, "%p", p);
- sscanf(buf, "%p", &q);
- exit (p != q);
-}], gcc_cv_func_printf_ptr=yes, gcc_cv_func_printf_ptr=no,
- gcc_cv_func_printf_ptr=no)
-rm -f core core.* *.core])
-if test $gcc_cv_func_printf_ptr = yes ; then
- AC_DEFINE(HAVE_PRINTF_PTR)
-fi
-])
-
-dnl See if symbolic links work and if not, try to substitute either hard links or simple copy.
-AC_DEFUN(GCC_PROG_LN_S,
-[AC_MSG_CHECKING(whether ln -s works)
-AC_CACHE_VAL(gcc_cv_prog_LN_S,
-[rm -f conftestdata_t
-echo >conftestdata_f
-if ln -s conftestdata_f conftestdata_t 2>/dev/null
-then
- gcc_cv_prog_LN_S="ln -s"
-else
- if ln conftestdata_f conftestdata_t 2>/dev/null
- then
- gcc_cv_prog_LN_S=ln
- else
- gcc_cv_prog_LN_S=cp
- fi
-fi
-rm -f conftestdata_f conftestdata_t
-])dnl
-LN_S="$gcc_cv_prog_LN_S"
-if test "$gcc_cv_prog_LN_S" = "ln -s"; then
- AC_MSG_RESULT(yes)
-else
- if test "$gcc_cv_prog_LN_S" = "ln"; then
- AC_MSG_RESULT([no, using ln])
- else
- AC_MSG_RESULT([no, and neither does ln, so using cp])
- fi
-fi
-AC_SUBST(LN_S)dnl
-])
-
-dnl See if hard links work and if not, try to substitute either symbolic links or simple copy.
-AC_DEFUN(GCC_PROG_LN,
-[AC_MSG_CHECKING(whether ln works)
-AC_CACHE_VAL(gcc_cv_prog_LN,
-[rm -f conftestdata_t
-echo >conftestdata_f
-if ln conftestdata_f conftestdata_t 2>/dev/null
-then
- gcc_cv_prog_LN="ln"
-else
- if ln -s conftestdata_f conftestdata_t 2>/dev/null
- then
- gcc_cv_prog_LN="ln -s"
- else
- gcc_cv_prog_LN=cp
- fi
-fi
-rm -f conftestdata_f conftestdata_t
-])dnl
-LN="$gcc_cv_prog_LN"
-if test "$gcc_cv_prog_LN" = "ln"; then
- AC_MSG_RESULT(yes)
-else
- if test "$gcc_cv_prog_LN" = "ln -s"; then
- AC_MSG_RESULT([no, using ln -s])
- else
- AC_MSG_RESULT([no, and neither does ln -s, so using cp])
- fi
-fi
-AC_SUBST(LN)dnl
-])
-
-dnl See whether the stage1 host compiler accepts the volatile keyword.
-AC_DEFUN(GCC_C_VOLATILE,
-[AC_CACHE_CHECK([for volatile], gcc_cv_c_volatile,
-[AC_TRY_COMPILE(, [volatile int foo;],
- gcc_cv_c_volatile=yes, gcc_cv_c_volatile=no)])
-if test $gcc_cv_c_volatile = yes ; then
- AC_DEFINE(HAVE_VOLATILE)
-fi
-])
-
-AC_DEFUN(EGCS_PROG_INSTALL,
-[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-# Find a good install program. We prefer a C program (faster),
-# so one script is as good as another. But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# ./install, which can be erroneously created by make from ./install.sh.
-AC_MSG_CHECKING(for a BSD compatible install)
-if test -z "$INSTALL"; then
-AC_CACHE_VAL(ac_cv_path_install,
-[ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:"
- for ac_dir in $PATH; do
- # Account for people who put trailing slashes in PATH elements.
- case "$ac_dir/" in
- /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
- *)
- # OSF1 and SCO ODT 3.0 have their own names for install.
- for ac_prog in ginstall scoinst install; do
- if test -f $ac_dir/$ac_prog; then
- if test $ac_prog = install &&
- grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
- # AIX install. It has an incompatible calling convention.
- # OSF/1 installbsd also uses dspmsg, but is usable.
- :
- else
- ac_cv_path_install="$ac_dir/$ac_prog -c"
- break 2
- fi
- fi
- done
- ;;
- esac
- done
- IFS="$ac_save_IFS"
-])dnl
- if test "${ac_cv_path_install+set}" = set; then
- INSTALL="$ac_cv_path_install"
- else
- # As a last resort, use the slow shell script. We don't cache a
- # path for INSTALL within a source directory, because that will
- # break other packages using the cache if that directory is
- # removed, or if the path is relative.
- INSTALL="$ac_install_sh"
- fi
-fi
-dnl We do special magic for INSTALL instead of AC_SUBST, to get
-dnl relative paths right.
-AC_MSG_RESULT($INSTALL)
-AC_SUBST(INSTALL)dnl
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-AC_SUBST(INSTALL_PROGRAM)dnl
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-AC_SUBST(INSTALL_DATA)dnl
-])
diff --git a/gcc/build-make b/gcc/build-make
deleted file mode 100755
index f9049ae..0000000
--- a/gcc/build-make
+++ /dev/null
@@ -1,35 +0,0 @@
-# We have to use the cross-compiler we just built to compile it.
-CC = gcc -b $(host)
-
-# Need those to compile binaries running on host machine.
-# It is configured by
-#
-# configure --host=target_cpu-target_os \
-# --target=host=target_cpu-target_os --build=host_cpu-host_os
-#
-# That HOST stuff has to be taken care of very carefully.
-HOST_PREFIX=l-
-HOST_PREFIX_1=$(HOST_PREFIX)
-HOST_CC=$(CC) -b $(build)
-HOST_CFLAGS=$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS) $(XCFLAGS)
-HOST_CLIB=
-HOST_LDFLAGS=$(LDFLAGS)
-HOST_CPPFLAGS=$(ALL_CPPFLAGS)
-HOST_ALLOCA=$(ALLOCA)
-HOST_MALLOC=$(MALLOC)
-HOST_OBSTACK=$(OBSTACK)
-
-# To build the native compiler with the cross compiler, the headers
-# for the target are already fixed. And /usr/include is for host, not
-# target.
-FIXINCLUDES=Makefile.in
-
-# Don't run fixproto either
-STMP_FIXPROTO =
-
-# Cause installation using install-build. We do nothing here.
-#INSTALL_TARGET = install-build
-
-# Don't try to compile the things we can't compile or we have made
-# while making gcc with the cross-compiler.
-#ALL = all.build
diff --git a/gcc/c-aux-info.c b/gcc/c-aux-info.c
index be5599e..0aac1f0 100755
--- a/gcc/c-aux-info.c
+++ b/gcc/c-aux-info.c
@@ -44,6 +44,67 @@ static char *gen_formal_list_for_func_def (tree, formals_style);
static char *gen_type (char *, tree, formals_style);
static char *gen_decl (tree, int, formals_style);
+/* Concatenate strings and return the result.
+ Each string is passed as an argument, with the last argument being NULL,
+ e.g. concat("str1", "str2", "str3", ..., "strN", NULL). */
+
+char *
+concat(const char *first, ...)
+{
+ int length;
+ char *newstr;
+ char *end;
+ const char *arg;
+ va_list args;
+
+ /* First compute the size of the result and get sufficient memory. */
+
+ va_start(args, first);
+
+ if (first == NULL)
+ {
+ length = 0;
+ }
+ else
+ {
+ length = strlen(first);
+ while ((arg = va_arg(args, const char *)) != NULL)
+ {
+ length += strlen(arg);
+ }
+ }
+
+ newstr = (char *)xmalloc(length + 1);
+ va_end(args);
+
+ /* Now copy the individual pieces to the result string. */
+
+ va_start(args, first);
+ end = newstr;
+
+ if (first != NULL)
+ {
+ arg = first;
+ while (*arg)
+ {
+ *end++ = *arg++;
+ }
+
+ while ((arg = va_arg(args, const char *)) != NULL)
+ {
+ while (*arg)
+ {
+ *end++ = *arg++;
+ }
+ }
+ }
+
+ *end = 0;
+ va_end(args);
+
+ return newstr;
+}
+
/* Given a string representing an entire type or an entire declaration
which only lacks the actual "data-type" specifier (at its left end),
affix the data-type specifier to the left end of the given type
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 51d4c5b..cfa2db2 100755
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -27,14 +27,8 @@ Boston, MA 02111-1307, USA. */
#include "obstack.h"
#include "toplev.h"
#include "output.h"
-#include "c-pragma.h"
#include "rtl.h"
-#include "cpplib.h"
-cpp_reader parse_in;
-cpp_options parse_options;
-static enum cpp_token cpp_token;
-
#ifndef WCHAR_TYPE_SIZE
#ifdef INT_TYPE_SIZE
#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
@@ -419,14 +413,6 @@ decl_attributes (node, attributes, prefix_attributes)
}
else if (TREE_CODE_CLASS (TREE_CODE (node)) == 't')
type = node, is_type = 1;
-
-#ifdef PRAGMA_INSERT_ATTRIBUTES
- /* If the code in c-pragma.c wants to insert some attributes then
- allow it to do so. Do this before allowing machine back ends to
- insert attributes, so that they have the opportunity to override
- anything done here. */
- PRAGMA_INSERT_ATTRIBUTES (node, & attributes, & prefix_attributes);
-#endif
#ifdef INSERT_ATTRIBUTES
INSERT_ATTRIBUTES (node, & attributes, & prefix_attributes);
@@ -2775,7 +2761,7 @@ truthvalue_conversion (expr)
return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
}
-
+
/* Read the rest of a #-directive from input stream FINPUT.
In normal use, the directive name and the white space after it
have already been read, so they won't be included in the result.
@@ -2784,103 +2770,85 @@ truthvalue_conversion (expr)
a part of the directive.
The value is a string in a reusable buffer. It remains valid
- only until the next time this function is called. */
-unsigned char *yy_cur, *yy_lim;
+ only until the next time this function is called.
-#define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ())
-#define UNGETC(c) ((c), yy_cur--)
+ The terminating character ('\n' or EOF) is left in FINPUT for the
+ caller to re-read. */
-void cpplib_init()
+char *
+get_directive_line (finput)
+FILE *finput;
{
- cpp_reader_init (&parse_in);
- parse_in.opts = &parse_options;
- cpp_options_init (&parse_options);
-}
+ static char *directive_buffer = NULL;
+ static unsigned buffer_length = 0;
+ char *buffer_limit;
+ int looking_for = 0;
+ int char_escaped = 0;
-int
-yy_get_token ()
-{
- for (;;)
+ if (buffer_length == 0)
{
- parse_in.limit = parse_in.token_buffer;
- cpp_token = cpp_get_token (&parse_in);
- if (cpp_token == CPP_EOF)
- return -1;
- yy_lim = CPP_PWRITTEN (&parse_in);
- yy_cur = parse_in.token_buffer;
- if (yy_cur < yy_lim)
- return *yy_cur++;
+ directive_buffer = (char *)xmalloc(128);
+ buffer_length = 128;
}
-}
-char *
-get_directive_line ()
-{
- static char *directive_buffer = NULL;
- static unsigned buffer_length = 0;
- register char *p;
- register char *buffer_limit;
- register int looking_for = 0;
- register int char_escaped = 0;
-
- if (buffer_length == 0)
- {
- directive_buffer = (char *)xmalloc (128);
- buffer_length = 128;
- }
+ buffer_limit = &directive_buffer[buffer_length];
- buffer_limit = &directive_buffer[buffer_length];
+ char *p = directive_buffer;
- for (p = directive_buffer; ; )
+ for (;;)
{
- int c;
+ int c;
- /* Make buffer bigger if it is full. */
- if (p >= buffer_limit)
+ /* Make buffer bigger if it is full. */
+ if (p >= buffer_limit)
{
- register unsigned bytes_used = (p - directive_buffer);
-
- buffer_length *= 2;
- directive_buffer
- = (char *)xrealloc (directive_buffer, buffer_length);
- p = &directive_buffer[bytes_used];
- buffer_limit = &directive_buffer[buffer_length];
+ unsigned bytes_used = (p - directive_buffer);
+ buffer_length *= 2;
+ directive_buffer = (char *)xrealloc(directive_buffer, buffer_length);
+ p = &directive_buffer[bytes_used];
+ buffer_limit = &directive_buffer[buffer_length];
}
- c = GETC ();
+ c = getc(finput);
- /* Discard initial whitespace. */
- if ((c == ' ' || c == '\t') && p == directive_buffer)
- continue;
+ /* Discard initial whitespace. */
+ if ((c == ' ' || c == '\t') && p == directive_buffer)
+ {
+ do
+ {
+ c = getc(finput);
+ } while (c == ' ' || c == '\t');
+ }
- /* Detect the end of the directive. */
- if (c == '\n' && looking_for == 0)
- {
- UNGETC (c);
- c = '\0';
- }
+ /* Detect the end of the directive. */
+ if (looking_for == 0 && (c == '\n' || c == EOF))
+ {
+ ungetc(c, finput);
+ c = 0;
+ }
- *p++ = c;
+ *p++ = c;
- if (c == 0)
- return directive_buffer;
+ if (c == 0)
+ return directive_buffer;
- /* Handle string and character constant syntax. */
- if (looking_for)
- {
- if (looking_for == c && !char_escaped)
- looking_for = 0; /* Found terminator... stop looking. */
- }
- else
- if (c == '\'' || c == '"')
- looking_for = c; /* Don't stop buffering until we see another
- another one of these (or an EOF). */
+ /* Handle string and character constant syntax. */
+ if (looking_for)
+ {
+ if (looking_for == c && !char_escaped)
+ looking_for = 0; /* Found terminator... stop looking. */
+ }
+ else
+ {
+ if (c == '\'' || c == '"')
+ looking_for = c; /* Don't stop buffering until we see another one of these (or an EOF). */
+ }
- /* Handle backslash. */
- char_escaped = (c == '\\' && ! char_escaped);
+ /* Handle backslash. */
+ char_escaped = (c == '\\' && !char_escaped);
}
}
-
+
/* Make a variant type in the proper way for C/C++, propagating qualifiers
down to the element type of an array. */
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index c43774b..728b7fa 100755
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -35,9 +35,6 @@ Boston, MA 02111-1307, USA. */
#include "c-lex.h"
#include "toplev.h"
-#include "cpplib.h"
-extern cpp_reader parse_in;
-
/* In grokdeclarator, distinguish syntactic contexts of declarators. */
enum decl_context
{ NORMAL, /* Ordinary declaration */
@@ -360,7 +357,7 @@ struct binding_level
/* Nonzero means make a BLOCK if this level has any subblocks. */
char keep_if_subblocks;
- /* Number of decls in `names' that have incomplete
+ /* Number of decls in `names' that have incomplete
structure or union types. */
int n_incomplete;
@@ -371,7 +368,7 @@ struct binding_level
};
#define NULL_BINDING_LEVEL (struct binding_level *) NULL
-
+
/* The binding level currently in effect. */
static struct binding_level *current_binding_level;
@@ -400,7 +397,7 @@ static int keep_next_level_flag;
if it has subblocks. */
static int keep_next_if_subblocks;
-
+
/* The chain of outer levels of label scopes.
This uses the same data structure used for binding levels,
but it works differently: each link in the chain records
@@ -570,10 +567,6 @@ int warn_missing_braces;
int warn_main;
-/* Warn about #pragma directives that are not recognised. */
-
-int warn_unknown_pragmas = 0; /* Tri state variable. */
-
/* Warn about comparison of signed and unsigned values.
If -1, neither -Wsign-compare nor -Wno-sign-compare has been specified. */
@@ -583,25 +576,12 @@ int warn_sign_compare = -1;
int warn_multichar = 1;
-/* Nonzero means `$' can be in an identifier. */
-
-#ifndef DOLLARS_IN_IDENTIFIERS
-#define DOLLARS_IN_IDENTIFIERS 1
-#endif
-int dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
+/* Decode the string P as a language-specific option for C. */
-/* Decode the string P as a language-specific option for C.
- Return the number of strings consumed. */
-
-int
-c_decode_option (argc, argv)
- int argc ATTRIBUTE_UNUSED;
- char **argv;
+void
+c_decode_option (p)
+ char *p;
{
- int strings_processed;
- char *p = argv[0];
- strings_processed = cpp_handle_option (&parse_in, argc, argv);
-
if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional"))
{
flag_traditional = 1;
@@ -684,18 +664,6 @@ c_decode_option (argc, argv)
else
error ("unknown C standard `%s'", argstart);
}
- else if (!strcmp (p, "-fdollars-in-identifiers"))
- dollars_in_ident = 1;
- else if (!strcmp (p, "-fno-dollars-in-identifiers"))
- dollars_in_ident = 0;
- else if (!strcmp (p, "-fsigned-char"))
- flag_signed_char = 1;
- else if (!strcmp (p, "-funsigned-char"))
- flag_signed_char = 0;
- else if (!strcmp (p, "-fno-signed-char"))
- flag_signed_char = 0;
- else if (!strcmp (p, "-fno-unsigned-char"))
- flag_signed_char = 1;
else if (!strcmp (p, "-fsigned-bitfields")
|| !strcmp (p, "-fno-unsigned-bitfields"))
{
@@ -820,26 +788,6 @@ c_decode_option (argc, argv)
warn_return_type = 1;
else if (!strcmp (p, "-Wno-return-type"))
warn_return_type = 0;
- else if (!strcmp (p, "-Wcomment"))
- ; /* cpp handles this one. */
- else if (!strcmp (p, "-Wno-comment"))
- ; /* cpp handles this one. */
- else if (!strcmp (p, "-Wcomments"))
- ; /* cpp handles this one. */
- else if (!strcmp (p, "-Wno-comments"))
- ; /* cpp handles this one. */
- else if (!strcmp (p, "-Wtrigraphs"))
- ; /* cpp handles this one. */
- else if (!strcmp (p, "-Wno-trigraphs"))
- ; /* cpp handles this one. */
- else if (!strcmp (p, "-Wundef"))
- ; /* cpp handles this one. */
- else if (!strcmp (p, "-Wno-undef"))
- ; /* cpp handles this one. */
- else if (!strcmp (p, "-Wimport"))
- ; /* cpp handles this one. */
- else if (!strcmp (p, "-Wno-import"))
- ; /* cpp handles this one. */
else if (!strcmp (p, "-Wmissing-braces"))
warn_missing_braces = 1;
else if (!strcmp (p, "-Wno-missing-braces"))
@@ -856,12 +804,6 @@ c_decode_option (argc, argv)
warn_multichar = 1;
else if (!strcmp (p, "-Wno-multichar"))
warn_multichar = 0;
- else if (!strcmp (p, "-Wunknown-pragmas"))
- /* Set to greater than 1, so that even unknown pragmas in system
- headers will be warned about. */
- warn_unknown_pragmas = 2;
- else if (!strcmp (p, "-Wno-unknown-pragmas"))
- warn_unknown_pragmas = 0;
else if (!strcmp (p, "-Wall"))
{
/* We save the value of warn_uninitialized, since if they put
@@ -881,13 +823,7 @@ c_decode_option (argc, argv)
/* We set this to 2 here, but 1 in -Wmain, so -ffreestanding can turn
it off only if it's not explicit. */
warn_main = 2;
- /* Only warn about unknown pragmas that are not in system headers. */
- warn_unknown_pragmas = 1;
}
- else
- return strings_processed;
-
- return 1;
}
/* Hooks for print_node. */
@@ -924,7 +860,7 @@ print_lang_identifier (file, node, indent)
/* Hook called at end of compilation to assume 1 elt
for a top-level array decl that wasn't complete before. */
-
+
void
finish_incomplete_decl (decl)
tree decl;
@@ -1065,7 +1001,7 @@ clear_limbo_values (block)
for (tem = BLOCK_SUBBLOCKS (block); tem; tem = TREE_CHAIN (tem))
clear_limbo_values (tem);
}
-
+
/* Exit a binding level.
Pop the level off, and restore the state of the identifier-decl mappings
that were in effect when this level was entered.
@@ -1405,7 +1341,7 @@ pop_label_level ()
DECL_NAME (TREE_VALUE (link)));
}
else if (warn_unused && !TREE_USED (TREE_VALUE (link)))
- warning_with_decl (TREE_VALUE (link),
+ warning_with_decl (TREE_VALUE (link),
"label `%s' defined but not used");
IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link))) = 0;
@@ -1612,7 +1548,7 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
tree trytype
= build_function_type (newreturntype,
TYPE_ARG_TYPES (oldtype));
-
+
types_match = comptypes (newtype, trytype);
if (types_match)
oldtype = trytype;
@@ -1630,10 +1566,10 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
the return type of olddecl's function type. */
tree trytype
= build_function_type (TREE_TYPE (oldtype),
- tree_cons (NULL_TREE,
+ tree_cons (NULL_TREE,
TREE_VALUE (TYPE_ARG_TYPES (newtype)),
TREE_CHAIN (TYPE_ARG_TYPES (oldtype))));
-
+
types_match = comptypes (newtype, trytype);
if (types_match)
oldtype = trytype;
@@ -1760,11 +1696,11 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
: "`%s' previously declared here"));
}
else if (TREE_CODE (newdecl) == TYPE_DECL
- && (DECL_IN_SYSTEM_HEADER (olddecl)
+ && (DECL_IN_SYSTEM_HEADER (olddecl)
|| DECL_IN_SYSTEM_HEADER (newdecl)))
{
warning_with_decl (newdecl, "redefinition of `%s'");
- warning_with_decl
+ warning_with_decl
(olddecl,
((DECL_INITIAL (olddecl)
&& current_binding_level == global_binding_level)
@@ -1894,7 +1830,7 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
push_obstacks_nochange ();
end_temporary_allocation ();
}
-
+
/* Merge the data types specified in the two decls. */
if (TREE_CODE (newdecl) != FUNCTION_DECL || !DECL_BUILT_IN (olddecl))
{
@@ -1996,7 +1932,7 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
}
/* Merge the storage class information. */
- DECL_WEAK (newdecl) |= DECL_WEAK (olddecl);
+ DECL_WEAK (newdecl) |= DECL_WEAK (olddecl);
/* For functions, static overrides non-static. */
if (TREE_CODE (newdecl) == FUNCTION_DECL)
{
@@ -2342,7 +2278,7 @@ pushdecl (x)
if (b == global_binding_level)
{
/* Install a global value. */
-
+
/* If the first global decl has external linkage,
warn if we later see static one. */
if (IDENTIFIER_GLOBAL_VALUE (name) == 0 && TREE_PUBLIC (x))
@@ -2648,7 +2584,7 @@ redeclaration_error_message (newdecl, olddecl)
is equivalent to what this code used to do before the build_type_copy
call. The variant type distinction should not matter for traditional
code, because it doesn't have type qualifiers. */
- if (flag_traditional
+ if (flag_traditional
&& TYPE_MAIN_VARIANT (TREE_TYPE (olddecl)) == TREE_TYPE (newdecl))
return 0;
if (DECL_IN_SYSTEM_HEADER (olddecl) || DECL_IN_SYSTEM_HEADER (newdecl))
@@ -2772,7 +2708,7 @@ shadow_label (name)
for (dup = named_labels; dup; dup = TREE_CHAIN (dup))
if (TREE_VALUE (dup) == decl)
{
- error ("duplicate label declaration `%s'",
+ error ("duplicate label declaration `%s'",
IDENTIFIER_POINTER (name));
error_with_decl (TREE_VALUE (dup),
"this is a previous declaration");
@@ -3011,13 +2947,9 @@ init_decl_processing ()
pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_INT],
integer_type_node));
- /* Define `char', which is like either `signed char' or `unsigned char'
- but not the same as either. */
+ /* Define `char', which is like `unsigned char' but not the same. */
- char_type_node
- = (flag_signed_char
- ? make_signed_type (CHAR_TYPE_SIZE)
- : make_unsigned_type (CHAR_TYPE_SIZE));
+ char_type_node = make_unsigned_type (CHAR_TYPE_SIZE);
pushdecl (build_decl (TYPE_DECL, get_identifier ("char"),
char_type_node));
@@ -3308,14 +3240,14 @@ init_decl_processing ()
BUILT_IN_CONSTANT_P, NULL);
builtin_function ("__builtin_return_address",
- build_function_type (ptr_type_node,
+ build_function_type (ptr_type_node,
tree_cons (NULL_TREE,
unsigned_type_node,
endlink)),
BUILT_IN_RETURN_ADDRESS, NULL);
builtin_function ("__builtin_frame_address",
- build_function_type (ptr_type_node,
+ build_function_type (ptr_type_node,
tree_cons (NULL_TREE,
unsigned_type_node,
endlink)),
@@ -3335,7 +3267,7 @@ init_decl_processing ()
build_function_type (unsigned_type_node, endlink),
BUILT_IN_DWARF_FP_REGNUM, NULL);
builtin_function ("__builtin_dwarf_reg_size", int_ftype_int,
- BUILT_IN_DWARF_REG_SIZE, NULL);
+ BUILT_IN_DWARF_REG_SIZE, NULL);
builtin_function ("__builtin_frob_return_addr", ptr_ftype_ptr,
BUILT_IN_FROB_RETURN_ADDR, NULL);
builtin_function ("__builtin_extract_return_addr", ptr_ftype_ptr,
@@ -3461,23 +3393,23 @@ init_decl_processing ()
BUILT_IN_STRCPY, "strcpy");
builtin_function ("__builtin_strlen", strlen_ftype,
BUILT_IN_STRLEN, "strlen");
- builtin_function ("__builtin_sqrtf", float_ftype_float,
+ builtin_function ("__builtin_sqrtf", float_ftype_float,
BUILT_IN_FSQRT, "sqrtf");
- builtin_function ("__builtin_fsqrt", double_ftype_double,
+ builtin_function ("__builtin_fsqrt", double_ftype_double,
BUILT_IN_FSQRT, "sqrt");
- builtin_function ("__builtin_sqrtl", ldouble_ftype_ldouble,
+ builtin_function ("__builtin_sqrtl", ldouble_ftype_ldouble,
BUILT_IN_FSQRT, "sqrtl");
- builtin_function ("__builtin_sinf", float_ftype_float,
+ builtin_function ("__builtin_sinf", float_ftype_float,
BUILT_IN_SIN, "sinf");
- builtin_function ("__builtin_sin", double_ftype_double,
+ builtin_function ("__builtin_sin", double_ftype_double,
BUILT_IN_SIN, "sin");
- builtin_function ("__builtin_sinl", ldouble_ftype_ldouble,
+ builtin_function ("__builtin_sinl", ldouble_ftype_ldouble,
BUILT_IN_SIN, "sinl");
- builtin_function ("__builtin_cosf", float_ftype_float,
+ builtin_function ("__builtin_cosf", float_ftype_float,
BUILT_IN_COS, "cosf");
- builtin_function ("__builtin_cos", double_ftype_double,
+ builtin_function ("__builtin_cos", double_ftype_double,
BUILT_IN_COS, "cos");
- builtin_function ("__builtin_cosl", ldouble_ftype_ldouble,
+ builtin_function ("__builtin_cosl", ldouble_ftype_ldouble,
BUILT_IN_COS, "cosl");
builtin_function ("__builtin_setjmp",
build_function_type (integer_type_node,
@@ -3762,7 +3694,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
/* The corresponding pop_obstacks is in finish_decl. */
push_obstacks_nochange ();
- if (warn_main && TREE_CODE (decl) != FUNCTION_DECL
+ if (warn_main && TREE_CODE (decl) != FUNCTION_DECL
&& !strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "main"))
warning_with_decl (decl, "`%s' is usually a function");
@@ -4978,7 +4910,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
/* Omit the arg types if -traditional, since the arg types
and the list links might not be permanent. */
type = build_function_type (type,
- flag_traditional
+ flag_traditional
? NULL_TREE : arg_types);
#endif
/* Type qualifiers before the return type of the function
@@ -5967,7 +5899,7 @@ finish_struct (t, fieldlist, attributes)
else
{
register tree y = fieldlist;
-
+
while (1)
{
if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x)))
@@ -6479,7 +6411,7 @@ start_function (declspecs, declarator, prefix_attributes, attributes, nested)
#ifdef SET_DEFAULT_DECL_ATTRIBUTES
SET_DEFAULT_DECL_ATTRIBUTES (decl1, attributes);
#endif
-
+
/* This function exists in static storage.
(This does not mean `static' in the C sense!) */
TREE_STATIC (decl1) = 1;
@@ -7159,7 +7091,7 @@ combine_parm_decls (specparms, parmlist, void_at_end)
types = saveable_tree_cons (NULL_TREE, TREE_TYPE (parm), types);
}
}
-
+
if (void_at_end)
return saveable_tree_cons (parmdecls, nonparms,
nreverse (saveable_tree_cons (NULL_TREE,
diff --git a/gcc/c-lex.c b/gcc/c-lex.c
index c82fc96..bfb2552 100755
--- a/gcc/c-lex.c
+++ b/gcc/c-lex.c
@@ -30,17 +30,10 @@ Boston, MA 02111-1307, USA. */
#include "c-tree.h"
#include "flags.h"
#include "c-parse.h"
-#include "c-pragma.h"
#include "toplev.h"
-#ifdef MULTIBYTE_CHARS
-#include "mbchar.h"
-#include <locale.h>
-#endif /* MULTIBYTE_CHARS */
-
-#include "cpplib.h"
-extern cpp_reader parse_in;
-extern cpp_options parse_options;
+/* Stream for reading from the input file. */
+FILE *finput;
extern void yyprint (FILE *, int, YYSTYPE);
@@ -52,12 +45,8 @@ tree ridpointers[(int) RID_MAX];
/* Cause the `yydebug' variable to be defined. */
#define YYDEBUG 1
-extern unsigned char *yy_cur, *yy_lim;
-
-extern int yy_get_token ();
-
-#define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ())
-#define UNGETC(c) ((void)(c), yy_cur--)
+#define GETC() getc(finput)
+#define UNGETC(c) ungetc(c, finput)
/* the declaration found for the last IDENTIFIER token read in.
yylex must look this up to detect typedefs, which get token type TYPENAME,
@@ -90,10 +79,6 @@ static int indent_level = 0; /* Number of { minus number of }. */
/* Nonzero if end-of-file has been seen on input. */
static int end_of_file;
-
-#ifdef HANDLE_GENERIC_PRAGMAS
-static int handle_generic_pragma (int);
-#endif /* HANDLE_GENERIC_PRAGMAS */
static int whitespace_cr (int);
static int skip_white_space (int);
static int skip_white_space_on_line (void);
@@ -155,17 +140,17 @@ char *
init_parse (filename)
char *filename;
{
- parse_in.show_column = 1;
- if (! cpp_start_read (&parse_in, filename))
- abort ();
-
+ /* Open input file. */
if (filename == 0 || !strcmp (filename, "-"))
- filename = "stdin";
+ {
+ finput = stdin;
+ filename = "stdin";
+ }
+ else
+ finput = fopen (filename, "r");
- /* cpp_start_read always puts at least one line directive into the
- token buffer. We must arrange to read it out here. */
- yy_cur = parse_in.token_buffer;
- yy_lim = CPP_PWRITTEN (&parse_in);
+ if (finput == 0)
+ pfatal_with_name (filename);
init_lex ();
@@ -175,7 +160,7 @@ init_parse (filename)
void
finish_parse ()
{
- cpp_finish (&parse_in);
+ fclose(finput);
}
void
@@ -188,12 +173,6 @@ init_lex ()
and will increment it to 1. */
lineno = 0;
-#ifdef MULTIBYTE_CHARS
- /* Change to the native locale for multibyte conversions. */
- setlocale (LC_CTYPE, "");
- literal_codeset = getenv ("LANG");
-#endif
-
maxtoken = 40;
token_buffer = (char *) xmalloc (maxtoken + 2);
@@ -361,16 +340,12 @@ skip_white_space (c)
}
}
-/* Skips all of the white space at the current location in the input file.
- Must use and reset nextchar if it has the next character. */
+/* Skips all of the white space at the current location in the input file. */
void
position_after_white_space ()
{
- register int c;
-
- c = GETC();
-
+ int c = GETC();
UNGETC (skip_white_space (c));
}
@@ -422,27 +397,13 @@ extend_token_buffer (p)
return token_buffer + offset;
}
-
-#if defined HANDLE_PRAGMA
-/* Local versions of these macros, that can be passed as function pointers. */
-static int
-pragma_getc ()
-{
- return GETC();
-}
-static void
-pragma_ungetc (arg)
- int arg;
-{
- UNGETC (arg);
-}
-#endif
+/* At the beginning of the file, check for a #line directive indicating
+ the real name of the file. */
void check_line_directive()
{
- check_newline ();
- yy_cur--;
+ ungetc(check_newline(), finput);
}
/* At the beginning of a line, increment the line number
@@ -478,7 +439,7 @@ check_newline ()
/* If a letter follows, then if the word here is `line', skip
it and ignore it; otherwise, ignore the line, with an error
- if the word isn't `pragma', `ident', `define', or `undef'. */
+ if the word isn't `pragma', `define', or `undef'. */
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
@@ -489,46 +450,9 @@ check_newline ()
&& GETC() == 'g'
&& GETC() == 'm'
&& GETC() == 'a'
- && ((c = GETC()) == ' ' || c == '\t' || c == '\n'
- || whitespace_cr (c) ))
+ && ((c = GETC()) == ' ' || c == '\t' || c == '\n' || whitespace_cr (c)))
{
- while (c == ' ' || c == '\t' || whitespace_cr (c))
- c = GETC ();
- if (c == '\n')
- return c;
-
-#if defined HANDLE_PRAGMA || defined HANDLE_GENERIC_PRAGMAS
- UNGETC (c);
- token = yylex ();
- if (token != IDENTIFIER)
- goto skipline;
-#endif /* HANDLE_PRAGMA || HANDLE_GENERIC_PRAGMAS */
-
-#ifdef HANDLE_PRAGMA
- /* We invoke HANDLE_PRAGMA before HANDLE_GENERIC_PRAGMAS (if
- both are defined), in order to give the back end a chance to
- override the interpretation of generic style pragmas. */
-
- if (TREE_CODE (yylval.ttype) != IDENTIFIER_NODE)
- goto skipline;
-
- if (HANDLE_PRAGMA (pragma_getc, pragma_ungetc,
- IDENTIFIER_POINTER (yylval.ttype)))
- return GETC ();
-#endif /* HANDLE_PRAGMA */
-
-#ifdef HANDLE_GENERIC_PRAGMAS
- if (handle_generic_pragma (token))
- return GETC ();
-#endif /* HANDLE_GENERIC_PRAGMAS */
-
- /* Issue a warning message if we have been asked to do so.
- Ignoring unknown pragmas in system header file unless
- an explcit -Wunknown-pragmas has been given. */
- if (warn_unknown_pragmas > 1
- || (warn_unknown_pragmas && ! in_system_header))
- warning ("ignoring pragma: %s", token_buffer);
-
+ warning ("ignoring pragma");
goto skipline;
}
}
@@ -568,45 +492,6 @@ check_newline ()
&& ((c = GETC()) == ' ' || c == '\t'))
goto linenum;
}
- else if (c == 'i')
- {
- if (GETC() == 'd'
- && GETC() == 'e'
- && GETC() == 'n'
- && GETC() == 't'
- && ((c = GETC()) == ' ' || c == '\t'))
- {
- /* #ident. The pedantic warning is now in cccp.c. */
-
- /* Here we have just seen `#ident '.
- A string constant should follow. */
-
- c = skip_white_space_on_line ();
-
- /* If no argument, ignore the line. */
- if (c == '\n')
- return c;
-
- UNGETC (c);
- token = yylex ();
- if (token != STRING
- || TREE_CODE (yylval.ttype) != STRING_CST)
- {
- error ("invalid #ident");
- goto skipline;
- }
-
- if (!flag_no_ident)
- {
-#ifdef ASM_OUTPUT_IDENT
- ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (yylval.ttype));
-#endif
- }
-
- /* Skip the rest of this line. */
- goto skipline;
- }
- }
error ("undefined or invalid # directive");
goto skipline;
@@ -782,50 +667,7 @@ linenum:
c = GETC();
return c;
}
-
-#ifdef HANDLE_GENERIC_PRAGMAS
-/* Handle a #pragma directive.
- TOKEN is the token we read after `#pragma'. Processes the entire input
- line and return non-zero iff the pragma has been successfully parsed. */
-
-/* This function has to be in this file, in order to get at
- the token types. */
-
-static int
-handle_generic_pragma (token)
- register int token;
-{
- register int c;
-
- for (;;)
- {
- switch (token)
- {
- case IDENTIFIER:
- case TYPENAME:
- case STRING:
- case CONSTANT:
- handle_pragma_token (token_buffer, yylval.ttype);
- break;
- default:
- handle_pragma_token (token_buffer, NULL);
- }
- c = GETC ();
-
- while (c == ' ' || c == '\t')
- c = GETC ();
- UNGETC (c);
-
- if (c == '\n' || c == EOF)
- return handle_pragma_token (NULL, NULL);
-
- token = yylex ();
- }
-}
-
-#endif /* HANDLE_GENERIC_PRAGMAS */
-
#define ENDFILE -1 /* token that represents end-of-file */
/* Read an escape sequence, returning its equivalent as a character,
@@ -1022,7 +864,7 @@ yylex ()
register int value;
int wide_flag = 0;
- c = GETC();
+ c = GETC();
/* Effectively do c = skip_white_space (c)
but do it faster in the usual cases. */
@@ -1097,20 +939,10 @@ yylex ()
case 'u': case 'v': case 'w': case 'x': case 'y':
case 'z':
case '_':
- case '$':
letter:
p = token_buffer;
- while (ISALNUM (c) || c == '_' || c == '$')
+ while (ISALNUM (c) || c == '_')
{
- /* Make sure this char really belongs in an identifier. */
- if (c == '$')
- {
- if (! dollars_in_ident)
- error ("`$' in identifier");
- else if (pedantic)
- pedwarn ("`$' in identifier");
- }
-
if (p >= token_buffer + maxtoken)
p = extend_token_buffer (p);
@@ -1714,7 +1546,7 @@ yylex ()
UNGETC (c);
*p = 0;
- if (ISALNUM (c) || c == '.' || c == '_' || c == '$'
+ if (ISALNUM (c) || c == '.' || c == '_'
|| (!flag_traditional && (c == '-' || c == '+')
&& (p[-1] == 'e' || p[-1] == 'E')))
error ("missing white space after number `%s'", token_buffer);
@@ -1730,10 +1562,6 @@ yylex ()
int chars_seen = 0;
unsigned width = TYPE_PRECISION (char_type_node);
int max_chars;
-#ifdef MULTIBYTE_CHARS
- int longest_char = local_mb_cur_max ();
- (void) local_mbtowc (NULL, NULL, 0);
-#endif
max_chars = TYPE_PRECISION (integer_type_node) / width;
if (wide_flag)
@@ -1757,10 +1585,6 @@ yylex ()
if (width < HOST_BITS_PER_INT
&& (unsigned) c >= ((unsigned)1 << width))
pedwarn ("escape sequence out of range for character");
-#ifdef MAP_CHARACTER
- if (ISPRINT (c))
- c = MAP_CHARACTER (c);
-#endif
}
else if (c == '\n')
{
@@ -1768,66 +1592,6 @@ yylex ()
pedwarn ("ANSI C forbids newline in character constant");
lineno++;
}
- else
- {
-#ifdef MULTIBYTE_CHARS
- wchar_t wc;
- int i;
- int char_len = -1;
- for (i = 1; i <= longest_char; ++i)
- {
- if (i > maxtoken - 4)
- extend_token_buffer (token_buffer);
-
- token_buffer[i] = c;
- char_len = local_mbtowc (& wc,
- token_buffer + 1,
- i);
- if (char_len != -1)
- break;
- c = GETC ();
- }
- if (char_len > 1)
- {
- /* mbtowc sometimes needs an extra char before accepting */
- if (char_len < i)
- UNGETC (c);
- if (! wide_flag)
- {
- /* Merge character into result; ignore excess chars. */
- for (i = 1; i <= char_len; ++i)
- {
- if (i > max_chars)
- break;
- if (width < HOST_BITS_PER_INT)
- result = (result << width)
- | (token_buffer[i]
- & ((1 << width) - 1));
- else
- result = token_buffer[i];
- }
- num_chars += char_len;
- goto tryagain;
- }
- c = wc;
- }
- else
- {
- if (char_len == -1)
- warning ("Ignoring invalid multibyte character");
- if (wide_flag)
- c = wc;
-#ifdef MAP_CHARACTER
- else
- c = MAP_CHARACTER (c);
-#endif
- }
-#else /* ! MULTIBYTE_CHARS */
-#ifdef MAP_CHARACTER
- c = MAP_CHARACTER (c);
-#endif
-#endif /* ! MULTIBYTE_CHARS */
- }
if (wide_flag)
{
@@ -1894,10 +1658,6 @@ yylex ()
{
unsigned width = wide_flag ? WCHAR_TYPE_SIZE
: TYPE_PRECISION (char_type_node);
-#ifdef MULTIBYTE_CHARS
- int longest_char = local_mb_cur_max ();
- (void) local_mbtowc (NULL, NULL, 0);
-#endif
c = GETC ();
p = token_buffer + 1;
@@ -1919,40 +1679,6 @@ yylex ()
pedwarn ("ANSI C forbids newline in string constant");
lineno++;
}
- else
- {
-#ifdef MULTIBYTE_CHARS
- wchar_t wc;
- int i;
- int char_len = -1;
- for (i = 0; i < longest_char; ++i)
- {
- if (p + i >= token_buffer + maxtoken)
- p = extend_token_buffer (p);
- p[i] = c;
-
- char_len = local_mbtowc (& wc, p, i + 1);
- if (char_len != -1)
- break;
- c = GETC ();
- }
- if (char_len == -1)
- warning ("Ignoring invalid multibyte character");
- else
- {
- /* mbtowc sometimes needs an extra char before accepting */
- if (char_len <= i)
- UNGETC (c);
- if (! wide_flag)
- {
- p += (i + 1);
- c = GETC ();
- continue;
- }
- c = wc;
- }
-#endif /* MULTIBYTE_CHARS */
- }
/* Add this single character into the buffer either as a wchar_t
or as a single byte. */
diff --git a/gcc/c-parse.c b/gcc/c-parse.c
index 27b2300..ee174d1 100644
--- a/gcc/c-parse.c
+++ b/gcc/c-parse.c
@@ -206,10 +206,6 @@
#include "output.h"
#include "toplev.h"
-#ifdef MULTIBYTE_CHARS
-#include <locale.h>
-#endif
-
/* Since parsers are distinct for each language, put the language string
definition here. */
diff --git a/gcc/c-pragma.c b/gcc/c-pragma.c
deleted file mode 100755
index 35379e3..0000000
--- a/gcc/c-pragma.c
+++ /dev/null
@@ -1,452 +0,0 @@
-/* Handle #pragma, system V.4 style. Supports #pragma weak and #pragma pack.
- Copyright (C) 1992, 1997, 1998 Free Software Foundation, Inc.
-
-This file is part of GNU CC.
-
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-#include "config.h"
-#include "system.h"
-#include "rtl.h"
-#include "tree.h"
-#include "except.h"
-#include "function.h"
-#include "defaults.h"
-#include "c-pragma.h"
-#include "flags.h"
-#include "toplev.h"
-
-#ifdef HANDLE_GENERIC_PRAGMAS
-
-#ifdef HANDLE_PRAGMA_PACK
-/* When structure field packing is in effect, this variable is the
- number of bits to use as the maximum alignment. When packing is not
- in effect, this is zero. */
-
-extern int maximum_field_alignment;
-#endif
-
-
-#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
-typedef struct align_stack
-{
- int alignment;
- unsigned int num_pushes;
- struct align_stack * prev;
-} align_stack;
-
-static struct align_stack * alignment_stack = NULL;
-
-static int push_alignment (int);
-static int pop_alignment (void);
-
-/* Push an alignment value onto the stack. */
-static int
-push_alignment (alignment)
- int alignment;
-{
- switch (alignment)
- {
- case 0:
- case 1:
- case 2:
- case 4:
- case 8:
- case 16:
- break;
- default:
- warning ("\
-Alignment must be a small power of two, not %d, in #pragma pack",
- alignment);
- return 0;
- }
-
- if (alignment_stack == NULL
- || alignment_stack->alignment != alignment)
- {
- align_stack * entry;
-
- entry = (align_stack *) xmalloc (sizeof (* entry));
-
- if (entry == NULL)
- {
- warning ("Out of memory pushing #pragma pack");
- return 0;
- }
-
- entry->alignment = alignment;
- entry->num_pushes = 1;
- entry->prev = alignment_stack;
-
- alignment_stack = entry;
-
- if (alignment < 8)
- maximum_field_alignment = alignment * 8;
- else
- /* MSVC ignores alignments > 4. */
- maximum_field_alignment = 0;
- }
- else
- alignment_stack->num_pushes ++;
-
- return 1;
-}
-
-/* Undo a push of an alignment onto the stack. */
-static int
-pop_alignment ()
-{
- if (alignment_stack == NULL)
- {
- warning ("\
-#pragma pack(pop) encountered without corresponding #pragma pack(push,<n>)");
- return 0;
- }
-
- if (-- alignment_stack->num_pushes == 0)
- {
- align_stack * entry;
-
- entry = alignment_stack->prev;
-
- if (entry == NULL || entry->alignment > 4)
- maximum_field_alignment = 0;
- else
- maximum_field_alignment = entry->alignment * 8;
-
- free (alignment_stack);
-
- alignment_stack = entry;
- }
-
- return 1;
-}
-
-/* Generate 'packed' and 'aligned' attributes for decls whilst a
- #pragma pack(push... is in effect. */
-void
-insert_pack_attributes (node, attributes, prefix)
- tree node;
- tree * attributes;
- tree * prefix;
-{
- tree a;
-
- /* If we are not packing, then there is nothing to do. */
- if (maximum_field_alignment == 0
- || alignment_stack == NULL)
- return;
-
- /* We are only interested in fields. */
- if (TREE_CODE_CLASS (TREE_CODE (node)) != 'd'
- || TREE_CODE (node) != FIELD_DECL)
- return;
-
- /* Add a 'packed' attribute. */
- * attributes = tree_cons (get_identifier ("packed"), NULL, * attributes);
-
- /* If the alignment is > 8 then add an alignment attribute as well. */
- if (maximum_field_alignment > 8)
- {
- /* If the aligned attribute is already present then do not override it. */
- for (a = * attributes; a; a = TREE_CHAIN (a))
- {
- tree name = TREE_PURPOSE (a);
- if (strcmp (IDENTIFIER_POINTER (name), "aligned") == 0)
- break;
- }
-
- if (a == NULL)
- for (a = * prefix; a; a = TREE_CHAIN (a))
- {
- tree name = TREE_PURPOSE (a);
- if (strcmp (IDENTIFIER_POINTER (name), "aligned") == 0)
- break;
- }
-
- if (a == NULL)
- {
- * attributes = tree_cons
- (get_identifier ("aligned"),
- tree_cons (NULL,
- build_int_2 (maximum_field_alignment / 8, 0),
- NULL),
- * attributes);
- }
- }
-
- return;
-}
-#endif /* HANDLE_PRAGMA_PACK_PUSH_POP */
-
-#ifdef HANDLE_PRAGMA_WEAK
-static int add_weak (char *, char *);
-
-static int
-add_weak (name, value)
- char * name;
- char * value;
-{
- struct weak_syms * weak;
-
- weak = (struct weak_syms *) permalloc (sizeof (struct weak_syms));
-
- if (weak == NULL)
- return 0;
-
- weak->next = weak_decls;
- weak->name = name;
- weak->value = value;
- weak_decls = weak;
-
- return 1;
-}
-#endif /* HANDLE_PRAGMA_WEAK */
-
-/* Handle one token of a pragma directive. TOKEN is the current token, and
- STRING is its printable form. Some front ends do not support generating
- tokens, and will only pass in a STRING. Also some front ends will reuse
- the buffer containing STRING, so it must be copied to a local buffer if
- it needs to be preserved.
-
- If STRING is non-NULL, then the return value will be ignored, and there
- will be futher calls to handle_pragma_token() in order to handle the rest of
- the line containing the #pragma directive. If STRING is NULL, the entire
- line has now been presented to handle_pragma_token() and the return value
- should be zero if the pragma flawed in some way, or if the pragma was not
- recognised, and non-zero if it was successfully handled. */
-
-int
-handle_pragma_token (string, token)
- char * string;
- tree token;
-{
- static enum pragma_state state = ps_start;
- static enum pragma_state type;
- static char * name;
- static char * value;
- static int align;
-
- /* If we have reached the end of the #pragma directive then
- determine what value we should return. */
-
- if (string == NULL)
- {
- int ret_val = 0;
-
- switch (type)
- {
- default:
- abort ();
- break;
-
- case ps_done:
- /* The pragma was not recognised. */
- break;
-
-#ifdef HANDLE_PRAGMA_PACK
- case ps_pack:
- if (state == ps_right)
- {
- maximum_field_alignment = align * 8;
- ret_val = 1;
- }
- else
- warning ("malformed `#pragma pack'");
- break;
-#endif /* HANDLE_PRAGMA_PACK */
-
-#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
- case ps_push:
- if (state == ps_right)
- ret_val = push_alignment (align);
- else
- warning ("incomplete '#pragma pack(push,<n>)'");
- break;
-
- case ps_pop:
- if (state == ps_right)
- ret_val = pop_alignment ();
- else
- warning ("missing closing parenthesis in '#pragma pack(pop)'");
- break;
-#endif /* HANDLE_PRAGMA_PACK_PUSH_POP */
-
-#ifdef HANDLE_PRAGMA_WEAK
- case ps_weak:
- if (HANDLE_PRAGMA_WEAK)
- {
- if (state == ps_name)
- ret_val = add_weak (name, NULL);
- else if (state == ps_value)
- ret_val = add_weak (name, value);
- else
- warning ("malformed `#pragma weak'");
- }
- else
- ret_val = 1; /* Ignore the pragma. */
- break;
-#endif /* HANDLE_PRAGMA_WEAK */
- }
-
- type = state = ps_start;
-
- return ret_val;
- }
-
- /* If we have been given a token, but it is not an identifier,
- or a small constant, then something has gone wrong. */
- if (token)
- {
- switch (TREE_CODE (token))
- {
- case IDENTIFIER_NODE:
- break;
-
- case INTEGER_CST:
- if (TREE_INT_CST_HIGH (token) != 0)
- return 0;
- break;
-
- default:
- return 0;
- }
- }
-
- switch (state)
- {
- case ps_start:
- type = state = ps_done;
-#ifdef HANDLE_PRAGMA_PACK
- if (strcmp (string, "pack") == 0)
- type = state = ps_pack;
-#endif
-#ifdef HANDLE_PRAGMA_WEAK
- if (strcmp (string, "weak") == 0)
- type = state = ps_weak;
-#endif
- break;
-
-#ifdef HANDLE_PRAGMA_WEAK
- case ps_weak:
- name = permalloc (strlen (string) + 1);
- if (name == NULL)
- {
- warning ("Out of memory parsing #pragma weak");
- state = ps_bad;
- }
- else
- {
- strcpy (name, string);
- state = ps_name;
- }
- break;
-
- case ps_name:
- state = (strcmp (string, "=") ? ps_bad : ps_equals);
- break;
-
- case ps_equals:
- value = permalloc (strlen (string) + 1);
- if (value == NULL)
- {
- warning ("Out of memory parsing #pragma weak");
- state = ps_bad;
- }
- else
- {
- strcpy (value, string);
- state = ps_value;
- }
- break;
-
- case ps_value:
- state = ps_bad;
- break;
-#endif /* HANDLE_PRAGMA_WEAK */
-
-#ifdef HANDLE_PRAGMA_PACK
- case ps_pack:
- state = (strcmp (string, "(") ? ps_bad : ps_left);
- break;
-
- case ps_left:
-
- if (token && TREE_CODE(token) == INTEGER_CST)
- align = TREE_INT_CST_LOW(token);
- else
- align = atoi (string);
- switch (align)
- {
- case 1:
- case 2:
- case 4:
- state = ps_align;
- break;
-
- case 0:
- state = (strcmp (string, ")") ? ps_bad : ps_right);
-#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
- if (state == ps_bad)
- {
- if (strcmp (string, "push") == 0)
- type = state = ps_push;
- else if (strcmp (string, "pop") == 0)
- type = state = ps_pop;
- }
-#endif
- break;
-
- default:
- state = ps_bad;
- break;
- }
- break;
-
-#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
- case ps_pop:
-#endif
- case ps_align:
- state = (strcmp (string, ")") ? ps_bad : ps_right);
- break;
-
- case ps_right:
- state = ps_bad;
- break;
-#endif /* HANDLE_PRAGMA_PACK */
-
-#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
- case ps_push:
- state = (strcmp (string, ",") ? ps_bad : ps_comma);
- break;
-
- case ps_comma:
- align = atoi (string);
- state = ps_align;
- break;
-#endif /* HANDLE_PRAGMA_PACK_PUSH_POP */
-
- case ps_bad:
- case ps_done:
- break;
-
- default:
- abort ();
- }
-
- return 1;
-}
-#endif /* HANDLE_GENERIC_PRAGMAS */
diff --git a/gcc/c-pragma.h b/gcc/c-pragma.h
deleted file mode 100755
index 6ee195a..0000000
--- a/gcc/c-pragma.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Pragma related interfaces.
- Copyright (C) 1995, 1998 Free Software Foundation, Inc.
-
-This file is part of GNU CC.
-
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-#ifndef _C_PRAGMA_H
-#define _C_PRAGMA_H
-
-#ifdef HANDLE_SYSV_PRAGMA
-/* Support #pragma weak iff ASM_WEAKEN_LABEL and ASM_OUTPUT_DEF are
- defined. */
-#if defined (ASM_WEAKEN_LABEL) && defined (ASM_OUTPUT_DEF)
-#define HANDLE_PRAGMA_WEAK SUPPORTS_WEAK
-#endif
-
-/* We always support #pragma pack for SYSV pragmas. */
-#ifndef HANDLE_PRAGMA_PACK
-#define HANDLE_PRAGMA_PACK 1
-#endif
-#endif /* HANDLE_SYSV_PRAGMA */
-
-
-#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
-/* If we are supporting #pragma pack(push... then we automatically
- support #pragma pack(<n>) */
-#define HANDLE_PRAGMA_PACK 1
-#define PRAGMA_INSERT_ATTRIBUTES(node, pattr, prefix_attr) \
- insert_pack_attributes (node, pattr, prefix_attr)
-extern void insert_pack_attributes (tree, tree *, tree *);
-#endif /* HANDLE_PRAGMA_PACK_PUSH_POP */
-
-
-#ifdef HANDLE_PRAGMA_WEAK
-/* This structure contains any weak symbol declarations waiting to be emitted. */
-struct weak_syms
-{
- struct weak_syms * next;
- char * name;
- char * value;
-};
-
-/* Declared in varasm.c */
-extern struct weak_syms * weak_decls;
-#endif /* HANDLE_PRAGMA_WEAK */
-
-
-#if defined HANDLE_PRAGMA_PACK || defined HANDLE_PRAGMA_WEAK
-/* Define HANDLE_GENERIC_PRAGMAS if any kind of front-end pragma
- parsing is to be done. The code in GCC's generic C source files
- will only look for the definition of this constant. They will
- ignore definitions of HANDLE_PRAGMA_PACK and so on. */
-#define HANDLE_GENERIC_PRAGMAS 1
-#endif
-
-
-#ifdef HANDLE_GENERIC_PRAGMAS
-enum pragma_state
-{
- ps_start,
- ps_done,
-#ifdef HANDLE_PRAGMA_WEAK
- ps_weak,
- ps_name,
- ps_equals,
- ps_value,
-#endif
-#ifdef HANDLE_PRAGMA_PACK
- ps_pack,
- ps_left,
- ps_align,
- ps_right,
-#endif
-#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
- ps_push,
- ps_pop,
- ps_comma,
-#endif
- ps_bad
-};
-
-/* Handle a C style pragma */
-extern int handle_pragma_token (char *, tree);
-
-#endif /* HANDLE_GENERIC_PRAGMAS */
-#endif /* _C_PRAGMA_H */
diff --git a/gcc/c-tree.h b/gcc/c-tree.h
index 6f45127..6ce8e4d 100755
--- a/gcc/c-tree.h
+++ b/gcc/c-tree.h
@@ -187,8 +187,8 @@ extern tree convert_and_check (tree, tree);
extern void overflow_warning (tree);
extern void unsigned_conversion_warning (tree, tree);
/* Read the rest of the current #-directive line. */
-extern char *get_directive_line (void);
-#define GET_DIRECTIVE_LINE() get_directive_line ()
+extern char *get_directive_line (FILE *);
+#define GET_DIRECTIVE_LINE() get_directive_line(finput)
/* Subroutine of build_binary_op, used for comparison operations.
See if the operands have both been converted from subword integer types
@@ -273,7 +273,7 @@ extern tree c_build_qualified_type (tree, int);
c_build_qualified_type (TYPE, \
((CONST_P) ? TYPE_QUAL_CONST : 0) | \
((VOLATILE_P) ? TYPE_QUAL_VOLATILE : 0))
-extern int c_decode_option (int, char **);
+extern void c_decode_option (char *);
extern void c_mark_varargs (void);
extern tree check_identifier (tree, tree);
extern void clear_parm_order (void);
@@ -410,10 +410,6 @@ extern int current_function_returns_null;
extern int skip_evaluation;
-/* Nonzero means `$' can be in an identifier. */
-
-extern int dollars_in_ident;
-
/* Nonzero means allow type mismatches in conditional expressions;
just make their values `void'. */
@@ -530,10 +526,6 @@ extern int warn_multichar;
extern int warn_long_long;
-/* Nonzero means we are reading code that came from a system header file. */
-
-extern int system_header_p;
-
/* In c-decl.c */
extern void finish_incomplete_decl (tree);
diff --git a/gcc/config.guess b/gcc/config.guess
deleted file mode 100755
index fd7602d..0000000
--- a/gcc/config.guess
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-# Use the top-level config.guess so that we don't have two of them.
-guesssys=`echo $0 | sed 's|config.guess|../config.guess|'`
-exec ${guesssys} "$@"
diff --git a/gcc/config.in b/gcc/config.in
deleted file mode 100755
index 13f0772..0000000
--- a/gcc/config.in
+++ /dev/null
@@ -1,240 +0,0 @@
-/* config.in. Generated automatically from configure.in by autoheader. */
-/* Define if you can safely include both <string.h> and <strings.h>. */
-#undef STRING_WITH_STRINGS
-
-/* Define if printf supports "%p". */
-#undef HAVE_PRINTF_PTR
-
-/* Define if you want expensive run-time checks. */
-#undef ENABLE_CHECKING
-
-/* Define if your cpp understands the stringify operator. */
-#undef HAVE_CPP_STRINGIFY
-
-/* Define if your compiler understands volatile. */
-#undef HAVE_VOLATILE
-
-/* Define if your assembler supports specifying the maximum number
- of bytes to skip when using the GAS .p2align command. */
-#undef HAVE_GAS_MAX_SKIP_P2ALIGN
-
-/* Define if your assembler supports .balign and .p2align. */
-#undef HAVE_GAS_BALIGN_AND_P2ALIGN
-
-/* Define if your assembler supports .subsection and .subsection -1 starts
- emitting at the beginning of your section */
-#undef HAVE_GAS_SUBSECTION_ORDERING
-
-/* Define if you have a working <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Whether malloc must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_MALLOC
-
-/* Whether realloc must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_REALLOC
-
-/* Whether calloc must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_CALLOC
-
-/* Whether free must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_FREE
-
-/* Whether bcopy must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_BCOPY
-
-/* Whether bcmp must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_BCMP
-
-/* Whether bzero must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_BZERO
-
-/* Whether index must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_INDEX
-
-/* Whether rindex must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_RINDEX
-
-/* Whether getenv must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_GETENV
-
-/* Whether atol must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_ATOL
-
-/* Whether sbrk must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_SBRK
-
-/* Whether abort must be declared even if <stdlib.h> is included. */
-#undef NEED_DECLARATION_ABORT
-
-/* Whether strerror must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_STRERROR
-
-/* Whether strsignal must be declared even if <string.h> is included. */
-#undef NEED_DECLARATION_STRSIGNAL
-
-/* Whether getcwd must be declared even if <unistd.h> is included. */
-#undef NEED_DECLARATION_GETCWD
-
-/* Whether getwd must be declared even if <unistd.h> is included. */
-#undef NEED_DECLARATION_GETWD
-
-/* Whether getrlimit must be declared even if <sys/resource.h> is included. */
-#undef NEED_DECLARATION_GETRLIMIT
-
-/* Whether setrlimit must be declared even if <sys/resource.h> is included. */
-#undef NEED_DECLARATION_SETRLIMIT
-
-/* Define if you want expensive run-time checks. */
-#undef ENABLE_CHECKING
-
-/* Define to enable the use of a default assembler. */
-#undef DEFAULT_ASSEMBLER
-
-/* Define to enable the use of a default linker. */
-#undef DEFAULT_LINKER
-
-
-/* Define if you don't have vprintf but do have _doprnt. */
-#undef HAVE_DOPRNT
-
-/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
-#undef HAVE_SYS_WAIT_H
-
-/* Define if you have <vfork.h>. */
-#undef HAVE_VFORK_H
-
-/* Define if you have the vprintf function. */
-#undef HAVE_VPRINTF
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-#undef pid_t
-
-/* Define if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define if `sys_siglist' is declared by <signal.h>. */
-#undef SYS_SIGLIST_DECLARED
-
-/* Define if you can safely include both <sys/time.h> and <time.h>. */
-#undef TIME_WITH_SYS_TIME
-
-/* Define vfork as fork if vfork does not work. */
-#undef vfork
-
-/* Define if you have the atoll function. */
-#undef HAVE_ATOLL
-
-/* Define if you have the atoq function. */
-#undef HAVE_ATOQ
-
-/* Define if you have the bcmp function. */
-#undef HAVE_BCMP
-
-/* Define if you have the bcopy function. */
-#undef HAVE_BCOPY
-
-/* Define if you have the bsearch function. */
-#undef HAVE_BSEARCH
-
-/* Define if you have the bzero function. */
-#undef HAVE_BZERO
-
-/* Define if you have the fputc_unlocked function. */
-#undef HAVE_FPUTC_UNLOCKED
-
-/* Define if you have the fputs_unlocked function. */
-#undef HAVE_FPUTS_UNLOCKED
-
-/* Define if you have the getrlimit function. */
-#undef HAVE_GETRLIMIT
-
-/* Define if you have the gettimeofday function. */
-#undef HAVE_GETTIMEOFDAY
-
-/* Define if you have the index function. */
-#undef HAVE_INDEX
-
-/* Define if you have the isascii function. */
-#undef HAVE_ISASCII
-
-/* Define if you have the kill function. */
-#undef HAVE_KILL
-
-/* Define if you have the popen function. */
-#undef HAVE_POPEN
-
-/* Define if you have the putc_unlocked function. */
-#undef HAVE_PUTC_UNLOCKED
-
-/* Define if you have the putenv function. */
-#undef HAVE_PUTENV
-
-/* Define if you have the rindex function. */
-#undef HAVE_RINDEX
-
-/* Define if you have the setrlimit function. */
-#undef HAVE_SETRLIMIT
-
-/* Define if you have the strchr function. */
-#undef HAVE_STRCHR
-
-/* Define if you have the strerror function. */
-#undef HAVE_STRERROR
-
-/* Define if you have the strrchr function. */
-#undef HAVE_STRRCHR
-
-/* Define if you have the strsignal function. */
-#undef HAVE_STRSIGNAL
-
-/* Define if you have the strtoul function. */
-#undef HAVE_STRTOUL
-
-/* Define if you have the sysconf function. */
-#undef HAVE_SYSCONF
-
-/* Define if you have the <fcntl.h> header file. */
-#undef HAVE_FCNTL_H
-
-/* Define if you have the <limits.h> header file. */
-#undef HAVE_LIMITS_H
-
-/* Define if you have the <stab.h> header file. */
-#undef HAVE_STAB_H
-
-/* Define if you have the <stddef.h> header file. */
-#undef HAVE_STDDEF_H
-
-/* Define if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define if you have the <sys/file.h> header file. */
-#undef HAVE_SYS_FILE_H
-
-/* Define if you have the <sys/param.h> header file. */
-#undef HAVE_SYS_PARAM_H
-
-/* Define if you have the <sys/resource.h> header file. */
-#undef HAVE_SYS_RESOURCE_H
-
-/* Define if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define if you have the <sys/time.h> header file. */
-#undef HAVE_SYS_TIME_H
-
-/* Define if you have the <sys/times.h> header file. */
-#undef HAVE_SYS_TIMES_H
-
-/* Define if you have the <time.h> header file. */
-#undef HAVE_TIME_H
-
-/* Define if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
diff --git a/gcc/config.sub b/gcc/config.sub
deleted file mode 100755
index fec3b6f..0000000
--- a/gcc/config.sub
+++ /dev/null
@@ -1,1225 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script, version 1.1.
-# Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine. It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support. The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-if [ x$1 = x ]
-then
- echo Configuration name missing. 1>&2
- echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
- echo "or $0 ALIAS" 1>&2
- echo where ALIAS is a recognized configuration type. 1>&2
- exit 1
-fi
-
-# First pass through any local machine types.
-case $1 in
- *local*)
- echo $1
- exit 0
- ;;
- *)
- ;;
-esac
-
-# CYGNUS LOCAL marketing-names
-# Here we handle any "marketing" names - translating them to
-# standard triplets
-case $1 in
- mips-tx39-elf)
- set mipstx39-unknown-elf
- ;;
- *)
- ;;
-esac
-# END CYGNUS LOCAL marketing-names
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
- linux-gnu*)
- os=-$maybe_os
- basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
- ;;
- *)
- basic_machine=`echo $1 | sed 's/-[^-]*$//'`
- if [ $basic_machine != $1 ]
- then os=`echo $1 | sed 's/.*-/-/'`
- else os=; fi
- ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work. We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
- -sun*os*)
- # Prevent following clause from handling this invalid input.
- ;;
- -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
- -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
- -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
- -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
- -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
- -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
- -apple)
- os=
- basic_machine=$1
- ;;
- -sim | -cisco | -oki | -wec | -winbond ) # CYGNUS LOCAL
- os=
- basic_machine=$1
- ;;
- -apple*) # CYGNUS LOCAL
- os=
- basic_machine=$1
- ;;
- -wrs) # CYGNUS LOCAL
- os=vxworks
- basic_machine=$1
- ;;
- -hiux*)
- os=-hiuxwe2
- ;;
- -sco5)
- os=-sco3.2v5
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco4)
- os=-sco3.2v4
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2v[4-9]*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -udk*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco*)
- os=-sco3.2v2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -isc)
- os=-isc2.2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -clix*)
- basic_machine=clipper-intergraph
- ;;
- -isc*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -lynx*)
- os=-lynxos
- ;;
- -ptx*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
- ;;
- -windowsnt*)
- os=`echo $os | sed -e 's/windowsnt/winnt/'`
- ;;
- -psos*)
- os=-psos
- ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
- # Recognize the basic CPU types without company name.
- # Some are omitted here because they have special meanings below.
- tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
- | arme[lb] | pyramid | mn10200 | mn10300 \
- | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
- | alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
- | i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
- | mips64 | mipsel | mips64el | mips64orion | mips64orionel \
- | mipstx39 | mipstx39el \
- | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850)
- basic_machine=$basic_machine-unknown
- ;;
- m680[01234]0 | m683?2 | m68360 | z8k | v70 | h8500 | w65 | fr30) # CYGNUS LOCAL
- basic_machine=$basic_machine-unknown
- ;;
- mips64vr4300 | mips64vr4300el) # CYGNUS LOCAL jsmith/vr4300
- basic_machine=$basic_machine-unknown
- ;;
- mips64vr4100 | mips64vr4100el) # CYGNUS LOCAL jsmith/vr4100
- basic_machine=$basic_machine-unknown
- ;;
- mips64vr5000 | mips64vr5000el) # CYGNUS LOCAL ian/vr5000
- basic_machine=$basic_machine-unknown
- ;;
- mips64vr5400 | mips64vr5400el) # CYGNUS LOCAL raeburn/vr5400
- basic_machine=$basic_machine-unknown
- ;;
-
- thumb | thumbel | thumb-pe)
- basic_machine=$basic_machine-unknown
- ;;
- thumb-pe) # CYGNUS LOCAL nickc/thumb-pe
- basic_machine=$basic_machine-unknown
- ;;
- # CYGNUS LOCAL v850e/nick
- v850e)
- basic_machine=$basic_machine-unknown
- ;;
- v850ea)
- basic_machine=$basic_machine-unknown
- ;;
- # END CYGNUS LOCAL
- d10v) # CYGNUS LOCAL meissner/d10v
- basic_machine=$basic_machine-unknown
- ;;
- # CYGNUS LOCAL d30v
- d30v)
- basic_machine=$basic_machine-unknown
- ;;
- # END CYGNUS LOCAL
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i[34567]86)
- basic_machine=$basic_machine-pc
- ;;
- # Object if more than one company name word.
- *-*-*)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
- # Recognize the basic CPU types with company name.
- vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
- | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
- | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
- | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
- | xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* \
- | alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
- | ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
- | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
- | sparc64-* | sparcv9-* | mips64-* | mipsel-* \
- | mips64el-* | mips64orion-* | mips64orionel-* \
- | mipstx39-* | mipstx39el-* \
- | f301-*)
- ;;
- m680[01234]0-* | m683?2-* | m68360-* | z8k-* | h8500-*) # CYGNUS LOCAL
- ;;
- mips64vr4300-* | mips64vr4300el-*) # CYGNUS LOCAL jsmith/vr4300
- ;;
- mips64vr4100-* | mips64vr4100el-*) # CYGNUS LOCAL jsmith/vr4100
- ;;
- mips64vr5400-* | mips64vr5400el-*) # CYGNUS LOCAL raeburn/vr5400
- ;;
- # Recognize the various machine names and aliases which stand
- # for a CPU type and a company and sometimes even an OS.
- 386bsd) # CYGNUS LOCAL
- basic_machine=i386-unknown
- os=-bsd
- ;;
- 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- basic_machine=m68000-att
- ;;
- 3b*)
- basic_machine=we32k-att
- ;;
- a29khif) # CYGNUS LOCAL
- basic_machine=a29k-amd
- os=-udi
- ;;
- alliant | fx80)
- basic_machine=fx80-alliant
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- ;;
- am29k)
- basic_machine=a29k-none
- os=-bsd
- ;;
- amdahl)
- basic_machine=580-amdahl
- os=-sysv
- ;;
- amiga | amiga-*)
- basic_machine=m68k-cbm
- ;;
- amigaos | amigados)
- basic_machine=m68k-cbm
- os=-amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-cbm
- os=-sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- os=-sysv
- ;;
- apollo68bsd) # CYGNUS LOCAL
- basic_machine=m68k-apollo
- os=-bsd
- ;;
- aux)
- basic_machine=m68k-apple
- os=-aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- os=-dynix
- ;;
- convex-c1)
- basic_machine=c1-convex
- os=-bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- os=-bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- os=-bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- os=-bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- os=-bsd
- ;;
- cray | ymp)
- basic_machine=ymp-cray
- os=-unicos
- ;;
- cray2)
- basic_machine=cray2-cray
- os=-unicos
- ;;
- [ctj]90-cray)
- basic_machine=c90-cray
- os=-unicos
- ;;
- crds | unos)
- basic_machine=m68k-crds
- ;;
- da30 | da30-*)
- basic_machine=m68k-da30
- ;;
- decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- ;;
- delta | 3300 | motorola-3300 | motorola-delta \
- | 3300-motorola | delta-motorola)
- basic_machine=m68k-motorola
- ;;
- delta88)
- basic_machine=m88k-motorola
- os=-sysv3
- ;;
- dpx20 | dpx20-*)
- basic_machine=rs6000-bull
- os=-bosx
- ;;
- dpx2* | dpx2*-bull)
- basic_machine=m68k-bull
- os=-sysv3
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- os=-ebmon
- ;;
- elxsi)
- basic_machine=elxsi-elxsi
- os=-bsd
- ;;
- encore | umax | mmax)
- basic_machine=ns32k-encore
- ;;
- es1800 | OSE68k | ose68k | ose | OSE) # CYGNUS LOCAL
- basic_machine=m68k-ericsson
- os=-ose
- ;;
- fx2800)
- basic_machine=i860-alliant
- ;;
- genix)
- basic_machine=ns32k-ns
- ;;
- gmicro)
- basic_machine=tron-gmicro
- os=-sysv
- ;;
- h3050r* | hiux*)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- os=-hms
- ;;
- h8300xray) # CYGNUS LOCAL
- basic_machine=h8300-hitachi
- os=-xray
- ;;
- h8500hms) # CYGNUS LOCAL
- basic_machine=h8500-hitachi
- os=-hms
- ;;
- harris)
- basic_machine=m88k-harris
- os=-sysv3
- ;;
- hp300-*)
- basic_machine=m68k-hp
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- os=-bsd
- ;;
- hp300hpux)
- basic_machine=m68k-hp
- os=-hpux
- ;;
- w89k-*) # CYGNUS LOCAL
- basic_machine=hppa1.1-winbond
- os=-proelf
- ;;
- op50n-*) # CYGNUS LOCAL
- basic_machine=hppa1.1-oki
- os=-proelf
- ;;
- op60c-*) # CYGNUS LOCAL
- basic_machine=hppa1.1-oki
- os=-proelf
- ;;
- hppro) # CYGNUS LOCAL
- basic_machine=hppa1.1-hp
- os=-proelf
- ;;
-
- hp3k9[0-9][0-9] | hp9[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k2[0-9][0-9] | hp9k31[0-9])
- basic_machine=m68000-hp
- ;;
- hp9k3[2-9][0-9])
- basic_machine=m68k-hp
- ;;
- hp9k6[0-9][0-9] | hp6[0-9][0-9] )
- basic_machine=hppa1.0-hp
- ;;
- hp9k7[0-79][0-9] | hp7[0-79][0-9] )
- basic_machine=hppa1.1-hp
- ;;
- hp9k78[0-9] | hp78[0-9] )
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | \
- hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893 )
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][13679] | hp8[0-9][13679] )
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][0-9] | hp8[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hppa-next)
- os=-nextstep3
- ;;
- hppaosf) # CYGNUS LOCAL
- basic_machine=hppa1.1-hp
- os=-osf
- ;;
- i370-ibm* | ibm*)
- basic_machine=i370-ibm
- os=-mvs
- ;;
-# I'm not sure what "Sysv32" means. Should this be sysv3.2?
- i[34567]86v32)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv32
- ;;
- i[34567]86v4*)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv4
- ;;
- i[34567]86v)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv
- ;;
- i[34567]86sol2)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-solaris2
- ;;
- i386mach) # CYGNUS LOCAL
- basic_machine=i386-mach
- os=-mach
- ;;
- i386-vsta | vsta) # CYGNUS LOCAL
- basic_machine=i386-unknown
- os=-vsta
- ;;
- i386-go32 | go32) # CYGNUS LOCAL
- basic_machine=i386-unknown
- os=-go32
- ;;
- iris | iris4d)
- basic_machine=mips-sgi
- case $os in
- -irix*)
- ;;
- *)
- os=-irix4
- ;;
- esac
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- os=-sysv
- ;;
- m88k-omron*)
- basic_machine=m88k-omron
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- os=-sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- os=-sysv
- ;;
- miniframe)
- basic_machine=m68000-convergent
- ;;
- mipsel*-linux*)
- basic_machine=mipsel-unknown
- os=-linux-gnu
- ;;
- mips*-linux*)
- basic_machine=mips-unknown
- os=-linux-gnu
- ;;
- mips3*-*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
- ;;
- mips3*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
- ;;
- monitor) # CYGNUS LOCAL
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- msdos) # CYGNUS LOCAL
- basic_machine=i386-unknown
- os=-msdos
- ;;
- ncr3000)
- basic_machine=i486-ncr
- os=-sysv4
- ;;
- netbsd386)
- basic_machine=i386-unknown # CYGNUS LOCAL
- os=-netbsd
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- os=-newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- os=-newsos
- ;;
- news-3600 | risc-news)
- basic_machine=mips-sony
- os=-newsos
- ;;
- necv70) # CYGNUS LOCAL
- basic_machine=v70-nec
- os=-sysv
- ;;
- next | m*-next )
- basic_machine=m68k-next
- case $os in
- -nextstep* )
- ;;
- -ns2*)
- os=-nextstep2
- ;;
- *)
- os=-nextstep3
- ;;
- esac
- ;;
- nh3000)
- basic_machine=m68k-harris
- os=-cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- os=-cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- os=-nindy
- ;;
- mon960) # CYGNUS LOCAL
- basic_machine=i960-intel
- os=-mon960
- ;;
- np1)
- basic_machine=np1-gould
- ;;
- OSE68000 | ose68000) # CYGNUS LOCAL
- basic_machine=m68000-ericsson
- os=-ose
- ;;
- os68k) # CYGNUS LOCAL
- basic_machine=m68k-none
- os=-os68k
- ;;
- pa-hitachi)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- paragon)
- basic_machine=i860-intel
- os=-osf
- ;;
- pbd)
- basic_machine=sparc-tti
- ;;
- pbb)
- basic_machine=m68k-tti
- ;;
- pc532 | pc532-*)
- basic_machine=ns32k-pc532
- ;;
- pentium | p5 | k5 | nexen)
- basic_machine=i586-pc
- ;;
- pentiumpro | p6 | k6 | 6x86)
- basic_machine=i686-pc
- ;;
- pentiumii | pentium2)
- basic_machine=i786-pc
- ;;
- pentium-* | p5-* | k5-* | nexen-*)
- basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumpro-* | p6-* | k6-* | 6x86-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumii-* | pentium2-*)
- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pn)
- basic_machine=pn-gould
- ;;
- power) basic_machine=rs6000-ibm
- ;;
- ppc) basic_machine=powerpc-unknown
- ;;
- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppcle | powerpclittle | ppc-le | powerpc-little)
- basic_machine=powerpcle-unknown
- ;;
- ppcle-* | powerpclittle-*)
- basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ps2)
- basic_machine=i386-ibm
- ;;
- rom68k) # CYGNUS LOCAL
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- rm[46]00)
- basic_machine=mips-siemens
- ;;
- rtpc | rtpc-*)
- basic_machine=romp-ibm
- ;;
- sa29200) # CYGNUS LOCAL
- basic_machine=a29k-amd
- os=-udi
- ;;
- sequent)
- basic_machine=i386-sequent
- ;;
- sh)
- basic_machine=sh-hitachi
- os=-hms
- ;;
- sparclite-wrs) # CYGNUS LOCAL
- basic_machine=sparclite-wrs
- os=-vxworks
- ;;
- sps7)
- basic_machine=m68k-bull
- os=-sysv2
- ;;
- spur)
- basic_machine=spur-unknown
- ;;
- st2000) # CYGNUS LOCAL
- basic_machine=m68k-tandem
- ;;
- stratus) # CYGNUS LOCAL
- basic_machine=i860-stratus
- os=-sysv4
- ;;
- sun2)
- basic_machine=m68000-sun
- ;;
- sun2os3)
- basic_machine=m68000-sun
- os=-sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- os=-sunos4
- ;;
- sun3os3)
- basic_machine=m68k-sun
- os=-sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- os=-sunos4
- ;;
- sun4os3)
- basic_machine=sparc-sun
- os=-sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- os=-sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- os=-solaris2
- ;;
- sun3 | sun3-*)
- basic_machine=m68k-sun
- ;;
- sun4)
- basic_machine=sparc-sun
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- ;;
- symmetry)
- basic_machine=i386-sequent
- os=-dynix
- ;;
- tx39)
- basic_machine=mipstx39-unknown
- ;;
- tx39el)
- basic_machine=mipstx39el-unknown
- ;;
- tower | tower-32)
- basic_machine=m68k-ncr
- ;;
- udi29k)
- basic_machine=a29k-amd
- os=-udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- os=-sym1
- ;;
- v810 | necv810) # CYGNUS LOCAL
- basic_machine=v810-nec
- os=-none
- ;;
- vaxv)
- basic_machine=vax-dec
- os=-sysv
- ;;
- vms)
- basic_machine=vax-dec
- os=-vms
- ;;
- vpp*|vx|vx-*)
- basic_machine=f301-fujitsu
- ;;
- vr5400 | vr5400el) # CYGNUS LOCAL
- basic_machine=mips64vr5400-unknown
- ;;
- vxworks960)
- basic_machine=i960-wrs
- os=-vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- os=-vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- os=-vxworks
- ;;
- w65*) # CYGNUS LOCAL
- basic_machine=w65-wdc
- os=-none
- ;;
- xmp)
- basic_machine=xmp-cray
- os=-unicos
- ;;
- xps | xps100)
- basic_machine=xps100-honeywell
- ;;
- z8k-*-coff) # CYGNUS LOCAL
- basic_machine=z8k-unknown
- os=-sim
- ;;
- none)
- basic_machine=none-none
- os=-none
- ;;
-
-# Here we handle the default manufacturer of certain CPU types. It is in
-# some cases the only manufacturer, in others, it is the most popular.
- w89k) # CYGNUS LOCAL
- basic_machine=hppa1.1-winbond
- ;;
- op50n) # CYGNUS LOCAL
- basic_machine=hppa1.1-oki
- ;;
- op60c) # CYGNUS LOCAL
- basic_machine=hppa1.1-oki
- ;;
- mips)
- if [ x$os = x-linux-gnu ]; then
- basic_machine=mips-unknown
- else
- basic_machine=mips-mips
- fi
- ;;
- romp)
- basic_machine=romp-ibm
- ;;
- rs6000)
- basic_machine=rs6000-ibm
- ;;
- vax)
- basic_machine=vax-dec
- ;;
- pdp11)
- basic_machine=pdp11-dec
- ;;
- we32k)
- basic_machine=we32k-att
- ;;
- sparc | sparcv9)
- basic_machine=sparc-sun
- ;;
- cydra)
- basic_machine=cydra-cydrome
- ;;
- orion)
- basic_machine=orion-highlevel
- ;;
- orion105)
- basic_machine=clipper-highlevel
- ;;
- *)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
- *-digital*)
- basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
- ;;
- *-commodore*)
- basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
- ;;
- *)
- ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
- # First match some system type aliases
- # that might get confused with valid system types.
- # -solaris* is a basic system type, with this one exception.
- -solaris1 | -solaris1.*)
- os=`echo $os | sed -e 's|solaris1|sunos4|'`
- ;;
- -solaris)
- os=-solaris2
- ;;
- -svr4*)
- os=-sysv4
- ;;
- -unixware*)
- os=-sysv4.2uw
- ;;
- -gnu/linux*)
- os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
- ;;
- # First accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST END IN A *, to match a version number.
- # -sysv* is not here because it comes later, after sysvr4.
- -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
- | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
- | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* \
- | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
- | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
- | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
- | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
- | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
- | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
- | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -win32* | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -udk* )
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
- # CYGNUS LOCAL
- -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
- | -windows* | -osx | -abug | -netware* | -os9* \
- | -magic* | -mon960* | -lnews* )
- ;;
- # END CYGNUS LOCAL
- -linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
- ;;
- -sunos5*)
- os=`echo $os | sed -e 's|sunos5|solaris2|'`
- ;;
- -sunos6*)
- os=`echo $os | sed -e 's|sunos6|solaris3|'`
- ;;
- -osfrose*)
- os=-osfrose
- ;;
- -osf*)
- os=-osf
- ;;
- -utek*)
- os=-bsd
- ;;
- -dynix*)
- os=-bsd
- ;;
- -acis*)
- os=-aos
- ;;
- -386bsd) # CYGNUS LOCAL
- os=-bsd
- ;;
- -ctix* | -uts*)
- os=-sysv
- ;;
- -ns2 )
- os=-nextstep2
- ;;
- # Preserve the version number of sinix5.
- -sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
- ;;
- -sinix*)
- os=-sysv4
- ;;
- -triton*)
- os=-sysv3
- ;;
- -oss*)
- os=-sysv3
- ;;
- -svr4)
- os=-sysv4
- ;;
- -svr3)
- os=-sysv3
- ;;
- -sysvr4)
- os=-sysv4
- ;;
- # This must come after -sysvr4.
- -sysv*)
- ;;
- -ose*) # CYGNUS LOCAL
- os=-ose
- ;;
- -es1800*) # CYGNUS LOCAL
- os=-ose
- ;;
- -xenix)
- os=-xenix
- ;;
- -none)
- ;;
- *)
- # Get rid of the `-' at the beginning of $os.
- os=`echo $os | sed 's/[^-]*-//'`
- echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
- exit 1
- ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system. Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
- *-acorn)
- os=-riscix1.2
- ;;
- arm*-semi)
- os=-aout
- ;;
- pdp11-*)
- os=-none
- ;;
- *-dec | vax-*)
- os=-ultrix4.2
- ;;
- m68*-apollo)
- os=-domain
- ;;
- i386-sun)
- os=-sunos4.0.2
- ;;
- m68000-sun)
- os=-sunos3
- # This also exists in the configure program, but was not the
- # default.
- # os=-sunos4
- ;;
- m68*-cisco) # CYGNUS LOCAL
- os=-aout
- ;;
- mips*-cisco) # CYGNUS LOCAL
- os=-elf
- ;;
- mips*-*) # CYGNUS LOCAL
- os=-elf
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=-sysv3
- ;;
- sparc-* | *-sun)
- os=-sunos4.1.1
- ;;
- *-ibm)
- os=-aix
- ;;
- *-wec) # CYGNUS LOCAL
- os=-proelf
- ;;
- *-winbond) # CYGNUS LOCAL
- os=-proelf
- ;;
- *-oki) # CYGNUS LOCAL
- os=-proelf
- ;;
- *-hp)
- os=-hpux
- ;;
- *-hitachi)
- os=-hiux
- ;;
- i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=-sysv
- ;;
- *-cbm)
- os=-amigaos
- ;;
- *-dg)
- os=-dgux
- ;;
- *-dolphin)
- os=-sysv3
- ;;
- m68k-ccur)
- os=-rtu
- ;;
- m88k-omron*)
- os=-luna
- ;;
- *-next )
- os=-nextstep
- ;;
- *-sequent)
- os=-ptx
- ;;
- *-crds)
- os=-unos
- ;;
- *-ns)
- os=-genix
- ;;
- i370-*)
- os=-mvs
- ;;
- *-next)
- os=-nextstep3
- ;;
- *-gould)
- os=-sysv
- ;;
- *-highlevel)
- os=-bsd
- ;;
- *-encore)
- os=-bsd
- ;;
- *-sgi)
- os=-irix
- ;;
- *-siemens)
- os=-sysv4
- ;;
- *-masscomp)
- os=-rtu
- ;;
- f301-fujitsu)
- os=-uxpv
- ;;
- *-rom68k) # CYGNUS LOCAL
- os=-coff
- ;;
- *-*bug) # CYGNUS LOCAL
- os=-coff
- ;;
- *-be)
- os=-beos
- ;;
- *)
- os=-none
- ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer. We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
- *-unknown)
- case $os in
- -riscix*)
- vendor=acorn
- ;;
- -sunos*)
- vendor=sun
- ;;
- -bosx*) # CYGNUS LOCAL
- vendor=bull
- ;;
- -lynxos*) # CYGNUS LOCAL
- vendor=lynx
- ;;
- -aix*)
- vendor=ibm
- ;;
- -hpux*)
- vendor=hp
- ;;
- -hiux*)
- vendor=hitachi
- ;;
- -unos*)
- vendor=crds
- ;;
- -dgux*)
- vendor=dg
- ;;
- -luna*)
- vendor=omron
- ;;
- -genix*)
- vendor=ns
- ;;
- -mvs*)
- vendor=ibm
- ;;
- -ptx*)
- vendor=sequent
- ;;
- -vxsim* | -vxworks*)
- vendor=wrs
- ;;
- -aux*)
- vendor=apple
- ;;
- -hms*) # CYGNUS LOCAL
- vendor=hitachi
- ;;
- -beos*)
- vendor=be
- ;;
- esac
- basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
- ;;
-esac
-
-echo $basic_machine$os
diff --git a/gcc/config/arm/thumb.h b/gcc/config/arm/thumb.h
index db196b5..7434831 100755
--- a/gcc/config/arm/thumb.h
+++ b/gcc/config/arm/thumb.h
@@ -384,8 +384,6 @@ extern char * structure_size_string;
/* Layout of Source Language Data Types */
-#define DEFAULT_SIGNED_CHAR 0
-
#define TARGET_BELL 007
#define TARGET_BS 010
#define TARGET_TAB 011
@@ -1101,8 +1099,6 @@ int thumb_shiftable_const ();
#define FUNCTION_MODE SImode
-#define DOLLARS_IN_IDENTIFIERS 0
-
#define NO_DOLLAR_IN_LABEL 1
#define HAVE_ATEXIT
@@ -1111,8 +1107,8 @@ int thumb_shiftable_const ();
limited PC addressing range: */
#define MACHINE_DEPENDENT_REORG(INSN) thumb_reorg ((INSN))
-extern char * thumb_unexpanded_epilogue ();
-extern char * output_move_mem_multiple ();
-extern char * thumb_load_double_from_address ();
-extern int far_jump_used_p();
-
+extern char *thumb_unexpanded_epilogue();
+extern char *output_move_mem_multiple();
+extern char *thumb_load_double_from_address();
+extern int far_jump_used_p();
+extern void thumb_override_options();
diff --git a/gcc/configure b/gcc/configure
deleted file mode 100755
index 688f5f8..0000000
--- a/gcc/configure
+++ /dev/null
@@ -1,4451 +0,0 @@
-#! /bin/sh
-
-# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.13
-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-
-# Defaults:
-ac_help=
-ac_default_prefix=/usr/local
-# Any additions from configure.in:
-ac_help="$ac_help
- --with-gnu-ld arrange to work with GNU ld."
-ac_help="$ac_help
- --with-ld arrange to use the specified ld (full pathname)."
-ac_help="$ac_help
- --with-gnu-as arrange to work with GNU as."
-ac_help="$ac_help
- --with-as arrange to use the specified as (full pathname)."
-ac_help="$ac_help
- --with-stabs arrange to use stabs instead of host debug format."
-ac_help="$ac_help
- --with-elf arrange to use ELF instead of host debug format."
-ac_help="$ac_help
- --with-gxx-include-dir=DIR
- specifies directory to put g++ header files."
-ac_help="$ac_help
- --enable-checking enable expensive run-time checks."
-ac_help="$ac_help
- --enable-cpplib use cpplib for the C preprocessor."
-ac_help="$ac_help
- --enable-c-cpplib link cpplib directly into C and C++ compilers
- (implies --enable-cpplib)."
-ac_help="$ac_help
- --enable-c-mbchar enable multibyte characters for C and C++.
- --disable-c-mbchar disable multibyte characters for C and C++. "
-ac_help="$ac_help
- --enable-haifa use the experimental scheduler.
- --disable-haifa don't use the experimental scheduler for the
- targets which normally enable it."
-ac_help="$ac_help
- --with-fast-fixincludes use a faster fixinclude program (experimental)"
-ac_help="$ac_help
- --enable-init-priority use attributes to assign initialization order
- for static objects.
- --disable-init-priority conform to ISO C++ rules for ordering static objects
- (i.e. initialized in order of declaration). "
-ac_help="$ac_help
- --enable-threads enable thread usage for target GCC.
- --enable-threads=LIB use LIB thread package for target GCC."
-ac_help="$ac_help
- --enable-objc-gc enable the use of Boehm's garbage collector with
- the GNU Objective-C runtime."
-ac_help="$ac_help
- --enable-java-gc=TYPE choose garbage collector [boehm]"
-ac_help="$ac_help
- --enable-dwarf2 enable DWARF2 debugging as default."
-
-# Initialize some variables set by options.
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-build=NONE
-cache_file=./config.cache
-exec_prefix=NONE
-host=NONE
-no_create=
-nonopt=NONE
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-target=NONE
-verbose=
-x_includes=NONE
-x_libraries=NONE
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-# Initialize some other variables.
-subdirs=
-MFLAGS= MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-# Maximum number of lines to put in a shell here document.
-ac_max_here_lines=12
-
-ac_prev=
-for ac_option
-do
-
- # If the previous option needs an argument, assign it.
- if test -n "$ac_prev"; then
- eval "$ac_prev=\$ac_option"
- ac_prev=
- continue
- fi
-
- case "$ac_option" in
- -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
- *) ac_optarg= ;;
- esac
-
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
- case "$ac_option" in
-
- -bindir | --bindir | --bindi | --bind | --bin | --bi)
- ac_prev=bindir ;;
- -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
- bindir="$ac_optarg" ;;
-
- -build | --build | --buil | --bui | --bu)
- ac_prev=build ;;
- -build=* | --build=* | --buil=* | --bui=* | --bu=*)
- build="$ac_optarg" ;;
-
- -cache-file | --cache-file | --cache-fil | --cache-fi \
- | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
- ac_prev=cache_file ;;
- -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
- | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
- cache_file="$ac_optarg" ;;
-
- -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
- ac_prev=datadir ;;
- -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
- | --da=*)
- datadir="$ac_optarg" ;;
-
- -disable-* | --disable-*)
- ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
- # Reject names that are not valid shell variable names.
- if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
- { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
- fi
- ac_feature=`echo $ac_feature| sed 's/-/_/g'`
- eval "enable_${ac_feature}=no" ;;
-
- -enable-* | --enable-*)
- ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
- # Reject names that are not valid shell variable names.
- if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
- { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
- fi
- ac_feature=`echo $ac_feature| sed 's/-/_/g'`
- case "$ac_option" in
- *=*) ;;
- *) ac_optarg=yes ;;
- esac
- eval "enable_${ac_feature}='$ac_optarg'" ;;
-
- -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
- | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
- | --exec | --exe | --ex)
- ac_prev=exec_prefix ;;
- -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
- | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
- | --exec=* | --exe=* | --ex=*)
- exec_prefix="$ac_optarg" ;;
-
- -gas | --gas | --ga | --g)
- # Obsolete; use --with-gas.
- with_gas=yes ;;
-
- -help | --help | --hel | --he)
- # Omit some internal or obsolete options to make the list less imposing.
- # This message is too long to be a string in the A/UX 3.1 sh.
- cat << EOF
-Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
-Configuration:
- --cache-file=FILE cache test results in FILE
- --help print this message
- --no-create do not create output files
- --quiet, --silent do not print \`checking...' messages
- --version print the version of autoconf that created configure
-Directory and file names:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [same as prefix]
- --bindir=DIR user executables in DIR [EPREFIX/bin]
- --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
- --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
- --datadir=DIR read-only architecture-independent data in DIR
- [PREFIX/share]
- --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data in DIR
- [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
- --libdir=DIR object code libraries in DIR [EPREFIX/lib]
- --includedir=DIR C header files in DIR [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
- --infodir=DIR info documentation in DIR [PREFIX/info]
- --mandir=DIR man documentation in DIR [PREFIX/man]
- --srcdir=DIR find the sources in DIR [configure dir or ..]
- --program-prefix=PREFIX prepend PREFIX to installed program names
- --program-suffix=SUFFIX append SUFFIX to installed program names
- --program-transform-name=PROGRAM
- run sed PROGRAM on installed program names
-EOF
- cat << EOF
-Host type:
- --build=BUILD configure for building on BUILD [BUILD=HOST]
- --host=HOST configure for HOST [guessed]
- --target=TARGET configure for TARGET [TARGET=HOST]
-Features and packages:
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --x-includes=DIR X include files are in DIR
- --x-libraries=DIR X library files are in DIR
-EOF
- if test -n "$ac_help"; then
- echo "--enable and --with options recognized:$ac_help"
- fi
- exit 0 ;;
-
- -host | --host | --hos | --ho)
- ac_prev=host ;;
- -host=* | --host=* | --hos=* | --ho=*)
- host="$ac_optarg" ;;
-
- -includedir | --includedir | --includedi | --included | --include \
- | --includ | --inclu | --incl | --inc)
- ac_prev=includedir ;;
- -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
- | --includ=* | --inclu=* | --incl=* | --inc=*)
- includedir="$ac_optarg" ;;
-
- -infodir | --infodir | --infodi | --infod | --info | --inf)
- ac_prev=infodir ;;
- -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
- infodir="$ac_optarg" ;;
-
- -libdir | --libdir | --libdi | --libd)
- ac_prev=libdir ;;
- -libdir=* | --libdir=* | --libdi=* | --libd=*)
- libdir="$ac_optarg" ;;
-
- -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
- | --libexe | --libex | --libe)
- ac_prev=libexecdir ;;
- -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
- | --libexe=* | --libex=* | --libe=*)
- libexecdir="$ac_optarg" ;;
-
- -localstatedir | --localstatedir | --localstatedi | --localstated \
- | --localstate | --localstat | --localsta | --localst \
- | --locals | --local | --loca | --loc | --lo)
- ac_prev=localstatedir ;;
- -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
- | --localstate=* | --localstat=* | --localsta=* | --localst=* \
- | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
- localstatedir="$ac_optarg" ;;
-
- -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
- ac_prev=mandir ;;
- -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
- mandir="$ac_optarg" ;;
-
- -nfp | --nfp | --nf)
- # Obsolete; use --without-fp.
- with_fp=no ;;
-
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c)
- no_create=yes ;;
-
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
- no_recursion=yes ;;
-
- -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
- | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
- | --oldin | --oldi | --old | --ol | --o)
- ac_prev=oldincludedir ;;
- -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
- | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
- | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
- oldincludedir="$ac_optarg" ;;
-
- -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
- ac_prev=prefix ;;
- -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
- prefix="$ac_optarg" ;;
-
- -program-prefix | --program-prefix | --program-prefi | --program-pref \
- | --program-pre | --program-pr | --program-p)
- ac_prev=program_prefix ;;
- -program-prefix=* | --program-prefix=* | --program-prefi=* \
- | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
- program_prefix="$ac_optarg" ;;
-
- -program-suffix | --program-suffix | --program-suffi | --program-suff \
- | --program-suf | --program-su | --program-s)
- ac_prev=program_suffix ;;
- -program-suffix=* | --program-suffix=* | --program-suffi=* \
- | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
- program_suffix="$ac_optarg" ;;
-
- -program-transform-name | --program-transform-name \
- | --program-transform-nam | --program-transform-na \
- | --program-transform-n | --program-transform- \
- | --program-transform | --program-transfor \
- | --program-transfo | --program-transf \
- | --program-trans | --program-tran \
- | --progr-tra | --program-tr | --program-t)
- ac_prev=program_transform_name ;;
- -program-transform-name=* | --program-transform-name=* \
- | --program-transform-nam=* | --program-transform-na=* \
- | --program-transform-n=* | --program-transform-=* \
- | --program-transform=* | --program-transfor=* \
- | --program-transfo=* | --program-transf=* \
- | --program-trans=* | --program-tran=* \
- | --progr-tra=* | --program-tr=* | --program-t=*)
- program_transform_name="$ac_optarg" ;;
-
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- silent=yes ;;
-
- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
- ac_prev=sbindir ;;
- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
- | --sbi=* | --sb=*)
- sbindir="$ac_optarg" ;;
-
- -sharedstatedir | --sharedstatedir | --sharedstatedi \
- | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
- | --sharedst | --shareds | --shared | --share | --shar \
- | --sha | --sh)
- ac_prev=sharedstatedir ;;
- -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
- | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
- | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
- | --sha=* | --sh=*)
- sharedstatedir="$ac_optarg" ;;
-
- -site | --site | --sit)
- ac_prev=site ;;
- -site=* | --site=* | --sit=*)
- site="$ac_optarg" ;;
-
- -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
- ac_prev=srcdir ;;
- -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
- srcdir="$ac_optarg" ;;
-
- -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
- | --syscon | --sysco | --sysc | --sys | --sy)
- ac_prev=sysconfdir ;;
- -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
- | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
- sysconfdir="$ac_optarg" ;;
-
- -target | --target | --targe | --targ | --tar | --ta | --t)
- ac_prev=target ;;
- -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
- target="$ac_optarg" ;;
-
- -v | -verbose | --verbose | --verbos | --verbo | --verb)
- verbose=yes ;;
-
- -version | --version | --versio | --versi | --vers)
- echo "configure generated by autoconf version 2.13"
- exit 0 ;;
-
- -with-* | --with-*)
- ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
- # Reject names that are not valid shell variable names.
- if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
- { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
- fi
- ac_package=`echo $ac_package| sed 's/-/_/g'`
- case "$ac_option" in
- *=*) ;;
- *) ac_optarg=yes ;;
- esac
- eval "with_${ac_package}='$ac_optarg'" ;;
-
- -without-* | --without-*)
- ac_package=`echo $ac_option|sed -e 's/-*without-//'`
- # Reject names that are not valid shell variable names.
- if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
- { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
- fi
- ac_package=`echo $ac_package| sed 's/-/_/g'`
- eval "with_${ac_package}=no" ;;
-
- --x)
- # Obsolete; use --with-x.
- with_x=yes ;;
-
- -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
- | --x-incl | --x-inc | --x-in | --x-i)
- ac_prev=x_includes ;;
- -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
- | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
- x_includes="$ac_optarg" ;;
-
- -x-libraries | --x-libraries | --x-librarie | --x-librari \
- | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
- ac_prev=x_libraries ;;
- -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries="$ac_optarg" ;;
-
- -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
- ;;
-
- *)
- if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
- echo "configure: warning: $ac_option: invalid host type" 1>&2
- fi
- if test "x$nonopt" != xNONE; then
- { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
- fi
- nonopt="$ac_option"
- ;;
-
- esac
-done
-
-if test -n "$ac_prev"; then
- { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
-fi
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 6 checking for... messages and results
-# 5 compiler messages saved in config.log
-if test "$silent" = yes; then
- exec 6>/dev/null
-else
- exec 6>&1
-fi
-exec 5>./config.log
-
-echo "\
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-" 1>&5
-
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
-ac_configure_args=
-for ac_arg
-do
- case "$ac_arg" in
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c) ;;
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
- ac_configure_args="$ac_configure_args '$ac_arg'" ;;
- *) ac_configure_args="$ac_configure_args $ac_arg" ;;
- esac
-done
-
-# NLS nuisances.
-# Only set these to C if already set. These must not be set unconditionally
-# because not all systems understand e.g. LANG=C (notably SCO).
-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
-# Non-C LC_CTYPE values break the ctype check.
-if test "${LANG+set}" = set; then LANG=C; export LANG; fi
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
-if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo > confdefs.h
-
-# A filename unique to this package, relative to the directory that
-# configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=tree.c
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
- ac_srcdir_defaulted=yes
- # Try the directory containing this script, then its parent.
- ac_prog=$0
- ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
- test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
- srcdir=$ac_confdir
- if test ! -r $srcdir/$ac_unique_file; then
- srcdir=..
- fi
-else
- ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
- if test "$ac_srcdir_defaulted" = yes; then
- { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
- else
- { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
- fi
-fi
-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
-
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
- if test "x$prefix" != xNONE; then
- CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
- else
- CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
- fi
-fi
-for ac_site_file in $CONFIG_SITE; do
- if test -r "$ac_site_file"; then
- echo "loading site script $ac_site_file"
- . "$ac_site_file"
- fi
-done
-
-if test -r "$cache_file"; then
- echo "loading cache $cache_file"
- . $cache_file
-else
- echo "creating cache $cache_file"
- > $cache_file
-fi
-
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-ac_exeext=
-ac_objext=o
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
- # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
- if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
- ac_n= ac_c='
-' ac_t=' '
- else
- ac_n=-n ac_c= ac_t=
- fi
-else
- ac_n= ac_c='\c' ac_t=
-fi
-
-
-
-
-remove=rm
-hard_link=ln
-symbolic_link='ln -s'
-copy=cp
-
-# Check for bogus environment variables.
-# Test if LIBRARY_PATH contains the notation for the current directory
-# since this would lead to problems installing/building glibc.
-# LIBRARY_PATH contains the current directory if one of the following
-# is true:
-# - one of the terminals (":" and ";") is the first or last sign
-# - two terminals occur directly after each other
-# - the path contains an element with a dot in it
-echo $ac_n "checking LIBRARY_PATH variable""... $ac_c" 1>&6
-echo "configure:587: checking LIBRARY_PATH variable" >&5
-case ${LIBRARY_PATH} in
- [:\;]* | *[:\;] | *[:\;][:\;]* | *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
- library_path_setting="contains current directory"
- ;;
- *)
- library_path_setting="ok"
- ;;
-esac
-echo "$ac_t""$library_path_setting" 1>&6
-if test "$library_path_setting" != "ok"; then
-{ echo "configure: error:
-*** LIBRARY_PATH shouldn't contain the current directory when
-*** building egcs. Please change the environment variable
-*** and run configure again." 1>&2; exit 1; }
-fi
-
-# Test if GCC_EXEC_PREFIX contains the notation for the current directory
-# since this would lead to problems installing/building glibc.
-# GCC_EXEC_PREFIX contains the current directory if one of the following
-# is true:
-# - one of the terminals (":" and ";") is the first or last sign
-# - two terminals occur directly after each other
-# - the path contains an element with a dot in it
-echo $ac_n "checking GCC_EXEC_PREFIX variable""... $ac_c" 1>&6
-echo "configure:612: checking GCC_EXEC_PREFIX variable" >&5
-case ${GCC_EXEC_PREFIX} in
- [:\;]* | *[:\;] | *[:\;][:\;]* | *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
- gcc_exec_prefix_setting="contains current directory"
- ;;
- *)
- gcc_exec_prefix_setting="ok"
- ;;
-esac
-echo "$ac_t""$gcc_exec_prefix_setting" 1>&6
-if test "$gcc_exec_prefix_setting" != "ok"; then
-{ echo "configure: error:
-*** GCC_EXEC_PREFIX shouldn't contain the current directory when
-*** building egcs. Please change the environment variable
-*** and run configure again." 1>&2; exit 1; }
-fi
-
-# Check for additional parameters
-
-# With GNU ld
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then
- withval="$with_gnu_ld"
- gnu_ld_flag="$with_gnu_ld"
-else
- gnu_ld_flag=no
-fi
-
-
-# With pre-defined ld
-# Check whether --with-ld or --without-ld was given.
-if test "${with_ld+set}" = set; then
- withval="$with_ld"
- DEFAULT_LINKER="$with_ld"
-fi
-
-if test x"${DEFAULT_LINKER+set}" = x"set"; then
- if test ! -x "$DEFAULT_LINKER"; then
- echo "configure: warning: cannot execute: $DEFAULT_LINKER: check --with-ld or env. var. DEFAULT_LINKER" 1>&2
- elif test "GNU" = `$DEFAULT_LINKER -v </dev/null 2>&1 | sed '1s/^GNU.*/GNU/;q'`; then
- gnu_ld_flag=yes
- fi
- cat >> confdefs.h <<EOF
-#define DEFAULT_LINKER "$DEFAULT_LINKER"
-EOF
-
-fi
-
-# With GNU as
-# Check whether --with-gnu-as or --without-gnu-as was given.
-if test "${with_gnu_as+set}" = set; then
- withval="$with_gnu_as"
- gas_flag="$with_gnu_as"
-else
- gas_flag=no
-fi
-
-
-# Check whether --with-as or --without-as was given.
-if test "${with_as+set}" = set; then
- withval="$with_as"
- DEFAULT_ASSEMBLER="$with_as"
-fi
-
-if test x"${DEFAULT_ASSEMBLER+set}" = x"set"; then
- if test ! -x "$DEFAULT_ASSEMBLER"; then
- echo "configure: warning: cannot execute: $DEFAULT_ASSEMBLER: check --with-as or env. var. DEFAULT_ASSEMBLER" 1>&2
- elif test "GNU" = `$DEFAULT_ASSEMBLER -v </dev/null 2>&1 | sed '1s/^GNU.*/GNU/;q'`; then
- gas_flag=yes
- fi
- cat >> confdefs.h <<EOF
-#define DEFAULT_ASSEMBLER "$DEFAULT_ASSEMBLER"
-EOF
-
-fi
-
-# With stabs
-# Check whether --with-stabs or --without-stabs was given.
-if test "${with_stabs+set}" = set; then
- withval="$with_stabs"
- stabs="$with_stabs"
-else
- stabs=no
-fi
-
-
-# With ELF
-# Check whether --with-elf or --without-elf was given.
-if test "${with_elf+set}" = set; then
- withval="$with_elf"
- elf="$with_elf"
-else
- elf=no
-fi
-
-
-# CYGNUS LOCAL: local_prefix
-#local_prefix=
-#AC_ARG_WITH(local-prefix,
-#[ --with-local-prefix=DIR specifies directory to put local include.],
-#[case "${withval}" in
-#yes) AC_MSG_ERROR(bad value ${withval} given for local include directory prefix) ;;
-#no) ;;
-#*) local_prefix=$with_local_prefix ;;
-#esac])
-local_prefix='$(prefix)'
-# END CYGNUS LOCAL
-
-# Default local prefix if it is empty
-if test x$local_prefix = x; then
- local_prefix=/usr/local
-fi
-
-# Don't set gcc_gxx_include_dir to gxx_include_dir since that's only
-# passed in by the toplevel make and thus we'd get different behavior
-# depending on where we built the sources.
-gcc_gxx_include_dir=
-# Specify the g++ header file directory
-# Check whether --with-gxx-include-dir or --without-gxx-include-dir was given.
-if test "${with_gxx_include_dir+set}" = set; then
- withval="$with_gxx_include_dir"
- case "${withval}" in
-yes) { echo "configure: error: bad value ${withval} given for g++ include directory" 1>&2; exit 1; } ;;
-no) ;;
-*) gcc_gxx_include_dir=$with_gxx_include_dir ;;
-esac
-fi
-
-
-if test x${gcc_gxx_include_dir} = x; then
- if test x${enable_version_specific_runtime_libs} = xyes; then
- gcc_gxx_include_dir='${libsubdir}/include/g++'
- else
- topsrcdir=${srcdir}/.. . ${srcdir}/../config.if
- gcc_gxx_include_dir="\$(libsubdir)/\$(unlibsubdir)/..\`echo \$(exec_prefix) | sed -e 's|^\$(prefix)||' -e 's|/[^/]*|/..|g'\`/include/g++"-${libstdcxx_interface}
- fi
-fi
-
-# Enable expensive internal checks
-# Check whether --enable-checking or --disable-checking was given.
-if test "${enable_checking+set}" = set; then
- enableval="$enable_checking"
- case "${enableval}" in
-yes) cat >> confdefs.h <<\EOF
-#define ENABLE_CHECKING 1
-EOF
- ;;
-no) ;;
-*) { echo "configure: error: bad value ${enableval} given for checking option" 1>&2; exit 1; } ;;
-esac
-fi
-
-
-# Use cpplib+cppmain for the preprocessor, but don't link it with the compiler.
-cpp_main=cccp
-# Check whether --enable-cpplib or --disable-cpplib was given.
-if test "${enable_cpplib+set}" = set; then
- enableval="$enable_cpplib"
- if test x$enable_cpplib != xno; then
- cpp_main=cppmain
-fi
-fi
-
-
-# Link cpplib into the compiler proper, for C/C++/ObjC.
-# Check whether --enable-c-cpplib or --disable-c-cpplib was given.
-if test "${enable_c_cpplib+set}" = set; then
- enableval="$enable_c_cpplib"
- if test x$enable_c_cpplib != xno; then
- extra_c_objs="${extra_c_objs} libcpp.a"
- extra_cxx_objs="${extra_cxx_objs} ../libcpp.a"
- extra_c_flags="${extra_c_flags} -DUSE_CPPLIB=1"
- cpp_main=cppmain
-fi
-fi
-
-
-# CYGNUS LOCAL mbchar
-# Enable Multibyte Characters for C/C++
-# Check whether --enable-c-mbchar or --disable-c-mbchar was given.
-if test "${enable_c_mbchar+set}" = set; then
- enableval="$enable_c_mbchar"
- if test x$enable_c_mbchar != xno; then
- extra_c_flags="${extra_c_flags} -DMULTIBYTE_CHARS=1"
-fi
-else
- extra_c_flags="${extra_c_flags} -DMULTIBYTE_CHARS=1"
-
-fi
-
-# END CYGNUS LOCAL
-
-# Enable Haifa scheduler.
-# Check whether --enable-haifa or --disable-haifa was given.
-if test "${enable_haifa+set}" = set; then
- enableval="$enable_haifa"
- :
-fi
-
-# Fast fixincludes
-#
-# This is a work in progress...
-# Check whether --with-fast-fixincludes or --without-fast-fixincludes was given.
-if test "${with_fast_fixincludes+set}" = set; then
- withval="$with_fast_fixincludes"
- fast_fixinc="$with_fast_fixincludes"
-else
- fast_fixinc=no
-fi
-
-
-# Enable init_priority.
-# Check whether --enable-init-priority or --disable-init-priority was given.
-if test "${enable_init_priority+set}" = set; then
- enableval="$enable_init_priority"
- if test x$enable_init_priority != xno; then
- extra_c_flags="${extra_c_flags} -DUSE_INIT_PRIORITY"
-fi
-fi
-
-
-# Enable threads
-# Pass with no value to take the default
-# Pass with a value to specify a thread package
-# Check whether --enable-threads or --disable-threads was given.
-if test "${enable_threads+set}" = set; then
- enableval="$enable_threads"
- if test x$enable_threads = xno; then
- enable_threads=''
-fi
-else
- enable_threads=''
-fi
-
-
-enable_threads_flag=$enable_threads
-# Check if a valid thread package
-case x${enable_threads_flag} in
- x | xno)
- # No threads
- target_thread_file='single'
- ;;
- xyes)
- # default
- target_thread_file=''
- ;;
- # CYGNUS LOCAL java
- xdecosf1 | xirix | xmach | xos2 | xposix | xpthreads | xsingle | \
- xsolaris | xwin32 | xdce | xvxworks | xqt)
- target_thread_file=$enable_threads_flag
- ;;
- *)
- echo "$enable_threads is an unknown thread package" 1>&2
- exit 1
- ;;
-esac
-
-# Check whether --enable-objc-gc or --disable-objc-gc was given.
-if test "${enable_objc_gc+set}" = set; then
- enableval="$enable_objc_gc"
- if [ x$enable_objc_gc = xno ]; then
- objc_boehm_gc=''
-else
- objc_boehm_gc=1
-fi
-else
- objc_boehm_gc=''
-fi
-
-
-# Check whether --enable-java-gc or --disable-java-gc was given.
-if test "${enable_java_gc+set}" = set; then
- enableval="$enable_java_gc"
-
- JAVAGC=$enableval
-else
- JAVAGC=boehm
-fi
-
-
-# Check whether --with-dwarf2 or --without-dwarf2 was given.
-if test "${with_dwarf2+set}" = set; then
- withval="$with_dwarf2"
- dwarf2="$with_dwarf2"
-else
- dwarf2=no
-fi
-
-
-# Determine the host, build, and target systems
-ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
- if test -f $ac_dir/install-sh; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f $ac_dir/install.sh; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
-fi
-ac_config_guess=$ac_aux_dir/config.guess
-ac_config_sub=$ac_aux_dir/config.sub
-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
-
-
-# Do some error checking and defaulting for the host and target type.
-# The inputs are:
-# configure --host=HOST --target=TARGET --build=BUILD NONOPT
-#
-# The rules are:
-# 1. You are not allowed to specify --host, --target, and nonopt at the
-# same time.
-# 2. Host defaults to nonopt.
-# 3. If nonopt is not specified, then host defaults to the current host,
-# as determined by config.guess.
-# 4. Target and build default to nonopt.
-# 5. If nonopt is not specified, then target and build default to host.
-
-# The aliases save the names the user supplied, while $host etc.
-# will get canonicalized.
-case $host---$target---$nonopt in
-NONE---*---* | *---NONE---* | *---*---NONE) ;;
-*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
-esac
-
-
-# Make sure we can run config.sub.
-if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
-else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
-fi
-
-echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:949: checking host system type" >&5
-
-host_alias=$host
-case "$host_alias" in
-NONE)
- case $nonopt in
- NONE)
- if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
- else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
- fi ;;
- *) host_alias=$nonopt ;;
- esac ;;
-esac
-
-host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
-host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-echo "$ac_t""$host" 1>&6
-
-echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:970: checking target system type" >&5
-
-target_alias=$target
-case "$target_alias" in
-NONE)
- case $nonopt in
- NONE) target_alias=$host_alias ;;
- *) target_alias=$nonopt ;;
- esac ;;
-esac
-
-target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
-target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-echo "$ac_t""$target" 1>&6
-
-echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:988: checking build system type" >&5
-
-build_alias=$build
-case "$build_alias" in
-NONE)
- case $nonopt in
- NONE) build_alias=$host_alias ;;
- *) build_alias=$nonopt ;;
- esac ;;
-esac
-
-build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
-build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-echo "$ac_t""$build" 1>&6
-
-test "$host_alias" != "$target_alias" &&
- test "$program_prefix$program_suffix$program_transform_name" = \
- NONENONEs,x,x, &&
- program_prefix=${target_alias}-
-
-
-# Find the native compiler
-# Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1015: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_CC="gcc"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1045: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_prog_rejected=no
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- break
- fi
- done
- IFS="$ac_save_ifs"
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# -gt 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- set dummy "$ac_dir/$ac_word" "$@"
- shift
- ac_cv_prog_CC="$@"
- fi
-fi
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
- if test -z "$CC"; then
- case "`uname -s`" in
- *win32* | *WIN32*)
- # Extract the first word of "cl", so it can be a program name with args.
-set dummy cl; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1096: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_CC="cl"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
- ;;
- esac
- fi
- test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
-fi
-
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1128: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
-
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-cat > conftest.$ac_ext << EOF
-
-#line 1139 "configure"
-#include "confdefs.h"
-
-main(){return(0);}
-EOF
-if { (eval echo configure:1144: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- ac_cv_prog_cc_works=yes
- # If we can't run a trivial program, we are probably using a cross compiler.
- if (./conftest; exit) 2>/dev/null; then
- ac_cv_prog_cc_cross=no
- else
- ac_cv_prog_cc_cross=yes
- fi
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_cv_prog_cc_works=no
-fi
-rm -fr conftest*
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
-if test $ac_cv_prog_cc_works = no; then
- { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
-fi
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1170: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
-echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1175: checking whether we are using GNU C" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.c <<EOF
-#ifdef __GNUC__
- yes;
-#endif
-EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1184: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
- ac_cv_prog_gcc=yes
-else
- ac_cv_prog_gcc=no
-fi
-fi
-
-echo "$ac_t""$ac_cv_prog_gcc" 1>&6
-
-if test $ac_cv_prog_gcc = yes; then
- GCC=yes
-else
- GCC=
-fi
-
-ac_test_CFLAGS="${CFLAGS+set}"
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS=
-echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1203: checking whether ${CC-cc} accepts -g" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- echo 'void f(){}' > conftest.c
-if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
- ac_cv_prog_cc_g=yes
-else
- ac_cv_prog_cc_g=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS="$ac_save_CFLAGS"
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-
-
-# If the native compiler is GCC, we can enable warnings even in stage1.
-# That's useful for people building cross-compilers, or just running a
-# quick `make'.
-if test "x$GCC" = "xyes"; then
- stage1_warn_cflags='$(WARN_CFLAGS)'
-else
- stage1_warn_cflags=""
-fi
-
-
-echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1246: checking whether ${MAKE-make} sets \${MAKE}" >&5
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftestmake <<\EOF
-all:
- @echo 'ac_maketemp="${MAKE}"'
-EOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
- eval ac_cv_prog_make_${ac_make}_set=yes
-else
- eval ac_cv_prog_make_${ac_make}_set=no
-fi
-rm -f conftestmake
-fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- SET_MAKE=
-else
- echo "$ac_t""no" 1>&6
- SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-
-echo $ac_n "checking whether a default assembler was specified""... $ac_c" 1>&6
-echo "configure:1274: checking whether a default assembler was specified" >&5
-if test x"${DEFAULT_ASSEMBLER+set}" = x"set"; then
- if test x"$with_gas" = x"no"; then
- echo "$ac_t""yes ($DEFAULT_ASSEMBLER)" 1>&6
- else
- echo "$ac_t""yes ($DEFAULT_ASSEMBLER - GNU as)" 1>&6
- fi
-else
- echo "$ac_t""no" 1>&6
-fi
-
-echo $ac_n "checking whether a default linker was specified""... $ac_c" 1>&6
-echo "configure:1286: checking whether a default linker was specified" >&5
-if test x"${DEFAULT_LINKER+set}" = x"set"; then
- if test x"$with_gnu_ld" = x"no"; then
- echo "$ac_t""yes ($DEFAULT_LINKER)" 1>&6
- else
- echo "$ac_t""yes ($DEFAULT_LINKER - GNU ld)" 1>&6
- fi
-else
- echo "$ac_t""no" 1>&6
-fi
-
-# Find some useful tools
-for ac_prog in mawk gawk nawk awk
-do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1303: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$AWK"; then
- ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_AWK="$ac_prog"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-fi
-AWK="$ac_cv_prog_AWK"
-if test -n "$AWK"; then
- echo "$ac_t""$AWK" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-test -n "$AWK" && break
-done
-
-# Extract the first word of "flex", so it can be a program name with args.
-set dummy flex; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1335: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$LEX"; then
- ac_cv_prog_LEX="$LEX" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_LEX="flex"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_prog_LEX" && ac_cv_prog_LEX="lex"
-fi
-fi
-LEX="$ac_cv_prog_LEX"
-if test -n "$LEX"; then
- echo "$ac_t""$LEX" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-if test -z "$LEXLIB"
-then
- case "$LEX" in
- flex*) ac_lib=fl ;;
- *) ac_lib=l ;;
- esac
- echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
-echo "configure:1369: checking for yywrap in -l$ac_lib" >&5
-ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-l$ac_lib $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1377 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char yywrap();
-
-int main() {
-yywrap()
-; return 0; }
-EOF
-if { (eval echo configure:1388: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- LEXLIB="-l$ac_lib"
-else
- echo "$ac_t""no" 1>&6
-fi
-
-fi
-
-echo $ac_n "checking whether ln works""... $ac_c" 1>&6
-echo "configure:1411: checking whether ln works" >&5
-if eval "test \"`echo '$''{'gcc_cv_prog_LN'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- rm -f conftestdata_t
-echo >conftestdata_f
-if ln conftestdata_f conftestdata_t 2>/dev/null
-then
- gcc_cv_prog_LN="ln"
-else
- if ln -s conftestdata_f conftestdata_t 2>/dev/null
- then
- gcc_cv_prog_LN="ln -s"
- else
- gcc_cv_prog_LN=cp
- fi
-fi
-rm -f conftestdata_f conftestdata_t
-
-fi
-LN="$gcc_cv_prog_LN"
-if test "$gcc_cv_prog_LN" = "ln"; then
- echo "$ac_t""yes" 1>&6
-else
- if test "$gcc_cv_prog_LN" = "ln -s"; then
- echo "$ac_t""no, using ln -s" 1>&6
- else
- echo "$ac_t""no, and neither does ln -s, so using cp" 1>&6
- fi
-fi
-
-echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:1443: checking whether ln -s works" >&5
-if eval "test \"`echo '$''{'gcc_cv_prog_LN_S'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- rm -f conftestdata_t
-echo >conftestdata_f
-if ln -s conftestdata_f conftestdata_t 2>/dev/null
-then
- gcc_cv_prog_LN_S="ln -s"
-else
- if ln conftestdata_f conftestdata_t 2>/dev/null
- then
- gcc_cv_prog_LN_S=ln
- else
- gcc_cv_prog_LN_S=cp
- fi
-fi
-rm -f conftestdata_f conftestdata_t
-
-fi
-LN_S="$gcc_cv_prog_LN_S"
-if test "$gcc_cv_prog_LN_S" = "ln -s"; then
- echo "$ac_t""yes" 1>&6
-else
- if test "$gcc_cv_prog_LN_S" = "ln"; then
- echo "$ac_t""no, using ln" 1>&6
- else
- echo "$ac_t""no, and neither does ln, so using cp" 1>&6
- fi
-fi
-
-echo $ac_n "checking for volatile""... $ac_c" 1>&6
-echo "configure:1475: checking for volatile" >&5
-if eval "test \"`echo '$''{'gcc_cv_c_volatile'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 1480 "configure"
-#include "confdefs.h"
-
-int main() {
-volatile int foo;
-; return 0; }
-EOF
-if { (eval echo configure:1487: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- gcc_cv_c_volatile=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- gcc_cv_c_volatile=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$gcc_cv_c_volatile" 1>&6
-if test $gcc_cv_c_volatile = yes ; then
- cat >> confdefs.h <<\EOF
-#define HAVE_VOLATILE 1
-EOF
-
-fi
-
-# Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1510: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$RANLIB"; then
- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_RANLIB="ranlib"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
-fi
-fi
-RANLIB="$ac_cv_prog_RANLIB"
-if test -n "$RANLIB"; then
- echo "$ac_t""$RANLIB" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-for ac_prog in 'bison -y' byacc
-do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1542: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$YACC"; then
- ac_cv_prog_YACC="$YACC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_YACC="$ac_prog"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-fi
-YACC="$ac_cv_prog_YACC"
-if test -n "$YACC"; then
- echo "$ac_t""$YACC" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-test -n "$YACC" && break
-done
-test -n "$YACC" || YACC="yacc"
-
-# Find a good install program. We prefer a C program (faster),
-# so one script is as good as another. But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# ./install, which can be erroneously created by make from ./install.sh.
-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1583: checking for a BSD compatible install" >&5
-if test -z "$INSTALL"; then
-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:"
- for ac_dir in $PATH; do
- # Account for people who put trailing slashes in PATH elements.
- case "$ac_dir/" in
- /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
- *)
- # OSF1 and SCO ODT 3.0 have their own names for install.
- for ac_prog in ginstall scoinst install; do
- if test -f $ac_dir/$ac_prog; then
- if test $ac_prog = install &&
- grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
- # AIX install. It has an incompatible calling convention.
- # OSF/1 installbsd also uses dspmsg, but is usable.
- :
- else
- ac_cv_path_install="$ac_dir/$ac_prog -c"
- break 2
- fi
- fi
- done
- ;;
- esac
- done
- IFS="$ac_save_IFS"
-
-fi
- if test "${ac_cv_path_install+set}" = set; then
- INSTALL="$ac_cv_path_install"
- else
- # As a last resort, use the slow shell script. We don't cache a
- # path for INSTALL within a source directory, because that will
- # break other packages using the cache if that directory is
- # removed, or if the path is relative.
- INSTALL="$ac_install_sh"
- fi
-fi
-echo "$ac_t""$INSTALL" 1>&6
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-
-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1634: checking how to run the C preprocessor" >&5
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- # This must be in double quotes, not single quotes, because CPP may get
- # substituted into the Makefile and "${CC-cc}" will confuse make.
- CPP="${CC-cc} -E"
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp.
- cat > conftest.$ac_ext <<EOF
-#line 1649 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1655: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- :
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CPP="${CC-cc} -E -traditional-cpp"
- cat > conftest.$ac_ext <<EOF
-#line 1666 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1672: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- :
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CPP="${CC-cc} -nologo -E"
- cat > conftest.$ac_ext <<EOF
-#line 1683 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1689: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- :
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CPP=/lib/cpp
-fi
-rm -f conftest*
-fi
-rm -f conftest*
-fi
-rm -f conftest*
- ac_cv_prog_CPP="$CPP"
-fi
- CPP="$ac_cv_prog_CPP"
-else
- ac_cv_prog_CPP="$CPP"
-fi
-echo "$ac_t""$CPP" 1>&6
-
-echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1714: checking for ANSI C header files" >&5
-if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 1719 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1727: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- rm -rf conftest*
- ac_cv_header_stdc=yes
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 1744 "configure"
-#include "confdefs.h"
-#include <string.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "memchr" >/dev/null 2>&1; then
- :
-else
- rm -rf conftest*
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 1762 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "free" >/dev/null 2>&1; then
- :
-else
- rm -rf conftest*
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-if test "$cross_compiling" = yes; then
- :
-else
- cat > conftest.$ac_ext <<EOF
-#line 1783 "configure"
-#include "confdefs.h"
-#include <ctype.h>
-#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int main () { int i; for (i = 0; i < 256; i++)
-if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
-exit (0); }
-
-EOF
-if { (eval echo configure:1794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
- :
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- ac_cv_header_stdc=no
-fi
-rm -fr conftest*
-fi
-
-fi
-fi
-
-echo "$ac_t""$ac_cv_header_stdc" 1>&6
-if test $ac_cv_header_stdc = yes; then
- cat >> confdefs.h <<\EOF
-#define STDC_HEADERS 1
-EOF
-
-fi
-
-echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:1818: checking whether time.h and sys/time.h may both be included" >&5
-if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 1823 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
-int main() {
-struct tm *tp;
-; return 0; }
-EOF
-if { (eval echo configure:1832: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ac_cv_header_time=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_header_time=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_header_time" 1>&6
-if test $ac_cv_header_time = yes; then
- cat >> confdefs.h <<\EOF
-#define TIME_WITH_SYS_TIME 1
-EOF
-
-fi
-
-echo $ac_n "checking whether string.h and strings.h may both be included""... $ac_c" 1>&6
-echo "configure:1853: checking whether string.h and strings.h may both be included" >&5
-if eval "test \"`echo '$''{'gcc_cv_header_string'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 1858 "configure"
-#include "confdefs.h"
-#include <string.h>
-#include <strings.h>
-int main() {
-
-; return 0; }
-EOF
-if { (eval echo configure:1866: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- gcc_cv_header_string=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- gcc_cv_header_string=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$gcc_cv_header_string" 1>&6
-if test $gcc_cv_header_string = yes; then
- cat >> confdefs.h <<\EOF
-#define STRING_WITH_STRINGS 1
-EOF
-
-fi
-
-echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:1887: checking for sys/wait.h that is POSIX.1 compatible" >&5
-if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 1892 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/wait.h>
-#ifndef WEXITSTATUS
-#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
-#endif
-#ifndef WIFEXITED
-#define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
-#endif
-int main() {
-int s;
-wait (&s);
-s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
-; return 0; }
-EOF
-if { (eval echo configure:1908: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ac_cv_header_sys_wait_h=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_header_sys_wait_h=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6
-if test $ac_cv_header_sys_wait_h = yes; then
- cat >> confdefs.h <<\EOF
-#define HAVE_SYS_WAIT_H 1
-EOF
-
-fi
-
-for ac_hdr in limits.h stddef.h string.h strings.h stdlib.h time.h fcntl.h unistd.h stab.h sys/file.h sys/time.h sys/resource.h sys/param.h sys/times.h sys/stat.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1932: checking for $ac_hdr" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 1937 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1942: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=yes"
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-done
-
-
-# Check for thread headers.
-ac_safe=`echo "thread.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for thread.h""... $ac_c" 1>&6
-echo "configure:1972: checking for thread.h" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 1977 "configure"
-#include "confdefs.h"
-#include <thread.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1982: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=yes"
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- have_thread_h=yes
-else
- echo "$ac_t""no" 1>&6
-have_thread_h=
-fi
-
-ac_safe=`echo "pthread.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for pthread.h""... $ac_c" 1>&6
-echo "configure:2006: checking for pthread.h" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2011 "configure"
-#include "confdefs.h"
-#include <pthread.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2016: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=yes"
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- have_pthread_h=yes
-else
- echo "$ac_t""no" 1>&6
-have_pthread_h=
-fi
-
-
-# See if GNAT has been installed
-# Extract the first word of "gnatbind", so it can be a program name with args.
-set dummy gnatbind; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2043: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_gnat'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$gnat"; then
- ac_cv_prog_gnat="$gnat" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_gnat="yes"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_prog_gnat" && ac_cv_prog_gnat="no"
-fi
-fi
-gnat="$ac_cv_prog_gnat"
-if test -n "$gnat"; then
- echo "$ac_t""$gnat" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-
-# See if the system preprocessor understands the ANSI C preprocessor
-# stringification operator.
-echo $ac_n "checking whether cpp understands the stringify operator""... $ac_c" 1>&6
-echo "configure:2074: checking whether cpp understands the stringify operator" >&5
-if eval "test \"`echo '$''{'gcc_cv_c_have_stringify'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2079 "configure"
-#include "confdefs.h"
-
-int main() {
-#define S(x) #x
-char *test = S(foo);
-; return 0; }
-EOF
-if { (eval echo configure:2087: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- gcc_cv_c_have_stringify=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- gcc_cv_c_have_stringify=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$gcc_cv_c_have_stringify" 1>&6
-if test $gcc_cv_c_have_stringify = yes; then
- cat >> confdefs.h <<\EOF
-#define HAVE_CPP_STRINGIFY 1
-EOF
-
-fi
-
-# Use <inttypes.h> only if it exists,
-# doesn't clash with <sys/types.h>, and declares intmax_t.
-echo $ac_n "checking for inttypes.h""... $ac_c" 1>&6
-echo "configure:2110: checking for inttypes.h" >&5
-if eval "test \"`echo '$''{'gcc_cv_header_inttypes_h'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2115 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <inttypes.h>
-int main() {
-intmax_t i = -1;
-; return 0; }
-EOF
-if { (eval echo configure:2123: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- gcc_cv_header_inttypes_h=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- gcc_cv_header_inttypes_h=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$gcc_cv_header_inttypes_h" 1>&6
-if test $gcc_cv_header_inttypes_h = yes; then
- cat >> confdefs.h <<\EOF
-#define HAVE_INTTYPES_H 1
-EOF
-
-fi
-
-for ac_func in strtoul bsearch strerror putenv popen bcopy bzero bcmp \
- index rindex strchr strrchr kill getrlimit setrlimit atoll atoq \
- sysconf isascii gettimeofday strsignal putc_unlocked fputc_unlocked \
- fputs_unlocked
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2149: checking for $ac_func" >&5
-if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2154 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2177: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_func 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-done
-
-
-# Make sure wchar_t is available
-#AC_CHECK_TYPE(wchar_t, unsigned int)
-
-echo $ac_n "checking for vprintf""... $ac_c" 1>&6
-echo "configure:2206: checking for vprintf" >&5
-if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2211 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char vprintf(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char vprintf();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_vprintf) || defined (__stub___vprintf)
-choke me
-#else
-vprintf();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_vprintf=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_vprintf=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- cat >> confdefs.h <<\EOF
-#define HAVE_VPRINTF 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-
-if test "$ac_cv_func_vprintf" != yes; then
-echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
-echo "configure:2258: checking for _doprnt" >&5
-if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2263 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char _doprnt(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char _doprnt();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub__doprnt) || defined (__stub____doprnt)
-choke me
-#else
-_doprnt();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2286: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func__doprnt=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func__doprnt=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- cat >> confdefs.h <<\EOF
-#define HAVE_DOPRNT 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-
-fi
-
-vfprintf=
-doprint=
-if test $ac_cv_func_vprintf != yes ; then
- vfprintf=vfprintf.o
- if test $ac_cv_func__doprnt != yes ; then
- doprint=doprint.o
- fi
-fi
-
-
-
-echo $ac_n "checking whether the printf functions support %p""... $ac_c" 1>&6
-echo "configure:2322: checking whether the printf functions support %p" >&5
-if eval "test \"`echo '$''{'gcc_cv_func_printf_ptr'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test "$cross_compiling" = yes; then
- gcc_cv_func_printf_ptr=no
-else
- cat > conftest.$ac_ext <<EOF
-#line 2330 "configure"
-#include "confdefs.h"
-#include <stdio.h>
-
-main()
-{
- char buf[64];
- char *p = buf, *q = NULL;
- sprintf(buf, "%p", p);
- sscanf(buf, "%p", &q);
- exit (p != q);
-}
-EOF
-if { (eval echo configure:2343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
- gcc_cv_func_printf_ptr=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- gcc_cv_func_printf_ptr=no
-fi
-rm -fr conftest*
-fi
-
-rm -f core core.* *.core
-fi
-
-echo "$ac_t""$gcc_cv_func_printf_ptr" 1>&6
-if test $gcc_cv_func_printf_ptr = yes ; then
- cat >> confdefs.h <<\EOF
-#define HAVE_PRINTF_PTR 1
-EOF
-
-fi
-
-echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:2367: checking for pid_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2372 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "(^|[^a-zA-Z_0-9])pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
- rm -rf conftest*
- ac_cv_type_pid_t=yes
-else
- rm -rf conftest*
- ac_cv_type_pid_t=no
-fi
-rm -f conftest*
-
-fi
-echo "$ac_t""$ac_cv_type_pid_t" 1>&6
-if test $ac_cv_type_pid_t = no; then
- cat >> confdefs.h <<\EOF
-#define pid_t int
-EOF
-
-fi
-
-ac_safe=`echo "vfork.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for vfork.h""... $ac_c" 1>&6
-echo "configure:2401: checking for vfork.h" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2406 "configure"
-#include "confdefs.h"
-#include <vfork.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2411: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=yes"
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- cat >> confdefs.h <<\EOF
-#define HAVE_VFORK_H 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-
-echo $ac_n "checking for working vfork""... $ac_c" 1>&6
-echo "configure:2436: checking for working vfork" >&5
-if eval "test \"`echo '$''{'ac_cv_func_vfork_works'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test "$cross_compiling" = yes; then
- echo $ac_n "checking for vfork""... $ac_c" 1>&6
-echo "configure:2442: checking for vfork" >&5
-if eval "test \"`echo '$''{'ac_cv_func_vfork'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2447 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char vfork(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char vfork();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_vfork) || defined (__stub___vfork)
-choke me
-#else
-vfork();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_vfork=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_vfork=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'vfork`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- :
-else
- echo "$ac_t""no" 1>&6
-fi
-
-ac_cv_func_vfork_works=$ac_cv_func_vfork
-else
- cat > conftest.$ac_ext <<EOF
-#line 2492 "configure"
-#include "confdefs.h"
-/* Thanks to Paul Eggert for this test. */
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifdef HAVE_VFORK_H
-#include <vfork.h>
-#endif
-/* On some sparc systems, changes by the child to local and incoming
- argument registers are propagated back to the parent.
- The compiler is told about this with #include <vfork.h>,
- but some compilers (e.g. gcc -O) don't grok <vfork.h>.
- Test for this by using a static variable whose address
- is put into a register that is clobbered by the vfork. */
-static
-#ifdef __cplusplus
-sparc_address_test (int arg)
-#else
-sparc_address_test (arg) int arg;
-#endif
-{
- static pid_t child;
- if (!child) {
- child = vfork ();
- if (child < 0) {
- perror ("vfork");
- _exit(2);
- }
- if (!child) {
- arg = getpid();
- write(-1, "", 0);
- _exit (arg);
- }
- }
-}
-main() {
- pid_t parent = getpid ();
- pid_t child;
-
- sparc_address_test ();
-
- child = vfork ();
-
- if (child == 0) {
- /* Here is another test for sparc vfork register problems.
- This test uses lots of local variables, at least
- as many local variables as main has allocated so far
- including compiler temporaries. 4 locals are enough for
- gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe.
- A buggy compiler should reuse the register of parent
- for one of the local variables, since it will think that
- parent can't possibly be used any more in this routine.
- Assigning to the local variable will thus munge parent
- in the parent process. */
- pid_t
- p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
- p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
- /* Convince the compiler that p..p7 are live; otherwise, it might
- use the same hardware register for all 8 local variables. */
- if (p != p1 || p != p2 || p != p3 || p != p4
- || p != p5 || p != p6 || p != p7)
- _exit(1);
-
- /* On some systems (e.g. IRIX 3.3),
- vfork doesn't separate parent from child file descriptors.
- If the child closes a descriptor before it execs or exits,
- this munges the parent's descriptor as well.
- Test for this by closing stdout in the child. */
- _exit(close(fileno(stdout)) != 0);
- } else {
- int status;
- struct stat st;
-
- while (wait(&status) != child)
- ;
- exit(
- /* Was there some problem with vforking? */
- child < 0
-
- /* Did the child fail? (This shouldn't happen.) */
- || status
-
- /* Did the vfork/compiler bug occur? */
- || parent != getpid()
-
- /* Did the file descriptor bug occur? */
- || fstat(fileno(stdout), &st) != 0
- );
- }
-}
-EOF
-if { (eval echo configure:2587: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
- ac_cv_func_vfork_works=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- ac_cv_func_vfork_works=no
-fi
-rm -fr conftest*
-fi
-
-fi
-
-echo "$ac_t""$ac_cv_func_vfork_works" 1>&6
-if test $ac_cv_func_vfork_works = no; then
- cat >> confdefs.h <<\EOF
-#define vfork fork
-EOF
-
-fi
-
-
-for ac_func in malloc realloc calloc free bcopy bzero bcmp \
- index rindex getenv atol sbrk abort atof strerror getcwd getwd \
- strsignal
-do
-echo $ac_n "checking whether $ac_func must be declared""... $ac_c" 1>&6
-echo "configure:2615: checking whether $ac_func must be declared" >&5
-if eval "test \"`echo '$''{'gcc_cv_decl_needed_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2620 "configure"
-#include "confdefs.h"
-
-#include <stdio.h>
-#ifdef STRING_WITH_STRINGS
-# include <string.h>
-# include <strings.h>
-#else
-# ifdef HAVE_STRING_H
-# include <string.h>
-# else
-# ifdef HAVE_STRINGS_H
-# include <strings.h>
-# endif
-# endif
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifndef HAVE_RINDEX
-#define rindex strrchr
-#endif
-#ifndef HAVE_INDEX
-#define index strchr
-#endif
-
-int main() {
-char *(*pfn) = (char *(*)) $ac_func
-; return 0; }
-EOF
-if { (eval echo configure:2653: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- eval "gcc_cv_decl_needed_$ac_func=no"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "gcc_cv_decl_needed_$ac_func=yes"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$gcc_cv_decl_needed_'$ac_func`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- gcc_tr_decl=NEED_DECLARATION_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- cat >> confdefs.h <<EOF
-#define $gcc_tr_decl 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-
-done
-
-
-for ac_func in getrlimit setrlimit
-do
-echo $ac_n "checking whether $ac_func must be declared""... $ac_c" 1>&6
-echo "configure:2682: checking whether $ac_func must be declared" >&5
-if eval "test \"`echo '$''{'gcc_cv_decl_needed_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2687 "configure"
-#include "confdefs.h"
-
-#include <stdio.h>
-#ifdef STRING_WITH_STRINGS
-# include <string.h>
-# include <strings.h>
-#else
-# ifdef HAVE_STRING_H
-# include <string.h>
-# else
-# ifdef HAVE_STRINGS_H
-# include <strings.h>
-# endif
-# endif
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifndef HAVE_RINDEX
-#define rindex strrchr
-#endif
-#ifndef HAVE_INDEX
-#define index strchr
-#endif
-#include <sys/types.h>
-#ifdef HAVE_SYS_RESOURCE_H
-#include <sys/resource.h>
-#endif
-
-int main() {
-char *(*pfn) = (char *(*)) $ac_func
-; return 0; }
-EOF
-if { (eval echo configure:2724: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- eval "gcc_cv_decl_needed_$ac_func=no"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "gcc_cv_decl_needed_$ac_func=yes"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$gcc_cv_decl_needed_'$ac_func`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- gcc_tr_decl=NEED_DECLARATION_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- cat >> confdefs.h <<EOF
-#define $gcc_tr_decl 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-
-done
-
-
-echo $ac_n "checking for sys_siglist declaration in signal.h or unistd.h""... $ac_c" 1>&6
-echo "configure:2751: checking for sys_siglist declaration in signal.h or unistd.h" >&5
-if eval "test \"`echo '$''{'ac_cv_decl_sys_siglist'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2756 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <signal.h>
-/* NetBSD declares sys_siglist in unistd.h. */
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-int main() {
-char *msg = *(sys_siglist + 1);
-; return 0; }
-EOF
-if { (eval echo configure:2768: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ac_cv_decl_sys_siglist=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_decl_sys_siglist=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_decl_sys_siglist" 1>&6
-if test $ac_cv_decl_sys_siglist = yes; then
- cat >> confdefs.h <<\EOF
-#define SYS_SIGLIST_DECLARED 1
-EOF
-
-fi
-
-
-# File extensions
-manext='.1'
-objext='.o'
-
-
-
-build_xm_file=
-build_xm_defines=
-build_install_headers_dir=install-headers-tar
-build_exeext=
-host_xm_file=
-host_xm_defines=
-host_xmake_file=
-host_truncate_target=
-host_exeext=
-
-# Decode the host machine, then the target machine.
-# For the host machine, we save the xm_file variable as host_xm_file;
-# then we decode the target machine and forget everything else
-# that came from the host machine.
-for machine in $build $host $target; do
-
- out_file=
- xmake_file=
- tmake_file=
- extra_headers=
- extra_passes=
- extra_parts=
- extra_programs=
- extra_objs=
- extra_host_objs=
- extra_gcc_objs=
- xm_defines=
- float_format=
- # Set this to override the default target model.
- target_cpu_default=
- # Set this to control which fixincludes program to use.
- if test x$fast_fixinc != xyes; then
- fixincludes=fixincludes
- else fixincludes=fixinc.sh ; fi
- # Set this to control how the header file directory is installed.
- install_headers_dir=install-headers-tar
- # Set this to a non-empty list of args to pass to cpp if the target
- # wants its .md file passed through cpp.
- md_cppflags=
- # Set this if directory names should be truncated to 14 characters.
- truncate_target=
- # Set this if gdb needs a dir command with `dirname $out_file`
- gdb_needs_out_file_path=
- # Set this if the build machine requires executables to have a
- # file name suffix.
- exeext=
- # Set this to control which thread package will be used.
- thread_file=
- # Reinitialize these from the flag values every loop pass, since some
- # configure entries modify them.
- gas="$gas_flag"
- gnu_ld="$gnu_ld_flag"
- enable_threads=$enable_threads_flag
-
- # Set default cpu_type, tm_file and xm_file so it can be updated in
- # each machine entry.
- cpu_type=`echo $machine | sed 's/-.*$//'`
- case $machine in
- alpha*-*-*)
- cpu_type=alpha
- ;;
- arm*-*-*)
- cpu_type=arm
- ;;
- c*-convex-*)
- cpu_type=convex
- ;;
- i[34567]86-*-*)
- cpu_type=i386
- ;;
- hppa*-*-*)
- cpu_type=pa
- ;;
- m68000-*-*)
- cpu_type=m68k
- ;;
- mips*-*-*)
- cpu_type=mips
- ;;
- powerpc*-*-*)
- cpu_type=rs6000
- ;;
- pyramid-*-*)
- cpu_type=pyr
- ;;
- sparc*-*-*)
- cpu_type=sparc
- ;;
- esac
-
- tm_file=${cpu_type}/${cpu_type}.h
- xm_file=${cpu_type}/xm-${cpu_type}.h
-
- # Set the default macros to define for GNU/Linux systems.
- case $machine in
- *-*-linux-gnu*)
- xm_defines="HAVE_ATEXIT POSIX BSTRING"
- ;;
- esac
-
- case $machine in
- # Support site-specific machine types.
- arm*-*-elf*)
- tm_file=arm/unknown-elf.h
- tmake_file=arm/t-arm-elf
- ;;
- thumb-*-elf*)
- tm_file=arm/telf.h
- out_file=arm/thumb.c
- xm_file=arm/xm-thumb.h
- md_file=arm/thumb.md
- tmake_file=arm/t-thumb-elf
- fixincludes=Makefile.in # There is nothing to fix
- ;;
- esac
-
- case $machine in
- *-*-linux-gnu*)
- ;; # Existing GNU/Linux systems do not use the GNU setup.
- *-*-gnu*)
- # On the GNU system, the setup is just about the same on
- # each different CPU. The specific machines that GNU
- # supports are matched above and just set $cpu_type.
- xm_file="xm-gnu.h ${xm_file}"
- tm_file=${cpu_type}/gnu.h
- # GNU always uses ELF.
- elf=yes
- # GNU tools are the only tools.
- gnu_ld=yes
- gas=yes
- # On GNU, the headers are already okay.
- fixincludes=Makefile.in
- xmake_file=x-linux # These details are the same as Linux.
- tmake_file=t-gnu # These are not.
- ;;
- *-*-sysv4*)
- fixincludes=fixinc.svr4
- xmake_try_sysv=x-sysv
- install_headers_dir=install-headers-cpio
- ;;
- *-*-sysv*)
- install_headers_dir=install-headers-cpio
- ;;
- esac
-
- # Distinguish i[34567]86
- # Also, do not run mips-tfile on MIPS if using gas.
- # Process --with-cpu= for PowerPC/rs6000
- target_cpu_default2=
- case $machine in
- i486-*-*)
- target_cpu_default2=1
- ;;
- i586-*-*)
- target_cpu_default2=2
- ;;
- i686-*-* | i786-*-*)
- target_cpu_default2=3
- ;;
- alpha*-*-*)
- case $machine in
- alphaev6*)
- target_cpu_default2="MASK_CPU_EV6|MASK_BWX|MASK_CIX|MASK_MAX"
- ;;
- alphapca56*)
- target_cpu_default2="MASK_CPU_EV5|MASK_BWX|MASK_MAX"
- ;;
- alphaev56*)
- target_cpu_default2="MASK_CPU_EV5|MASK_BWX"
- ;;
- alphaev5*)
- target_cpu_default2="MASK_CPU_EV5"
- ;;
- esac
-
- if test x$gas = xyes
- then
- if test "$target_cpu_default2" = ""
- then
- target_cpu_default2="MASK_GAS"
- else
- target_cpu_default2="${target_cpu_default2}|MASK_GAS"
- fi
- fi
- ;;
- # CYGNUS LOCAL m68k embedded
- m68*-*-*)
- target_cpu_default2=M68K_CPU_"`echo $machine | sed 's/-.*$//'`"
- ;;
- # END CYGNUS LOCAL
- arm*-*-*)
- case "x$with_cpu" in
- x)
- # The most generic
- target_cpu_default2="TARGET_CPU_generic"
- ;;
-
- # Distinguish cores, and major variants
- # arm7m doesn't exist, but D & I don't affect code
- xarm[23678] | xarm250 | xarm[67][01]0 \
- | xarm7m | xarm7dm | xarm7dmi | xarm7tdmi \
- | xarm7100 | xarm7500 | xarm7500fe | xarm810 \
- | xstrongarm | xstrongarm110)
- target_cpu_default2="TARGET_CPU_$with_cpu"
- ;;
-
- xyes | xno)
- echo "--with-cpu must be passed a value" 1>&2
- exit 1
- ;;
-
- *)
- if test x$pass2done = xyes
- then
- echo "Unknown cpu used with --with-cpu=$with_cpu" 1>&2
- exit 1
- fi
- ;;
- esac
- ;;
-
- mips*-*-ecoff* | mips*-*-elf*)
- if test x$gas = xyes
- then
- if test x$gnu_ld = xyes
- then
- target_cpu_default2=20
- else
- target_cpu_default2=16
- fi
- fi
- ;;
- mips*-*-*)
- if test x$gas = xyes
- then
- target_cpu_default2=16
- fi
- ;;
- powerpc*-*-* | rs6000-*-*)
- case "x$with_cpu" in
- x)
- ;;
-
- xcommon | xpower | xpower2 | xpowerpc | xrios \
- | xrios1 | xrios2 | xrsc | xrsc1 \
- | x601 | x602 | x603 | x603e | x604 | x604e | x620 \
- | x403 | x505 | x801 | x821 | x823 | x860)
- target_cpu_default2="\"$with_cpu\""
- ;;
-
- xyes | xno)
- echo "--with-cpu must be passed a value" 1>&2
- exit 1
- ;;
-
- *)
- if test x$pass2done = xyes
- then
- echo "Unknown cpu used with --with-cpu=$with_cpu" 1>&2
- exit 1
- fi
- ;;
- esac
- ;;
- sparc*-*-*)
- case ".$with_cpu" in
- .)
- target_cpu_default2=TARGET_CPU_"`echo $machine | sed 's/-.*$//'`"
- ;;
- # CYGNUS LOCAL sp86
- .supersparc | .hypersparc | .ultrasparc \
- | .sparclite | .sparc86x | .v7 | .v8 | .v9)
- target_cpu_default2="TARGET_CPU_$with_cpu"
- ;;
- *)
- if test x$pass2done = xyes
- then
- echo "Unknown cpu used with --with-cpu=$with_cpu" 1>&2
- exit 1
- fi
- ;;
- esac
- ;;
- esac
-
- if test "$target_cpu_default2" != ""
- then
- if test "$target_cpu_default" != ""
- then
- target_cpu_default="(${target_cpu_default}|${target_cpu_default2})"
- else
- target_cpu_default=$target_cpu_default2
- fi
- fi
-
-# Save data on machine being used to compile GCC in build_xm_file.
-# Save data on host machine in vars host_xm_file and host_xmake_file.
- if test x$pass1done = x
- then
- if test x"$xm_file" = x
- then build_xm_file=$cpu_type/xm-$cpu_type.h
- else build_xm_file=$xm_file
- fi
- build_xm_defines=$xm_defines
- build_install_headers_dir=$install_headers_dir
- build_exeext=$exeext
- pass1done=yes
- else
- if test x$pass2done = x
- then
- if test x"$xm_file" = x
- then host_xm_file=$cpu_type/xm-$cpu_type.h
- else host_xm_file=$xm_file
- fi
- host_xm_defines=$xm_defines
- if test x"$xmake_file" = x
- then xmake_file=$cpu_type/x-$cpu_type
- fi
- host_xmake_file="$xmake_file"
- host_truncate_target=$truncate_target
- host_extra_gcc_objs=$extra_gcc_objs
- host_extra_objs=$extra_host_objs
- host_exeext=$exeext
- pass2done=yes
- fi
- fi
-done
-
-extra_objs="${host_extra_objs} ${extra_objs}"
-
-# Default the target-machine variables that were not explicitly set.
-if test x"$tm_file" = x
-then tm_file=$cpu_type/$cpu_type.h; fi
-
-if test x$extra_headers = x
-then extra_headers=; fi
-
-if test x"$xm_file" = x
-then xm_file=$cpu_type/xm-$cpu_type.h; fi
-
-if test x$md_file = x
-then md_file=$cpu_type/$cpu_type.md; fi
-
-if test x$out_file = x
-then out_file=$cpu_type/$cpu_type.c; fi
-
-if test x"$tmake_file" = x
-then tmake_file=$cpu_type/t-$cpu_type
-fi
-
-if test x"$dwarf2" = xyes
-then tm_file="tm-dwarf2.h $tm_file"
-fi
-
-if test x$float_format = x
-then float_format=i64
-fi
-
-if test $float_format = none
-then float_h_file=Makefile.in
-else float_h_file=float-$float_format.h
-fi
-
-if test x$enable_haifa = x
-then
- case $target in
- alpha*-* | hppa*-* | powerpc*-* | rs6000-* | *sparc*-* | m32r*-*)
- enable_haifa=yes;;
- esac
-fi
-
-# Say what files are being used for the output code and MD file.
-echo "Using \`$srcdir/config/$out_file' to output insns."
-echo "Using \`$srcdir/config/$md_file' as machine description file."
-
-count=a
-for f in $tm_file; do
- count=${count}x
-done
-if test $count = ax; then
- echo "Using \`$srcdir/config/$tm_file' as target machine macro file."
-else
- echo "Using the following target machine macro files:"
- for f in $tm_file; do
- echo " $srcdir/config/$f"
- done
-fi
-
-count=a
-for f in $host_xm_file; do
- count=${count}x
-done
-if test $count = ax; then
- echo "Using \`$srcdir/config/$host_xm_file' as host machine macro file."
-else
- echo "Using the following host machine macro files:"
- for f in $host_xm_file; do
- echo " $srcdir/config/$f"
- done
-fi
-
-if test "$host_xm_file" != "$build_xm_file"; then
- count=a
- for f in $build_xm_file; do
- count=${count}x
- done
- if test $count = ax; then
- echo "Using \`$srcdir/config/$build_xm_file' as build machine macro file."
- else
- echo "Using the following build machine macro files:"
- for f in $build_xm_file; do
- echo " $srcdir/config/$f"
- done
- fi
-fi
-
-if test x$thread_file = x; then
- if test x$target_thread_file != x; then
- thread_file=$target_thread_file
- else
- thread_file='single'
- fi
-fi
-
-# Set up the header files.
-# $links is the list of header files to create.
-# $vars is the list of shell variables with file names to include.
-# auto-host.h is the file containing items generated by autoconf and is
-# the first file included by config.h.
-null_defines=
-host_xm_file="auto-host.h gansidecl.h ${host_xm_file}"
-
-# If host=build, it is correct to have hconfig include auto-host.h
-# as well. If host!=build, we are in error and need to do more
-# work to find out the build config parameters.
-if test x$host = x$build
-then
- build_xm_file="auto-host.h gansidecl.h ${build_xm_file}"
-else
- # We create a subdir, then run autoconf in the subdir.
- # To prevent recursion we set host and build for the new
- # invocation of configure to the build for this invocation
- # of configure.
- tempdir=build.$$
- rm -rf $tempdir
- mkdir $tempdir
- cd $tempdir
- case ${srcdir} in
- /*) realsrcdir=${srcdir};;
- *) realsrcdir=../${srcdir};;
- esac
- CC=${CC_FOR_BUILD} ${realsrcdir}/configure \
- --target=$target --host=$build --build=$build
-
- # We just finished tests for the build machine, so rename
- # the file auto-build.h in the gcc directory.
- mv auto-host.h ../auto-build.h
- cd ..
- rm -rf $tempdir
- build_xm_file="auto-build.h gansidecl.h ${build_xm_file}"
-fi
-
-
-xm_file="gansidecl.h ${xm_file}"
-tm_file="gansidecl.h ${tm_file}"
-
-vars="host_xm_file tm_file xm_file build_xm_file"
-links="config.h tm.h tconfig.h hconfig.h"
-defines="host_xm_defines null_defines xm_defines build_xm_defines"
-
-rm -f config.bak
-if test -f config.status; then mv -f config.status config.bak; fi
-
-# Truncate the target if necessary
-if test x$host_truncate_target != x; then
- target=`echo $target | sed -e 's/\(..............\).*/\1/'`
-fi
-
-# Get the version trigger filename from the toplevel
-if test "${with_gcc_version_trigger+set}" = set; then
- gcc_version_trigger=$with_gcc_version_trigger
-else
- gcc_version_trigger=${srcdir}/version.c
-fi
-gcc_version=`sed -e 's/.*\"\([^ \"]*\)[ \"].*/\1/' < ${gcc_version_trigger}`
-
-# Get an absolute path to the GCC top-level source directory
-holddir=`pwd`
-cd $srcdir
-topdir=`pwd`
-cd $holddir
-
-# Conditionalize the makefile for this host machine.
-# Make-host contains the concatenation of all host makefile fragments
-# [there can be more than one]. This file is built by configure.frag.
-host_overrides=Make-host
-dep_host_xmake_file=
-for f in .. ${host_xmake_file}
-do
- if test -f ${srcdir}/config/$f
- then
- dep_host_xmake_file="${dep_host_xmake_file} ${srcdir}/config/$f"
- fi
-done
-
-# Conditionalize the makefile for this target machine.
-# Make-target contains the concatenation of all host makefile fragments
-# [there can be more than one]. This file is built by configure.frag.
-target_overrides=Make-target
-dep_tmake_file=
-for f in .. ${tmake_file}
-do
- if test -f ${srcdir}/config/$f
- then
- dep_tmake_file="${dep_tmake_file} ${srcdir}/config/$f"
- fi
-done
-
-# If the host doesn't support symlinks, modify CC in
-# FLAGS_TO_PASS so CC="stage1/xgcc -Bstage1/" works.
-# Otherwise, we can use "CC=$(CC)".
-rm -f symtest.tem
-if $symbolic_link $srcdir/gcc.c symtest.tem 2>/dev/null
-then
- cc_set_by_configure="\$(CC)"
- stage_prefix_set_by_configure="\$(STAGE_PREFIX)"
-else
- rm -f symtest.tem
- if cp -p $srcdir/gcc.c symtest.tem 2>/dev/null
- then
- symbolic_link="cp -p"
- else
- symbolic_link="cp"
- fi
- cc_set_by_configure="\`case '\$(CC)' in stage*) echo '\$(CC)' | sed -e 's|stage|../stage|g';; *) echo '\$(CC)';; esac\`"
- stage_prefix_set_by_configure="\`case '\$(STAGE_PREFIX)' in stage*) echo '\$(STAGE_PREFIX)' | sed -e 's|stage|../stage|g';; *) echo '\$(STAGE_PREFIX)';; esac\`"
-fi
-rm -f symtest.tem
-
-out_object_file=`basename $out_file .c`.o
-
-tm_file_list=
-for f in $tm_file; do
- if test $f != "gansidecl.h" ; then
- tm_file_list="${tm_file_list} \$(srcdir)/config/$f"
- else
- tm_file_list="${tm_file_list} $f"
- fi
-done
-
-host_xm_file_list=
-for f in $host_xm_file; do
- if test $f != "auto-host.h" -a $f != "gansidecl.h" ; then
- host_xm_file_list="${host_xm_file_list} \$(srcdir)/config/$f"
- else
- host_xm_file_list="${host_xm_file_list} $f"
- fi
-done
-
-build_xm_file_list=
-for f in $build_xm_file; do
- if test $f != "auto-build.h" -a $f != "auto-host.h" -a $f != "gansidecl.h" ; then
- build_xm_file_list="${build_xm_file_list} \$(srcdir)/config/$f"
- else
- build_xm_file_list="${build_xm_file_list} $f"
- fi
-done
-
-# Define macro CROSS_COMPILE in compilation
-# if this is a cross-compiler.
-# Also use all.cross instead of all.internal
-# and add cross-make to Makefile.
-cross_overrides="/dev/null"
-if test x$host != x$target
-then
- cross_defines="CROSS=-DCROSS_COMPILE"
- cross_overrides="${topdir}/cross-make"
-fi
-
-# When building gcc with a cross-compiler, we need to fix a few things.
-# This must come after cross-make as we want all.build to override
-# all.cross.
-build_overrides="/dev/null"
-if test x$build != x$host
-then
- build_overrides="${topdir}/build-make"
-fi
-
-# Expand extra_headers to include complete path.
-# This substitutes for lots of t-* files.
-extra_headers_list=
-if test "x$extra_headers" = x
-then true
-else
- # Prepend ${srcdir}/ginclude/ to every entry in extra_headers.
- for file in $extra_headers;
- do
- extra_headers_list="${extra_headers_list} \$(srcdir)/ginclude/${file}"
- done
-fi
-
-# NEED TO CONVERT
-# Set MD_DEPS if the real md file is in md.pre-cpp.
-# Set MD_CPP to the cpp to pass the md file through. Md files use ';'
-# for line oriented comments, so we must always use a GNU cpp. If
-# building gcc with a cross compiler, use the cross compiler just
-# built. Otherwise, we can use the cpp just built.
-md_file_sub=
-if test "x$md_cppflags" = x
-then
- md_file_sub=$srcdir/config/$md_file
-else
- md_file=md
-fi
-
-# If we have gas in the build tree, make a link to it.
-if test -f ../gas/Makefile; then
- rm -f as; $symbolic_link ../gas/as-new$host_exeext as$host_exeext 2>/dev/null
-fi
-
-# If we have nm in the build tree, make a link to it.
-if test -f ../binutils/Makefile; then
- rm -f nm; $symbolic_link ../binutils/nm-new$host_exeext nm$host_exeext 2>/dev/null
-fi
-
-# If we have ld in the build tree, make a link to it.
-if test -f ../ld/Makefile; then
- rm -f ld; $symbolic_link ../ld/ld-new$host_exeext ld$host_exeext 2>/dev/null
-fi
-
-# Figure out what assembler alignment features are present.
-echo $ac_n "checking assembler alignment features""... $ac_c" 1>&6
-echo "configure:6324: checking assembler alignment features" >&5
-gcc_cv_as=
-gcc_cv_as_alignment_features=
-gcc_cv_as_gas_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/gas
-if test -x "$DEFAULT_ASSEMBLER"; then
- gcc_cv_as="$DEFAULT_ASSEMBLER"
-elif test -x "$AS"; then
- gcc_cv_as="$AS"
-elif test -x as$host_exeext; then
- # Build using assembler in the current directory.
- gcc_cv_as=./as$host_exeext
-elif test -f $gcc_cv_as_gas_srcdir/configure.in -a -f ../gas/Makefile; then
- # Single tree build which includes gas.
- for f in $gcc_cv_as_gas_srcdir/configure $gcc_cv_as_gas_srcdir/configure.in $gcc_cv_as_gas_srcdir/Makefile.in
- do
- gcc_cv_gas_version=`grep '^VERSION=[0-9]*\.[0-9]*' $f`
- if test x$gcc_cv_gas_version != x; then
- break
- fi
- done
- gcc_cv_gas_major_version=`expr "$gcc_cv_gas_version" : "VERSION=\([0-9]*\)"`
- gcc_cv_gas_minor_version=`expr "$gcc_cv_gas_version" : "VERSION=[0-9]*\.\([0-9]*\)"`
- if test x$gcc_cv_gas_major_version != x -a x$gcc_cv_gas_minor_version != x; then
- # Gas version 2.6 and later support for .balign and .p2align.
- # bytes to skip when using .p2align.
- if test "$gcc_cv_gas_major_version" -eq 2 -a "$gcc_cv_gas_minor_version" -ge 6 -o "$gcc_cv_gas_major_version" -gt 2; then
- gcc_cv_as_alignment_features=".balign and .p2align"
- cat >> confdefs.h <<\EOF
-#define HAVE_GAS_BALIGN_AND_P2ALIGN 1
-EOF
-
- fi
- # Gas version 2.8 and later support specifying the maximum
- # bytes to skip when using .p2align.
- if test "$gcc_cv_gas_major_version" -eq 2 -a "$gcc_cv_gas_minor_version" -ge 8 -o "$gcc_cv_gas_major_version" -gt 2; then
- gcc_cv_as_alignment_features=".p2align including maximum skip"
- cat >> confdefs.h <<\EOF
-#define HAVE_GAS_MAX_SKIP_P2ALIGN 1
-EOF
-
- fi
- fi
-elif test x$host = x$target; then
- # Native build.
- gcc_cv_as=as$host_exeext
-fi
-if test x$gcc_cv_as != x; then
- # Check if we have .balign and .p2align
- echo ".balign 4" > conftest.s
- echo ".p2align 2" >> conftest.s
- if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
- gcc_cv_as_alignment_features=".balign and .p2align"
- cat >> confdefs.h <<\EOF
-#define HAVE_GAS_BALIGN_AND_P2ALIGN 1
-EOF
-
- fi
- rm -f conftest.s conftest.o
- # Check if specifying the maximum bytes to skip when
- # using .p2align is supported.
- echo ".p2align 4,,7" > conftest.s
- if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
- gcc_cv_as_alignment_features=".p2align including maximum skip"
- cat >> confdefs.h <<\EOF
-#define HAVE_GAS_MAX_SKIP_P2ALIGN 1
-EOF
-
- fi
- rm -f conftest.s conftest.o
-fi
-echo "$ac_t""$gcc_cv_as_alignment_features" 1>&6
-
-echo $ac_n "checking assembler subsection support""... $ac_c" 1>&6
-echo "configure:6397: checking assembler subsection support" >&5
-gcc_cv_as_subsections=
-if test x$gcc_cv_as != x; then
- # Check if we have .subsection
- echo ".subsection 1" > conftest.s
- if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
- gcc_cv_as_subsections=".subsection"
- if test -x nm$host_exeext; then
- gcc_cv_nm=./nm$host_exeext
- elif test x$host = x$target; then
- # Native build.
- gcc_cv_nm=nm$host_exeext
- fi
- if test x$gcc_cv_nm != x; then
- cat > conftest.s <<EOF
-conftest_label1: .word 0
-.subsection -1
-conftest_label2: .word 0
-.previous
-EOF
- if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
- $gcc_cv_nm conftest.o | grep conftest_label1 > conftest.nm1
- $gcc_cv_nm conftest.o | grep conftest_label2 | sed -e 's/label2/label1/' > conftest.nm2
- if cmp conftest.nm1 conftest.nm2 > /dev/null 2>&1; then
- :
- else
- gcc_cv_as_subsections="working .subsection -1"
- cat >> confdefs.h <<\EOF
-#define HAVE_GAS_SUBSECTION_ORDERING 1
-EOF
-
- fi
- fi
- fi
- fi
- rm -f conftest.s conftest.o conftest.nm1 conftest.nm2
-fi
-echo "$ac_t""$gcc_cv_as_subsections" 1>&6
-
-# Figure out what language subdirectories are present.
-# Look if the user specified --enable-languages="..."; if not, use
-# the environment variable $LANGUAGES if defined. $LANGUAGES might
-# go away some day.
-if test x"${enable_languages+set}" != xset; then
- if test x"${LANGUAGES+set}" = xset; then
- enable_languages="`echo ${LANGUAGES} | tr ' ' ','`"
- else
- enable_languages=all
- fi
-fi
-subdirs=
-for lang in ${srcdir}/*/config-lang.in ..
-do
- case $lang in
- ..) ;;
- # The odd quoting in the next line works around
- # an apparent bug in bash 1.12 on linux.
- ${srcdir}/[*]/config-lang.in) ;;
- # CYGNUS LOCAL nofortran/law
- ${srcdir}/f/config-lang.in)
- if [ x$enable_fortran = xyes ]; then
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([^/]*\)/config-lang.in$,\1,'`"
- fi
- ;;
- ${srcdir}/objc/config-lang.in)
- if [ x$enable_objc = xyes ]; then
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([^/]*\)/config-lang.in$,\1,'`"
- fi
- ;;
- ${srcdir}/ch/config-lang.in)
- if [ x$enable_chill = xyes ]; then
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([^/]*\)/config-lang.in$,\1,'`"
- fi
- ;;
- # END CYGNUS LOCAL
- ${srcdir}/ada/config-lang.in)
- if test x$gnat = xyes ; then
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([^/]*\)/config-lang.in$,\1,'`"
- fi
- ;;
- *)
- lang_alias=`sed -n -e 's,^language=['"'"'"'"]\(.*\)["'"'"'"'].*$,\1,p' -e 's,^language=\([^ ]*\).*$,\1,p' $lang`
- if test "x$lang_alias" = x
- then
- echo "$lang doesn't set \$language." 1>&2
- exit 1
- fi
- if test x"${enable_languages}" = xall; then
- add_this_lang=yes
- else
- case "${enable_languages}" in
- ${lang_alias} | "${lang_alias},"* | *",${lang_alias},"* | *",${lang_alias}" )
- add_this_lang=yes
- ;;
- * )
- add_this_lang=no
- ;;
- esac
- fi
- if test x"${add_this_lang}" = xyes; then
- case $lang in
- ${srcdir}/ada/config-lang.in)
- if test x$gnat = xyes ; then
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([^/]*\)/config-lang.in$,\1,'`"
- fi
- ;;
- *)
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([^/]*\)/config-lang.in$,\1,'`"
- ;;
- esac
- fi
- ;;
- esac
-done
-
-# Make gthr-default.h if we have a thread file.
-gthread_flags=
-if test $thread_file != single; then
- rm -f gthr-default.h
- echo "#include \"gthr-${thread_file}.h\"" > gthr-default.h
- gthread_flags=-DHAVE_GTHR_DEFAULT
-fi
-# CYGNUS LOCAL java quickthreads
-# qt is a library we build. So if we're using for it, and it is in
-# our source tree, then we must look there for includes.
-if test $thread_file = qt && test -d $srcdir/../qthreads; then
- gthread_flags="$gthread_flags -I\$(srcdir)/../qthreads"
-fi
-# END CYGNUS LOCAL
-
-
-# Make empty files to contain the specs and options for each language.
-# Then add #include lines to for a compiler that has specs and/or options.
-
-lang_specs_files=
-lang_options_files=
-lang_tree_files=
-rm -f specs.h options.h gencheck.h
-touch specs.h options.h gencheck.h
-for subdir in . $subdirs
-do
- if test -f $srcdir/$subdir/lang-specs.h; then
- echo "#include \"$subdir/lang-specs.h\"" >>specs.h
- lang_specs_files="$lang_specs_files $srcdir/$subdir/lang-specs.h"
- fi
- if test -f $srcdir/$subdir/lang-options.h; then
- echo "#include \"$subdir/lang-options.h\"" >>options.h
- lang_options_files="$lang_options_files $srcdir/$subdir/lang-options.h"
- fi
- if test -f $srcdir/$subdir/$subdir-tree.def; then
- echo "#include \"$subdir/$subdir-tree.def\"" >>gencheck.h
- lang_tree_files="$lang_tree_files $srcdir/$subdir/$subdir-tree.def"
- fi
-done
-
-# These (without "all_") are set in each config-lang.in.
-# `language' must be a single word so is spelled singularly.
-all_languages=
-all_boot_languages=
-all_compilers=
-all_stagestuff=
-all_diff_excludes=
-all_outputs=Makefile
-# List of language makefile fragments.
-all_lang_makefiles=
-all_headers=
-all_lib2funcs=
-
-# Add the language fragments.
-# Languages are added via two mechanisms. Some information must be
-# recorded in makefile variables, these are defined in config-lang.in.
-# We accumulate them and plug them into the main Makefile.
-# The other mechanism is a set of hooks for each of the main targets
-# like `clean', `install', etc.
-
-language_fragments="Make-lang"
-language_hooks="Make-hooks"
-oldstyle_subdirs=
-
-for s in .. $subdirs
-do
- if test $s != ".."
- then
- language=
- boot_language=
- compilers=
- stagestuff=
- diff_excludes=
- headers=
- outputs=
- lib2funcs=
- . ${srcdir}/$s/config-lang.in
- if test "x$language" = x
- then
- echo "${srcdir}/$s/config-lang.in doesn't set \$language." 1>&2
- exit 1
- fi
- all_lang_makefiles="$all_lang_makefiles ${srcdir}/$s/Make-lang.in ${srcdir}/$s/Makefile.in"
- all_languages="$all_languages $language"
- if test "x$boot_language" = xyes
- then
- all_boot_languages="$all_boot_languages $language"
- fi
- all_compilers="$all_compilers $compilers"
- all_stagestuff="$all_stagestuff $stagestuff"
- all_diff_excludes="$all_diff_excludes $diff_excludes"
- all_headers="$all_headers $headers"
- all_outputs="$all_outputs $outputs"
- if test x$outputs = x
- then
- oldstyle_subdirs="$oldstyle_subdirs $s"
- fi
- all_lib2funcs="$all_lib2funcs $lib2funcs"
- fi
-done
-
-# Since we can't use `::' targets, we link each language in
-# with a set of hooks, reached indirectly via lang.${target}.
-
-rm -f Make-hooks
-touch Make-hooks
-target_list="all.build all.cross start.encap rest.encap \
- info dvi \
- install-normal install-common install-info install-man \
- uninstall distdir \
- mostlyclean clean distclean extraclean maintainer-clean \
- stage1 stage2 stage3 stage4"
-for t in $target_list
-do
- x=
- for l in .. $all_languages
- do
- if test $l != ".."; then
- x="$x $l.$t"
- fi
- done
- echo "lang.$t: $x" >> Make-hooks
-done
-
-# If we're not building in srcdir, create .gdbinit.
-
-if test ! -f Makefile.in; then
- echo "dir ." > .gdbinit
- echo "dir ${srcdir}" >> .gdbinit
- if test x$gdb_needs_out_file_path = xyes
- then
- echo "dir ${srcdir}/config/"`dirname ${out_file}` >> .gdbinit
- fi
- if test "x$subdirs" != x; then
- for s in $subdirs
- do
- echo "dir ${srcdir}/$s" >> .gdbinit
- done
- fi
- echo "source ${srcdir}/.gdbinit" >> .gdbinit
-fi
-
-# Define variables host_canonical and build_canonical
-# because some Cygnus local changes in the Makefile depend on them.
-build_canonical=${build}
-host_canonical=${host}
-target_subdir=
-if test "${host}" != "${target}" ; then
- target_subdir=${target}/
-fi
-
-
-
-
-# If this is using newlib, then define inhibit_libc in
-# LIBGCC2_CFLAGS. This will cause __eprintf to be left out of
-# libgcc.a, but that's OK because newib should have its own version of
-# assert.h.
-inhibit_libc=
-if test x$with_newlib = xyes; then
- inhibit_libc=-Dinhibit_libc
-fi
-
-
-# Override SCHED_OBJ and SCHED_CFLAGS to enable the Haifa scheduler.
-sched_prefix=
-sched_cflags=
-if test x$enable_haifa = xyes; then
- echo "Using the Haifa scheduler."
- sched_prefix=haifa-
- sched_cflags=-DHAIFA
-fi
-
-
-if test x$enable_haifa != x; then
- # Explicitly remove files that need to be recompiled for the Haifa scheduler.
- for x in genattrtab.o toplev.o loop.o unroll.o *sched.o; do
- if test -f $x; then
- echo "Removing $x"
- rm -f $x
- fi
- done
-fi
-
-# If $(exec_prefix) exists and is not the same as $(prefix), then compute an
-# absolute path for gcc_tooldir based on inserting the number of up-directory
-# movements required to get from $(exec_prefix) to $(prefix) into the basic
-# $(libsubdir)/@(unlibsubdir) based path.
-# Don't set gcc_tooldir to tooldir since that's only passed in by the toplevel
-# make and thus we'd get different behavior depending on where we built the
-# sources.
-if test x$exec_prefix = xNONE -o x$exec_prefix = x$prefix; then
- gcc_tooldir='$(libsubdir)/$(unlibsubdir)/../$(target_alias)'
-else
-# An explanation of the sed strings:
-# -e 's|^\$(prefix)||' matches and eliminates 'prefix' from 'exec_prefix'
-# -e 's|/$||' match a trailing forward slash and eliminates it
-# -e 's|^[^/]|/|' forces the string to start with a forward slash (*)
-# -e 's|/[^/]*|../|g' replaces each occurance of /<directory> with ../
-#
-# (*) Note this pattern overwrites the first character of the string
-# with a forward slash if one is not already present. This is not a
-# problem because the exact names of the sub-directories concerned is
-# unimportant, just the number of them matters.
-#
-# The practical upshot of these patterns is like this:
-#
-# prefix exec_prefix result
-# ------ ----------- ------
-# /foo /foo/bar ../
-# /foo/ /foo/bar ../
-# /foo /foo/bar/ ../
-# /foo/ /foo/bar/ ../
-# /foo /foo/bar/ugg ../../
-#
- dollar='$$'
- gcc_tooldir="\$(libsubdir)/\$(unlibsubdir)/\`echo \$(exec_prefix) | sed -e 's|^\$(prefix)||' -e 's|/\$(dollar)||' -e 's|^[^/]|/|' -e 's|/[^/]*|../|g'\`\$(target_alias)"
-fi
-
-
-
-# Warn if using init_priority.
-echo $ac_n "checking whether to enable init_priority by default""... $ac_c" 1>&6
-echo "configure:6735: checking whether to enable init_priority by default" >&5
-if test x$enable_init_priority != xyes; then
- enable_init_priority=no
-fi
-echo "$ac_t""$enable_init_priority" 1>&6
-
-# Nothing to do for FLOAT_H, float_format already handled.
-objdir=`pwd`
-
-
-# Process the language and host/target makefile fragments.
-${CONFIG_SHELL-/bin/sh} $srcdir/configure.frag $srcdir "$subdirs" "$dep_host_xmake_file" "$dep_tmake_file"
-
-# Substitute configuration variables
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Echo that links are built
-if test x$host = x$target
-then
- str1="native "
-else
- str1="cross-"
- str2=" from $host"
-fi
-
-if test x$host != x$build
-then
- str3=" on a $build system"
-fi
-
-if test "x$str2" != x || test "x$str3" != x
-then
- str4=
-fi
-
-echo "Links are now set up to build a ${str1}compiler for ${target}$str4" 1>&2
-
-if test "x$str2" != x || test "x$str3" != x
-then
- echo " ${str2}${str3}." 1>&2
-fi
-
-# Truncate the target if necessary
-if test x$host_truncate_target != x; then
- target=`echo $target | sed -e 's/\(..............\).*/\1/'`
-fi
-
-# Configure the subdirectories
-# AC_CONFIG_SUBDIRS($subdirs)
-
-# Create the Makefile
-# and configure language subdirectories
-trap '' 1 2 15
-cat > confcache <<\EOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs. It is not useful on other systems.
-# If it contains results you don't want to keep, you may remove or edit it.
-#
-# By default, configure uses ./config.cache as the cache file,
-# creating it if it does not exist already. You can give configure
-# the --cache-file=FILE option to use a different cache file; that is
-# what configure does when it calls configure scripts in
-# subdirectories, so they share the cache.
-# Giving --cache-file=/dev/null disables caching, for debugging configure.
-# config.status only pays attention to the cache file if you give it the
-# --recheck option to rerun configure.
-#
-EOF
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(set) 2>&1 |
- case `(ac_space=' '; set | grep ac_space) 2>&1` in
- *ac_space=\ *)
- # `set' does not quote correctly, so add quotes (double-quote substitution
- # turns \\\\ into \\, and sed turns \\ into \).
- sed -n \
- -e "s/'/'\\\\''/g" \
- -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
- ;;
- *)
- # `set' quotes correctly as required by POSIX, so do not add quotes.
- sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
- ;;
- esac >> confcache
-if cmp -s $cache_file confcache; then
- :
-else
- if test -w $cache_file; then
- echo "updating cache $cache_file"
- cat confcache > $cache_file
- else
- echo "not updating unwritable cache $cache_file"
- fi
-fi
-rm -f confcache
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# Any assignment to VPATH causes Sun make to only execute
-# the first set of double-colon rules, so remove it if not needed.
-# If there is a colon in the path, we need to keep it.
-if test "x$srcdir" = x.; then
- ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
-fi
-
-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
-
-DEFS=-DHAVE_CONFIG_H
-
-# Without the "./", some shells look in PATH for config.status.
-: ${CONFIG_STATUS=./config.status}
-
-echo creating $CONFIG_STATUS
-rm -f $CONFIG_STATUS
-cat > $CONFIG_STATUS <<EOF
-#! /bin/sh
-# Generated automatically by configure.
-# Run this file to recreate the current configuration.
-# This directory was configured as follows,
-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# $0 $ac_configure_args
-#
-# Compiler output produced by configure, useful for debugging
-# configure, is in ./config.log if it exists.
-
-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
-for ac_option
-do
- case "\$ac_option" in
- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
- echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
- exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
- -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
- echo "$CONFIG_STATUS generated by autoconf version 2.13"
- exit 0 ;;
- -help | --help | --hel | --he | --h)
- echo "\$ac_cs_usage"; exit 0 ;;
- *) echo "\$ac_cs_usage"; exit 1 ;;
- esac
-done
-
-ac_given_srcdir=$srcdir
-
-trap 'rm -fr `echo "$all_outputs auto-host.h:config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-# Protect against being on the right side of a sed subst in config.status.
-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
-$ac_vpsub
-$extrasub
-s%@SHELL@%$SHELL%g
-s%@CFLAGS@%$CFLAGS%g
-s%@CPPFLAGS@%$CPPFLAGS%g
-s%@CXXFLAGS@%$CXXFLAGS%g
-s%@FFLAGS@%$FFLAGS%g
-s%@DEFS@%$DEFS%g
-s%@LDFLAGS@%$LDFLAGS%g
-s%@LIBS@%$LIBS%g
-s%@exec_prefix@%$exec_prefix%g
-s%@prefix@%$prefix%g
-s%@program_transform_name@%$program_transform_name%g
-s%@bindir@%$bindir%g
-s%@sbindir@%$sbindir%g
-s%@libexecdir@%$libexecdir%g
-s%@datadir@%$datadir%g
-s%@sysconfdir@%$sysconfdir%g
-s%@sharedstatedir@%$sharedstatedir%g
-s%@localstatedir@%$localstatedir%g
-s%@libdir@%$libdir%g
-s%@includedir@%$includedir%g
-s%@oldincludedir@%$oldincludedir%g
-s%@infodir@%$infodir%g
-s%@mandir@%$mandir%g
-s%@host@%$host%g
-s%@host_alias@%$host_alias%g
-s%@host_cpu@%$host_cpu%g
-s%@host_vendor@%$host_vendor%g
-s%@host_os@%$host_os%g
-s%@target@%$target%g
-s%@target_alias@%$target_alias%g
-s%@target_cpu@%$target_cpu%g
-s%@target_vendor@%$target_vendor%g
-s%@target_os@%$target_os%g
-s%@build@%$build%g
-s%@build_alias@%$build_alias%g
-s%@build_cpu@%$build_cpu%g
-s%@build_vendor@%$build_vendor%g
-s%@build_os@%$build_os%g
-s%@CC@%$CC%g
-s%@stage1_warn_cflags@%$stage1_warn_cflags%g
-s%@SET_MAKE@%$SET_MAKE%g
-s%@AWK@%$AWK%g
-s%@LEX@%$LEX%g
-s%@LEXLIB@%$LEXLIB%g
-s%@LN@%$LN%g
-s%@LN_S@%$LN_S%g
-s%@RANLIB@%$RANLIB%g
-s%@YACC@%$YACC%g
-s%@INSTALL@%$INSTALL%g
-s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
-s%@INSTALL_DATA@%$INSTALL_DATA%g
-s%@CPP@%$CPP%g
-s%@gnat@%$gnat%g
-s%@vfprintf@%$vfprintf%g
-s%@doprint@%$doprint%g
-s%@manext@%$manext%g
-s%@objext@%$objext%g
-s%@gthread_flags@%$gthread_flags%g
-s%@build_canonical@%$build_canonical%g
-s%@host_canonical@%$host_canonical%g
-s%@target_subdir@%$target_subdir%g
-s%@inhibit_libc@%$inhibit_libc%g
-s%@sched_prefix@%$sched_prefix%g
-s%@sched_cflags@%$sched_cflags%g
-s%@gcc_tooldir@%$gcc_tooldir%g
-s%@dollar@%$dollar%g
-s%@objdir@%$objdir%g
-s%@subdirs@%$subdirs%g
-s%@all_languages@%$all_languages%g
-s%@all_boot_languages@%$all_boot_languages%g
-s%@all_compilers@%$all_compilers%g
-s%@all_lang_makefiles@%$all_lang_makefiles%g
-s%@all_stagestuff@%$all_stagestuff%g
-s%@all_diff_excludes@%$all_diff_excludes%g
-s%@all_lib2funcs@%$all_lib2funcs%g
-s%@all_headers@%$all_headers%g
-s%@cpp_main@%$cpp_main%g
-s%@extra_passes@%$extra_passes%g
-s%@extra_programs@%$extra_programs%g
-s%@extra_parts@%$extra_parts%g
-s%@extra_c_objs@%$extra_c_objs%g
-s%@extra_cxx_objs@%$extra_cxx_objs%g
-s%@extra_cpp_objs@%$extra_cpp_objs%g
-s%@extra_c_flags@%$extra_c_flags%g
-s%@extra_objs@%$extra_objs%g
-s%@host_extra_gcc_objs@%$host_extra_gcc_objs%g
-s%@extra_headers_list@%$extra_headers_list%g
-s%@dep_host_xmake_file@%$dep_host_xmake_file%g
-s%@dep_tmake_file@%$dep_tmake_file%g
-s%@out_file@%$out_file%g
-s%@out_object_file@%$out_object_file%g
-s%@md_file@%$md_file%g
-s%@tm_file_list@%$tm_file_list%g
-s%@build_xm_file_list@%$build_xm_file_list%g
-s%@host_xm_file_list@%$host_xm_file_list%g
-s%@lang_specs_files@%$lang_specs_files%g
-s%@lang_options_files@%$lang_options_files%g
-s%@lang_tree_files@%$lang_tree_files%g
-s%@thread_file@%$thread_file%g
-s%@objc_boehm_gc@%$objc_boehm_gc%g
-s%@JAVAGC@%$JAVAGC%g
-s%@gcc_version@%$gcc_version%g
-s%@gcc_version_trigger@%$gcc_version_trigger%g
-s%@local_prefix@%$local_prefix%g
-s%@gcc_gxx_include_dir@%$gcc_gxx_include_dir%g
-s%@fixincludes@%$fixincludes%g
-s%@build_install_headers_dir@%$build_install_headers_dir%g
-s%@build_exeext@%$build_exeext%g
-s%@host_exeext@%$host_exeext%g
-s%@float_h_file@%$float_h_file%g
-s%@cc_set_by_configure@%$cc_set_by_configure%g
-s%@stage_prefix_set_by_configure@%$stage_prefix_set_by_configure%g
-s%@install@%$install%g
-s%@symbolic_link@%$symbolic_link%g
-/@target_overrides@/r $target_overrides
-s%@target_overrides@%%g
-/@host_overrides@/r $host_overrides
-s%@host_overrides@%%g
-s%@cross_defines@%$cross_defines%g
-/@cross_overrides@/r $cross_overrides
-s%@cross_overrides@%%g
-/@build_overrides@/r $build_overrides
-s%@build_overrides@%%g
-/@language_fragments@/r $language_fragments
-s%@language_fragments@%%g
-/@language_hooks@/r $language_hooks
-s%@language_hooks@%%g
-
-CEOF
-EOF
-
-cat >> $CONFIG_STATUS <<\EOF
-
-# Split the substitutions into bite-sized pieces for seds with
-# small command number limits, like on Digital OSF/1 and HP-UX.
-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
-ac_file=1 # Number of current file.
-ac_beg=1 # First line for current file.
-ac_end=$ac_max_sed_cmds # Line after last line for current file.
-ac_more_lines=:
-ac_sed_cmds=""
-while $ac_more_lines; do
- if test $ac_beg -gt 1; then
- sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
- else
- sed "${ac_end}q" conftest.subs > conftest.s$ac_file
- fi
- if test ! -s conftest.s$ac_file; then
- ac_more_lines=false
- rm -f conftest.s$ac_file
- else
- if test -z "$ac_sed_cmds"; then
- ac_sed_cmds="sed -f conftest.s$ac_file"
- else
- ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
- fi
- ac_file=`expr $ac_file + 1`
- ac_beg=$ac_end
- ac_end=`expr $ac_end + $ac_max_sed_cmds`
- fi
-done
-if test -z "$ac_sed_cmds"; then
- ac_sed_cmds=cat
-fi
-EOF
-
-cat >> $CONFIG_STATUS <<EOF
-
-CONFIG_FILES=\${CONFIG_FILES-"$all_outputs"}
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
- case "$ac_file" in
- *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
- ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
- *) ac_file_in="${ac_file}.in" ;;
- esac
-
- # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
-
- # Remove last slash and all that follows it. Not all systems have dirname.
- ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
- if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
- # The file is in a subdirectory.
- test ! -d "$ac_dir" && mkdir "$ac_dir"
- ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
- # A "../" for each directory in $ac_dir_suffix.
- ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
- else
- ac_dir_suffix= ac_dots=
- fi
-
- case "$ac_given_srcdir" in
- .) srcdir=.
- if test -z "$ac_dots"; then top_srcdir=.
- else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
- /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
- *) # Relative path.
- srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
- top_srcdir="$ac_dots$ac_given_srcdir" ;;
- esac
-
-
- echo creating "$ac_file"
- rm -f "$ac_file"
- configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
- case "$ac_file" in
- *Makefile*) ac_comsub="1i\\
-# $configure_input" ;;
- *) ac_comsub= ;;
- esac
-
- ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
- sed -e "$ac_comsub
-s%@configure_input@%$configure_input%g
-s%@srcdir@%$srcdir%g
-s%@top_srcdir@%$top_srcdir%g
-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
-fi; done
-rm -f conftest.s*
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
-ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
-ac_dC='\3'
-ac_dD='%g'
-# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
-ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
-ac_uB='\([ ]\)%\1#\2define\3'
-ac_uC=' '
-ac_uD='\4%g'
-# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
-ac_eB='$%\1#\2define\3'
-ac_eC=' '
-ac_eD='%g'
-
-if test "${CONFIG_HEADERS+set}" != set; then
-EOF
-cat >> $CONFIG_STATUS <<EOF
- CONFIG_HEADERS="auto-host.h:config.in"
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-fi
-for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
- case "$ac_file" in
- *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
- ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
- *) ac_file_in="${ac_file}.in" ;;
- esac
-
- echo creating $ac_file
-
- rm -f conftest.frag conftest.in conftest.out
- ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
- cat $ac_file_inputs > conftest.in
-
-EOF
-
-# Transform confdefs.h into a sed script conftest.vals that substitutes
-# the proper values into config.h.in to produce config.h. And first:
-# Protect against being on the right side of a sed subst in config.status.
-# Protect against being in an unquoted here document in config.status.
-rm -f conftest.vals
-cat > conftest.hdr <<\EOF
-s/[\\&%]/\\&/g
-s%[\\$`]%\\&%g
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
-s%ac_d%ac_u%gp
-s%ac_u%ac_e%gp
-EOF
-sed -n -f conftest.hdr confdefs.h > conftest.vals
-rm -f conftest.hdr
-
-# This sed command replaces #undef with comments. This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >> conftest.vals <<\EOF
-s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
-EOF
-
-# Break up conftest.vals because some shells have a limit on
-# the size of here documents, and old seds have small limits too.
-
-rm -f conftest.tail
-while :
-do
- ac_lines=`grep -c . conftest.vals`
- # grep -c gives empty output for an empty file on some AIX systems.
- if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
- # Write a limited-size here document to conftest.frag.
- echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
- sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
- echo 'CEOF
- sed -f conftest.frag conftest.in > conftest.out
- rm -f conftest.in
- mv conftest.out conftest.in
-' >> $CONFIG_STATUS
- sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
- rm -f conftest.vals
- mv conftest.tail conftest.vals
-done
-rm -f conftest.vals
-
-cat >> $CONFIG_STATUS <<\EOF
- rm -f conftest.frag conftest.h
- echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
- cat conftest.in >> conftest.h
- rm -f conftest.in
- if cmp -s $ac_file conftest.h 2>/dev/null; then
- echo "$ac_file is unchanged"
- rm -f conftest.h
- else
- # Remove last slash and all that follows it. Not all systems have dirname.
- ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
- if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
- # The file is in a subdirectory.
- test ! -d "$ac_dir" && mkdir "$ac_dir"
- fi
- rm -f $ac_file
- mv conftest.h $ac_file
- fi
-fi; done
-
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-host='${host}'
-build='${build}'
-target='${target}'
-target_alias='${target_alias}'
-srcdir='${srcdir}'
-subdirs='${subdirs}'
-oldstyle_subdirs='${oldstyle_subdirs}'
-symbolic_link='${symbolic_link}'
-program_transform_set='${program_transform_set}'
-program_transform_name='${program_transform_name}'
-dep_host_xmake_file='${dep_host_xmake_file}'
-host_xmake_file='${host_xmake_file}'
-dep_tmake_file='${dep_tmake_file}'
-tmake_file='${tmake_file}'
-thread_file='${thread_file}'
-gcc_version='${gcc_version}'
-gcc_version_trigger='${gcc_version_trigger}'
-local_prefix='${local_prefix}'
-build_install_headers_dir='${build_install_headers_dir}'
-build_exeext='${build_exeext}'
-host_exeext='${host_exeext}'
-out_file='${out_file}'
-gdb_needs_out_file_path='${gdb_needs_out_file_path}'
-SET_MAKE='${SET_MAKE}'
-target_list='${target_list}'
-target_overrides='${target_overrides}'
-host_overrides='${host_overrides}'
-cross_defines='${cross_defines}'
-cross_overrides='${cross_overrides}'
-build_overrides='${build_overrides}'
-
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-
-. $srcdir/configure.lang
-case x$CONFIG_HEADERS in
-xauto-host.h:config.in)
-echo > cstamp-h ;;
-esac
-# If the host supports symlinks, point stage[1234] at ../stage[1234] so
-# bootstrapping and the installation procedure can still use
-# CC="stage1/xgcc -Bstage1/". If the host doesn't support symlinks,
-# FLAGS_TO_PASS has been modified to solve the problem there.
-# This is virtually a duplicate of what happens in configure.lang; we do
-# an extra check to make sure this only happens if ln -s can be used.
-if test "$symbolic_link" = "ln -s"; then
- for d in .. ${subdirs} ; do
- if test $d != ..; then
- STARTDIR=`pwd`
- cd $d
- for t in stage1 stage2 stage3 stage4 include
- do
- rm -f $t
- $symbolic_link ../$t $t 2>/dev/null
- done
- cd $STARTDIR
- fi
- done
-else true ; fi
-
-exit 0
-EOF
-chmod +x $CONFIG_STATUS
-rm -fr confdefs* $ac_clean_files
-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
-
diff --git a/gcc/configure.bat b/gcc/configure.bat
deleted file mode 100755
index 33cbe65..0000000
--- a/gcc/configure.bat
+++ /dev/null
@@ -1,21 +0,0 @@
-@echo off
-if %1.==go32. goto call_go32
-if %1.==winnt. goto call_winnt
-echo Usage: configure go32 or configure winnt cpu
-goto END
-
-:call_go32
-call config\msdos\configure %1 %2 %3 %4
-goto END
-
-:call_winnt
-if %2.==i386. goto really_call_winnt
-if %2.==alpha. goto really_call_winnt
-echo Usage: configure winnt i386 or configure winnt alpha
-goto END
-:really_call_winnt
-call config\winnt\config-nt %1 %2 %3 %4
-goto END
-
-:END
-
diff --git a/gcc/configure.frag b/gcc/configure.frag
deleted file mode 100755
index 4bdac94..0000000
--- a/gcc/configure.frag
+++ /dev/null
@@ -1,77 +0,0 @@
-# configure.frag for GNU CC
-# Process the host/target/language Makefile fragments.
-
-# Copyright (C) 1997 Free Software Foundation, Inc.
-
-#This file is part of GNU CC.
-
-#GNU CC is free software; you can redistribute it and/or modify
-#it under the terms of the GNU General Public License as published by
-#the Free Software Foundation; either version 2, or (at your option)
-#any later version.
-
-#GNU CC is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-#GNU General Public License for more details.
-
-#You should have received a copy of the GNU General Public License
-#along with GNU CC; see the file COPYING. If not, write to
-#the Free Software Foundation, 59 Temple Place - Suite 330,
-#Boston, MA 02111-1307, USA.
-
-# First parameter is the source directory, second is list of subdirectories,
-# third is list of host makefile fragments, fourth is list of target makefile
-# fragments.
-
-srcdir=$1
-subdirs=$2
-xmake_files=$3
-tmake_files=$4
-
-# Copy all the host makefile fragments into Make-host.
-
-rm -f Make-host
-touch Make-host
-for f in .. $xmake_files
-do
- if [ -f $f ]
- then
- cat $f >> Make-host
- fi
-done
-
-# Copy all the target makefile fragments into Make-target.
-
-rm -f Make-target
-touch Make-target
-for f in .. $tmake_files
-do
- if [ -f $f ]
- then
- cat $f >> Make-target
- fi
-done
-
-# Ensure the language build subdirectories exist.
-
-for subdir in . $subdirs
-do
- if [ $subdir != . ]
- then
- test -d $subdir || mkdir $subdir
- fi
-done
-
-# Now copy each language's Make-lang.in file to Make-lang.
-
-rm -f Make-lang
-touch Make-lang
-
-for subdir in . $subdirs
-do
- if [ $subdir != . ]
- then
- cat $srcdir/$subdir/Make-lang.in >> Make-lang
- fi
-done
diff --git a/gcc/configure.in b/gcc/configure.in
deleted file mode 100755
index 5d801fa..0000000
--- a/gcc/configure.in
+++ /dev/null
@@ -1,1656 +0,0 @@
-# configure.in for GNU CC
-# Process this file with autoconf to generate a configuration script.
-
-# Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
-
-#This file is part of GNU CC.
-
-#GNU CC is free software; you can redistribute it and/or modify
-#it under the terms of the GNU General Public License as published by
-#the Free Software Foundation; either version 2, or (at your option)
-#any later version.
-
-#GNU CC is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-#GNU General Public License for more details.
-
-#You should have received a copy of the GNU General Public License
-#along with GNU CC; see the file COPYING. If not, write to
-#the Free Software Foundation, 59 Temple Place - Suite 330,
-#Boston, MA 02111-1307, USA.
-
-# Initialization and defaults
-AC_PREREQ(2.12.1)
-AC_INIT(tree.c)
-AC_CONFIG_HEADER(auto-host.h:config.in)
-
-remove=rm
-hard_link=ln
-symbolic_link='ln -s'
-copy=cp
-
-# Check for bogus environment variables.
-# Test if LIBRARY_PATH contains the notation for the current directory
-# since this would lead to problems installing/building glibc.
-# LIBRARY_PATH contains the current directory if one of the following
-# is true:
-# - one of the terminals (":" and ";") is the first or last sign
-# - two terminals occur directly after each other
-# - the path contains an element with a dot in it
-AC_MSG_CHECKING(LIBRARY_PATH variable)
-changequote(,)dnl
-case ${LIBRARY_PATH} in
- [:\;]* | *[:\;] | *[:\;][:\;]* | *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
- library_path_setting="contains current directory"
- ;;
- *)
- library_path_setting="ok"
- ;;
-esac
-changequote([,])dnl
-AC_MSG_RESULT($library_path_setting)
-if test "$library_path_setting" != "ok"; then
-AC_MSG_ERROR([
-*** LIBRARY_PATH shouldn't contain the current directory when
-*** building egcs. Please change the environment variable
-*** and run configure again.])
-fi
-
-# Test if GCC_EXEC_PREFIX contains the notation for the current directory
-# since this would lead to problems installing/building glibc.
-# GCC_EXEC_PREFIX contains the current directory if one of the following
-# is true:
-# - one of the terminals (":" and ";") is the first or last sign
-# - two terminals occur directly after each other
-# - the path contains an element with a dot in it
-AC_MSG_CHECKING(GCC_EXEC_PREFIX variable)
-changequote(,)dnl
-case ${GCC_EXEC_PREFIX} in
- [:\;]* | *[:\;] | *[:\;][:\;]* | *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
- gcc_exec_prefix_setting="contains current directory"
- ;;
- *)
- gcc_exec_prefix_setting="ok"
- ;;
-esac
-changequote([,])dnl
-AC_MSG_RESULT($gcc_exec_prefix_setting)
-if test "$gcc_exec_prefix_setting" != "ok"; then
-AC_MSG_ERROR([
-*** GCC_EXEC_PREFIX shouldn't contain the current directory when
-*** building egcs. Please change the environment variable
-*** and run configure again.])
-fi
-
-# Check for additional parameters
-
-# With GNU ld
-AC_ARG_WITH(gnu-ld,
-[ --with-gnu-ld arrange to work with GNU ld.],
-gnu_ld_flag="$with_gnu_ld",
-gnu_ld_flag=no)
-
-# With pre-defined ld
-AC_ARG_WITH(ld,
-[ --with-ld arrange to use the specified ld (full pathname).],
-DEFAULT_LINKER="$with_ld")
-if test x"${DEFAULT_LINKER+set}" = x"set"; then
- if test ! -x "$DEFAULT_LINKER"; then
- AC_MSG_WARN([cannot execute: $DEFAULT_LINKER: check --with-ld or env. var. DEFAULT_LINKER])
- elif test "GNU" = `$DEFAULT_LINKER -v </dev/null 2>&1 | sed '1s/^GNU.*/GNU/;q'`; then
- gnu_ld_flag=yes
- fi
- AC_DEFINE_UNQUOTED(DEFAULT_LINKER,"$DEFAULT_LINKER")
-fi
-
-# With GNU as
-AC_ARG_WITH(gnu-as,
-[ --with-gnu-as arrange to work with GNU as.],
-gas_flag="$with_gnu_as",
-gas_flag=no)
-
-AC_ARG_WITH(as,
-[ --with-as arrange to use the specified as (full pathname).],
-DEFAULT_ASSEMBLER="$with_as")
-if test x"${DEFAULT_ASSEMBLER+set}" = x"set"; then
- if test ! -x "$DEFAULT_ASSEMBLER"; then
- AC_MSG_WARN([cannot execute: $DEFAULT_ASSEMBLER: check --with-as or env. var. DEFAULT_ASSEMBLER])
- elif test "GNU" = `$DEFAULT_ASSEMBLER -v </dev/null 2>&1 | sed '1s/^GNU.*/GNU/;q'`; then
- gas_flag=yes
- fi
- AC_DEFINE_UNQUOTED(DEFAULT_ASSEMBLER,"$DEFAULT_ASSEMBLER")
-fi
-
-# With stabs
-AC_ARG_WITH(stabs,
-[ --with-stabs arrange to use stabs instead of host debug format.],
-stabs="$with_stabs",
-stabs=no)
-
-# With ELF
-AC_ARG_WITH(elf,
-[ --with-elf arrange to use ELF instead of host debug format.],
-elf="$with_elf",
-elf=no)
-
-# CYGNUS LOCAL: local_prefix
-#local_prefix=
-#AC_ARG_WITH(local-prefix,
-#[ --with-local-prefix=DIR specifies directory to put local include.],
-#[case "${withval}" in
-#yes) AC_MSG_ERROR(bad value ${withval} given for local include directory prefix) ;;
-#no) ;;
-#*) local_prefix=$with_local_prefix ;;
-#esac])
-local_prefix='$(prefix)'
-# END CYGNUS LOCAL
-
-# Default local prefix if it is empty
-if test x$local_prefix = x; then
- local_prefix=/usr/local
-fi
-
-# Don't set gcc_gxx_include_dir to gxx_include_dir since that's only
-# passed in by the toplevel make and thus we'd get different behavior
-# depending on where we built the sources.
-gcc_gxx_include_dir=
-# Specify the g++ header file directory
-AC_ARG_WITH(gxx-include-dir,
-[ --with-gxx-include-dir=DIR
- specifies directory to put g++ header files.],
-[case "${withval}" in
-yes) AC_MSG_ERROR(bad value ${withval} given for g++ include directory) ;;
-no) ;;
-*) gcc_gxx_include_dir=$with_gxx_include_dir ;;
-esac])
-
-if test x${gcc_gxx_include_dir} = x; then
- if test x${enable_version_specific_runtime_libs} = xyes; then
- gcc_gxx_include_dir='${libsubdir}/include/g++'
- else
- topsrcdir=${srcdir}/.. . ${srcdir}/../config.if
-changequote(<<, >>)dnl
- gcc_gxx_include_dir="\$(libsubdir)/\$(unlibsubdir)/..\`echo \$(exec_prefix) | sed -e 's|^\$(prefix)||' -e 's|/[^/]*|/..|g'\`/include/g++"-${libstdcxx_interface}
-changequote([, ])dnl
- fi
-fi
-
-# Enable expensive internal checks
-AC_ARG_ENABLE(checking,
-[ --enable-checking enable expensive run-time checks.],
-[case "${enableval}" in
-yes) AC_DEFINE(ENABLE_CHECKING) ;;
-no) ;;
-*) AC_MSG_ERROR(bad value ${enableval} given for checking option) ;;
-esac])
-
-# Use cpplib+cppmain for the preprocessor, but don't link it with the compiler.
-cpp_main=cccp
-AC_ARG_ENABLE(cpplib,
-[ --enable-cpplib use cpplib for the C preprocessor.],
-if test x$enable_cpplib != xno; then
- cpp_main=cppmain
-fi)
-
-# Link cpplib into the compiler proper, for C/C++/ObjC.
-AC_ARG_ENABLE(c-cpplib,
-[ --enable-c-cpplib link cpplib directly into C and C++ compilers
- (implies --enable-cpplib).],
-if test x$enable_c_cpplib != xno; then
- extra_c_objs="${extra_c_objs} libcpp.a"
- extra_cxx_objs="${extra_cxx_objs} ../libcpp.a"
- extra_c_flags="${extra_c_flags} -DUSE_CPPLIB=1"
- cpp_main=cppmain
-fi)
-
-# CYGNUS LOCAL mbchar
-# Enable Multibyte Characters for C/C++
-AC_ARG_ENABLE(c-mbchar,
-[ --enable-c-mbchar enable multibyte characters for C and C++.
- --disable-c-mbchar disable multibyte characters for C and C++. ],
-if test x$enable_c_mbchar != xno; then
- extra_c_flags="${extra_c_flags} -DMULTIBYTE_CHARS=1"
-fi,
-extra_c_flags="${extra_c_flags} -DMULTIBYTE_CHARS=1"
-)
-# END CYGNUS LOCAL
-
-# Enable Haifa scheduler.
-AC_ARG_ENABLE(haifa,
-[ --enable-haifa use the experimental scheduler.
- --disable-haifa don't use the experimental scheduler for the
- targets which normally enable it.])
-# Fast fixincludes
-#
-# This is a work in progress...
-AC_ARG_WITH(fast-fixincludes,
-[ --with-fast-fixincludes use a faster fixinclude program (experimental)],
-fast_fixinc="$with_fast_fixincludes",
-fast_fixinc=no)
-
-# Enable init_priority.
-AC_ARG_ENABLE(init-priority,
-[ --enable-init-priority use attributes to assign initialization order
- for static objects.
- --disable-init-priority conform to ISO C++ rules for ordering static objects
- (i.e. initialized in order of declaration). ],
-if test x$enable_init_priority != xno; then
- extra_c_flags="${extra_c_flags} -DUSE_INIT_PRIORITY"
-fi)
-
-# Enable threads
-# Pass with no value to take the default
-# Pass with a value to specify a thread package
-AC_ARG_ENABLE(threads,
-[ --enable-threads enable thread usage for target GCC.
- --enable-threads=LIB use LIB thread package for target GCC.],
-if test x$enable_threads = xno; then
- enable_threads=''
-fi,
-enable_threads='')
-
-enable_threads_flag=$enable_threads
-# Check if a valid thread package
-case x${enable_threads_flag} in
- x | xno)
- # No threads
- target_thread_file='single'
- ;;
- xyes)
- # default
- target_thread_file=''
- ;;
- # CYGNUS LOCAL java
- xdecosf1 | xirix | xmach | xos2 | xposix | xpthreads | xsingle | \
- xsolaris | xwin32 | xdce | xvxworks | xqt)
- target_thread_file=$enable_threads_flag
- ;;
- *)
- echo "$enable_threads is an unknown thread package" 1>&2
- exit 1
- ;;
-esac
-
-AC_ARG_ENABLE(objc-gc,
-[ --enable-objc-gc enable the use of Boehm's garbage collector with
- the GNU Objective-C runtime.],
-if [[[ x$enable_objc_gc = xno ]]]; then
- objc_boehm_gc=''
-else
- objc_boehm_gc=1
-fi,
-objc_boehm_gc='')
-
-AC_ARG_ENABLE(java-gc,
-changequote(<<,>>)dnl
-<< --enable-java-gc=TYPE choose garbage collector [boehm]>>,
-changequote([,])
- JAVAGC=$enableval,
- JAVAGC=boehm)
-
-AC_ARG_WITH(dwarf2,
-[ --enable-dwarf2 enable DWARF2 debugging as default.],
-dwarf2="$with_dwarf2",
-dwarf2=no)
-
-# Determine the host, build, and target systems
-AC_CANONICAL_SYSTEM
-
-# Find the native compiler
-AC_PROG_CC
-
-# If the native compiler is GCC, we can enable warnings even in stage1.
-# That's useful for people building cross-compilers, or just running a
-# quick `make'.
-if test "x$GCC" = "xyes"; then
- stage1_warn_cflags='$(WARN_CFLAGS)'
-else
- stage1_warn_cflags=""
-fi
-AC_SUBST(stage1_warn_cflags)
-
-AC_PROG_MAKE_SET
-
-AC_MSG_CHECKING([whether a default assembler was specified])
-if test x"${DEFAULT_ASSEMBLER+set}" = x"set"; then
- if test x"$with_gas" = x"no"; then
- AC_MSG_RESULT([yes ($DEFAULT_ASSEMBLER)])
- else
- AC_MSG_RESULT([yes ($DEFAULT_ASSEMBLER - GNU as)])
- fi
-else
- AC_MSG_RESULT(no)
-fi
-
-AC_MSG_CHECKING([whether a default linker was specified])
-if test x"${DEFAULT_LINKER+set}" = x"set"; then
- if test x"$with_gnu_ld" = x"no"; then
- AC_MSG_RESULT([yes ($DEFAULT_LINKER)])
- else
- AC_MSG_RESULT([yes ($DEFAULT_LINKER - GNU ld)])
- fi
-else
- AC_MSG_RESULT(no)
-fi
-
-# Find some useful tools
-AC_PROG_AWK
-AC_PROG_LEX
-GCC_PROG_LN
-GCC_PROG_LN_S
-GCC_C_VOLATILE
-AC_PROG_RANLIB
-AC_PROG_YACC
-EGCS_PROG_INSTALL
-
-AC_HEADER_STDC
-AC_HEADER_TIME
-GCC_HEADER_STRING
-AC_HEADER_SYS_WAIT
-AC_CHECK_HEADERS(limits.h stddef.h string.h strings.h stdlib.h time.h fcntl.h unistd.h stab.h sys/file.h sys/time.h sys/resource.h sys/param.h sys/times.h sys/stat.h)
-
-# Check for thread headers.
-AC_CHECK_HEADER(thread.h, [have_thread_h=yes], [have_thread_h=])
-AC_CHECK_HEADER(pthread.h, [have_pthread_h=yes], [have_pthread_h=])
-
-# See if GNAT has been installed
-AC_CHECK_PROG(gnat, gnatbind, yes, no)
-
-# See if the system preprocessor understands the ANSI C preprocessor
-# stringification operator.
-AC_MSG_CHECKING(whether cpp understands the stringify operator)
-AC_CACHE_VAL(gcc_cv_c_have_stringify,
-[AC_TRY_COMPILE(,
-[#define S(x) #x
-char *test = S(foo);],
-gcc_cv_c_have_stringify=yes, gcc_cv_c_have_stringify=no)])
-AC_MSG_RESULT($gcc_cv_c_have_stringify)
-if test $gcc_cv_c_have_stringify = yes; then
- AC_DEFINE(HAVE_CPP_STRINGIFY)
-fi
-
-# Use <inttypes.h> only if it exists,
-# doesn't clash with <sys/types.h>, and declares intmax_t.
-AC_MSG_CHECKING(for inttypes.h)
-AC_CACHE_VAL(gcc_cv_header_inttypes_h,
-[AC_TRY_COMPILE(
- [#include <sys/types.h>
-#include <inttypes.h>],
- [intmax_t i = -1;],
- [gcc_cv_header_inttypes_h=yes],
- gcc_cv_header_inttypes_h=no)])
-AC_MSG_RESULT($gcc_cv_header_inttypes_h)
-if test $gcc_cv_header_inttypes_h = yes; then
- AC_DEFINE(HAVE_INTTYPES_H)
-fi
-
-AC_CHECK_FUNCS(strtoul bsearch strerror putenv popen bcopy bzero bcmp \
- index rindex strchr strrchr kill getrlimit setrlimit atoll atoq \
- sysconf isascii gettimeofday strsignal putc_unlocked fputc_unlocked \
- fputs_unlocked)
-
-# Make sure wchar_t is available
-#AC_CHECK_TYPE(wchar_t, unsigned int)
-
-GCC_FUNC_VFPRINTF_DOPRNT
-GCC_FUNC_PRINTF_PTR
-AC_FUNC_VFORK
-
-GCC_NEED_DECLARATIONS(malloc realloc calloc free bcopy bzero bcmp \
- index rindex getenv atol sbrk abort atof strerror getcwd getwd \
- strsignal)
-
-GCC_NEED_DECLARATIONS(getrlimit setrlimit, [
-#include <sys/types.h>
-#ifdef HAVE_SYS_RESOURCE_H
-#include <sys/resource.h>
-#endif
-])
-
-AC_DECL_SYS_SIGLIST
-
-# File extensions
-manext='.1'
-objext='.o'
-AC_SUBST(manext)
-AC_SUBST(objext)
-
-build_xm_file=
-build_xm_defines=
-build_install_headers_dir=install-headers-tar
-build_exeext=
-host_xm_file=
-host_xm_defines=
-host_xmake_file=
-host_truncate_target=
-host_exeext=
-
-# Decode the host machine, then the target machine.
-# For the host machine, we save the xm_file variable as host_xm_file;
-# then we decode the target machine and forget everything else
-# that came from the host machine.
-for machine in $build $host $target; do
-
- out_file=
- xmake_file=
- tmake_file=
- extra_headers=
- extra_passes=
- extra_parts=
- extra_programs=
- extra_objs=
- extra_host_objs=
- extra_gcc_objs=
- xm_defines=
- float_format=
- # Set this to override the default target model.
- target_cpu_default=
- # Set this to control which fixincludes program to use.
- if test x$fast_fixinc != xyes; then
- fixincludes=fixincludes
- else fixincludes=fixinc.sh ; fi
- # Set this to control how the header file directory is installed.
- install_headers_dir=install-headers-tar
- # Set this to a non-empty list of args to pass to cpp if the target
- # wants its .md file passed through cpp.
- md_cppflags=
- # Set this if directory names should be truncated to 14 characters.
- truncate_target=
- # Set this if gdb needs a dir command with `dirname $out_file`
- gdb_needs_out_file_path=
- # Set this if the build machine requires executables to have a
- # file name suffix.
- exeext=
- # Set this to control which thread package will be used.
- thread_file=
- # Reinitialize these from the flag values every loop pass, since some
- # configure entries modify them.
- gas="$gas_flag"
- gnu_ld="$gnu_ld_flag"
- enable_threads=$enable_threads_flag
-
- # Set default cpu_type, tm_file and xm_file so it can be updated in
- # each machine entry.
- cpu_type=`echo $machine | sed 's/-.*$//'`
- case $machine in
- alpha*-*-*)
- cpu_type=alpha
- ;;
- arm*-*-*)
- cpu_type=arm
- ;;
- c*-convex-*)
- cpu_type=convex
- ;;
-changequote(,)dnl
- i[34567]86-*-*)
-changequote([,])dnl
- cpu_type=i386
- ;;
- hppa*-*-*)
- cpu_type=pa
- ;;
- m68000-*-*)
- cpu_type=m68k
- ;;
- mips*-*-*)
- cpu_type=mips
- ;;
- powerpc*-*-*)
- cpu_type=rs6000
- ;;
- pyramid-*-*)
- cpu_type=pyr
- ;;
- sparc*-*-*)
- cpu_type=sparc
- ;;
- esac
-
- tm_file=${cpu_type}/${cpu_type}.h
- xm_file=${cpu_type}/xm-${cpu_type}.h
-
- # Set the default macros to define for GNU/Linux systems.
- case $machine in
- *-*-linux-gnu*)
- xm_defines="HAVE_ATEXIT POSIX BSTRING"
- ;;
- esac
-
- case $machine in
- # Support site-specific machine types.
- arm*-*-elf)
- tm_file=arm/unknown-elf.h
- tmake_file=arm/t-arm-elf
- ;;
-
- thumb-*-elf)
- tm_file=arm/telf.h
- out_file=arm/thumb.c
- xm_file=arm/xm-thumb.h
- md_file=arm/thumb.md
- tmake_file=arm/t-thumb-elf
- fixincludes=Makefile.in # There is nothing to fix
- ;;
-
- *)
- echo "Configuration $machine not supported" 1>&2
- exit 1
- ;;
- esac
-
- case $machine in
- *-*-linux-gnu*)
- ;; # Existing GNU/Linux systems do not use the GNU setup.
- *-*-gnu*)
- # On the GNU system, the setup is just about the same on
- # each different CPU. The specific machines that GNU
- # supports are matched above and just set $cpu_type.
- xm_file="xm-gnu.h ${xm_file}"
- tm_file=${cpu_type}/gnu.h
- extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o"
- # GNU always uses ELF.
- elf=yes
- # GNU tools are the only tools.
- gnu_ld=yes
- gas=yes
- # On GNU, the headers are already okay.
- fixincludes=Makefile.in
- xmake_file=x-linux # These details are the same as Linux.
- tmake_file=t-gnu # These are not.
- ;;
- *-*-sysv4*)
- fixincludes=fixinc.svr4
- xmake_try_sysv=x-sysv
- install_headers_dir=install-headers-cpio
- ;;
- *-*-sysv*)
- install_headers_dir=install-headers-cpio
- ;;
- esac
-
- # Distinguish i[34567]86
- # Also, do not run mips-tfile on MIPS if using gas.
- # Process --with-cpu= for PowerPC/rs6000
- target_cpu_default2=
- case $machine in
- i486-*-*)
- target_cpu_default2=1
- ;;
- i586-*-*)
- target_cpu_default2=2
- ;;
- i686-*-* | i786-*-*)
- target_cpu_default2=3
- ;;
- alpha*-*-*)
- case $machine in
- alphaev6*)
- target_cpu_default2="MASK_CPU_EV6|MASK_BWX|MASK_CIX|MASK_MAX"
- ;;
- alphapca56*)
- target_cpu_default2="MASK_CPU_EV5|MASK_BWX|MASK_MAX"
- ;;
- alphaev56*)
- target_cpu_default2="MASK_CPU_EV5|MASK_BWX"
- ;;
- alphaev5*)
- target_cpu_default2="MASK_CPU_EV5"
- ;;
- esac
-
- if test x$gas = xyes
- then
- if test "$target_cpu_default2" = ""
- then
- target_cpu_default2="MASK_GAS"
- else
- target_cpu_default2="${target_cpu_default2}|MASK_GAS"
- fi
- fi
- ;;
- # CYGNUS LOCAL m68k embedded
- m68*-*-*)
- target_cpu_default2=M68K_CPU_"`echo $machine | sed 's/-.*$//'`"
- ;;
- # END CYGNUS LOCAL
- arm*-*-*)
- case "x$with_cpu" in
- x)
- # The most generic
- target_cpu_default2="TARGET_CPU_generic"
- ;;
-
- # Distinguish cores, and major variants
- # arm7m doesn't exist, but D & I don't affect code
- xarm[[23678]] | xarm250 | xarm[[67]][[01]]0 \
- | xarm7m | xarm7dm | xarm7dmi | xarm7tdmi \
- | xarm7100 | xarm7500 | xarm7500fe | xarm810 \
- | xstrongarm | xstrongarm110)
- target_cpu_default2="TARGET_CPU_$with_cpu"
- ;;
-
- xyes | xno)
- echo "--with-cpu must be passed a value" 1>&2
- exit 1
- ;;
-
- *)
- if test x$pass2done = xyes
- then
- echo "Unknown cpu used with --with-cpu=$with_cpu" 1>&2
- exit 1
- fi
- ;;
- esac
- ;;
-
- mips*-*-ecoff* | mips*-*-elf*)
- if test x$gas = xyes
- then
- if test x$gnu_ld = xyes
- then
- target_cpu_default2=20
- else
- target_cpu_default2=16
- fi
- fi
- ;;
- mips*-*-*)
- if test x$gas = xyes
- then
- target_cpu_default2=16
- fi
- ;;
- powerpc*-*-* | rs6000-*-*)
- case "x$with_cpu" in
- x)
- ;;
-
- xcommon | xpower | xpower2 | xpowerpc | xrios \
- | xrios1 | xrios2 | xrsc | xrsc1 \
- | x601 | x602 | x603 | x603e | x604 | x604e | x620 \
- | x403 | x505 | x801 | x821 | x823 | x860)
- target_cpu_default2="\"$with_cpu\""
- ;;
-
- xyes | xno)
- echo "--with-cpu must be passed a value" 1>&2
- exit 1
- ;;
-
- *)
- if test x$pass2done = xyes
- then
- echo "Unknown cpu used with --with-cpu=$with_cpu" 1>&2
- exit 1
- fi
- ;;
- esac
- ;;
- sparc*-*-*)
- case ".$with_cpu" in
- .)
- target_cpu_default2=TARGET_CPU_"`echo $machine | sed 's/-.*$//'`"
- ;;
- # CYGNUS LOCAL sp86
- .supersparc | .hypersparc | .ultrasparc \
- | .sparclite | .sparc86x | .v7 | .v8 | .v9)
- target_cpu_default2="TARGET_CPU_$with_cpu"
- ;;
- *)
- if test x$pass2done = xyes
- then
- echo "Unknown cpu used with --with-cpu=$with_cpu" 1>&2
- exit 1
- fi
- ;;
- esac
- ;;
- esac
-
- if test "$target_cpu_default2" != ""
- then
- if test "$target_cpu_default" != ""
- then
- target_cpu_default="(${target_cpu_default}|${target_cpu_default2})"
- else
- target_cpu_default=$target_cpu_default2
- fi
- fi
-
-# Save data on machine being used to compile GCC in build_xm_file.
-# Save data on host machine in vars host_xm_file and host_xmake_file.
- if test x$pass1done = x
- then
- if test x"$xm_file" = x
- then build_xm_file=$cpu_type/xm-$cpu_type.h
- else build_xm_file=$xm_file
- fi
- build_xm_defines=$xm_defines
- build_install_headers_dir=$install_headers_dir
- build_exeext=$exeext
- pass1done=yes
- else
- if test x$pass2done = x
- then
- if test x"$xm_file" = x
- then host_xm_file=$cpu_type/xm-$cpu_type.h
- else host_xm_file=$xm_file
- fi
- host_xm_defines=$xm_defines
- if test x"$xmake_file" = x
- then xmake_file=$cpu_type/x-$cpu_type
- fi
- host_xmake_file="$xmake_file"
- host_truncate_target=$truncate_target
- host_extra_gcc_objs=$extra_gcc_objs
- host_extra_objs=$extra_host_objs
- host_exeext=$exeext
- pass2done=yes
- fi
- fi
-done
-
-extra_objs="${host_extra_objs} ${extra_objs}"
-
-# Default the target-machine variables that were not explicitly set.
-if test x"$tm_file" = x
-then tm_file=$cpu_type/$cpu_type.h; fi
-
-if test x$extra_headers = x
-then extra_headers=; fi
-
-if test x"$xm_file" = x
-then xm_file=$cpu_type/xm-$cpu_type.h; fi
-
-if test x$md_file = x
-then md_file=$cpu_type/$cpu_type.md; fi
-
-if test x$out_file = x
-then out_file=$cpu_type/$cpu_type.c; fi
-
-if test x"$tmake_file" = x
-then tmake_file=$cpu_type/t-$cpu_type
-fi
-
-if test x"$dwarf2" = xyes
-then tm_file="tm-dwarf2.h $tm_file"
-fi
-
-if test x$float_format = x
-then float_format=i64
-fi
-
-if test $float_format = none
-then float_h_file=Makefile.in
-else float_h_file=float-$float_format.h
-fi
-
-if test x$enable_haifa = x
-then
- case $target in
- alpha*-* | hppa*-* | powerpc*-* | rs6000-* | *sparc*-* | m32r*-*)
- enable_haifa=yes;;
- esac
-fi
-
-# Say what files are being used for the output code and MD file.
-echo "Using \`$srcdir/config/$out_file' to output insns."
-echo "Using \`$srcdir/config/$md_file' as machine description file."
-
-count=a
-for f in $tm_file; do
- count=${count}x
-done
-if test $count = ax; then
- echo "Using \`$srcdir/config/$tm_file' as target machine macro file."
-else
- echo "Using the following target machine macro files:"
- for f in $tm_file; do
- echo " $srcdir/config/$f"
- done
-fi
-
-count=a
-for f in $host_xm_file; do
- count=${count}x
-done
-if test $count = ax; then
- echo "Using \`$srcdir/config/$host_xm_file' as host machine macro file."
-else
- echo "Using the following host machine macro files:"
- for f in $host_xm_file; do
- echo " $srcdir/config/$f"
- done
-fi
-
-if test "$host_xm_file" != "$build_xm_file"; then
- count=a
- for f in $build_xm_file; do
- count=${count}x
- done
- if test $count = ax; then
- echo "Using \`$srcdir/config/$build_xm_file' as build machine macro file."
- else
- echo "Using the following build machine macro files:"
- for f in $build_xm_file; do
- echo " $srcdir/config/$f"
- done
- fi
-fi
-
-if test x$thread_file = x; then
- if test x$target_thread_file != x; then
- thread_file=$target_thread_file
- else
- thread_file='single'
- fi
-fi
-
-# Set up the header files.
-# $links is the list of header files to create.
-# $vars is the list of shell variables with file names to include.
-# auto-host.h is the file containing items generated by autoconf and is
-# the first file included by config.h.
-null_defines=
-host_xm_file="auto-host.h gansidecl.h ${host_xm_file}"
-
-# If host=build, it is correct to have hconfig include auto-host.h
-# as well. If host!=build, we are in error and need to do more
-# work to find out the build config parameters.
-if test x$host = x$build
-then
- build_xm_file="auto-host.h gansidecl.h ${build_xm_file}"
-else
- # We create a subdir, then run autoconf in the subdir.
- # To prevent recursion we set host and build for the new
- # invocation of configure to the build for this invocation
- # of configure.
- tempdir=build.$$
- rm -rf $tempdir
- mkdir $tempdir
- cd $tempdir
- case ${srcdir} in
- /*) realsrcdir=${srcdir};;
- *) realsrcdir=../${srcdir};;
- esac
- CC=${CC_FOR_BUILD} ${realsrcdir}/configure \
- --target=$target --host=$build --build=$build
-
- # We just finished tests for the build machine, so rename
- # the file auto-build.h in the gcc directory.
- mv auto-host.h ../auto-build.h
- cd ..
- rm -rf $tempdir
- build_xm_file="auto-build.h gansidecl.h ${build_xm_file}"
-fi
-
-
-xm_file="gansidecl.h ${xm_file}"
-tm_file="gansidecl.h ${tm_file}"
-
-vars="host_xm_file tm_file xm_file build_xm_file"
-links="config.h tm.h tconfig.h hconfig.h"
-defines="host_xm_defines null_defines xm_defines build_xm_defines"
-
-rm -f config.bak
-if test -f config.status; then mv -f config.status config.bak; fi
-
-# Make the links.
-while test -n "$vars"
-do
- set $vars; var=$1; shift; vars=$*
- set $links; link=$1; shift; links=$*
- set $defines; define=$1; shift; defines=$*
-
- rm -f $link
-
- # Define TARGET_CPU_DEFAULT if the system wants one.
- # This substitutes for lots of *.h files.
- if test "$target_cpu_default" != "" -a $link = tm.h
- then
- echo "#define TARGET_CPU_DEFAULT ($target_cpu_default)" >>$link
- fi
-
- for file in `eval echo '$'$var`; do
- echo "#include \"$file\"" >>$link
- done
-
- for def in `eval echo '$'$define`; do
- echo "#ifndef $def" >>$link
- echo "#define $def" >>$link
- echo "#endif" >>$link
- done
-done
-
-# Truncate the target if necessary
-if test x$host_truncate_target != x; then
- target=`echo $target | sed -e 's/\(..............\).*/\1/'`
-fi
-
-# Get the version trigger filename from the toplevel
-if test "${with_gcc_version_trigger+set}" = set; then
- gcc_version_trigger=$with_gcc_version_trigger
-else
- gcc_version_trigger=${srcdir}/version.c
-fi
-changequote(,)dnl
-gcc_version=`sed -e 's/.*\"\([^ \"]*\)[ \"].*/\1/' < ${gcc_version_trigger}`
-changequote([,])dnl
-
-# Get an absolute path to the GCC top-level source directory
-holddir=`pwd`
-cd $srcdir
-topdir=`pwd`
-cd $holddir
-
-# Conditionalize the makefile for this host machine.
-# Make-host contains the concatenation of all host makefile fragments
-# [there can be more than one]. This file is built by configure.frag.
-host_overrides=Make-host
-dep_host_xmake_file=
-for f in .. ${host_xmake_file}
-do
- if test -f ${srcdir}/config/$f
- then
- dep_host_xmake_file="${dep_host_xmake_file} ${srcdir}/config/$f"
- fi
-done
-
-# Conditionalize the makefile for this target machine.
-# Make-target contains the concatenation of all host makefile fragments
-# [there can be more than one]. This file is built by configure.frag.
-target_overrides=Make-target
-dep_tmake_file=
-for f in .. ${tmake_file}
-do
- if test -f ${srcdir}/config/$f
- then
- dep_tmake_file="${dep_tmake_file} ${srcdir}/config/$f"
- fi
-done
-
-# If the host doesn't support symlinks, modify CC in
-# FLAGS_TO_PASS so CC="stage1/xgcc -Bstage1/" works.
-# Otherwise, we can use "CC=$(CC)".
-rm -f symtest.tem
-if $symbolic_link $srcdir/gcc.c symtest.tem 2>/dev/null
-then
- cc_set_by_configure="\$(CC)"
- stage_prefix_set_by_configure="\$(STAGE_PREFIX)"
-else
- rm -f symtest.tem
- if cp -p $srcdir/gcc.c symtest.tem 2>/dev/null
- then
- symbolic_link="cp -p"
- else
- symbolic_link="cp"
- fi
- cc_set_by_configure="\`case '\$(CC)' in stage*) echo '\$(CC)' | sed -e 's|stage|../stage|g';; *) echo '\$(CC)';; esac\`"
- stage_prefix_set_by_configure="\`case '\$(STAGE_PREFIX)' in stage*) echo '\$(STAGE_PREFIX)' | sed -e 's|stage|../stage|g';; *) echo '\$(STAGE_PREFIX)';; esac\`"
-fi
-rm -f symtest.tem
-
-out_object_file=`basename $out_file .c`.o
-
-tm_file_list=
-for f in $tm_file; do
- if test $f != "gansidecl.h" ; then
- tm_file_list="${tm_file_list} \$(srcdir)/config/$f"
- else
- tm_file_list="${tm_file_list} $f"
- fi
-done
-
-host_xm_file_list=
-for f in $host_xm_file; do
- if test $f != "auto-host.h" -a $f != "gansidecl.h" ; then
- host_xm_file_list="${host_xm_file_list} \$(srcdir)/config/$f"
- else
- host_xm_file_list="${host_xm_file_list} $f"
- fi
-done
-
-build_xm_file_list=
-for f in $build_xm_file; do
- if test $f != "auto-build.h" -a $f != "auto-host.h" -a $f != "gansidecl.h" ; then
- build_xm_file_list="${build_xm_file_list} \$(srcdir)/config/$f"
- else
- build_xm_file_list="${build_xm_file_list} $f"
- fi
-done
-
-# Define macro CROSS_COMPILE in compilation
-# if this is a cross-compiler.
-# Also use all.cross instead of all.internal
-# and add cross-make to Makefile.
-cross_overrides="/dev/null"
-if test x$host != x$target
-then
- cross_defines="CROSS=-DCROSS_COMPILE"
- cross_overrides="${topdir}/cross-make"
-fi
-
-# When building gcc with a cross-compiler, we need to fix a few things.
-# This must come after cross-make as we want all.build to override
-# all.cross.
-build_overrides="/dev/null"
-if test x$build != x$host
-then
- build_overrides="${topdir}/build-make"
-fi
-
-# Expand extra_headers to include complete path.
-# This substitutes for lots of t-* files.
-extra_headers_list=
-if test "x$extra_headers" = x
-then true
-else
- # Prepend ${srcdir}/ginclude/ to every entry in extra_headers.
- for file in $extra_headers;
- do
- extra_headers_list="${extra_headers_list} \$(srcdir)/ginclude/${file}"
- done
-fi
-
-# NEED TO CONVERT
-# Set MD_DEPS if the real md file is in md.pre-cpp.
-# Set MD_CPP to the cpp to pass the md file through. Md files use ';'
-# for line oriented comments, so we must always use a GNU cpp. If
-# building gcc with a cross compiler, use the cross compiler just
-# built. Otherwise, we can use the cpp just built.
-md_file_sub=
-if test "x$md_cppflags" = x
-then
- md_file_sub=$srcdir/config/$md_file
-else
- md_file=md
-fi
-
-# If we have gas in the build tree, make a link to it.
-if test -f ../gas/Makefile; then
- rm -f as; $symbolic_link ../gas/as-new$host_exeext as$host_exeext 2>/dev/null
-fi
-
-# If we have nm in the build tree, make a link to it.
-if test -f ../binutils/Makefile; then
- rm -f nm; $symbolic_link ../binutils/nm-new$host_exeext nm$host_exeext 2>/dev/null
-fi
-
-# If we have ld in the build tree, make a link to it.
-if test -f ../ld/Makefile; then
-# rm -f ld; $symbolic_link ../ld/ld-new$host_exeext ld$host_exeext 2>/dev/null
-fi
-
-# Figure out what assembler alignment features are present.
-AC_MSG_CHECKING(assembler alignment features)
-gcc_cv_as=
-gcc_cv_as_alignment_features=
-gcc_cv_as_gas_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/gas
-if test -x "$DEFAULT_ASSEMBLER"; then
- gcc_cv_as="$DEFAULT_ASSEMBLER"
-elif test -x "$AS"; then
- gcc_cv_as="$AS"
-elif test -x as$host_exeext; then
- # Build using assembler in the current directory.
- gcc_cv_as=./as$host_exeext
-elif test -f $gcc_cv_as_gas_srcdir/configure.in -a -f ../gas/Makefile; then
- # Single tree build which includes gas.
- for f in $gcc_cv_as_gas_srcdir/configure $gcc_cv_as_gas_srcdir/configure.in $gcc_cv_as_gas_srcdir/Makefile.in
- do
-changequote(,)dnl
- gcc_cv_gas_version=`grep '^VERSION=[0-9]*\.[0-9]*' $f`
-changequote([,])dnl
- if test x$gcc_cv_gas_version != x; then
- break
- fi
- done
-changequote(,)dnl
- gcc_cv_gas_major_version=`expr "$gcc_cv_gas_version" : "VERSION=\([0-9]*\)"`
- gcc_cv_gas_minor_version=`expr "$gcc_cv_gas_version" : "VERSION=[0-9]*\.\([0-9]*\)"`
-changequote([,])dnl
- if test x$gcc_cv_gas_major_version != x -a x$gcc_cv_gas_minor_version != x; then
- # Gas version 2.6 and later support for .balign and .p2align.
- # bytes to skip when using .p2align.
- if test "$gcc_cv_gas_major_version" -eq 2 -a "$gcc_cv_gas_minor_version" -ge 6 -o "$gcc_cv_gas_major_version" -gt 2; then
- gcc_cv_as_alignment_features=".balign and .p2align"
- AC_DEFINE(HAVE_GAS_BALIGN_AND_P2ALIGN)
- fi
- # Gas version 2.8 and later support specifying the maximum
- # bytes to skip when using .p2align.
- if test "$gcc_cv_gas_major_version" -eq 2 -a "$gcc_cv_gas_minor_version" -ge 8 -o "$gcc_cv_gas_major_version" -gt 2; then
- gcc_cv_as_alignment_features=".p2align including maximum skip"
- AC_DEFINE(HAVE_GAS_MAX_SKIP_P2ALIGN)
- fi
- fi
-elif test x$host = x$target; then
- # Native build.
- gcc_cv_as=as$host_exeext
-fi
-if test x$gcc_cv_as != x; then
- # Check if we have .balign and .p2align
- echo ".balign 4" > conftest.s
- echo ".p2align 2" >> conftest.s
- if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
- gcc_cv_as_alignment_features=".balign and .p2align"
- AC_DEFINE(HAVE_GAS_BALIGN_AND_P2ALIGN)
- fi
- rm -f conftest.s conftest.o
- # Check if specifying the maximum bytes to skip when
- # using .p2align is supported.
- echo ".p2align 4,,7" > conftest.s
- if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
- gcc_cv_as_alignment_features=".p2align including maximum skip"
- AC_DEFINE(HAVE_GAS_MAX_SKIP_P2ALIGN)
- fi
- rm -f conftest.s conftest.o
-fi
-AC_MSG_RESULT($gcc_cv_as_alignment_features)
-
-AC_MSG_CHECKING(assembler subsection support)
-gcc_cv_as_subsections=
-if test x$gcc_cv_as != x; then
- # Check if we have .subsection
- echo ".subsection 1" > conftest.s
- if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
- gcc_cv_as_subsections=".subsection"
- if test -x nm$host_exeext; then
- gcc_cv_nm=./nm$host_exeext
- elif test x$host = x$target; then
- # Native build.
- gcc_cv_nm=nm$host_exeext
- fi
- if test x$gcc_cv_nm != x; then
- cat > conftest.s <<EOF
-conftest_label1: .word 0
-.subsection -1
-conftest_label2: .word 0
-.previous
-EOF
- if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
- $gcc_cv_nm conftest.o | grep conftest_label1 > conftest.nm1
- $gcc_cv_nm conftest.o | grep conftest_label2 | sed -e 's/label2/label1/' > conftest.nm2
- if cmp conftest.nm1 conftest.nm2 > /dev/null 2>&1; then
- :
- else
- gcc_cv_as_subsections="working .subsection -1"
- AC_DEFINE(HAVE_GAS_SUBSECTION_ORDERING)
- fi
- fi
- fi
- fi
- rm -f conftest.s conftest.o conftest.nm1 conftest.nm2
-fi
-AC_MSG_RESULT($gcc_cv_as_subsections)
-
-# Figure out what language subdirectories are present.
-# Look if the user specified --enable-languages="..."; if not, use
-# the environment variable $LANGUAGES if defined. $LANGUAGES might
-# go away some day.
-if test x"${enable_languages+set}" != xset; then
- if test x"${LANGUAGES+set}" = xset; then
- enable_languages="`echo ${LANGUAGES} | tr ' ' ','`"
- else
- enable_languages=all
- fi
-fi
-subdirs=
-for lang in ${srcdir}/*/config-lang.in ..
-do
- case $lang in
- ..) ;;
- # The odd quoting in the next line works around
- # an apparent bug in bash 1.12 on linux.
- ${srcdir}/[[*]]/config-lang.in) ;;
- # CYGNUS LOCAL nofortran/law
- ${srcdir}/f/config-lang.in)
- if [[ x$enable_fortran = xyes ]]; then
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([[^/]]*\)/config-lang.in$,\1,'`"
- fi
- ;;
- ${srcdir}/objc/config-lang.in)
- if [[ x$enable_objc = xyes ]]; then
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([[^/]]*\)/config-lang.in$,\1,'`"
- fi
- ;;
- ${srcdir}/ch/config-lang.in)
- if [[ x$enable_chill = xyes ]]; then
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([[^/]]*\)/config-lang.in$,\1,'`"
- fi
- ;;
- # END CYGNUS LOCAL
-changequote(,)dnl
- ${srcdir}/ada/config-lang.in)
- if test x$gnat = xyes ; then
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([^/]*\)/config-lang.in$,\1,'`"
- fi
- ;;
-changequote(,)dnl
- *)
- lang_alias=`sed -n -e 's,^language=['"'"'"'"]\(.*\)["'"'"'"'].*$,\1,p' -e 's,^language=\([^ ]*\).*$,\1,p' $lang`
- if test "x$lang_alias" = x
- then
- echo "$lang doesn't set \$language." 1>&2
- exit 1
- fi
- if test x"${enable_languages}" = xall; then
- add_this_lang=yes
- else
- case "${enable_languages}" in
- ${lang_alias} | "${lang_alias},"* | *",${lang_alias},"* | *",${lang_alias}" )
- add_this_lang=yes
- ;;
- * )
- add_this_lang=no
- ;;
- esac
- fi
- if test x"${add_this_lang}" = xyes; then
- case $lang in
- ${srcdir}/ada/config-lang.in)
- if test x$gnat = xyes ; then
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([^/]*\)/config-lang.in$,\1,'`"
- fi
- ;;
- *)
- subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([^/]*\)/config-lang.in$,\1,'`"
- ;;
- esac
- fi
- ;;
-changequote([,])dnl
- esac
-done
-
-# Make gthr-default.h if we have a thread file.
-gthread_flags=
-if test $thread_file != single; then
- rm -f gthr-default.h
- echo "#include \"gthr-${thread_file}.h\"" > gthr-default.h
- gthread_flags=-DHAVE_GTHR_DEFAULT
-fi
-# CYGNUS LOCAL java quickthreads
-# qt is a library we build. So if we're using for it, and it is in
-# our source tree, then we must look there for includes.
-if test $thread_file = qt && test -d $srcdir/../qthreads; then
- gthread_flags="$gthread_flags -I\$(srcdir)/../qthreads"
-fi
-# END CYGNUS LOCAL
-AC_SUBST(gthread_flags)
-
-# Make empty files to contain the specs and options for each language.
-# Then add #include lines to for a compiler that has specs and/or options.
-
-lang_specs_files=
-lang_options_files=
-lang_tree_files=
-rm -f specs.h options.h gencheck.h
-touch specs.h options.h gencheck.h
-for subdir in . $subdirs
-do
- if test -f $srcdir/$subdir/lang-specs.h; then
- echo "#include \"$subdir/lang-specs.h\"" >>specs.h
- lang_specs_files="$lang_specs_files $srcdir/$subdir/lang-specs.h"
- fi
- if test -f $srcdir/$subdir/lang-options.h; then
- echo "#include \"$subdir/lang-options.h\"" >>options.h
- lang_options_files="$lang_options_files $srcdir/$subdir/lang-options.h"
- fi
- if test -f $srcdir/$subdir/$subdir-tree.def; then
- echo "#include \"$subdir/$subdir-tree.def\"" >>gencheck.h
- lang_tree_files="$lang_tree_files $srcdir/$subdir/$subdir-tree.def"
- fi
-done
-
-# These (without "all_") are set in each config-lang.in.
-# `language' must be a single word so is spelled singularly.
-all_languages=
-all_boot_languages=
-all_compilers=
-all_stagestuff=
-all_diff_excludes=
-all_outputs=Makefile
-# List of language makefile fragments.
-all_lang_makefiles=
-all_headers=
-all_lib2funcs=
-
-# Add the language fragments.
-# Languages are added via two mechanisms. Some information must be
-# recorded in makefile variables, these are defined in config-lang.in.
-# We accumulate them and plug them into the main Makefile.
-# The other mechanism is a set of hooks for each of the main targets
-# like `clean', `install', etc.
-
-language_fragments="Make-lang"
-language_hooks="Make-hooks"
-oldstyle_subdirs=
-
-for s in .. $subdirs
-do
- if test $s != ".."
- then
- language=
- boot_language=
- compilers=
- stagestuff=
- diff_excludes=
- headers=
- outputs=
- lib2funcs=
- . ${srcdir}/$s/config-lang.in
- if test "x$language" = x
- then
- echo "${srcdir}/$s/config-lang.in doesn't set \$language." 1>&2
- exit 1
- fi
- all_lang_makefiles="$all_lang_makefiles ${srcdir}/$s/Make-lang.in ${srcdir}/$s/Makefile.in"
- all_languages="$all_languages $language"
- if test "x$boot_language" = xyes
- then
- all_boot_languages="$all_boot_languages $language"
- fi
- all_compilers="$all_compilers $compilers"
- all_stagestuff="$all_stagestuff $stagestuff"
- all_diff_excludes="$all_diff_excludes $diff_excludes"
- all_headers="$all_headers $headers"
- all_outputs="$all_outputs $outputs"
- if test x$outputs = x
- then
- oldstyle_subdirs="$oldstyle_subdirs $s"
- fi
- all_lib2funcs="$all_lib2funcs $lib2funcs"
- fi
-done
-
-# Since we can't use `::' targets, we link each language in
-# with a set of hooks, reached indirectly via lang.${target}.
-
-rm -f Make-hooks
-touch Make-hooks
-target_list="all.build all.cross start.encap rest.encap \
- info dvi \
- install-normal install-common install-info install-man \
- uninstall distdir \
- mostlyclean clean distclean extraclean maintainer-clean \
- stage1 stage2 stage3 stage4"
-for t in $target_list
-do
- x=
- for l in .. $all_languages
- do
- if test $l != ".."; then
- x="$x $l.$t"
- fi
- done
- echo "lang.$t: $x" >> Make-hooks
-done
-
-# If we're not building in srcdir, create .gdbinit.
-
-if test ! -f Makefile.in; then
- echo "dir ." > .gdbinit
- echo "dir ${srcdir}" >> .gdbinit
- if test x$gdb_needs_out_file_path = xyes
- then
- echo "dir ${srcdir}/config/"`dirname ${out_file}` >> .gdbinit
- fi
- if test "x$subdirs" != x; then
- for s in $subdirs
- do
- echo "dir ${srcdir}/$s" >> .gdbinit
- done
- fi
- echo "source ${srcdir}/.gdbinit" >> .gdbinit
-fi
-
-# Define variables host_canonical and build_canonical
-# because some Cygnus local changes in the Makefile depend on them.
-build_canonical=${build}
-host_canonical=${host}
-target_subdir=
-if test "${host}" != "${target}" ; then
- target_subdir=${target}/
-fi
-AC_SUBST(build_canonical)
-AC_SUBST(host_canonical)
-AC_SUBST(target_subdir)
-
-# If this is using newlib, then define inhibit_libc in
-# LIBGCC2_CFLAGS. This will cause __eprintf to be left out of
-# libgcc.a, but that's OK because newib should have its own version of
-# assert.h.
-inhibit_libc=
-if test x$with_newlib = xyes; then
- inhibit_libc=-Dinhibit_libc
-fi
-AC_SUBST(inhibit_libc)
-
-# Override SCHED_OBJ and SCHED_CFLAGS to enable the Haifa scheduler.
-sched_prefix=
-sched_cflags=
-if test x$enable_haifa = xyes; then
- echo "Using the Haifa scheduler."
- sched_prefix=haifa-
- sched_cflags=-DHAIFA
-fi
-AC_SUBST(sched_prefix)
-AC_SUBST(sched_cflags)
-if test x$enable_haifa != x; then
- # Explicitly remove files that need to be recompiled for the Haifa scheduler.
- for x in genattrtab.o toplev.o loop.o unroll.o *sched.o; do
- if test -f $x; then
- echo "Removing $x"
- rm -f $x
- fi
- done
-fi
-
-# If $(exec_prefix) exists and is not the same as $(prefix), then compute an
-# absolute path for gcc_tooldir based on inserting the number of up-directory
-# movements required to get from $(exec_prefix) to $(prefix) into the basic
-# $(libsubdir)/@(unlibsubdir) based path.
-# Don't set gcc_tooldir to tooldir since that's only passed in by the toplevel
-# make and thus we'd get different behavior depending on where we built the
-# sources.
-if test x$exec_prefix = xNONE -o x$exec_prefix = x$prefix; then
- gcc_tooldir='$(libsubdir)/$(unlibsubdir)/../$(target_alias)'
-else
-changequote(<<, >>)dnl
-# An explanation of the sed strings:
-# -e 's|^\$(prefix)||' matches and eliminates 'prefix' from 'exec_prefix'
-# -e 's|/$||' match a trailing forward slash and eliminates it
-# -e 's|^[^/]|/|' forces the string to start with a forward slash (*)
-# -e 's|/[^/]*|../|g' replaces each occurance of /<directory> with ../
-#
-# (*) Note this pattern overwrites the first character of the string
-# with a forward slash if one is not already present. This is not a
-# problem because the exact names of the sub-directories concerned is
-# unimportant, just the number of them matters.
-#
-# The practical upshot of these patterns is like this:
-#
-# prefix exec_prefix result
-# ------ ----------- ------
-# /foo /foo/bar ../
-# /foo/ /foo/bar ../
-# /foo /foo/bar/ ../
-# /foo/ /foo/bar/ ../
-# /foo /foo/bar/ugg ../../
-#
- dollar='$$'
- gcc_tooldir="\$(libsubdir)/\$(unlibsubdir)/\`echo \$(exec_prefix) | sed -e 's|^\$(prefix)||' -e 's|/\$(dollar)||' -e 's|^[^/]|/|' -e 's|/[^/]*|../|g'\`\$(target_alias)"
-changequote([, ])dnl
-fi
-AC_SUBST(gcc_tooldir)
-AC_SUBST(dollar)
-
-# Warn if using init_priority.
-AC_MSG_CHECKING(whether to enable init_priority by default)
-if test x$enable_init_priority != xyes; then
- enable_init_priority=no
-fi
-AC_MSG_RESULT($enable_init_priority)
-
-# Nothing to do for FLOAT_H, float_format already handled.
-objdir=`pwd`
-AC_SUBST(objdir)
-
-# Process the language and host/target makefile fragments.
-${CONFIG_SHELL-/bin/sh} $srcdir/configure.frag $srcdir "$subdirs" "$dep_host_xmake_file" "$dep_tmake_file"
-
-# Substitute configuration variables
-AC_SUBST(subdirs)
-AC_SUBST(all_languages)
-AC_SUBST(all_boot_languages)
-AC_SUBST(all_compilers)
-AC_SUBST(all_lang_makefiles)
-AC_SUBST(all_stagestuff)
-AC_SUBST(all_diff_excludes)
-AC_SUBST(all_lib2funcs)
-AC_SUBST(all_headers)
-AC_SUBST(cpp_main)
-AC_SUBST(extra_passes)
-AC_SUBST(extra_programs)
-AC_SUBST(extra_parts)
-AC_SUBST(extra_c_objs)
-AC_SUBST(extra_cxx_objs)
-AC_SUBST(extra_cpp_objs)
-AC_SUBST(extra_c_flags)
-AC_SUBST(extra_objs)
-AC_SUBST(host_extra_gcc_objs)
-AC_SUBST(extra_headers_list)
-AC_SUBST(dep_host_xmake_file)
-AC_SUBST(dep_tmake_file)
-AC_SUBST(out_file)
-AC_SUBST(out_object_file)
-AC_SUBST(md_file)
-AC_SUBST(tm_file_list)
-AC_SUBST(build_xm_file_list)
-AC_SUBST(host_xm_file_list)
-AC_SUBST(lang_specs_files)
-AC_SUBST(lang_options_files)
-AC_SUBST(lang_tree_files)
-AC_SUBST(thread_file)
-AC_SUBST(objc_boehm_gc)
-AC_SUBST(JAVAGC)
-AC_SUBST(gcc_version)
-AC_SUBST(gcc_version_trigger)
-AC_SUBST(local_prefix)
-AC_SUBST(gcc_gxx_include_dir)
-AC_SUBST(fixincludes)
-AC_SUBST(build_install_headers_dir)
-AC_SUBST(build_exeext)
-AC_SUBST(host_exeext)
-AC_SUBST(float_h_file)
-AC_SUBST(cc_set_by_configure)
-AC_SUBST(stage_prefix_set_by_configure)
-AC_SUBST(install)
-AC_SUBST(symbolic_link)
-
-AC_SUBST_FILE(target_overrides)
-AC_SUBST_FILE(host_overrides)
-AC_SUBST(cross_defines)
-AC_SUBST_FILE(cross_overrides)
-AC_SUBST_FILE(build_overrides)
-AC_SUBST_FILE(language_fragments)
-AC_SUBST_FILE(language_hooks)
-
-# Echo that links are built
-if test x$host = x$target
-then
- str1="native "
-else
- str1="cross-"
- str2=" from $host"
-fi
-
-if test x$host != x$build
-then
- str3=" on a $build system"
-fi
-
-if test "x$str2" != x || test "x$str3" != x
-then
- str4=
-fi
-
-echo "Links are now set up to build a ${str1}compiler for ${target}$str4" 1>&2
-
-if test "x$str2" != x || test "x$str3" != x
-then
- echo " ${str2}${str3}." 1>&2
-fi
-
-# Truncate the target if necessary
-if test x$host_truncate_target != x; then
- target=`echo $target | sed -e 's/\(..............\).*/\1/'`
-fi
-
-# Configure the subdirectories
-# AC_CONFIG_SUBDIRS($subdirs)
-
-# Create the Makefile
-# and configure language subdirectories
-AC_OUTPUT($all_outputs,
-[
-. $srcdir/configure.lang
-case x$CONFIG_HEADERS in
-xauto-host.h:config.in)
-echo > cstamp-h ;;
-esac
-# If the host supports symlinks, point stage[1234] at ../stage[1234] so
-# bootstrapping and the installation procedure can still use
-# CC="stage1/xgcc -Bstage1/". If the host doesn't support symlinks,
-# FLAGS_TO_PASS has been modified to solve the problem there.
-# This is virtually a duplicate of what happens in configure.lang; we do
-# an extra check to make sure this only happens if ln -s can be used.
-if test "$symbolic_link" = "ln -s"; then
- for d in .. ${subdirs} ; do
- if test $d != ..; then
- STARTDIR=`pwd`
- cd $d
- for t in stage1 stage2 stage3 stage4 include
- do
- rm -f $t
- $symbolic_link ../$t $t 2>/dev/null
- done
- cd $STARTDIR
- fi
- done
-else true ; fi
-],
-[
-host='${host}'
-build='${build}'
-target='${target}'
-target_alias='${target_alias}'
-srcdir='${srcdir}'
-subdirs='${subdirs}'
-oldstyle_subdirs='${oldstyle_subdirs}'
-symbolic_link='${symbolic_link}'
-program_transform_set='${program_transform_set}'
-program_transform_name='${program_transform_name}'
-dep_host_xmake_file='${dep_host_xmake_file}'
-host_xmake_file='${host_xmake_file}'
-dep_tmake_file='${dep_tmake_file}'
-tmake_file='${tmake_file}'
-thread_file='${thread_file}'
-gcc_version='${gcc_version}'
-gcc_version_trigger='${gcc_version_trigger}'
-local_prefix='${local_prefix}'
-build_install_headers_dir='${build_install_headers_dir}'
-build_exeext='${build_exeext}'
-host_exeext='${host_exeext}'
-out_file='${out_file}'
-gdb_needs_out_file_path='${gdb_needs_out_file_path}'
-SET_MAKE='${SET_MAKE}'
-target_list='${target_list}'
-target_overrides='${target_overrides}'
-host_overrides='${host_overrides}'
-cross_defines='${cross_defines}'
-cross_overrides='${cross_overrides}'
-build_overrides='${build_overrides}'
-])
diff --git a/gcc/configure.lang b/gcc/configure.lang
deleted file mode 100755
index d96b6d8..0000000
--- a/gcc/configure.lang
+++ /dev/null
@@ -1,233 +0,0 @@
-# configure.lang for GNU CC
-# This script is run by configure for configuration of language
-# subdirectories which conform to the old GCC configure mechanism
-# for such subdirectories.
-
-# Copyright (C) 1997, 1998 Free Software Foundation, Inc.
-
-#This file is part of GNU CC.
-
-#GNU CC is free software; you can redistribute it and/or modify
-#it under the terms of the GNU General Public License as published by
-#the Free Software Foundation; either version 2, or (at your option)
-#any later version.
-
-#GNU CC is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-#GNU General Public License for more details.
-
-#You should have received a copy of the GNU General Public License
-#along with GNU CC; see the file COPYING. If not, write to
-#the Free Software Foundation, 59 Temple Place - Suite 330,
-#Boston, MA 02111-1307, USA.
-
-savesrcdir=$srcdir
-
-for subdir in . $oldstyle_subdirs
-do
- # We only want to do this in language subdirs, but we have to handle
- # the case of $oldstyle_subdirs = "".
- if [ $subdir = . ]
- then
- continue
- fi
-
- oldsrcdir=$savesrcdir
-
- # Re-adjust the path
- case $oldsrcdir in
- /*)
- srcdir=$oldsrcdir/$subdir
- ;;
- *)
- oldsrcdir=../${oldsrcdir}
- srcdir=$oldsrcdir/$subdir
- ;;
- esac
- mainsrcdir=$oldsrcdir
- STARTDIR=`pwd`
- test -d $subdir || mkdir $subdir
- cd $subdir
-
- # Create Makefile.tem from Makefile.in.
- # Make it set VPATH if necessary so that the sources are found.
- # Also change its value of srcdir.
- # Also create a .gdbinit file which runs the one in srcdir
- # and tells GDB to look there for source files.
- case $srcdir in
- . | ./$subdir | .././$subdir)
- rm -f Makefile.tem
- cp Makefile.in Makefile.tem
- chmod +w Makefile.tem
- ;;
- *)
- rm -f Makefile.tem
- echo "VPATH = ${srcdir}" \
- | cat - ${srcdir}/Makefile.in \
- | sed "s@^srcdir = \.@srcdir = ${srcdir}@" > Makefile.tem
- rm -f .gdbinit
- echo "dir ." > .gdbinit
- echo "dir ${srcdir}" >> .gdbinit
- echo "dir ${mainsrcdir}" >> .gdbinit
- if [ x$gdb_needs_out_file_path = xyes ]
- then
- echo "dir ${mainsrcdir}/config/"`dirname ${out_file}` >> .gdbinit
- fi
- echo "source ${mainsrcdir}/.gdbinit" >> .gdbinit
- ;;
- esac
-
- # Conditionalize the makefile for this host machine.
- rm -f Makefile.xx Makefile.ll
- merged_frags=
- for f in .. ${host_xmake_file}
- do
- if [ -f ${mainsrcdir}/config/$f ]
- then
- cat ${mainsrcdir}/config/$f >> Makefile.ll
- if [ x"${merged_frags}" != x ]
- then
- merged_frags="${merged_frags} and "
- fi
- merged_frags="${merged_frags}${f}"
- fi
- done
- if [ x"${merged_frags}" != x ]
- then
- sed -e "/####host/ r Makefile.ll" Makefile.tem > Makefile.xx
- echo "Merged ${merged_frags}."
- rm -f Makefile.tem
- mv Makefile.xx Makefile.tem
- rm -f Makefile.ll
- fi
-
- # Add a definition for MAKE if system wants one.
- case "$SET_MAKE" in
- ?*)
- rm -f Makefile.xx
- (echo "$SET_MAKE"; cat Makefile.tem) >Makefile.xx
- rm -f Makefile.tem
- mv Makefile.xx Makefile.tem
- esac
-
- # Add a definition for INSTALL if system wants one.
- # This substitutes for lots of x-* files.
- if [ x$build_broken_install = x ]
- then true
- else
- rm -f Makefile.xx
- abssrcdir=`cd ${srcdir}; pwd`
- sed "s|^INSTALL = .*|${INSTALL}|" Makefile.tem > Makefile.xx
- rm -f Makefile.tem
- mv Makefile.xx Makefile.tem
- fi
-
- # If using -program-transform-name, override the installation names.
- if [ "x${program_transform_set}" = "xyes" ] ; then
- sed -e "s/^program_transform_name[ ]*=.*$/program_transform_name =
-$program_transform_name/" \
- -e "s/^program_transform_cross_name[
-]*=.*$/program_transform_cross_name = $program_transform_name/" \
- Makefile.tem > Makefile.xx
- rm -f Makefile.tem
- mv Makefile.xx Makefile.tem
- fi
-
- # Conditionalize the makefile for this target machine.
- rm -f Makefile.xx Makefile.ll
- merged_frags=
- for f in .. ${tmake_file}
- do
- if [ -f ${mainsrcdir}/config/$f ]
- then
- cat ${mainsrcdir}/config/$f >> Makefile.ll
- if [ x"${merged_frags}" != x ]
- then
- merged_frags="${merged_frags} and "
- fi
- merged_frags="${merged_frags}$f"
- fi
- done
- if [ x"${merged_frags}" != x ]
- then
- sed -e "/####target/ r Makefile.ll" Makefile.tem > Makefile.xx
- echo "Merged ${merged_frags}."
- rm -f Makefile.tem
- mv Makefile.xx Makefile.tem
- rm -f Makefile.ll
- fi
-
- # If the host supports
- # symlinks, point stage[123] at ../stage[123] so bootstrapping and the
- # installation procedure can still use CC="stage1/xgcc -Bstage1/".
- # If the host doesn't support symlinks, FLAGS_TO_PASS has been
- # modified to solve the problem there.
- for t in stage1 stage2 stage3 stage4 include
- do
- rm -f $t
- $symbolic_link ../$t $t 2>/dev/null
- done
-
- # Remove all formfeeds, since some Makes get confused by them.
- # Also arrange to give the variables `target', `target_alias',
- # `host_xmake_file', `tmake_file', `prefix', `local_prefix',
- # `exec_prefix', `INSTALL_HEADERS_DIR', `exeext'
- # values in the Makefile from the values they have in this script.
- rm -f Makefile.xx
- # Create an empty Makefile.sed first, to work around a Nextstep 3.3 bug.
- echo 's| ||' > Makefile.sed
- rm Makefile.sed
- echo 's| ||' > Makefile.sed
- echo "s|^target=.*$|target=${target}|" >> Makefile.sed
- echo "s|^target_alias=.*$|target_alias=${target_alias}|" >> Makefile.sed
- echo "s|^xmake_file=.*$|xmake_file=${dep_host_xmake_file}|" >> Makefile.sed
- echo "s|^tmake_file=.*$|tmake_file=${dep_tmake_file}|" >> Makefile.sed
- echo "s|^version=.*$|version=${version}|" >> Makefile.sed
- echo "s|^GCC_THREAD_FILE=.*$|GCC_THREAD_FILE=${thread_file}|" >> Makefile.sed
- echo "s|^prefix[ ]*=.*|prefix = $prefix|" >> Makefile.sed
- echo "s|^local_prefix[ ]*=.*|local_prefix = $local_prefix|" >> Makefile.sed
- echo "s|^exec_prefix[ ]*=.*|exec_prefix = $exec_prefix|" >> Makefile.sed
- echo "s|^INSTALL_HEADERS_DIR[ ]*=.*$|INSTALL_HEADERS_DIR = ${build_install_headers_dir}|" >> Makefile.sed
- echo "s|^exeext[ ]*=.*$|exeext = ${build_exeext}|" >> Makefile.sed
- sed -f Makefile.sed Makefile.tem > Makefile.xx
- rm -f Makefile.tem Makefile.sed
- mv Makefile.xx Makefile.tem
-
- # Install Makefile for real, after making final changes.
- # Define macro CROSS_COMPILE in compilation
- # if this is a cross-compiler.
- # Also use all.cross instead of all.internal
- # and add cross-make to Makefile.
- if [ x$host != x$target ]
- then
- rm -f Makefile.xx
- echo "CROSS=-DCROSS_COMPILE" > Makefile.xx
- sed -e "/####cross/ r ${mainsrcdir}/cross-make" Makefile.tem >> Makefile.xx
- rm -f Makefile.tem
- mv Makefile.xx Makefile.tem
- fi
-
- # When building gcc with a cross-compiler, we need to fix a few things.
- # This must come after cross-make as we want all.build to override
- # all.cross.
- if [ x$build != x$host ]
- then
- rm -f Makefile.xx
- echo "build= $build" > Makefile.xx
- echo "host= $host" >> Makefile.xx
- sed -e "s|objc-runtime$||" \
- -e "/####build/ r ${mainsrcdir}/build-make" Makefile.tem >> Makefile.xx
- rm -f Makefile.tem
- mv Makefile.xx Makefile.tem
- fi
-
- rm -f Makefile
- mv Makefile.tem Makefile
- echo "Created \`$subdir/Makefile'."
-
- cd $STARTDIR
-done # end of current-dir SUBDIRS loop
-
-# Restore this, remember we're invoked with `.'.
-srcdir=$savesrcdir
diff --git a/gcc/cpp.1 b/gcc/cpp.1
deleted file mode 100755
index 54c4dfb..0000000
--- a/gcc/cpp.1
+++ /dev/null
@@ -1 +0,0 @@
-.so man1/cccp.1
diff --git a/gcc/cpp.cps b/gcc/cpp.cps
deleted file mode 100755
index 63ca498..0000000
--- a/gcc/cpp.cps
+++ /dev/null
@@ -1,66 +0,0 @@
-\initial {#}
-\entry {\samp {##}}{18}
-\initial {A}
-\entry {arguments in macro definitions}{10}
-\entry {assertions}{36}
-\entry {assertions, undoing}{37}
-\initial {B}
-\entry {blank macro arguments}{12}
-\initial {C}
-\entry {cascaded macros}{29}
-\entry {commands}{3}
-\entry {commenting out code}{34}
-\entry {computed \samp {#include}}{5}
-\entry {concatenation}{18}
-\entry {conditionals}{30}
-\initial {E}
-\entry {expansion of arguments}{26}
-\initial {F}
-\entry {function-like macro}{10}
-\initial {H}
-\entry {header file}{3}
-\initial {I}
-\entry {including just once}{6}
-\entry {inheritance}{8}
-\entry {invocation of the preprocessor}{41}
-\initial {L}
-\entry {line control}{39}
-\initial {M}
-\entry {macro argument expansion}{26}
-\entry {macro body uses macro}{29}
-\entry {macros with argument}{10}
-\entry {manifest constant}{9}
-\initial {N}
-\entry {newlines in macro arguments}{30}
-\entry {null command}{40}
-\initial {O}
-\entry {options}{41}
-\entry {output format}{41}
-\entry {overriding a header file}{8}
-\initial {P}
-\entry {parentheses in macro bodies}{22}
-\entry {pitfalls of macros}{21}
-\entry {predefined macros}{13}
-\entry {predicates}{36}
-\entry {preprocessor commands}{3}
-\entry {prescan of macro arguments}{26}
-\entry {problems with macros}{21}
-\initial {R}
-\entry {redefining macros}{20}
-\entry {repeated inclusion}{6}
-\entry {retracting assertions}{37}
-\initial {S}
-\entry {second include path}{45}
-\entry {self-reference}{25}
-\entry {semicolons (after macro calls)}{23}
-\entry {side effects (in macro arguments)}{24}
-\entry {simple macro}{9}
-\entry {space as macro argument}{12}
-\entry {standard predefined macros}{13}
-\entry {stringification}{17}
-\initial {T}
-\entry {testing predicates}{36}
-\initial {U}
-\entry {unassert}{37}
-\entry {undefining macros}{20}
-\entry {unsafe macros}{24}
diff --git a/gcc/cpp.fns b/gcc/cpp.fns
deleted file mode 100755
index 849b4b2..0000000
--- a/gcc/cpp.fns
+++ /dev/null
@@ -1,94 +0,0 @@
-\initial {#}
-\entry {\code {#assert}}{37}
-\entry {\code {#cpu}}{36}
-\entry {\code {#define}}{10}
-\entry {\code {#elif}}{33}
-\entry {\code {#else}}{32}
-\entry {\code {#error}}{38}
-\entry {\code {#ident}}{40}
-\entry {\code {#if}}{31}
-\entry {\code {#ifdef}}{35}
-\entry {\code {#ifndef}}{35}
-\entry {\code {#import}}{7}
-\entry {\code {#include}}{4}
-\entry {\code {#include{\_}next}}{8}
-\entry {\code {#line}}{39}
-\entry {\code {#machine}}{36}
-\entry {\code {#pragma}}{40}
-\entry {\code {#pragma once}}{7}
-\entry {\code {#system}}{36}
-\entry {\code {#unassert}}{37}
-\entry {\code {#warning}}{38}
-\initial {-}
-\entry {\code {-$}}{46}
-\entry {\code {-A}}{44}
-\entry {\code {-C}}{42}
-\entry {\code {-D}}{43}
-\entry {\code {-dD}}{44}
-\entry {\code {-dM}}{44}
-\entry {\code {-H}}{45}
-\entry {\code {-I}}{43}
-\entry {\code {-idirafter}}{45}
-\entry {\code {-imacros}}{45}
-\entry {\code {-include}}{45}
-\entry {\code {-iprefix}}{45}
-\entry {\code {-isystem}}{45}
-\entry {\code {-iwithprefix}}{45}
-\entry {\code {-lang-c}}{45}
-\entry {\code {-lang-c{\tt\char43}{\tt\char43}}}{45}
-\entry {\code {-lang-objc}}{45}
-\entry {\code {-lang-objc{\tt\char43}{\tt\char43}}}{45}
-\entry {\code {-M}}{44}
-\entry {\code {-MD}}{44}
-\entry {\code {-MM}}{44}
-\entry {\code {-MMD}}{45}
-\entry {\code {-nostdinc}}{43}
-\entry {\code {-nostdinc{\tt\char43}{\tt\char43}}}{43}
-\entry {\code {-P}}{42}
-\entry {\code {-pedantic}}{43}
-\entry {\code {-pedantic-errors}}{43}
-\entry {\code {-traditional}}{42}
-\entry {\code {-trigraphs}}{42}
-\entry {\code {-U}}{44}
-\entry {\code {-undef}}{44}
-\entry {\code {-Wall}}{43}
-\entry {\code {-Wcomment}}{43}
-\entry {\code {-Wtraditional}}{43}
-\entry {\code {-Wtrigraphs}}{43}
-\initial {{\_}}
-\entry {\code {{\_}{\_}BASE{\_}FILE{\_}{\_}}}{15}
-\entry {\code {{\_}{\_}CHAR{\_}UNSIGNED{\_}{\_}}}{15}
-\entry {\code {{\_}{\_}cplusplus}}{14}
-\entry {\code {{\_}{\_}DATE{\_}{\_}}}{14}
-\entry {\code {{\_}{\_}FILE{\_}{\_}}}{13}
-\entry {\code {{\_}{\_}GNUC{\_}{\_}}}{14}
-\entry {\code {{\_}{\_}GNUG{\_}{\_}}}{14}
-\entry {\code {{\_}{\_}INCLUDE{\_}LEVEL{\_}}}{14}
-\entry {\code {{\_}{\_}LINE{\_}{\_}}}{13}
-\entry {\code {{\_}{\_}OPTIMIZE{\_}{\_}}}{15}
-\entry {\code {{\_}{\_}STDC{\_}{\_}}}{14}
-\entry {\code {{\_}{\_}STRICT{\_}ANSI{\_}{\_}}}{15}
-\entry {\code {{\_}{\_}TIME{\_}{\_}}}{14}
-\entry {\code {{\_}{\_}VERSION{\_}{\_}}}{15}
-\entry {\code {{\_}AM29000}}{16}
-\entry {\code {{\_}AM29K}}{16}
-\initial {B}
-\entry {\code {BSD}}{16}
-\initial {D}
-\entry {\code {defined}}{34}
-\initial {M}
-\entry {\code {M68020}}{16}
-\entry {\code {m68k}}{16}
-\entry {\code {mc68000}}{16}
-\initial {N}
-\entry {\code {ns32000}}{16}
-\initial {P}
-\entry {\code {pyr}}{16}
-\initial {S}
-\entry {\code {sequent}}{16}
-\entry {\code {sun}}{16}
-\entry {\code {system header files}}{4}
-\initial {U}
-\entry {\code {unix}}{16}
-\initial {V}
-\entry {\code {vax}}{16}
diff --git a/gcc/cpp.texi b/gcc/cpp.texi
deleted file mode 100755
index 315cfc7..0000000
--- a/gcc/cpp.texi
+++ /dev/null
@@ -1,2936 +0,0 @@
-\input texinfo
-@setfilename cpp.info
-@settitle The C Preprocessor
-
-@c CYGNUS LOCAL doc
-@c @ignore
-@ifinfo
-@dircategory Programming
-@direntry
-* Cpp: (cpp). The GNU C preprocessor.
-@end direntry
-@end ifinfo
-@c CYGNUS LOCAL doc
-@c @end ignore
-
-@c @smallbook
-@c @cropmarks
-@c CYGNUS LOCAL doc
-@finalout
-@setchapternewpage odd
-@ifinfo
-This file documents the GNU C Preprocessor.
-
-Copyright 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1997, 1998 Free Software
-Foundation, Inc.
-
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
-@ignore
-Permission is granted to process this file through Tex and print the
-results, provided the printed document carries copying permission
-notice identical to this one except for the removal of this paragraph
-(this paragraph not being relevant to the printed manual).
-
-@end ignore
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided also that
-the entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-
-Permission is granted to copy and distribute translations of this manual
-into another language, under the above conditions for modified versions.
-@end ifinfo
-
-@titlepage
-@c @finalout
-@title The C Preprocessor
-@subtitle Last revised September 1998
-@subtitle for GCC version 2
-@author Richard M. Stallman
-@page
-@vskip 2pc
-This booklet is eventually intended to form the first chapter of a GNU
-C Language manual.
-
-@vskip 0pt plus 1filll
-Copyright @copyright{} 1987, 1989, 1991-1998
-Free Software Foundation, Inc.
-
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided also that
-the entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-
-Permission is granted to copy and distribute translations of this manual
-into another language, under the above conditions for modified versions.
-@end titlepage
-@page
-
-@node Top, Global Actions,, (DIR)
-@chapter The C Preprocessor
-
-The C preprocessor is a @dfn{macro processor} that is used automatically by
-the C compiler to transform your program before actual compilation. It is
-called a macro processor because it allows you to define @dfn{macros},
-which are brief abbreviations for longer constructs.
-
-The C preprocessor provides four separate facilities that you can use as
-you see fit:
-
-@itemize @bullet
-@item
-Inclusion of header files. These are files of declarations that can be
-substituted into your program.
-
-@item
-Macro expansion. You can define @dfn{macros}, which are abbreviations
-for arbitrary fragments of C code, and then the C preprocessor will
-replace the macros with their definitions throughout the program.
-
-@item
-Conditional compilation. Using special preprocessing directives, you
-can include or exclude parts of the program according to various
-conditions.
-
-@item
-Line control. If you use a program to combine or rearrange source files into
-an intermediate file which is then compiled, you can use line control
-to inform the compiler of where each source line originally came from.
-@end itemize
-
-C preprocessors vary in some details. This manual discusses the GNU C
-preprocessor, the C Compatible Compiler Preprocessor. The GNU C
-preprocessor provides a superset of the features of ANSI Standard C@.
-
-ANSI Standard C requires the rejection of many harmless constructs commonly
-used by today's C programs. Such incompatibility would be inconvenient for
-users, so the GNU C preprocessor is configured to accept these constructs
-by default. Strictly speaking, to get ANSI Standard C, you must use the
-options @samp{-trigraphs}, @samp{-undef} and @samp{-pedantic}, but in
-practice the consequences of having strict ANSI Standard C make it
-undesirable to do this. @xref{Invocation}.
-
-The C preprocessor is designed for C-like languages; you may run into
-problems if you apply it to other kinds of languages, because it assumes
-that it is dealing with C@. For example, the C preprocessor sometimes
-outputs extra white space to avoid inadvertent C token concatenation,
-and this may cause problems with other languages.
-
-@menu
-* Global Actions:: Actions made uniformly on all input files.
-* Directives:: General syntax of preprocessing directives.
-* Header Files:: How and why to use header files.
-* Macros:: How and why to use macros.
-* Conditionals:: How and why to use conditionals.
-* Combining Sources:: Use of line control when you combine source files.
-* Other Directives:: Miscellaneous preprocessing directives.
-* Output:: Format of output from the C preprocessor.
-* Invocation:: How to invoke the preprocessor; command options.
-* Concept Index:: Index of concepts and terms.
-* Index:: Index of directives, predefined macros and options.
-@end menu
-
-@node Global Actions, Directives, Top, Top
-@section Transformations Made Globally
-
-Most C preprocessor features are inactive unless you give specific directives
-to request their use. (Preprocessing directives are lines starting with
-@samp{#}; @pxref{Directives}). But there are three transformations that the
-preprocessor always makes on all the input it receives, even in the absence
-of directives.
-
-@itemize @bullet
-@item
-All C comments are replaced with single spaces.
-
-@item
-Backslash-Newline sequences are deleted, no matter where. This
-feature allows you to break long lines for cosmetic purposes without
-changing their meaning.
-
-@item
-Predefined macro names are replaced with their expansions
-(@pxref{Predefined}).
-@end itemize
-
-The first two transformations are done @emph{before} nearly all other parsing
-and before preprocessing directives are recognized. Thus, for example, you
-can split a line cosmetically with Backslash-Newline anywhere (except
-when trigraphs are in use; see below).
-
-@example
-/*
-*/ # /*
-*/ defi\
-ne FO\
-O 10\
-20
-@end example
-
-@noindent
-is equivalent into @samp{#define FOO 1020}. You can split even an escape
-sequence with Backslash-Newline. For example, you can split @code{"foo\bar"}
-between the @samp{\} and the @samp{b} to get
-
-@example
-"foo\\
-bar"
-@end example
-
-@noindent
-This behavior is unclean: in all other contexts, a Backslash can be
-inserted in a string constant as an ordinary character by writing a double
-Backslash, and this creates an exception. But the ANSI C standard requires
-it. (Strict ANSI C does not allow Newlines in string constants, so they
-do not consider this a problem.)
-
-But there are a few exceptions to all three transformations.
-
-@itemize @bullet
-@item
-C comments and predefined macro names are not recognized inside a
-@samp{#include} directive in which the file name is delimited with
-@samp{<} and @samp{>}.
-
-@item
-C comments and predefined macro names are never recognized within a
-character or string constant. (Strictly speaking, this is the rule,
-not an exception, but it is worth noting here anyway.)
-
-@item
-Backslash-Newline may not safely be used within an ANSI ``trigraph''.
-Trigraphs are converted before Backslash-Newline is deleted. If you
-write what looks like a trigraph with a Backslash-Newline inside, the
-Backslash-Newline is deleted as usual, but it is then too late to
-recognize the trigraph.
-
-This exception is relevant only if you use the @samp{-trigraphs}
-option to enable trigraph processing. @xref{Invocation}.
-@end itemize
-
-@node Directives, Header Files, Global Actions, Top
-@section Preprocessing Directives
-
-@cindex preprocessing directives
-@cindex directives
-Most preprocessor features are active only if you use preprocessing directives
-to request their use.
-
-Preprocessing directives are lines in your program that start with @samp{#}.
-The @samp{#} is followed by an identifier that is the @dfn{directive name}.
-For example, @samp{#define} is the directive that defines a macro.
-Whitespace is also allowed before and after the @samp{#}.
-
-The set of valid directive names is fixed. Programs cannot define new
-preprocessing directives.
-
-Some directive names require arguments; these make up the rest of the directive
-line and must be separated from the directive name by whitespace. For example,
-@samp{#define} must be followed by a macro name and the intended expansion
-of the macro. @xref{Simple Macros}.
-
-A preprocessing directive cannot be more than one line in normal circumstances.
-It may be split cosmetically with Backslash-Newline, but that has no effect
-on its meaning. Comments containing Newlines can also divide the
-directive into multiple lines, but the comments are changed to Spaces
-before the directive is interpreted. The only way a significant Newline
-can occur in a preprocessing directive is within a string constant or
-character constant. Note that
-most C compilers that might be applied to the output from the preprocessor
-do not accept string or character constants containing Newlines.
-
-The @samp{#} and the directive name cannot come from a macro expansion. For
-example, if @samp{foo} is defined as a macro expanding to @samp{define},
-that does not make @samp{#foo} a valid preprocessing directive.
-
-@node Header Files, Macros, Directives, Top
-@section Header Files
-
-@cindex header file
-A header file is a file containing C declarations and macro definitions
-(@pxref{Macros}) to be shared between several source files. You request
-the use of a header file in your program with the C preprocessing directive
-@samp{#include}.
-
-@menu
-* Header Uses:: What header files are used for.
-* Include Syntax:: How to write @samp{#include} directives.
-* Include Operation:: What @samp{#include} does.
-* Once-Only:: Preventing multiple inclusion of one header file.
-* Inheritance:: Including one header file in another header file.
-@end menu
-
-@node Header Uses, Include Syntax, Header Files, Header Files
-@subsection Uses of Header Files
-
-Header files serve two kinds of purposes.
-
-@itemize @bullet
-@item
-@findex system header files
-System header files declare the interfaces to parts of the operating
-system. You include them in your program to supply the definitions and
-declarations you need to invoke system calls and libraries.
-
-@item
-Your own header files contain declarations for interfaces between the
-source files of your program. Each time you have a group of related
-declarations and macro definitions all or most of which are needed in
-several different source files, it is a good idea to create a header
-file for them.
-@end itemize
-
-Including a header file produces the same results in C compilation as
-copying the header file into each source file that needs it. But such
-copying would be time-consuming and error-prone. With a header file, the
-related declarations appear in only one place. If they need to be changed,
-they can be changed in one place, and programs that include the header file
-will automatically use the new version when next recompiled. The header
-file eliminates the labor of finding and changing all the copies as well as
-the risk that a failure to find one copy will result in inconsistencies
-within a program.
-
-The usual convention is to give header files names that end with
-@file{.h}. Avoid unusual characters in header file names, as they
-reduce portability.
-
-@node Include Syntax, Include Operation, Header Uses, Header Files
-@subsection The @samp{#include} Directive
-
-@findex #include
-Both user and system header files are included using the preprocessing
-directive @samp{#include}. It has three variants:
-
-@table @code
-@item #include <@var{file}>
-This variant is used for system header files. It searches for a file
-named @var{file} in a list of directories specified by you, then in a
-standard list of system directories. You specify directories to
-search for header files with the command option @samp{-I}
-(@pxref{Invocation}). The option @samp{-nostdinc} inhibits searching
-the standard system directories; in this case only the directories
-you specify are searched.
-
-The parsing of this form of @samp{#include} is slightly special
-because comments are not recognized within the @samp{<@dots{}>}.
-Thus, in @samp{#include <x/*y>} the @samp{/*} does not start a comment
-and the directive specifies inclusion of a system header file named
-@file{x/*y}. Of course, a header file with such a name is unlikely to
-exist on Unix, where shell wildcard features would make it hard to
-manipulate.@refill
-
-The argument @var{file} may not contain a @samp{>} character. It may,
-however, contain a @samp{<} character.
-
-@item #include "@var{file}"
-This variant is used for header files of your own program. It
-searches for a file named @var{file} first in the current directory,
-then in the same directories used for system header files. The
-current directory is the directory of the current input file. It is
-tried first because it is presumed to be the location of the files
-that the current input file refers to. (If the @samp{-I-} option is
-used, the special treatment of the current directory is inhibited.)
-
-The argument @var{file} may not contain @samp{"} characters. If
-backslashes occur within @var{file}, they are considered ordinary text
-characters, not escape characters. None of the character escape
-sequences appropriate to string constants in C are processed. Thus,
-@samp{#include "x\n\\y"} specifies a filename containing three
-backslashes. It is not clear why this behavior is ever useful, but
-the ANSI standard specifies it.
-
-@item #include @var{anything else}
-@cindex computed @samp{#include}
-This variant is called a @dfn{computed #include}. Any @samp{#include}
-directive whose argument does not fit the above two forms is a computed
-include. The text @var{anything else} is checked for macro calls,
-which are expanded (@pxref{Macros}). When this is done, the result
-must fit one of the above two variants---in particular, the expanded
-text must in the end be surrounded by either quotes or angle braces.
-
-This feature allows you to define a macro which controls the file name
-to be used at a later point in the program. One application of this is
-to allow a site-specific configuration file for your program to specify
-the names of the system include files to be used. This can help in
-porting the program to various operating systems in which the necessary
-system header files are found in different places.
-@end table
-
-@node Include Operation, Once-Only, Include Syntax, Header Files
-@subsection How @samp{#include} Works
-
-The @samp{#include} directive works by directing the C preprocessor to scan
-the specified file as input before continuing with the rest of the current
-file. The output from the preprocessor contains the output already
-generated, followed by the output resulting from the included file,
-followed by the output that comes from the text after the @samp{#include}
-directive. For example, given a header file @file{header.h} as follows,
-
-@example
-char *test ();
-@end example
-
-@noindent
-and a main program called @file{program.c} that uses the header file,
-like this,
-
-@example
-int x;
-#include "header.h"
-
-main ()
-@{
- printf (test ());
-@}
-@end example
-
-@noindent
-the output generated by the C preprocessor for @file{program.c} as input
-would be
-
-@example
-int x;
-char *test ();
-
-main ()
-@{
- printf (test ());
-@}
-@end example
-
-Included files are not limited to declarations and macro definitions; those
-are merely the typical uses. Any fragment of a C program can be included
-from another file. The include file could even contain the beginning of a
-statement that is concluded in the containing file, or the end of a
-statement that was started in the including file. However, a comment or a
-string or character constant may not start in the included file and finish
-in the including file. An unterminated comment, string constant or
-character constant in an included file is considered to end (with an error
-message) at the end of the file.
-
-It is possible for a header file to begin or end a syntactic unit such
-as a function definition, but that would be very confusing, so don't do
-it.
-
-The line following the @samp{#include} directive is always treated as a
-separate line by the C preprocessor even if the included file lacks a final
-newline.
-
-@node Once-Only, Inheritance, Include Operation, Header Files
-@subsection Once-Only Include Files
-@cindex repeated inclusion
-@cindex including just once
-
-Very often, one header file includes another. It can easily result that a
-certain header file is included more than once. This may lead to errors,
-if the header file defines structure types or typedefs, and is certainly
-wasteful. Therefore, we often wish to prevent multiple inclusion of a
-header file.
-
-The standard way to do this is to enclose the entire real contents of the
-file in a conditional, like this:
-
-@example
-#ifndef FILE_FOO_SEEN
-#define FILE_FOO_SEEN
-
-@var{the entire file}
-
-#endif /* FILE_FOO_SEEN */
-@end example
-
-The macro @code{FILE_FOO_SEEN} indicates that the file has been included
-once already. In a user header file, the macro name should not begin
-with @samp{_}. In a system header file, this name should begin with
-@samp{__} to avoid conflicts with user programs. In any kind of header
-file, the macro name should contain the name of the file and some
-additional text, to avoid conflicts with other header files.
-
-The GNU C preprocessor is programmed to notice when a header file uses
-this particular construct and handle it efficiently. If a header file
-is contained entirely in a @samp{#ifndef} conditional, then it records
-that fact. If a subsequent @samp{#include} specifies the same file,
-and the macro in the @samp{#ifndef} is already defined, then the file
-is entirely skipped, without even reading it.
-
-@findex #pragma once
-There is also an explicit directive to tell the preprocessor that it need
-not include a file more than once. This is called @samp{#pragma once},
-and was used @emph{in addition to} the @samp{#ifndef} conditional around
-the contents of the header file. @samp{#pragma once} is now obsolete
-and should not be used at all.
-
-@findex #import
-In the Objective C language, there is a variant of @samp{#include}
-called @samp{#import} which includes a file, but does so at most once.
-If you use @samp{#import} @emph{instead of} @samp{#include}, then you
-don't need the conditionals inside the header file to prevent multiple
-execution of the contents.
-
-@samp{#import} is obsolete because it is not a well designed feature.
-It requires the users of a header file---the applications
-programmers---to know that a certain header file should only be included
-once. It is much better for the header file's implementor to write the
-file so that users don't need to know this. Using @samp{#ifndef}
-accomplishes this goal.
-
-@node Inheritance,, Once-Only, Header Files
-@subsection Inheritance and Header Files
-@cindex inheritance
-@cindex overriding a header file
-
-@dfn{Inheritance} is what happens when one object or file derives some
-of its contents by virtual copying from another object or file. In
-the case of C header files, inheritance means that one header file
-includes another header file and then replaces or adds something.
-
-If the inheriting header file and the base header file have different
-names, then inheritance is straightforward: simply write @samp{#include
-"@var{base}"} in the inheriting file.
-
-Sometimes it is necessary to give the inheriting file the same name as
-the base file. This is less straightforward.
-
-For example, suppose an application program uses the system header
-@file{sys/signal.h}, but the version of @file{/usr/include/sys/signal.h}
-on a particular system doesn't do what the application program expects.
-It might be convenient to define a ``local'' version, perhaps under the
-name @file{/usr/local/include/sys/signal.h}, to override or add to the
-one supplied by the system.
-
-You can do this by compiling with the option @samp{-I.}, and
-writing a file @file{sys/signal.h} that does what the application
-program expects. But making this file include the standard
-@file{sys/signal.h} is not so easy---writing @samp{#include
-<sys/signal.h>} in that file doesn't work, because it includes your own
-version of the file, not the standard system version. Used in that file
-itself, this leads to an infinite recursion and a fatal error in
-compilation.
-
-@samp{#include </usr/include/sys/signal.h>} would find the proper file,
-but that is not clean, since it makes an assumption about where the
-system header file is found. This is bad for maintenance, since it
-means that any change in where the system's header files are kept
-requires a change somewhere else.
-
-@findex #include_next
-The clean way to solve this problem is to use
-@samp{#include_next}, which means, ``Include the @emph{next} file with
-this name.'' This directive works like @samp{#include} except in
-searching for the specified file: it starts searching the list of header
-file directories @emph{after} the directory in which the current file
-was found.
-
-Suppose you specify @samp{-I /usr/local/include}, and the list of
-directories to search also includes @file{/usr/include}; and suppose
-both directories contain @file{sys/signal.h}. Ordinary
-@samp{#include <sys/signal.h>} finds the file under
-@file{/usr/local/include}. If that file contains @samp{#include_next
-<sys/signal.h>}, it starts searching after that directory, and finds the
-file in @file{/usr/include}.
-
-@node Macros, Conditionals, Header Files, Top
-@section Macros
-
-A macro is a sort of abbreviation which you can define once and then
-use later. There are many complicated features associated with macros
-in the C preprocessor.
-
-@menu
-* Simple Macros:: Macros that always expand the same way.
-* Argument Macros:: Macros that accept arguments that are substituted
- into the macro expansion.
-* Predefined:: Predefined macros that are always available.
-* Stringification:: Macro arguments converted into string constants.
-* Concatenation:: Building tokens from parts taken from macro arguments.
-* Undefining:: Cancelling a macro's definition.
-* Redefining:: Changing a macro's definition.
-* Macro Pitfalls:: Macros can confuse the unwary. Here we explain
- several common problems and strange features.
-@end menu
-
-@node Simple Macros, Argument Macros, Macros, Macros
-@subsection Simple Macros
-@cindex simple macro
-@cindex manifest constant
-
-A @dfn{simple macro} is a kind of abbreviation. It is a name which
-stands for a fragment of code. Some people refer to these as
-@dfn{manifest constants}.
-
-Before you can use a macro, you must @dfn{define} it explicitly with the
-@samp{#define} directive. @samp{#define} is followed by the name of the
-macro and then the code it should be an abbreviation for. For example,
-
-@example
-#define BUFFER_SIZE 1020
-@end example
-
-@noindent
-defines a macro named @samp{BUFFER_SIZE} as an abbreviation for the text
-@samp{1020}. If somewhere after this @samp{#define} directive there comes
-a C statement of the form
-
-@example
-foo = (char *) xmalloc (BUFFER_SIZE);
-@end example
-
-@noindent
-then the C preprocessor will recognize and @dfn{expand} the macro
-@samp{BUFFER_SIZE}, resulting in
-
-@example
-foo = (char *) xmalloc (1020);
-@end example
-
-The use of all upper case for macro names is a standard convention.
-Programs are easier to read when it is possible to tell at a glance which
-names are macros.
-
-Normally, a macro definition must be a single line, like all C
-preprocessing directives. (You can split a long macro definition
-cosmetically with Backslash-Newline.) There is one exception: Newlines
-can be included in the macro definition if within a string or character
-constant. This is because it is not possible for a macro definition to
-contain an unbalanced quote character; the definition automatically
-extends to include the matching quote character that ends the string or
-character constant. Comments within a macro definition may contain
-Newlines, which make no difference since the comments are entirely
-replaced with Spaces regardless of their contents.
-
-Aside from the above, there is no restriction on what can go in a macro
-body. Parentheses need not balance. The body need not resemble valid C
-code. (But if it does not, you may get error messages from the C
-compiler when you use the macro.)
-
-The C preprocessor scans your program sequentially, so macro definitions
-take effect at the place you write them. Therefore, the following input to
-the C preprocessor
-
-@example
-foo = X;
-#define X 4
-bar = X;
-@end example
-
-@noindent
-produces as output
-
-@example
-foo = X;
-
-bar = 4;
-@end example
-
-After the preprocessor expands a macro name, the macro's definition body is
-appended to the front of the remaining input, and the check for macro calls
-continues. Therefore, the macro body can contain calls to other macros.
-For example, after
-
-@example
-#define BUFSIZE 1020
-#define TABLESIZE BUFSIZE
-@end example
-
-@noindent
-the name @samp{TABLESIZE} when used in the program would go through two
-stages of expansion, resulting ultimately in @samp{1020}.
-
-This is not at all the same as defining @samp{TABLESIZE} to be @samp{1020}.
-The @samp{#define} for @samp{TABLESIZE} uses exactly the body you
-specify---in this case, @samp{BUFSIZE}---and does not check to see whether
-it too is the name of a macro. It's only when you @emph{use} @samp{TABLESIZE}
-that the result of its expansion is checked for more macro names.
-@xref{Cascaded Macros}.
-
-@node Argument Macros, Predefined, Simple Macros, Macros
-@subsection Macros with Arguments
-@cindex macros with argument
-@cindex arguments in macro definitions
-@cindex function-like macro
-
-A simple macro always stands for exactly the same text, each time it is
-used. Macros can be more flexible when they accept @dfn{arguments}.
-Arguments are fragments of code that you supply each time the macro is
-used. These fragments are included in the expansion of the macro
-according to the directions in the macro definition. A macro that
-accepts arguments is called a @dfn{function-like macro} because the
-syntax for using it looks like a function call.
-
-@findex #define
-To define a macro that uses arguments, you write a @samp{#define} directive
-with a list of @dfn{argument names} in parentheses after the name of the
-macro. The argument names may be any valid C identifiers, separated by
-commas and optionally whitespace. The open-parenthesis must follow the
-macro name immediately, with no space in between.
-
-For example, here is a macro that computes the minimum of two numeric
-values, as it is defined in many C programs:
-
-@example
-#define min(X, Y) ((X) < (Y) ? (X) : (Y))
-@end example
-
-@noindent
-(This is not the best way to define a ``minimum'' macro in GNU C@.
-@xref{Side Effects}, for more information.)
-
-To use a macro that expects arguments, you write the name of the macro
-followed by a list of @dfn{actual arguments} in parentheses, separated by
-commas. The number of actual arguments you give must match the number of
-arguments the macro expects. Examples of use of the macro @samp{min}
-include @samp{min (1, 2)} and @samp{min (x + 28, *p)}.
-
-The expansion text of the macro depends on the arguments you use.
-Each of the argument names of the macro is replaced, throughout the
-macro definition, with the corresponding actual argument. Using the
-same macro @samp{min} defined above, @samp{min (1, 2)} expands into
-
-@example
-((1) < (2) ? (1) : (2))
-@end example
-
-@noindent
-where @samp{1} has been substituted for @samp{X} and @samp{2} for @samp{Y}.
-
-Likewise, @samp{min (x + 28, *p)} expands into
-
-@example
-((x + 28) < (*p) ? (x + 28) : (*p))
-@end example
-
-Parentheses in the actual arguments must balance; a comma within
-parentheses does not end an argument. However, there is no requirement
-for brackets or braces to balance, and they do not prevent a comma from
-separating arguments. Thus,
-
-@example
-macro (array[x = y, x + 1])
-@end example
-
-@noindent
-passes two arguments to @code{macro}: @samp{array[x = y} and @samp{x +
-1]}. If you want to supply @samp{array[x = y, x + 1]} as an argument,
-you must write it as @samp{array[(x = y, x + 1)]}, which is equivalent C
-code.
-
-After the actual arguments are substituted into the macro body, the entire
-result is appended to the front of the remaining input, and the check for
-macro calls continues. Therefore, the actual arguments can contain calls
-to other macros, either with or without arguments, or even to the same
-macro. The macro body can also contain calls to other macros. For
-example, @samp{min (min (a, b), c)} expands into this text:
-
-@example
-((((a) < (b) ? (a) : (b))) < (c)
- ? (((a) < (b) ? (a) : (b)))
- : (c))
-@end example
-
-@noindent
-(Line breaks shown here for clarity would not actually be generated.)
-
-@cindex blank macro arguments
-@cindex space as macro argument
-If a macro @code{foo} takes one argument, and you want to supply an
-empty argument, you must write at least some whitespace between the
-parentheses, like this: @samp{foo ( )}. Just @samp{foo ()} is providing
-no arguments, which is an error if @code{foo} expects an argument. But
-@samp{foo0 ()} is the correct way to call a macro defined to take zero
-arguments, like this:
-
-@example
-#define foo0() @dots{}
-@end example
-
-If you use the macro name followed by something other than an
-open-parenthesis (after ignoring any spaces, tabs and comments that
-follow), it is not a call to the macro, and the preprocessor does not
-change what you have written. Therefore, it is possible for the same name
-to be a variable or function in your program as well as a macro, and you
-can choose in each instance whether to refer to the macro (if an actual
-argument list follows) or the variable or function (if an argument list
-does not follow).
-
-Such dual use of one name could be confusing and should be avoided
-except when the two meanings are effectively synonymous: that is, when the
-name is both a macro and a function and the two have similar effects. You
-can think of the name simply as a function; use of the name for purposes
-other than calling it (such as, to take the address) will refer to the
-function, while calls will expand the macro and generate better but
-equivalent code. For example, you can use a function named @samp{min} in
-the same source file that defines the macro. If you write @samp{&min} with
-no argument list, you refer to the function. If you write @samp{min (x,
-bb)}, with an argument list, the macro is expanded. If you write
-@samp{(min) (a, bb)}, where the name @samp{min} is not followed by an
-open-parenthesis, the macro is not expanded, so you wind up with a call to
-the function @samp{min}.
-
-You may not define the same name as both a simple macro and a macro with
-arguments.
-
-In the definition of a macro with arguments, the list of argument names
-must follow the macro name immediately with no space in between. If there
-is a space after the macro name, the macro is defined as taking no
-arguments, and all the rest of the line is taken to be the expansion. The
-reason for this is that it is often useful to define a macro that takes no
-arguments and whose definition begins with an identifier in parentheses.
-This rule about spaces makes it possible for you to do either this:
-
-@example
-#define FOO(x) - 1 / (x)
-@end example
-
-@noindent
-(which defines @samp{FOO} to take an argument and expand into minus the
-reciprocal of that argument) or this:
-
-@example
-#define BAR (x) - 1 / (x)
-@end example
-
-@noindent
-(which defines @samp{BAR} to take no argument and always expand into
-@samp{(x) - 1 / (x)}).
-
-Note that the @emph{uses} of a macro with arguments can have spaces before
-the left parenthesis; it's the @emph{definition} where it matters whether
-there is a space.
-
-@node Predefined, Stringification, Argument Macros, Macros
-@subsection Predefined Macros
-
-@cindex predefined macros
-Several simple macros are predefined. You can use them without giving
-definitions for them. They fall into two classes: standard macros and
-system-specific macros.
-
-@menu
-* Standard Predefined:: Standard predefined macros.
-* Nonstandard Predefined:: Nonstandard predefined macros.
-@end menu
-
-@node Standard Predefined, Nonstandard Predefined, Predefined, Predefined
-@subsubsection Standard Predefined Macros
-@cindex standard predefined macros
-
-The standard predefined macros are available with the same meanings
-regardless of the machine or operating system on which you are using GNU C@.
-Their names all start and end with double underscores. Those preceding
-@code{__GNUC__} in this table are standardized by ANSI C; the rest are
-GNU C extensions.
-
-@table @code
-@item __FILE__
-@findex __FILE__
-This macro expands to the name of the current input file, in the form of
-a C string constant. The precise name returned is the one that was
-specified in @samp{#include} or as the input file name argument.
-
-@item __LINE__
-@findex __LINE__
-This macro expands to the current input line number, in the form of a
-decimal integer constant. While we call it a predefined macro, it's
-a pretty strange macro, since its ``definition'' changes with each
-new line of source code.
-
-This and @samp{__FILE__} are useful in generating an error message to
-report an inconsistency detected by the program; the message can state
-the source line at which the inconsistency was detected. For example,
-
-@smallexample
-fprintf (stderr, "Internal error: "
- "negative string length "
- "%d at %s, line %d.",
- length, __FILE__, __LINE__);
-@end smallexample
-
-A @samp{#include} directive changes the expansions of @samp{__FILE__}
-and @samp{__LINE__} to correspond to the included file. At the end of
-that file, when processing resumes on the input file that contained
-the @samp{#include} directive, the expansions of @samp{__FILE__} and
-@samp{__LINE__} revert to the values they had before the
-@samp{#include} (but @samp{__LINE__} is then incremented by one as
-processing moves to the line after the @samp{#include}).
-
-The expansions of both @samp{__FILE__} and @samp{__LINE__} are altered
-if a @samp{#line} directive is used. @xref{Combining Sources}.
-
-@item __DATE__
-@findex __DATE__
-This macro expands to a string constant that describes the date on
-which the preprocessor is being run. The string constant contains
-eleven characters and looks like @w{@samp{"Feb 1 1996"}}.
-@c After reformatting the above, check that the date remains `Feb 1 1996',
-@c all on one line, with two spaces between the `Feb' and the `1'.
-
-@item __TIME__
-@findex __TIME__
-This macro expands to a string constant that describes the time at
-which the preprocessor is being run. The string constant contains
-eight characters and looks like @samp{"23:59:01"}.
-
-@item __STDC__
-@findex __STDC__
-This macro expands to the constant 1, to signify that this is ANSI
-Standard C@. (Whether that is actually true depends on what C compiler
-will operate on the output from the preprocessor.)
-
-On some hosts, system include files use a different convention, where
-@samp{__STDC__} is normally 0, but is 1 if the user specifies strict
-conformance to the C Standard. The preprocessor follows the host convention
-when processing system include files, but when processing user files it follows
-the usual GNU C convention.
-
-This macro is not defined if the @samp{-traditional} option is used.
-
-@item __STDC_VERSION__
-@findex __STDC_VERSION__
-This macro expands to the C Standard's version number,
-a long integer constant of the form @samp{@var{yyyy}@var{mm}L}
-where @var{yyyy} and @var{mm} are the year and month of the Standard version.
-This signifies which version of the C Standard the preprocessor conforms to.
-Like @samp{__STDC__}, whether this version number is accurate
-for the entire implementation depends on what C compiler
-will operate on the output from the preprocessor.
-
-This macro is not defined if the @samp{-traditional} option is used.
-
-@item __GNUC__
-@findex __GNUC__
-This macro is defined if and only if this is GNU C@. This macro is
-defined only when the entire GNU C compiler is in use; if you invoke the
-preprocessor directly, @samp{__GNUC__} is undefined. The value
-identifies the major version number of GNU CC (@samp{1} for GNU CC
-version 1, which is now obsolete, and @samp{2} for version 2).
-
-@item __GNUC_MINOR__
-@findex __GNUC_MINOR__
-The macro contains the minor version number of the compiler. This can
-be used to work around differences between different releases of the
-compiler (for example, if gcc 2.6.3 is known to support a feature, you
-can test for @code{__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6)}).
-The last number, @samp{3} in the
-example above, denotes the bugfix level of the compiler; no macro
-contains this value.
-
-@item __GNUG__
-@findex __GNUG__
-The GNU C compiler defines this when the compilation language is
-C++; use @samp{__GNUG__} to distinguish between GNU C and GNU
-C++.
-
-@item __cplusplus
-@findex __cplusplus
-The draft ANSI standard for C++ used to require predefining this
-variable. Though it is no longer required, GNU C++ continues to define
-it, as do other popular C++ compilers. You can use @samp{__cplusplus}
-to test whether a header is compiled by a C compiler or a C++ compiler.
-
-@item __STRICT_ANSI__
-@findex __STRICT_ANSI__
-GNU C defines this macro if and only if the @samp{-ansi} switch was
-specified when GNU C was invoked. Its definition is the null string.
-This macro exists primarily to direct certain GNU header files not to
-define certain traditional Unix constructs which are incompatible with
-ANSI C@.
-
-@item __BASE_FILE__
-@findex __BASE_FILE__
-This macro expands to the name of the main input file, in the form
-of a C string constant. This is the source file that was specified
-as an argument when the C compiler was invoked.
-
-@item __INCLUDE_LEVEL__
-@findex __INCLUDE_LEVEL_
-This macro expands to a decimal integer constant that represents the
-depth of nesting in include files. The value of this macro is
-incremented on every @samp{#include} directive and decremented at every
-end of file. For input files specified by command line arguments,
-the nesting level is zero.
-
-@item __VERSION__
-@findex __VERSION__
-This macro expands to a string constant which describes the version number of
-GNU C@. The string is normally a sequence of decimal numbers separated
-by periods, such as @samp{"2.6.0"}.
-
-@item __OPTIMIZE__
-@findex __OPTIMIZE__
-GNU CC defines this macro in optimizing compilations. It causes certain
-GNU header files to define alternative macro definitions for some system
-library functions. You should not refer to or test the definition of
-this macro unless you make very sure that programs will execute with the
-same effect regardless.
-
-@item __CHAR_UNSIGNED__
-@findex __CHAR_UNSIGNED__
-GNU C defines this macro if and only if the data type @code{char} is
-unsigned on the target machine. It exists to cause the standard header
-file @file{limits.h} to work correctly. You should not refer to this
-macro yourself; instead, refer to the standard macros defined in
-@file{limits.h}. The preprocessor uses this macro to determine whether
-or not to sign-extend large character constants written in octal; see
-@ref{#if Directive,,The @samp{#if} Directive}.
-
-@item __REGISTER_PREFIX__
-@findex __REGISTER_PREFIX__
-This macro expands to a string (not a string constant) describing the
-prefix applied to CPU registers in assembler code. You can use it to
-write assembler code that is usable in multiple environments. For
-example, in the @samp{m68k-aout} environment it expands to the null
-string, but in the @samp{m68k-coff} environment it expands to the string
-@samp{%}.
-
-@item __USER_LABEL_PREFIX__
-@findex __USER_LABEL_PREFIX__
-Similar to @code{__REGISTER_PREFIX__}, but describes the prefix applied
-to user generated labels in assembler code. For example, in the
-@samp{m68k-aout} environment it expands to the string @samp{_}, but in
-the @samp{m68k-coff} environment it expands to the null string. This
-does not work with the @samp{-mno-underscores} option that the i386
-OSF/rose and m88k targets provide nor with the @samp{-mcall*} options of
-the rs6000 System V Release 4 target.
-@end table
-
-@node Nonstandard Predefined,, Standard Predefined, Predefined
-@subsubsection Nonstandard Predefined Macros
-
-The C preprocessor normally has several predefined macros that vary between
-machines because their purpose is to indicate what type of system and
-machine is in use. This manual, being for all systems and machines, cannot
-tell you exactly what their names are; instead, we offer a list of some
-typical ones. You can use @samp{cpp -dM} to see the values of
-predefined macros; see @ref{Invocation}.
-
-Some nonstandard predefined macros describe the operating system in use,
-with more or less specificity. For example,
-
-@table @code
-@item unix
-@findex unix
-@samp{unix} is normally predefined on all Unix systems.
-
-@item BSD
-@findex BSD
-@samp{BSD} is predefined on recent versions of Berkeley Unix
-(perhaps only in version 4.3).
-@end table
-
-Other nonstandard predefined macros describe the kind of CPU, with more or
-less specificity. For example,
-
-@table @code
-@item vax
-@findex vax
-@samp{vax} is predefined on Vax computers.
-
-@item mc68000
-@findex mc68000
-@samp{mc68000} is predefined on most computers whose CPU is a Motorola
-68000, 68010 or 68020.
-
-@item m68k
-@findex m68k
-@samp{m68k} is also predefined on most computers whose CPU is a 68000,
-68010 or 68020; however, some makers use @samp{mc68000} and some use
-@samp{m68k}. Some predefine both names. What happens in GNU C
-depends on the system you are using it on.
-
-@item M68020
-@findex M68020
-@samp{M68020} has been observed to be predefined on some systems that
-use 68020 CPUs---in addition to @samp{mc68000} and @samp{m68k}, which
-are less specific.
-
-@item _AM29K
-@findex _AM29K
-@itemx _AM29000
-@findex _AM29000
-Both @samp{_AM29K} and @samp{_AM29000} are predefined for the AMD 29000
-CPU family.
-
-@item ns32000
-@findex ns32000
-@samp{ns32000} is predefined on computers which use the National
-Semiconductor 32000 series CPU.
-@end table
-
-Yet other nonstandard predefined macros describe the manufacturer of
-the system. For example,
-
-@table @code
-@item sun
-@findex sun
-@samp{sun} is predefined on all models of Sun computers.
-
-@item pyr
-@findex pyr
-@samp{pyr} is predefined on all models of Pyramid computers.
-
-@item sequent
-@findex sequent
-@samp{sequent} is predefined on all models of Sequent computers.
-@end table
-
-These predefined symbols are not only nonstandard, they are contrary to the
-ANSI standard because their names do not start with underscores.
-Therefore, the option @samp{-ansi} inhibits the definition of these
-symbols.
-
-This tends to make @samp{-ansi} useless, since many programs depend on the
-customary nonstandard predefined symbols. Even system header files check
-them and will generate incorrect declarations if they do not find the names
-that are expected. You might think that the header files supplied for the
-Uglix computer would not need to test what machine they are running on,
-because they can simply assume it is the Uglix; but often they do, and they
-do so using the customary names. As a result, very few C programs will
-compile with @samp{-ansi}. We intend to avoid such problems on the GNU
-system.
-
-What, then, should you do in an ANSI C program to test the type of machine
-it will run on?
-
-GNU C offers a parallel series of symbols for this purpose, whose names
-are made from the customary ones by adding @samp{__} at the beginning
-and end. Thus, the symbol @code{__vax__} would be available on a Vax,
-and so on.
-
-The set of nonstandard predefined names in the GNU C preprocessor is
-controlled (when @code{cpp} is itself compiled) by the macro
-@samp{CPP_PREDEFINES}, which should be a string containing @samp{-D}
-options, separated by spaces. For example, on the Sun 3, we use the
-following definition:
-
-@example
-#define CPP_PREDEFINES "-Dmc68000 -Dsun -Dunix -Dm68k"
-@end example
-
-@noindent
-This macro is usually specified in @file{tm.h}.
-
-@node Stringification, Concatenation, Predefined, Macros
-@subsection Stringification
-
-@cindex stringification
-@dfn{Stringification} means turning a code fragment into a string constant
-whose contents are the text for the code fragment. For example,
-stringifying @samp{foo (z)} results in @samp{"foo (z)"}.
-
-In the C preprocessor, stringification is an option available when macro
-arguments are substituted into the macro definition. In the body of the
-definition, when an argument name appears, the character @samp{#} before
-the name specifies stringification of the corresponding actual argument
-when it is substituted at that point in the definition. The same argument
-may be substituted in other places in the definition without
-stringification if the argument name appears in those places with no
-@samp{#}.
-
-Here is an example of a macro definition that uses stringification:
-
-@smallexample
-@group
-#define WARN_IF(EXP) \
-do @{ if (EXP) \
- fprintf (stderr, "Warning: " #EXP "\n"); @} \
-while (0)
-@end group
-@end smallexample
-
-@noindent
-Here the actual argument for @samp{EXP} is substituted once as given,
-into the @samp{if} statement, and once as stringified, into the
-argument to @samp{fprintf}. The @samp{do} and @samp{while (0)} are
-a kludge to make it possible to write @samp{WARN_IF (@var{arg});},
-which the resemblance of @samp{WARN_IF} to a function would make
-C programmers want to do; see @ref{Swallow Semicolon}.
-
-The stringification feature is limited to transforming one macro argument
-into one string constant: there is no way to combine the argument with
-other text and then stringify it all together. But the example above shows
-how an equivalent result can be obtained in ANSI Standard C using the
-feature that adjacent string constants are concatenated as one string
-constant. The preprocessor stringifies the actual value of @samp{EXP}
-into a separate string constant, resulting in text like
-
-@smallexample
-@group
-do @{ if (x == 0) \
- fprintf (stderr, "Warning: " "x == 0" "\n"); @} \
-while (0)
-@end group
-@end smallexample
-
-@noindent
-but the C compiler then sees three consecutive string constants and
-concatenates them into one, producing effectively
-
-@smallexample
-do @{ if (x == 0) \
- fprintf (stderr, "Warning: x == 0\n"); @} \
-while (0)
-@end smallexample
-
-Stringification in C involves more than putting doublequote characters
-around the fragment; it is necessary to put backslashes in front of all
-doublequote characters, and all backslashes in string and character
-constants, in order to get a valid C string constant with the proper
-contents. Thus, stringifying @samp{p = "foo\n";} results in @samp{"p =
-\"foo\\n\";"}. However, backslashes that are not inside of string or
-character constants are not duplicated: @samp{\n} by itself stringifies to
-@samp{"\n"}.
-
-Whitespace (including comments) in the text being stringified is handled
-according to precise rules. All leading and trailing whitespace is ignored.
-Any sequence of whitespace in the middle of the text is converted to
-a single space in the stringified result.
-
-@node Concatenation, Undefining, Stringification, Macros
-@subsection Concatenation
-@cindex concatenation
-@cindex @samp{##}
-@dfn{Concatenation} means joining two strings into one. In the context
-of macro expansion, concatenation refers to joining two lexical units
-into one longer one. Specifically, an actual argument to the macro can be
-concatenated with another actual argument or with fixed text to produce
-a longer name. The longer name might be the name of a function,
-variable or type, or a C keyword; it might even be the name of another
-macro, in which case it will be expanded.
-
-When you define a macro, you request concatenation with the special
-operator @samp{##} in the macro body. When the macro is called,
-after actual arguments are substituted, all @samp{##} operators are
-deleted, and so is any whitespace next to them (including whitespace
-that was part of an actual argument). The result is to concatenate
-the syntactic tokens on either side of the @samp{##}.
-
-Consider a C program that interprets named commands. There probably needs
-to be a table of commands, perhaps an array of structures declared as
-follows:
-
-@example
-struct command
-@{
- char *name;
- void (*function) ();
-@};
-
-struct command commands[] =
-@{
- @{ "quit", quit_command@},
- @{ "help", help_command@},
- @dots{}
-@};
-@end example
-
-It would be cleaner not to have to give each command name twice, once in
-the string constant and once in the function name. A macro which takes the
-name of a command as an argument can make this unnecessary. The string
-constant can be created with stringification, and the function name by
-concatenating the argument with @samp{_command}. Here is how it is done:
-
-@example
-#define COMMAND(NAME) @{ #NAME, NAME ## _command @}
-
-struct command commands[] =
-@{
- COMMAND (quit),
- COMMAND (help),
- @dots{}
-@};
-@end example
-
-The usual case of concatenation is concatenating two names (or a name and a
-number) into a longer name. But this isn't the only valid case. It is
-also possible to concatenate two numbers (or a number and a name, such as
-@samp{1.5} and @samp{e3}) into a number. Also, multi-character operators
-such as @samp{+=} can be formed by concatenation. In some cases it is even
-possible to piece together a string constant. However, two pieces of text
-that don't together form a valid lexical unit cannot be concatenated. For
-example, concatenation with @samp{x} on one side and @samp{+} on the other
-is not meaningful because those two characters can't fit together in any
-lexical unit of C@. The ANSI standard says that such attempts at
-concatenation are undefined, but in the GNU C preprocessor it is well
-defined: it puts the @samp{x} and @samp{+} side by side with no particular
-special results.
-
-Keep in mind that the C preprocessor converts comments to whitespace before
-macros are even considered. Therefore, you cannot create a comment by
-concatenating @samp{/} and @samp{*}: the @samp{/*} sequence that starts a
-comment is not a lexical unit, but rather the beginning of a ``long'' space
-character. Also, you can freely use comments next to a @samp{##} in a
-macro definition, or in actual arguments that will be concatenated, because
-the comments will be converted to spaces at first sight, and concatenation
-will later discard the spaces.
-
-@node Undefining, Redefining, Concatenation, Macros
-@subsection Undefining Macros
-
-@cindex undefining macros
-To @dfn{undefine} a macro means to cancel its definition. This is done
-with the @samp{#undef} directive. @samp{#undef} is followed by the macro
-name to be undefined.
-
-Like definition, undefinition occurs at a specific point in the source
-file, and it applies starting from that point. The name ceases to be a
-macro name, and from that point on it is treated by the preprocessor as if
-it had never been a macro name.
-
-For example,
-
-@example
-#define FOO 4
-x = FOO;
-#undef FOO
-x = FOO;
-@end example
-
-@noindent
-expands into
-
-@example
-x = 4;
-
-x = FOO;
-@end example
-
-@noindent
-In this example, @samp{FOO} had better be a variable or function as well
-as (temporarily) a macro, in order for the result of the expansion to be
-valid C code.
-
-The same form of @samp{#undef} directive will cancel definitions with
-arguments or definitions that don't expect arguments. The @samp{#undef}
-directive has no effect when used on a name not currently defined as a macro.
-
-@node Redefining, Macro Pitfalls, Undefining, Macros
-@subsection Redefining Macros
-
-@cindex redefining macros
-@dfn{Redefining} a macro means defining (with @samp{#define}) a name that
-is already defined as a macro.
-
-A redefinition is trivial if the new definition is transparently identical
-to the old one. You probably wouldn't deliberately write a trivial
-redefinition, but they can happen automatically when a header file is
-included more than once (@pxref{Header Files}), so they are accepted
-silently and without effect.
-
-Nontrivial redefinition is considered likely to be an error, so
-it provokes a warning message from the preprocessor. However, sometimes it
-is useful to change the definition of a macro in mid-compilation. You can
-inhibit the warning by undefining the macro with @samp{#undef} before the
-second definition.
-
-In order for a redefinition to be trivial, the new definition must
-exactly match the one already in effect, with two possible exceptions:
-
-@itemize @bullet
-@item
-Whitespace may be added or deleted at the beginning or the end.
-
-@item
-Whitespace may be changed in the middle (but not inside strings).
-However, it may not be eliminated entirely, and it may not be added
-where there was no whitespace at all.
-@end itemize
-
-Recall that a comment counts as whitespace.
-
-@node Macro Pitfalls,, Redefining, Macros
-@subsection Pitfalls and Subtleties of Macros
-@cindex problems with macros
-@cindex pitfalls of macros
-
-In this section we describe some special rules that apply to macros and
-macro expansion, and point out certain cases in which the rules have
-counterintuitive consequences that you must watch out for.
-
-@menu
-* Misnesting:: Macros can contain unmatched parentheses.
-* Macro Parentheses:: Why apparently superfluous parentheses
- may be necessary to avoid incorrect grouping.
-* Swallow Semicolon:: Macros that look like functions
- but expand into compound statements.
-* Side Effects:: Unsafe macros that cause trouble when
- arguments contain side effects.
-* Self-Reference:: Macros whose definitions use the macros' own names.
-* Argument Prescan:: Actual arguments are checked for macro calls
- before they are substituted.
-* Cascaded Macros:: Macros whose definitions use other macros.
-* Newlines in Args:: Sometimes line numbers get confused.
-@end menu
-
-@node Misnesting, Macro Parentheses, Macro Pitfalls, Macro Pitfalls
-@subsubsection Improperly Nested Constructs
-
-Recall that when a macro is called with arguments, the arguments are
-substituted into the macro body and the result is checked, together with
-the rest of the input file, for more macro calls.
-
-It is possible to piece together a macro call coming partially from the
-macro body and partially from the actual arguments. For example,
-
-@example
-#define double(x) (2*(x))
-#define call_with_1(x) x(1)
-@end example
-
-@noindent
-would expand @samp{call_with_1 (double)} into @samp{(2*(1))}.
-
-Macro definitions do not have to have balanced parentheses. By writing an
-unbalanced open parenthesis in a macro body, it is possible to create a
-macro call that begins inside the macro body but ends outside of it. For
-example,
-
-@example
-#define strange(file) fprintf (file, "%s %d",
-@dots{}
-strange(stderr) p, 35)
-@end example
-
-@noindent
-This bizarre example expands to @samp{fprintf (stderr, "%s %d", p, 35)}!
-
-@node Macro Parentheses, Swallow Semicolon, Misnesting, Macro Pitfalls
-@subsubsection Unintended Grouping of Arithmetic
-@cindex parentheses in macro bodies
-
-You may have noticed that in most of the macro definition examples shown
-above, each occurrence of a macro argument name had parentheses around it.
-In addition, another pair of parentheses usually surround the entire macro
-definition. Here is why it is best to write macros that way.
-
-Suppose you define a macro as follows,
-
-@example
-#define ceil_div(x, y) (x + y - 1) / y
-@end example
-
-@noindent
-whose purpose is to divide, rounding up. (One use for this operation is
-to compute how many @samp{int} objects are needed to hold a certain
-number of @samp{char} objects.) Then suppose it is used as follows:
-
-@example
-a = ceil_div (b & c, sizeof (int));
-@end example
-
-@noindent
-This expands into
-
-@example
-a = (b & c + sizeof (int) - 1) / sizeof (int);
-@end example
-
-@noindent
-which does not do what is intended. The operator-precedence rules of
-C make it equivalent to this:
-
-@example
-a = (b & (c + sizeof (int) - 1)) / sizeof (int);
-@end example
-
-@noindent
-But what we want is this:
-
-@example
-a = ((b & c) + sizeof (int) - 1)) / sizeof (int);
-@end example
-
-@noindent
-Defining the macro as
-
-@example
-#define ceil_div(x, y) ((x) + (y) - 1) / (y)
-@end example
-
-@noindent
-provides the desired result.
-
-Unintended grouping can result in another way. Consider
-@samp{sizeof ceil_div(1, 2)}. That has the appearance of a C expression
-that would compute the size of the type of @samp{ceil_div (1, 2)}, but in
-fact it means something very different. Here is what it expands to:
-
-@example
-sizeof ((1) + (2) - 1) / (2)
-@end example
-
-@noindent
-This would take the size of an integer and divide it by two. The precedence
-rules have put the division outside the @samp{sizeof} when it was intended
-to be inside.
-
-Parentheses around the entire macro definition can prevent such problems.
-Here, then, is the recommended way to define @samp{ceil_div}:
-
-@example
-#define ceil_div(x, y) (((x) + (y) - 1) / (y))
-@end example
-
-@node Swallow Semicolon, Side Effects, Macro Parentheses, Macro Pitfalls
-@subsubsection Swallowing the Semicolon
-
-@cindex semicolons (after macro calls)
-Often it is desirable to define a macro that expands into a compound
-statement. Consider, for example, the following macro, that advances a
-pointer (the argument @samp{p} says where to find it) across whitespace
-characters:
-
-@example
-#define SKIP_SPACES (p, limit) \
-@{ register char *lim = (limit); \
- while (p != lim) @{ \
- if (*p++ != ' ') @{ \
- p--; break; @}@}@}
-@end example
-
-@noindent
-Here Backslash-Newline is used to split the macro definition, which must
-be a single line, so that it resembles the way such C code would be
-laid out if not part of a macro definition.
-
-A call to this macro might be @samp{SKIP_SPACES (p, lim)}. Strictly
-speaking, the call expands to a compound statement, which is a complete
-statement with no need for a semicolon to end it. But it looks like a
-function call. So it minimizes confusion if you can use it like a function
-call, writing a semicolon afterward, as in @samp{SKIP_SPACES (p, lim);}
-
-But this can cause trouble before @samp{else} statements, because the
-semicolon is actually a null statement. Suppose you write
-
-@example
-if (*p != 0)
- SKIP_SPACES (p, lim);
-else @dots{}
-@end example
-
-@noindent
-The presence of two statements---the compound statement and a null
-statement---in between the @samp{if} condition and the @samp{else}
-makes invalid C code.
-
-The definition of the macro @samp{SKIP_SPACES} can be altered to solve
-this problem, using a @samp{do @dots{} while} statement. Here is how:
-
-@example
-#define SKIP_SPACES (p, limit) \
-do @{ register char *lim = (limit); \
- while (p != lim) @{ \
- if (*p++ != ' ') @{ \
- p--; break; @}@}@} \
-while (0)
-@end example
-
-Now @samp{SKIP_SPACES (p, lim);} expands into
-
-@example
-do @{@dots{}@} while (0);
-@end example
-
-@noindent
-which is one statement.
-
-@node Side Effects, Self-Reference, Swallow Semicolon, Macro Pitfalls
-@subsubsection Duplication of Side Effects
-
-@cindex side effects (in macro arguments)
-@cindex unsafe macros
-Many C programs define a macro @samp{min}, for ``minimum'', like this:
-
-@example
-#define min(X, Y) ((X) < (Y) ? (X) : (Y))
-@end example
-
-When you use this macro with an argument containing a side effect,
-as shown here,
-
-@example
-next = min (x + y, foo (z));
-@end example
-
-@noindent
-it expands as follows:
-
-@example
-next = ((x + y) < (foo (z)) ? (x + y) : (foo (z)));
-@end example
-
-@noindent
-where @samp{x + y} has been substituted for @samp{X} and @samp{foo (z)}
-for @samp{Y}.
-
-The function @samp{foo} is used only once in the statement as it appears
-in the program, but the expression @samp{foo (z)} has been substituted
-twice into the macro expansion. As a result, @samp{foo} might be called
-two times when the statement is executed. If it has side effects or
-if it takes a long time to compute, the results might not be what you
-intended. We say that @samp{min} is an @dfn{unsafe} macro.
-
-The best solution to this problem is to define @samp{min} in a way that
-computes the value of @samp{foo (z)} only once. The C language offers no
-standard way to do this, but it can be done with GNU C extensions as
-follows:
-
-@example
-#define min(X, Y) \
-(@{ typeof (X) __x = (X), __y = (Y); \
- (__x < __y) ? __x : __y; @})
-@end example
-
-If you do not wish to use GNU C extensions, the only solution is to be
-careful when @emph{using} the macro @samp{min}. For example, you can
-calculate the value of @samp{foo (z)}, save it in a variable, and use that
-variable in @samp{min}:
-
-@example
-#define min(X, Y) ((X) < (Y) ? (X) : (Y))
-@dots{}
-@{
- int tem = foo (z);
- next = min (x + y, tem);
-@}
-@end example
-
-@noindent
-(where we assume that @samp{foo} returns type @samp{int}).
-
-@node Self-Reference, Argument Prescan, Side Effects, Macro Pitfalls
-@subsubsection Self-Referential Macros
-
-@cindex self-reference
-A @dfn{self-referential} macro is one whose name appears in its definition.
-A special feature of ANSI Standard C is that the self-reference is not
-considered a macro call. It is passed into the preprocessor output
-unchanged.
-
-Let's consider an example:
-
-@example
-#define foo (4 + foo)
-@end example
-
-@noindent
-where @samp{foo} is also a variable in your program.
-
-Following the ordinary rules, each reference to @samp{foo} will expand into
-@samp{(4 + foo)}; then this will be rescanned and will expand into @samp{(4
-+ (4 + foo))}; and so on until it causes a fatal error (memory full) in the
-preprocessor.
-
-However, the special rule about self-reference cuts this process short
-after one step, at @samp{(4 + foo)}. Therefore, this macro definition
-has the possibly useful effect of causing the program to add 4 to
-the value of @samp{foo} wherever @samp{foo} is referred to.
-
-In most cases, it is a bad idea to take advantage of this feature. A
-person reading the program who sees that @samp{foo} is a variable will
-not expect that it is a macro as well. The reader will come across the
-identifier @samp{foo} in the program and think its value should be that
-of the variable @samp{foo}, whereas in fact the value is four greater.
-
-The special rule for self-reference applies also to @dfn{indirect}
-self-reference. This is the case where a macro @var{x} expands to use a
-macro @samp{y}, and the expansion of @samp{y} refers to the macro
-@samp{x}. The resulting reference to @samp{x} comes indirectly from the
-expansion of @samp{x}, so it is a self-reference and is not further
-expanded. Thus, after
-
-@example
-#define x (4 + y)
-#define y (2 * x)
-@end example
-
-@noindent
-@samp{x} would expand into @samp{(4 + (2 * x))}. Clear?
-
-But suppose @samp{y} is used elsewhere, not from the definition of @samp{x}.
-Then the use of @samp{x} in the expansion of @samp{y} is not a self-reference
-because @samp{x} is not ``in progress''. So it does expand. However,
-the expansion of @samp{x} contains a reference to @samp{y}, and that
-is an indirect self-reference now because @samp{y} is ``in progress''.
-The result is that @samp{y} expands to @samp{(2 * (4 + y))}.
-
-It is not clear that this behavior would ever be useful, but it is specified
-by the ANSI C standard, so you may need to understand it.
-
-@node Argument Prescan, Cascaded Macros, Self-Reference, Macro Pitfalls
-@subsubsection Separate Expansion of Macro Arguments
-@cindex expansion of arguments
-@cindex macro argument expansion
-@cindex prescan of macro arguments
-
-We have explained that the expansion of a macro, including the substituted
-actual arguments, is scanned over again for macro calls to be expanded.
-
-What really happens is more subtle: first each actual argument text is scanned
-separately for macro calls. Then the results of this are substituted into
-the macro body to produce the macro expansion, and the macro expansion
-is scanned again for macros to expand.
-
-The result is that the actual arguments are scanned @emph{twice} to expand
-macro calls in them.
-
-Most of the time, this has no effect. If the actual argument contained
-any macro calls, they are expanded during the first scan. The result
-therefore contains no macro calls, so the second scan does not change it.
-If the actual argument were substituted as given, with no prescan,
-the single remaining scan would find the same macro calls and produce
-the same results.
-
-You might expect the double scan to change the results when a
-self-referential macro is used in an actual argument of another macro
-(@pxref{Self-Reference}): the self-referential macro would be expanded once
-in the first scan, and a second time in the second scan. But this is not
-what happens. The self-references that do not expand in the first scan are
-marked so that they will not expand in the second scan either.
-
-The prescan is not done when an argument is stringified or concatenated.
-Thus,
-
-@example
-#define str(s) #s
-#define foo 4
-str (foo)
-@end example
-
-@noindent
-expands to @samp{"foo"}. Once more, prescan has been prevented from
-having any noticeable effect.
-
-More precisely, stringification and concatenation use the argument as
-written, in un-prescanned form. The same actual argument would be used in
-prescanned form if it is substituted elsewhere without stringification or
-concatenation.
-
-@example
-#define str(s) #s lose(s)
-#define foo 4
-str (foo)
-@end example
-
-expands to @samp{"foo" lose(4)}.
-
-You might now ask, ``Why mention the prescan, if it makes no difference?
-And why not skip it and make the preprocessor faster?'' The answer is
-that the prescan does make a difference in three special cases:
-
-@itemize @bullet
-@item
-Nested calls to a macro.
-
-@item
-Macros that call other macros that stringify or concatenate.
-
-@item
-Macros whose expansions contain unshielded commas.
-@end itemize
-
-We say that @dfn{nested} calls to a macro occur when a macro's actual
-argument contains a call to that very macro. For example, if @samp{f}
-is a macro that expects one argument, @samp{f (f (1))} is a nested
-pair of calls to @samp{f}. The desired expansion is made by
-expanding @samp{f (1)} and substituting that into the definition of
-@samp{f}. The prescan causes the expected result to happen.
-Without the prescan, @samp{f (1)} itself would be substituted as
-an actual argument, and the inner use of @samp{f} would appear
-during the main scan as an indirect self-reference and would not
-be expanded. Here, the prescan cancels an undesirable side effect
-(in the medical, not computational, sense of the term) of the special
-rule for self-referential macros.
-
-But prescan causes trouble in certain other cases of nested macro calls.
-Here is an example:
-
-@example
-#define foo a,b
-#define bar(x) lose(x)
-#define lose(x) (1 + (x))
-
-bar(foo)
-@end example
-
-@noindent
-We would like @samp{bar(foo)} to turn into @samp{(1 + (foo))}, which
-would then turn into @samp{(1 + (a,b))}. But instead, @samp{bar(foo)}
-expands into @samp{lose(a,b)}, and you get an error because @code{lose}
-requires a single argument. In this case, the problem is easily solved
-by the same parentheses that ought to be used to prevent misnesting of
-arithmetic operations:
-
-@example
-#define foo (a,b)
-#define bar(x) lose((x))
-@end example
-
-The problem is more serious when the operands of the macro are not
-expressions; for example, when they are statements. Then parentheses
-are unacceptable because they would make for invalid C code:
-
-@example
-#define foo @{ int a, b; @dots{} @}
-@end example
-
-@noindent
-In GNU C you can shield the commas using the @samp{(@{@dots{}@})}
-construct which turns a compound statement into an expression:
-
-@example
-#define foo (@{ int a, b; @dots{} @})
-@end example
-
-Or you can rewrite the macro definition to avoid such commas:
-
-@example
-#define foo @{ int a; int b; @dots{} @}
-@end example
-
-There is also one case where prescan is useful. It is possible
-to use prescan to expand an argument and then stringify it---if you use
-two levels of macros. Let's add a new macro @samp{xstr} to the
-example shown above:
-
-@example
-#define xstr(s) str(s)
-#define str(s) #s
-#define foo 4
-xstr (foo)
-@end example
-
-This expands into @samp{"4"}, not @samp{"foo"}. The reason for the
-difference is that the argument of @samp{xstr} is expanded at prescan
-(because @samp{xstr} does not specify stringification or concatenation of
-the argument). The result of prescan then forms the actual argument for
-@samp{str}. @samp{str} uses its argument without prescan because it
-performs stringification; but it cannot prevent or undo the prescanning
-already done by @samp{xstr}.
-
-@node Cascaded Macros, Newlines in Args, Argument Prescan, Macro Pitfalls
-@subsubsection Cascaded Use of Macros
-
-@cindex cascaded macros
-@cindex macro body uses macro
-A @dfn{cascade} of macros is when one macro's body contains a reference
-to another macro. This is very common practice. For example,
-
-@example
-#define BUFSIZE 1020
-#define TABLESIZE BUFSIZE
-@end example
-
-This is not at all the same as defining @samp{TABLESIZE} to be @samp{1020}.
-The @samp{#define} for @samp{TABLESIZE} uses exactly the body you
-specify---in this case, @samp{BUFSIZE}---and does not check to see whether
-it too is the name of a macro.
-
-It's only when you @emph{use} @samp{TABLESIZE} that the result of its expansion
-is checked for more macro names.
-
-This makes a difference if you change the definition of @samp{BUFSIZE}
-at some point in the source file. @samp{TABLESIZE}, defined as shown,
-will always expand using the definition of @samp{BUFSIZE} that is
-currently in effect:
-
-@example
-#define BUFSIZE 1020
-#define TABLESIZE BUFSIZE
-#undef BUFSIZE
-#define BUFSIZE 37
-@end example
-
-@noindent
-Now @samp{TABLESIZE} expands (in two stages) to @samp{37}. (The
-@samp{#undef} is to prevent any warning about the nontrivial
-redefinition of @code{BUFSIZE}.)
-
-@node Newlines in Args,, Cascaded Macros, Macro Pitfalls
-@subsection Newlines in Macro Arguments
-@cindex newlines in macro arguments
-
-Traditional macro processing carries forward all newlines in macro
-arguments into the expansion of the macro. This means that, if some of
-the arguments are substituted more than once, or not at all, or out of
-order, newlines can be duplicated, lost, or moved around within the
-expansion. If the expansion consists of multiple statements, then the
-effect is to distort the line numbers of some of these statements. The
-result can be incorrect line numbers, in error messages or displayed in
-a debugger.
-
-The GNU C preprocessor operating in ANSI C mode adjusts appropriately
-for multiple use of an argument---the first use expands all the
-newlines, and subsequent uses of the same argument produce no newlines.
-But even in this mode, it can produce incorrect line numbering if
-arguments are used out of order, or not used at all.
-
-Here is an example illustrating this problem:
-
-@example
-#define ignore_second_arg(a,b,c) a; c
-
-ignore_second_arg (foo (),
- ignored (),
- syntax error);
-@end example
-
-@noindent
-The syntax error triggered by the tokens @samp{syntax error} results
-in an error message citing line four, even though the statement text
-comes from line five.
-
-@node Conditionals, Combining Sources, Macros, Top
-@section Conditionals
-
-@cindex conditionals
-In a macro processor, a @dfn{conditional} is a directive that allows a part
-of the program to be ignored during compilation, on some conditions.
-In the C preprocessor, a conditional can test either an arithmetic expression
-or whether a name is defined as a macro.
-
-A conditional in the C preprocessor resembles in some ways an @samp{if}
-statement in C, but it is important to understand the difference between
-them. The condition in an @samp{if} statement is tested during the execution
-of your program. Its purpose is to allow your program to behave differently
-from run to run, depending on the data it is operating on. The condition
-in a preprocessing conditional directive is tested when your program is compiled.
-Its purpose is to allow different code to be included in the program depending
-on the situation at the time of compilation.
-
-@menu
-* Uses: Conditional Uses. What conditionals are for.
-* Syntax: Conditional Syntax. How conditionals are written.
-* Deletion: Deleted Code. Making code into a comment.
-* Macros: Conditionals-Macros. Why conditionals are used with macros.
-* Assertions:: How and why to use assertions.
-* Errors: #error Directive. Detecting inconsistent compilation parameters.
-@end menu
-
-@node Conditional Uses
-@subsection Why Conditionals are Used
-
-Generally there are three kinds of reason to use a conditional.
-
-@itemize @bullet
-@item
-A program may need to use different code depending on the machine or
-operating system it is to run on. In some cases the code for one
-operating system may be erroneous on another operating system; for
-example, it might refer to library routines that do not exist on the
-other system. When this happens, it is not enough to avoid executing
-the invalid code: merely having it in the program makes it impossible
-to link the program and run it. With a preprocessing conditional, the
-offending code can be effectively excised from the program when it is
-not valid.
-
-@item
-You may want to be able to compile the same source file into two
-different programs. Sometimes the difference between the programs is
-that one makes frequent time-consuming consistency checks on its
-intermediate data, or prints the values of those data for debugging,
-while the other does not.
-
-@item
-A conditional whose condition is always false is a good way to exclude
-code from the program but keep it as a sort of comment for future
-reference.
-@end itemize
-
-Most simple programs that are intended to run on only one machine will
-not need to use preprocessing conditionals.
-
-@node Conditional Syntax
-@subsection Syntax of Conditionals
-
-@findex #if
-A conditional in the C preprocessor begins with a @dfn{conditional
-directive}: @samp{#if}, @samp{#ifdef} or @samp{#ifndef}.
-@xref{Conditionals-Macros}, for information on @samp{#ifdef} and
-@samp{#ifndef}; only @samp{#if} is explained here.
-
-@menu
-* If: #if Directive. Basic conditionals using @samp{#if} and @samp{#endif}.
-* Else: #else Directive. Including some text if the condition fails.
-* Elif: #elif Directive. Testing several alternative possibilities.
-@end menu
-
-@node #if Directive
-@subsubsection The @samp{#if} Directive
-
-The @samp{#if} directive in its simplest form consists of
-
-@example
-#if @var{expression}
-@var{controlled text}
-#endif /* @var{expression} */
-@end example
-
-The comment following the @samp{#endif} is not required, but it is a good
-practice because it helps people match the @samp{#endif} to the
-corresponding @samp{#if}. Such comments should always be used, except in
-short conditionals that are not nested. In fact, you can put anything at
-all after the @samp{#endif} and it will be ignored by the GNU C preprocessor,
-but only comments are acceptable in ANSI Standard C@.
-
-@var{expression} is a C expression of integer type, subject to stringent
-restrictions. It may contain
-
-@itemize @bullet
-@item
-Integer constants, which are all regarded as @code{long} or
-@code{unsigned long}.
-
-@item
-Character constants, which are interpreted according to the character
-set and conventions of the machine and operating system on which the
-preprocessor is running. The GNU C preprocessor uses the C data type
-@samp{char} for these character constants; therefore, whether some
-character codes are negative is determined by the C compiler used to
-compile the preprocessor. If it treats @samp{char} as signed, then
-character codes large enough to set the sign bit will be considered
-negative; otherwise, no character code is considered negative.
-
-@item
-Arithmetic operators for addition, subtraction, multiplication,
-division, bitwise operations, shifts, comparisons, and logical
-operations (@samp{&&} and @samp{||}).
-
-@item
-Identifiers that are not macros, which are all treated as zero(!).
-
-@item
-Macro calls. All macro calls in the expression are expanded before
-actual computation of the expression's value begins.
-@end itemize
-
-Note that @samp{sizeof} operators and @code{enum}-type values are not allowed.
-@code{enum}-type values, like all other identifiers that are not taken
-as macro calls and expanded, are treated as zero.
-
-The @var{controlled text} inside of a conditional can include
-preprocessing directives. Then the directives inside the conditional are
-obeyed only if that branch of the conditional succeeds. The text can
-also contain other conditional groups. However, the @samp{#if} and
-@samp{#endif} directives must balance.
-
-@node #else Directive
-@subsubsection The @samp{#else} Directive
-
-@findex #else
-The @samp{#else} directive can be added to a conditional to provide
-alternative text to be used if the condition is false. This is what
-it looks like:
-
-@example
-#if @var{expression}
-@var{text-if-true}
-#else /* Not @var{expression} */
-@var{text-if-false}
-#endif /* Not @var{expression} */
-@end example
-
-If @var{expression} is nonzero, and thus the @var{text-if-true} is
-active, then @samp{#else} acts like a failing conditional and the
-@var{text-if-false} is ignored. Contrariwise, if the @samp{#if}
-conditional fails, the @var{text-if-false} is considered included.
-
-@node #elif Directive
-@subsubsection The @samp{#elif} Directive
-
-@findex #elif
-One common case of nested conditionals is used to check for more than two
-possible alternatives. For example, you might have
-
-@example
-#if X == 1
-@dots{}
-#else /* X != 1 */
-#if X == 2
-@dots{}
-#else /* X != 2 */
-@dots{}
-#endif /* X != 2 */
-#endif /* X != 1 */
-@end example
-
-Another conditional directive, @samp{#elif}, allows this to be abbreviated
-as follows:
-
-@example
-#if X == 1
-@dots{}
-#elif X == 2
-@dots{}
-#else /* X != 2 and X != 1*/
-@dots{}
-#endif /* X != 2 and X != 1*/
-@end example
-
-@samp{#elif} stands for ``else if''. Like @samp{#else}, it goes in the
-middle of a @samp{#if}-@samp{#endif} pair and subdivides it; it does not
-require a matching @samp{#endif} of its own. Like @samp{#if}, the
-@samp{#elif} directive includes an expression to be tested.
-
-The text following the @samp{#elif} is processed only if the original
-@samp{#if}-condition failed and the @samp{#elif} condition succeeds.
-More than one @samp{#elif} can go in the same @samp{#if}-@samp{#endif}
-group. Then the text after each @samp{#elif} is processed only if the
-@samp{#elif} condition succeeds after the original @samp{#if} and any
-previous @samp{#elif} directives within it have failed. @samp{#else} is
-equivalent to @samp{#elif 1}, and @samp{#else} is allowed after any
-number of @samp{#elif} directives, but @samp{#elif} may not follow
-@samp{#else}.
-
-@node Deleted Code
-@subsection Keeping Deleted Code for Future Reference
-@cindex commenting out code
-
-If you replace or delete a part of the program but want to keep the old
-code around as a comment for future reference, the easy way to do this
-is to put @samp{#if 0} before it and @samp{#endif} after it. This is
-better than using comment delimiters @samp{/*} and @samp{*/} since those
-won't work if the code already contains comments (C comments do not
-nest).
-
-This works even if the code being turned off contains conditionals, but
-they must be entire conditionals (balanced @samp{#if} and @samp{#endif}).
-
-Conversely, do not use @samp{#if 0} for comments which are not C code.
-Use the comment delimiters @samp{/*} and @samp{*/} instead. The
-interior of @samp{#if 0} must consist of complete tokens; in particular,
-singlequote characters must balance. But comments often contain
-unbalanced singlequote characters (known in English as apostrophes).
-These confuse @samp{#if 0}. They do not confuse @samp{/*}.
-
-@node Conditionals-Macros
-@subsection Conditionals and Macros
-
-Conditionals are useful in connection with macros or assertions, because
-those are the only ways that an expression's value can vary from one
-compilation to another. A @samp{#if} directive whose expression uses no
-macros or assertions is equivalent to @samp{#if 1} or @samp{#if 0}; you
-might as well determine which one, by computing the value of the
-expression yourself, and then simplify the program.
-
-For example, here is a conditional that tests the expression
-@samp{BUFSIZE == 1020}, where @samp{BUFSIZE} must be a macro.
-
-@example
-#if BUFSIZE == 1020
- printf ("Large buffers!\n");
-#endif /* BUFSIZE is large */
-@end example
-
-(Programmers often wish they could test the size of a variable or data
-type in @samp{#if}, but this does not work. The preprocessor does not
-understand @code{sizeof}, or typedef names, or even the type keywords
-such as @code{int}.)
-
-@findex defined
-The special operator @samp{defined} is used in @samp{#if} expressions to
-test whether a certain name is defined as a macro. Either @samp{defined
-@var{name}} or @samp{defined (@var{name})} is an expression whose value
-is 1 if @var{name} is defined as macro at the current point in the
-program, and 0 otherwise. For the @samp{defined} operator it makes no
-difference what the definition of the macro is; all that matters is
-whether there is a definition. Thus, for example,@refill
-
-@example
-#if defined (vax) || defined (ns16000)
-@end example
-
-@noindent
-would succeed if either of the names @samp{vax} and @samp{ns16000} is
-defined as a macro. You can test the same condition using assertions
-(@pxref{Assertions}), like this:
-
-@example
-#if #cpu (vax) || #cpu (ns16000)
-@end example
-
-If a macro is defined and later undefined with @samp{#undef},
-subsequent use of the @samp{defined} operator returns 0, because
-the name is no longer defined. If the macro is defined again with
-another @samp{#define}, @samp{defined} will recommence returning 1.
-
-@findex #ifdef
-@findex #ifndef
-Conditionals that test whether just one name is defined are very common,
-so there are two special short conditional directives for this case.
-
-@table @code
-@item #ifdef @var{name}
-is equivalent to @samp{#if defined (@var{name})}.
-
-@item #ifndef @var{name}
-is equivalent to @samp{#if ! defined (@var{name})}.
-@end table
-
-Macro definitions can vary between compilations for several reasons.
-
-@itemize @bullet
-@item
-Some macros are predefined on each kind of machine. For example, on a
-Vax, the name @samp{vax} is a predefined macro. On other machines, it
-would not be defined.
-
-@item
-Many more macros are defined by system header files. Different
-systems and machines define different macros, or give them different
-values. It is useful to test these macros with conditionals to avoid
-using a system feature on a machine where it is not implemented.
-
-@item
-Macros are a common way of allowing users to customize a program for
-different machines or applications. For example, the macro
-@samp{BUFSIZE} might be defined in a configuration file for your
-program that is included as a header file in each source file. You
-would use @samp{BUFSIZE} in a preprocessing conditional in order to
-generate different code depending on the chosen configuration.
-
-@item
-Macros can be defined or undefined with @samp{-D} and @samp{-U}
-command options when you compile the program. You can arrange to
-compile the same source file into two different programs by choosing
-a macro name to specify which program you want, writing conditionals
-to test whether or how this macro is defined, and then controlling
-the state of the macro with compiler command options.
-@xref{Invocation}.
-@end itemize
-
-@ifinfo
-Assertions are usually predefined, but can be defined with preprocessor
-directives or command-line options.
-@end ifinfo
-
-@node Assertions
-@subsection Assertions
-
-@cindex assertions
-@dfn{Assertions} are a more systematic alternative to macros in writing
-conditionals to test what sort of computer or system the compiled
-program will run on. Assertions are usually predefined, but you can
-define them with preprocessing directives or command-line options.
-
-@cindex predicates
-The macros traditionally used to describe the type of target are not
-classified in any way according to which question they answer; they may
-indicate a hardware architecture, a particular hardware model, an
-operating system, a particular version of an operating system, or
-specific configuration options. These are jumbled together in a single
-namespace. In contrast, each assertion consists of a named question and
-an answer. The question is usually called the @dfn{predicate}.
-An assertion looks like this:
-
-@example
-#@var{predicate} (@var{answer})
-@end example
-
-@noindent
-You must use a properly formed identifier for @var{predicate}. The
-value of @var{answer} can be any sequence of words; all characters are
-significant except for leading and trailing whitespace, and differences
-in internal whitespace sequences are ignored. Thus, @samp{x + y} is
-different from @samp{x+y} but equivalent to @samp{x + y}. @samp{)} is
-not allowed in an answer.
-
-@cindex testing predicates
-Here is a conditional to test whether the answer @var{answer} is asserted
-for the predicate @var{predicate}:
-
-@example
-#if #@var{predicate} (@var{answer})
-@end example
-
-@noindent
-There may be more than one answer asserted for a given predicate. If
-you omit the answer, you can test whether @emph{any} answer is asserted
-for @var{predicate}:
-
-@example
-#if #@var{predicate}
-@end example
-
-@findex #system
-@findex #machine
-@findex #cpu
-Most of the time, the assertions you test will be predefined assertions.
-GNU C provides three predefined predicates: @code{system}, @code{cpu},
-and @code{machine}. @code{system} is for assertions about the type of
-software, @code{cpu} describes the type of computer architecture, and
-@code{machine} gives more information about the computer. For example,
-on a GNU system, the following assertions would be true:
-
-@example
-#system (gnu)
-#system (mach)
-#system (mach 3)
-#system (mach 3.@var{subversion})
-#system (hurd)
-#system (hurd @var{version})
-@end example
-
-@noindent
-and perhaps others. The alternatives with
-more or less version information let you ask more or less detailed
-questions about the type of system software.
-
-On a Unix system, you would find @code{#system (unix)} and perhaps one of:
-@code{#system (aix)}, @code{#system (bsd)}, @code{#system (hpux)},
-@code{#system (lynx)}, @code{#system (mach)}, @code{#system (posix)},
-@code{#system (svr3)}, @code{#system (svr4)}, or @code{#system (xpg4)}
-with possible version numbers following.
-
-Other values for @code{system} are @code{#system (mvs)}
-and @code{#system (vms)}.
-
-@strong{Portability note:} Many Unix C compilers provide only one answer
-for the @code{system} assertion: @code{#system (unix)}, if they support
-assertions at all. This is less than useful.
-
-An assertion with a multi-word answer is completely different from several
-assertions with individual single-word answers. For example, the presence
-of @code{system (mach 3.0)} does not mean that @code{system (3.0)} is true.
-It also does not directly imply @code{system (mach)}, but in GNU C, that
-last will normally be asserted as well.
-
-The current list of possible assertion values for @code{cpu} is:
-@code{#cpu (a29k)}, @code{#cpu (alpha)}, @code{#cpu (arm)}, @code{#cpu
-(clipper)}, @code{#cpu (convex)}, @code{#cpu (elxsi)}, @code{#cpu
-(tron)}, @code{#cpu (h8300)}, @code{#cpu (i370)}, @code{#cpu (i386)},
-@code{#cpu (i860)}, @code{#cpu (i960)}, @code{#cpu (m68k)}, @code{#cpu
-(m88k)}, @code{#cpu (mips)}, @code{#cpu (ns32k)}, @code{#cpu (hppa)},
-@code{#cpu (pyr)}, @code{#cpu (ibm032)}, @code{#cpu (rs6000)},
-@code{#cpu (sh)}, @code{#cpu (sparc)}, @code{#cpu (spur)}, @code{#cpu
-(tahoe)}, @code{#cpu (vax)}, @code{#cpu (we32000)}.
-
-@findex #assert
-You can create assertions within a C program using @samp{#assert}, like
-this:
-
-@example
-#assert @var{predicate} (@var{answer})
-@end example
-
-@noindent
-(Note the absence of a @samp{#} before @var{predicate}.)
-
-@cindex unassert
-@cindex assertions, undoing
-@cindex retracting assertions
-@findex #unassert
-Each time you do this, you assert a new true answer for @var{predicate}.
-Asserting one answer does not invalidate previously asserted answers;
-they all remain true. The only way to remove an assertion is with
-@samp{#unassert}. @samp{#unassert} has the same syntax as
-@samp{#assert}. You can also remove all assertions about
-@var{predicate} like this:
-
-@example
-#unassert @var{predicate}
-@end example
-
-You can also add or cancel assertions using command options
-when you run @code{gcc} or @code{cpp}. @xref{Invocation}.
-
-@node #error Directive
-@subsection The @samp{#error} and @samp{#warning} Directives
-
-@findex #error
-The directive @samp{#error} causes the preprocessor to report a fatal
-error. The rest of the line that follows @samp{#error} is used as the
-error message. The line must consist of complete tokens.
-
-You would use @samp{#error} inside of a conditional that detects a
-combination of parameters which you know the program does not properly
-support. For example, if you know that the program will not run
-properly on a Vax, you might write
-
-@smallexample
-@group
-#ifdef __vax__
-#error "Won't work on Vaxen. See comments at get_last_object."
-#endif
-@end group
-@end smallexample
-
-@noindent
-@xref{Nonstandard Predefined}, for why this works.
-
-If you have several configuration parameters that must be set up by
-the installation in a consistent way, you can use conditionals to detect
-an inconsistency and report it with @samp{#error}. For example,
-
-@smallexample
-#if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \
- || HASH_TABLE_SIZE % 5 == 0
-#error HASH_TABLE_SIZE should not be divisible by a small prime
-#endif
-@end smallexample
-
-@findex #warning
-The directive @samp{#warning} is like the directive @samp{#error}, but causes
-the preprocessor to issue a warning and continue preprocessing. The rest of
-the line that follows @samp{#warning} is used as the warning message.
-
-You might use @samp{#warning} in obsolete header files, with a message
-directing the user to the header file which should be used instead.
-
-@node Combining Sources, Other Directives, Conditionals, Top
-@section Combining Source Files
-
-@cindex line control
-One of the jobs of the C preprocessor is to inform the C compiler of where
-each line of C code came from: which source file and which line number.
-
-C code can come from multiple source files if you use @samp{#include};
-both @samp{#include} and the use of conditionals and macros can cause
-the line number of a line in the preprocessor output to be different
-from the line's number in the original source file. You will appreciate
-the value of making both the C compiler (in error messages) and symbolic
-debuggers such as GDB use the line numbers in your source file.
-
-The C preprocessor builds on this feature by offering a directive by which
-you can control the feature explicitly. This is useful when a file for
-input to the C preprocessor is the output from another program such as the
-@code{bison} parser generator, which operates on another file that is the
-true source file. Parts of the output from @code{bison} are generated from
-scratch, other parts come from a standard parser file. The rest are copied
-nearly verbatim from the source file, but their line numbers in the
-@code{bison} output are not the same as their original line numbers.
-Naturally you would like compiler error messages and symbolic debuggers to
-know the original source file and line number of each line in the
-@code{bison} input.
-
-@findex #line
-@code{bison} arranges this by writing @samp{#line} directives into the output
-file. @samp{#line} is a directive that specifies the original line number
-and source file name for subsequent input in the current preprocessor input
-file. @samp{#line} has three variants:
-
-@table @code
-@item #line @var{linenum}
-Here @var{linenum} is a decimal integer constant. This specifies that
-the line number of the following line of input, in its original source file,
-was @var{linenum}.
-
-@item #line @var{linenum} @var{filename}
-Here @var{linenum} is a decimal integer constant and @var{filename}
-is a string constant. This specifies that the following line of input
-came originally from source file @var{filename} and its line number there
-was @var{linenum}. Keep in mind that @var{filename} is not just a
-file name; it is surrounded by doublequote characters so that it looks
-like a string constant.
-
-@item #line @var{anything else}
-@var{anything else} is checked for macro calls, which are expanded.
-The result should be a decimal integer constant followed optionally
-by a string constant, as described above.
-@end table
-
-@samp{#line} directives alter the results of the @samp{__FILE__} and
-@samp{__LINE__} predefined macros from that point on. @xref{Standard
-Predefined}.
-
-The output of the preprocessor (which is the input for the rest of the
-compiler) contains directives that look much like @samp{#line} directives.
-They start with just @samp{#} instead of @samp{#line}, but this is
-followed by a line number and file name as in @samp{#line}. @xref{Output}.
-
-@node Other Directives, Output, Combining Sources, Top
-@section Miscellaneous Preprocessing Directives
-
-@cindex null directive
-This section describes three additional preprocessing directives. They are
-not very useful, but are mentioned for completeness.
-
-The @dfn{null directive} consists of a @samp{#} followed by a Newline, with
-only whitespace (including comments) in between. A null directive is
-understood as a preprocessing directive but has no effect on the preprocessor
-output. The primary significance of the existence of the null directive is
-that an input line consisting of just a @samp{#} will produce no output,
-rather than a line of output containing just a @samp{#}. Supposedly
-some old C programs contain such lines.
-
-@findex #pragma
-The ANSI standard specifies that the effect of the @samp{#pragma}
-directive is implementation-defined. In the GNU C preprocessor,
-@samp{#pragma} directives are not used, except for @samp{#pragma once}
-(@pxref{Once-Only}). However, they are left in the preprocessor output,
-so they are available to the compilation pass.
-
-@findex #ident
-The @samp{#ident} directive is supported for compatibility with certain
-other systems. It is followed by a line of text. On some systems, the
-text is copied into a special place in the object file; on most systems,
-the text is ignored and this directive has no effect. Typically
-@samp{#ident} is only used in header files supplied with those systems
-where it is meaningful.
-
-@node Output, Invocation, Other Directives, Top
-@section C Preprocessor Output
-
-@cindex output format
-The output from the C preprocessor looks much like the input, except
-that all preprocessing directive lines have been replaced with blank lines
-and all comments with spaces. Whitespace within a line is not altered;
-however, unless @samp{-traditional} is used, spaces may be inserted into
-the expansions of macro calls to prevent tokens from being concatenated.
-
-Source file name and line number information is conveyed by lines of
-the form
-
-@example
-# @var{linenum} @var{filename} @var{flags}
-@end example
-
-@noindent
-which are inserted as needed into the middle of the input (but never
-within a string or character constant). Such a line means that the
-following line originated in file @var{filename} at line @var{linenum}.
-
-After the file name comes zero or more flags, which are @samp{1},
-@samp{2}, @samp{3}, or @samp{4}. If there are multiple flags, spaces separate
-them. Here is what the flags mean:
-
-@table @samp
-@item 1
-This indicates the start of a new file.
-@item 2
-This indicates returning to a file (after having included another file).
-@item 3
-This indicates that the following text comes from a system header file,
-so certain warnings should be suppressed.
-@item 4
-This indicates that the following text should be treated as C@.
-@c maybe cross reference NO_IMPLICIT_EXTERN_C
-@end table
-
-@node Invocation, Concept Index, Output, Top
-@section Invoking the C Preprocessor
-@cindex invocation of the preprocessor
-
-Most often when you use the C preprocessor you will not have to invoke it
-explicitly: the C compiler will do so automatically. However, the
-preprocessor is sometimes useful on its own.
-
-The C preprocessor expects two file names as arguments, @var{infile} and
-@var{outfile}. The preprocessor reads @var{infile} together with any other
-files it specifies with @samp{#include}. All the output generated by the
-combined input files is written in @var{outfile}.
-
-Either @var{infile} or @var{outfile} may be @samp{-}, which as @var{infile}
-means to read from standard input and as @var{outfile} means to write to
-standard output. Also, if @var{outfile} or both file names are omitted,
-the standard output and standard input are used for the omitted file names.
-
-@cindex options
-Here is a table of command options accepted by the C preprocessor.
-These options can also be given when compiling a C program; they are
-passed along automatically to the preprocessor when it is invoked by the
-compiler.
-
-@table @samp
-@item -P
-@findex -P
-Inhibit generation of @samp{#}-lines with line-number information in
-the output from the preprocessor (@pxref{Output}). This might be
-useful when running the preprocessor on something that is not C code
-and will be sent to a program which might be confused by the
-@samp{#}-lines.
-
-@item -C
-@findex -C
-Do not discard comments: pass them through to the output file.
-Comments appearing in arguments of a macro call will be copied to the
-output before the expansion of the macro call.
-
-@item -traditional
-@findex -traditional
-Try to imitate the behavior of old-fashioned C, as opposed to ANSI C@.
-
-@itemize @bullet
-@item
-Traditional macro expansion pays no attention to singlequote or
-doublequote characters; macro argument symbols are replaced by the
-argument values even when they appear within apparent string or
-character constants.
-
-@item
-Traditionally, it is permissible for a macro expansion to end in the
-middle of a string or character constant. The constant continues into
-the text surrounding the macro call.
-
-@item
-However, traditionally the end of the line terminates a string or
-character constant, with no error.
-
-@item
-In traditional C, a comment is equivalent to no text at all. (In ANSI
-C, a comment counts as whitespace.)
-
-@item
-Traditional C does not have the concept of a ``preprocessing number''.
-It considers @samp{1.0e+4} to be three tokens: @samp{1.0e}, @samp{+},
-and @samp{4}.
-
-@item
-A macro is not suppressed within its own definition, in traditional C@.
-Thus, any macro that is used recursively inevitably causes an error.
-
-@item
-The character @samp{#} has no special meaning within a macro definition
-in traditional C@.
-
-@item
-In traditional C, the text at the end of a macro expansion can run
-together with the text after the macro call, to produce a single token.
-(This is impossible in ANSI C@.)
-
-@item
-Traditionally, @samp{\} inside a macro argument suppresses the syntactic
-significance of the following character.
-@end itemize
-
-@cindex Fortran
-@cindex unterminated
-Use the @samp{-traditional} option when preprocessing Fortran code,
-so that singlequotes and doublequotes
-within Fortran comment lines
-(which are generally not recognized as such by the preprocessor)
-do not cause diagnostics
-about unterminated character or string constants.
-
-However, this option does not prevent diagnostics
-about unterminated comments
-when a C-style comment appears to start, but not end,
-within Fortran-style commentary.
-
-So, the following Fortran comment lines are accepted with
-@samp{-traditional}:
-
-@smallexample
-C This isn't an unterminated character constant
-C Neither is "20000000000, an octal constant
-C in some dialects of Fortran
-@end smallexample
-
-However, this type of comment line will likely produce a diagnostic,
-or at least unexpected output from the preprocessor,
-due to the unterminated comment:
-
-@smallexample
-C Some Fortran compilers accept /* as starting
-C an inline comment.
-@end smallexample
-
-@cindex g77
-Note that @code{g77} automatically supplies
-the @samp{-traditional} option
-when it invokes the preprocessor.
-However, a future version of @code{g77}
-might use a different, more-Fortran-aware preprocessor
-in place of @code{cpp}.
-
-@item -trigraphs
-@findex -trigraphs
-Process ANSI standard trigraph sequences. These are three-character
-sequences, all starting with @samp{??}, that are defined by ANSI C to
-stand for single characters. For example, @samp{??/} stands for
-@samp{\}, so @samp{'??/n'} is a character constant for a newline.
-Strictly speaking, the GNU C preprocessor does not support all
-programs in ANSI Standard C unless @samp{-trigraphs} is used, but if
-you ever notice the difference it will be with relief.
-
-You don't want to know any more about trigraphs.
-
-@item -pedantic
-@findex -pedantic
-Issue warnings required by the ANSI C standard in certain cases such
-as when text other than a comment follows @samp{#else} or @samp{#endif}.
-
-@item -pedantic-errors
-@findex -pedantic-errors
-Like @samp{-pedantic}, except that errors are produced rather than
-warnings.
-
-@item -Wtrigraphs
-@findex -Wtrigraphs
-Warn if any trigraphs are encountered (assuming they are enabled).
-
-@item -Wcomment
-@findex -Wcomment
-@ignore
-@c "Not worth documenting" both singular and plural forms of this
-@c option, per RMS. But also unclear which is better; hence may need to
-@c switch this at some future date. pesch@cygnus.com, 2jan92.
-@itemx -Wcomments
-(Both forms have the same effect).
-@end ignore
-Warn whenever a comment-start sequence @samp{/*} appears in a @samp{/*}
-comment, or whenever a Backslash-Newline appears in a @samp{//} comment.
-
-@item -Wall
-@findex -Wall
-Requests both @samp{-Wtrigraphs} and @samp{-Wcomment} (but not
-@samp{-Wtraditional} or @samp{-Wundef}).
-
-@item -Wtraditional
-@findex -Wtraditional
-Warn about certain constructs that behave differently in traditional and
-ANSI C@.
-
-@item -Wundef
-@findex -Wundef
-Warn if an undefined identifier is evaluated in an @samp{#if} directive.
-
-@item -I @var{directory}
-@findex -I
-Add the directory @var{directory} to the head of the list of
-directories to be searched for header files (@pxref{Include Syntax}).
-This can be used to override a system header file, substituting your
-own version, since these directories are searched before the system
-header file directories. If you use more than one @samp{-I} option,
-the directories are scanned in left-to-right order; the standard
-system directories come after.
-
-@item -I-
-Any directories specified with @samp{-I} options before the @samp{-I-}
-option are searched only for the case of @samp{#include "@var{file}"};
-they are not searched for @samp{#include <@var{file}>}.
-
-If additional directories are specified with @samp{-I} options after
-the @samp{-I-}, these directories are searched for all @samp{#include}
-directives.
-
-In addition, the @samp{-I-} option inhibits the use of the current
-directory as the first search directory for @samp{#include "@var{file}"}.
-Therefore, the current directory is searched only if it is requested
-explicitly with @samp{-I.}. Specifying both @samp{-I-} and @samp{-I.}
-allows you to control precisely which directories are searched before
-the current one and which are searched after.
-
-@item -nostdinc
-@findex -nostdinc
-Do not search the standard system directories for header files.
-Only the directories you have specified with @samp{-I} options
-(and the current directory, if appropriate) are searched.
-
-@item -nostdinc++
-@findex -nostdinc++
-Do not search for header files in the C++-specific standard directories,
-but do still search the other standard directories.
-(This option is used when building the C++ library.)
-
-@item -remap
-@findex -remap
-When searching for a header file in a directory, remap file names if a
-file named @file{header.gcc} exists in that directory. This can be used
-to work around limitations of file systems with file name restrictions.
-The @file{header.gcc} file should contain a series of lines with two
-tokens on each line: the first token is the name to map, and the second
-token is the actual name to use.
-
-@item -D @var{name}
-@findex -D
-Predefine @var{name} as a macro, with definition @samp{1}.
-
-@item -D @var{name}=@var{definition}
-Predefine @var{name} as a macro, with definition @var{definition}.
-There are no restrictions on the contents of @var{definition}, but if
-you are invoking the preprocessor from a shell or shell-like program you
-may need to use the shell's quoting syntax to protect characters such as
-spaces that have a meaning in the shell syntax. If you use more than
-one @samp{-D} for the same @var{name}, the rightmost definition takes
-effect.
-
-@item -U @var{name}
-@findex -U
-Do not predefine @var{name}. If both @samp{-U} and @samp{-D} are
-specified for one name, the @samp{-U} beats the @samp{-D} and the name
-is not predefined.
-
-@item -undef
-@findex -undef
-Do not predefine any nonstandard macros.
-
-@item -A @var{predicate}(@var{answer})
-@findex -A
-Make an assertion with the predicate @var{predicate} and answer
-@var{answer}. @xref{Assertions}.
-
-@noindent
-You can use @samp{-A-} to disable all predefined assertions; it also
-undefines all predefined macros that identify the type of target system.
-
-@item -dM
-@findex -dM
-Instead of outputting the result of preprocessing, output a list of
-@samp{#define} directives for all the macros defined during the
-execution of the preprocessor, including predefined macros. This gives
-you a way of finding out what is predefined in your version of the
-preprocessor; assuming you have no file @samp{foo.h}, the command
-
-@example
-touch foo.h; cpp -dM foo.h
-@end example
-
-@noindent
-will show the values of any predefined macros.
-
-@item -dD
-@findex -dD
-Like @samp{-dM} except in two respects: it does @emph{not} include the
-predefined macros, and it outputs @emph{both} the @samp{#define}
-directives and the result of preprocessing. Both kinds of output go to
-the standard output file.
-
-@item -dI
-@findex -dI
-Output @samp{#include} directives in addition to the result of preprocessing.
-
-@item -M [-MG]
-@findex -M
-Instead of outputting the result of preprocessing, output a rule
-suitable for @code{make} describing the dependencies of the main
-source file. The preprocessor outputs one @code{make} rule containing
-the object file name for that source file, a colon, and the names of
-all the included files. If there are many included files then the
-rule is split into several lines using @samp{\}-newline.
-
-@samp{-MG} says to treat missing header files as generated files and assume
-they live in the same directory as the source file. It must be specified
-in addition to @samp{-M}.
-
-This feature is used in automatic updating of makefiles.
-
-@item -MM [-MG]
-@findex -MM
-Like @samp{-M} but mention only the files included with @samp{#include
-"@var{file}"}. System header files included with @samp{#include
-<@var{file}>} are omitted.
-
-@item -MD @var{file}
-@findex -MD
-Like @samp{-M} but the dependency information is written to @var{file}.
-This is in addition to compiling the file as specified---@samp{-MD} does
-not inhibit ordinary compilation the way @samp{-M} does.
-
-When invoking @code{gcc}, do not specify the @var{file} argument.
-@code{gcc} will create file names made by replacing ".c" with ".d" at
-the end of the input file names.
-
-In Mach, you can use the utility @code{md} to merge multiple dependency
-files into a single dependency file suitable for using with the @samp{make}
-command.
-
-@item -MMD @var{file}
-@findex -MMD
-Like @samp{-MD} except mention only user header files, not system
-header files.
-
-@item -H
-@findex -H
-Print the name of each header file used, in addition to other normal
-activities.
-
-@item -imacros @var{file}
-@findex -imacros
-Process @var{file} as input, discarding the resulting output, before
-processing the regular input file. Because the output generated from
-@var{file} is discarded, the only effect of @samp{-imacros @var{file}}
-is to make the macros defined in @var{file} available for use in the
-main input.
-
-@item -include @var{file}
-@findex -include
-Process @var{file} as input, and include all the resulting output,
-before processing the regular input file.
-
-@item -idirafter @var{dir}
-@findex -idirafter
-@cindex second include path
-Add the directory @var{dir} to the second include path. The directories
-on the second include path are searched when a header file is not found
-in any of the directories in the main include path (the one that
-@samp{-I} adds to).
-
-@item -iprefix @var{prefix}
-@findex -iprefix
-Specify @var{prefix} as the prefix for subsequent @samp{-iwithprefix}
-options.
-
-@item -iwithprefix @var{dir}
-@findex -iwithprefix
-Add a directory to the second include path. The directory's name is
-made by concatenating @var{prefix} and @var{dir}, where @var{prefix}
-was specified previously with @samp{-iprefix}.
-
-@item -isystem @var{dir}
-@findex -isystem
-Add a directory to the beginning of the second include path, marking it
-as a system directory, so that it gets the same special treatment as
-is applied to the standard system directories.
-
-@item -lang-c
-@itemx -lang-c89
-@itemx -lang-c++
-@itemx -lang-objc
-@itemx -lang-objc++
-@findex -lang-c
-@findex -lang-c89
-@findex -lang-c++
-@findex -lang-objc
-@findex -lang-objc++
-Specify the source language. @samp{-lang-c} is the default; it
-allows recognition of C++ comments (comments that begin with
-@samp{//} and end at end of line) and hexadecimal floating-point constants,
-since these features will most likely appear in the next C standard.
-@samp{-lang-c89} disables recognition of C++ comments and
-hexadecimal floating-point constants. @samp{-lang-c++}
-handles C++ comment syntax and includes extra default include
-directories for C++. @samp{-lang-objc} enables the Objective C
-@samp{#import} directive. @samp{-lang-objc++} enables both C++ and Objective C
-extensions.
-
-These options are generated by the compiler driver @code{gcc}, but not
-passed from the @samp{gcc} command line unless you use the driver's
-@samp{-Wp} option.
-
-@item -lint
-Look for commands to the program checker @code{lint} embedded in
-comments, and emit them preceded by @samp{#pragma lint}. For example,
-the comment @samp{/* NOTREACHED */} becomes @samp{#pragma lint
-NOTREACHED}.
-
-This option is available only when you call @code{cpp} directly;
-@code{gcc} will not pass it from its command line.
-
-@item -$
-@findex -$
-Forbid the use of @samp{$} in identifiers. This was formerly required
-for strict conformance to the C Standard before the standard was
-corrected.
-
-This option is available only when you call @code{cpp} directly;
-@code{gcc} will not pass it from its command line.
-
-@end table
-
-@node Concept Index, Index, Invocation, Top
-@unnumbered Concept Index
-@printindex cp
-
-@node Index,, Concept Index, Top
-@unnumbered Index of Directives, Macros and Options
-@printindex fn
-
-@contents
-@bye
diff --git a/gcc/cppalloc.c b/gcc/cppalloc.c
deleted file mode 100755
index 269bad6..0000000
--- a/gcc/cppalloc.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Part of CPP library. (memory allocation - xmalloc etc)
- Copyright (C) 1986, 87, 89, 92 - 95, 1998 Free Software Foundation, Inc.
- Written by Per Bothner, 1994.
- Based on CCCP program by Paul Rubin, June 1986
- Adapted to ANSI C, Richard Stallman, Jan 1987
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding! */
-
-#include "config.h"
-#include "system.h"
-#include "cpplib.h"
-
-static void memory_full (void) ATTRIBUTE_NORETURN;
-
-static void
-memory_full ()
-{
- fprintf (stderr, "%s: Memory exhausted.\n", progname);
- exit (EXIT_FAILURE);
-}
-
-void *
-xmalloc (size)
- size_t size;
-{
- register void *ptr = malloc (size);
- if (ptr == 0)
- memory_full ();
- return ptr;
-}
-
-void *
-xcalloc (number, size)
- size_t number, size;
-{
- register void *ptr = calloc (number, size);
- if (ptr == 0)
- memory_full ();
- return ptr;
-}
-
-void *
-xrealloc (old, size)
- void *old;
- size_t size;
-{
- register void *ptr;
- if (old)
- ptr = realloc (old, size);
- else
- ptr = malloc (size);
- if (ptr == 0)
- memory_full ();
- return ptr;
-}
-
-char *
-xstrdup (input)
- const char *input;
-{
- unsigned size = strlen (input);
- char *output = xmalloc (size + 1);
- strcpy (output, input);
- return output;
-}
diff --git a/gcc/cpperror.c b/gcc/cpperror.c
deleted file mode 100755
index 7a82656..0000000
--- a/gcc/cpperror.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* Default error handlers for CPP Library.
- Copyright (C) 1986, 87, 89, 92 - 95, 1998 Free Software Foundation, Inc.
- Written by Per Bothner, 1994.
- Based on CCCP program by Paul Rubin, June 1986
- Adapted to ANSI C, Richard Stallman, Jan 1987
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding! */
-
-#ifndef EMACS
-#include "config.h"
-#include "system.h"
-#else
-#include <stdio.h>
-#endif /* not EMACS */
-
-#include "cpplib.h"
-
-/* Print the file names and line numbers of the #include
- commands which led to the current file. */
-
-void
-cpp_print_containing_files (pfile)
- cpp_reader *pfile;
-{
- cpp_buffer *ip;
- int first = 1;
-
- /* If stack of files hasn't changed since we last printed
- this info, don't repeat it. */
- if (pfile->input_stack_listing_current)
- return;
-
- ip = cpp_file_buffer (pfile);
-
- /* Give up if we don't find a source file. */
- if (ip == NULL)
- return;
-
- /* Find the other, outer source files. */
- while ((ip = CPP_PREV_BUFFER (ip)), ip != CPP_NULL_BUFFER (pfile))
- {
- long line, col;
- cpp_buf_line_and_col (ip, &line, &col);
- if (ip->fname != NULL)
- {
- if (first)
- {
- first = 0;
- fprintf (stderr, "In file included");
- }
- else
- fprintf (stderr, ",\n ");
- }
-
- fprintf (stderr, " from %s:%ld", ip->nominal_fname, line);
- }
- if (! first)
- fprintf (stderr, ":\n");
-
- /* Record we have printed the status as of this time. */
- pfile->input_stack_listing_current = 1;
-}
-
-void
-cpp_file_line_for_message (pfile, filename, line, column)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
- char *filename;
- int line, column;
-{
- if (column > 0)
- fprintf (stderr, "%s:%d:%d: ", filename, line, column);
- else
- fprintf (stderr, "%s:%d: ", filename, line);
-}
-
-/* IS_ERROR is 2 for "fatal" error, 1 for error, 0 for warning */
-
-void
-v_cpp_message (pfile, is_error, msg, ap)
- cpp_reader * pfile;
- int is_error;
- const char *msg;
- va_list ap;
-{
- if (!is_error)
- fprintf (stderr, "warning: ");
- else if (is_error == 2)
- pfile->errors = CPP_FATAL_LIMIT;
- else if (pfile->errors < CPP_FATAL_LIMIT)
- pfile->errors++;
- vfprintf (stderr, msg, ap);
- fprintf (stderr, "\n");
-}
-
-void
-cpp_message (cpp_reader *pfile, int is_error, const char *msg, ...)
-{
- va_list ap;
-
- va_start (ap, msg);
-
-
- v_cpp_message(pfile, is_error, msg, ap);
- va_end(ap);
-}
-
-/* Same as cpp_error, except we consider the error to be "fatal",
- such as inconsistent options. I.e. there is little point in continuing.
- (We do not exit, to support use of cpplib as a library.
- Instead, it is the caller's responsibility to check
- CPP_FATAL_ERRORS. */
-
-void
-cpp_fatal (cpp_reader *pfile, const char *str, ...)
-{
- va_list ap;
-
- va_start (ap, str);
-
-
- fprintf (stderr, "%s: ", progname);
- v_cpp_message (pfile, 2, str, ap);
- va_end(ap);
-}
-
-void
-cpp_pfatal_with_name (pfile, name)
- cpp_reader *pfile;
- const char *name;
-{
- cpp_perror_with_name (pfile, name);
- exit (EXIT_FAILURE);
-}
diff --git a/gcc/cppexp.c b/gcc/cppexp.c
deleted file mode 100755
index 6efd90b..0000000
--- a/gcc/cppexp.c
+++ /dev/null
@@ -1,1001 +0,0 @@
-/* Parse C expressions for CCCP.
- Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998 Free Software Foundation.
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding!
-
-Written by Per Bothner 1994. */
-
-/* Parse a C expression from text in a string */
-
-#include "config.h"
-#include "system.h"
-#include "cpplib.h"
-
-#ifdef MULTIBYTE_CHARS
-#include <locale.h>
-#endif
-
-/* This is used for communicating lists of keywords with cccp.c. */
-struct arglist {
- struct arglist *next;
- U_CHAR *name;
- int length;
- int argno;
-};
-
-#ifndef CHAR_TYPE_SIZE
-#define CHAR_TYPE_SIZE BITS_PER_UNIT
-#endif
-
-#ifndef INT_TYPE_SIZE
-#define INT_TYPE_SIZE BITS_PER_WORD
-#endif
-
-#ifndef LONG_TYPE_SIZE
-#define LONG_TYPE_SIZE BITS_PER_WORD
-#endif
-
-#ifndef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
-#endif
-
-#define CHAR_TYPE_MASK 0xFF
-
-#define WCHAR_TYPE_MASK 0xFFFFFFFF
-
-/* Yield nonzero if adding two numbers with A's and B's signs can yield a
- number with SUM's sign, where A, B, and SUM are all C integers. */
-#define possible_sum_sign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0)
-
-static void integer_overflow (cpp_reader *);
-static HOST_WIDE_INT left_shift (cpp_reader *, HOST_WIDE_INT, int, HOST_WIDE_UINT);
-static HOST_WIDE_INT right_shift (cpp_reader *, HOST_WIDE_INT, int, HOST_WIDE_UINT);
-
-#define ERROR 299
-#define OROR 300
-#define ANDAND 301
-#define EQUAL 302
-#define NOTEQUAL 303
-#define LEQ 304
-#define GEQ 305
-#define LSH 306
-#define RSH 307
-#define NAME 308
-#define INT 309
-#define CHAR 310
-
-#define LEFT_OPERAND_REQUIRED 1
-#define RIGHT_OPERAND_REQUIRED 2
-#define HAVE_VALUE 4
-/* SKIP_OPERAND is set for '&&' '||' '?' and ':' when the
- following operand should be short-circuited instead of evaluated. */
-#define SKIP_OPERAND 8
-/*#define UNSIGNEDP 16*/
-
-#ifndef CHAR_BIT
-#define CHAR_BIT 8
-#endif
-
-#ifndef HOST_BITS_PER_WIDE_INT
-#define HOST_BITS_PER_WIDE_INT (CHAR_BIT * sizeof (HOST_WIDE_INT))
-#endif
-
-struct operation {
- short op;
- char rprio; /* Priority of op (relative to it right operand). */
- char flags;
- char unsignedp; /* true if value should be treated as unsigned */
- HOST_WIDE_INT value; /* The value logically "right" of op. */
-};
-
-/* Take care of parsing a number (anything that starts with a digit).
- LEN is the number of characters in it. */
-
-/* maybe needs to actually deal with floating point numbers */
-
-struct operation
-parse_number (pfile, start, olen)
- cpp_reader *pfile;
- char *start;
- int olen;
-{
- struct operation op;
- register char *p = start;
- register int c;
- HOST_WIDE_UINT n = 0;
- HOST_WIDE_UINT cutoff;
- HOST_WIDE_UINT gap;
- register int base = 10;
- register int len = olen;
- register int overflow = 0;
- register int digit, largest_digit = 0;
- int spec_long = 0;
-
- op.unsignedp = 0;
-
- for (c = 0; c < len; c++)
- if (p[c] == '.') {
- /* It's a float since it contains a point. */
- cpp_error (pfile,
- "floating point numbers not allowed in #if expressions");
- op.op = ERROR;
- return op;
- }
-
- if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
- p += 2;
- base = 16;
- len -= 2;
- }
- else if (*p == '0')
- base = 8;
-
- cutoff = ((HOST_WIDE_UINT)-1) / base;
- gap = ((HOST_WIDE_UINT)-1) % base;
-
- for (; len > 0; len--) {
- c = *p++;
-
- if (c >= '0' && c <= '9')
- digit = c - '0';
- else if (base == 16 && c >= 'a' && c <= 'f')
- digit = c - 'a' + 10;
- else if (base == 16 && c >= 'A' && c <= 'F')
- digit = c - 'A' + 10;
- else {
- /* `l' means long, and `u' means unsigned. */
- while (1) {
- if (c == 'l' || c == 'L')
- {
- if (spec_long)
- cpp_error (pfile, "two `l's in integer constant");
- spec_long = 1;
- }
- else if (c == 'u' || c == 'U')
- {
- if (op.unsignedp)
- cpp_error (pfile, "two `u's in integer constant");
- op.unsignedp = 1;
- }
- else
- break;
-
- if (--len == 0)
- break;
- c = *p++;
- }
- /* Don't look for any more digits after the suffixes. */
- break;
- }
- if (largest_digit < digit)
- largest_digit = digit;
- if (n > cutoff || (n == cutoff && digit > gap))
- overflow = 1;
- n = n * base + digit;
- }
-
- if (len != 0)
- {
- cpp_error (pfile, "Invalid number in #if expression");
- op.op = ERROR;
- return op;
- }
-
- if (base <= largest_digit)
- cpp_pedwarn (pfile, "integer constant contains digits beyond the radix");
-
- if (overflow)
- cpp_pedwarn (pfile, "integer constant out of range");
-
- /* If too big to be signed, consider it unsigned. */
- if ((HOST_WIDE_INT) n < 0 && ! op.unsignedp)
- {
- if (base == 10)
- cpp_warning (pfile, "integer constant is so large that it is unsigned");
- op.unsignedp = 1;
- }
-
- op.value = n;
- op.op = INT;
- return op;
-}
-
-struct token {
- char *operator;
- int token;
-};
-
-static struct token tokentab2[] = {
- {"&&", ANDAND},
- {"||", OROR},
- {"<<", LSH},
- {">>", RSH},
- {"==", EQUAL},
- {"!=", NOTEQUAL},
- {"<=", LEQ},
- {">=", GEQ},
- {"++", ERROR},
- {"--", ERROR},
- {NULL, ERROR}
-};
-
-/* This is used to accumulate the value of a character literal. It is static
- so that it only gets allocated once per compilation. */
-static char *token_buffer = NULL;
-
-/* Read one token. */
-
-struct operation
-cpp_lex (pfile, skip_evaluation)
- cpp_reader *pfile;
- int skip_evaluation;
-{
- register HOST_WIDE_INT c;
- register struct token *toktab;
- enum cpp_token token;
- struct operation op;
- U_CHAR *tok_start, *tok_end;
- int old_written;
-
- retry:
-
- old_written = CPP_WRITTEN (pfile);
- cpp_skip_hspace (pfile);
- c = CPP_BUF_PEEK (CPP_BUFFER (pfile));
-
- if (c == '\n')
- {
- op.op = 0;
- return op;
- }
-
- token = cpp_get_token (pfile);
- tok_start = pfile->token_buffer + old_written;
- tok_end = CPP_PWRITTEN (pfile);
- pfile->limit = tok_start;
- switch (token)
- {
- case CPP_EOF: /* Should not happen ... */
- case CPP_VSPACE:
- op.op = 0;
- return op;
- case CPP_POP:
- if (CPP_BUFFER (pfile)->fname != NULL)
- {
- op.op = 0;
- return op;
- }
- cpp_pop_buffer (pfile);
- goto retry;
- case CPP_HSPACE: case CPP_COMMENT:
- goto retry;
- case CPP_NUMBER:
- return parse_number (pfile, tok_start, tok_end - tok_start);
- case CPP_STRING:
- cpp_error (pfile, "string constants not allowed in #if expressions");
- op.op = ERROR;
- return op;
- case CPP_CHAR:
- /* This code for reading a character constant
- handles multicharacter constants and wide characters.
- It is mostly copied from c-lex.c. */
- {
- HOST_WIDE_INT result = 0;
- register int num_chars = 0;
- unsigned width = CHAR_TYPE_SIZE;
- int wide_flag = 0;
- int max_chars;
- U_CHAR *ptr = tok_start;
-
- /* We need to allocate this buffer dynamically since the size is not
- a constant expression on all platforms. */
- if (token_buffer == NULL)
- {
-#ifdef MULTIBYTE_CHARS
- token_buffer = xmalloc (LONG_TYPE_SIZE/CHAR_TYPE_SIZE
- + MB_CUR_MAX);
-#else
- token_buffer = xmalloc (LONG_TYPE_SIZE/CHAR_TYPE_SIZE + 1);
-#endif
- }
-
- if (*ptr == 'L')
- {
- ptr++;
- wide_flag = 1;
- width = WCHAR_TYPE_SIZE;
-#ifdef MULTIBYTE_CHARS
- max_chars = MB_CUR_MAX;
-#else
- max_chars = 1;
-#endif
- }
- else
- max_chars = LONG_TYPE_SIZE / width;
-
- ++ptr;
- while (ptr < tok_end && ((c = *ptr++) != '\''))
- {
- if (c == '\\')
- {
- c = cpp_parse_escape (pfile, (char **) &ptr,
- wide_flag ? WCHAR_TYPE_MASK : CHAR_TYPE_MASK);
- if (width < HOST_BITS_PER_INT
- && (unsigned) c >= (unsigned)(1 << width))
- cpp_pedwarn (pfile,
- "escape sequence out of range for character");
- }
-
- num_chars++;
-
- /* Merge character into result; ignore excess chars. */
- if (num_chars < max_chars + 1)
- {
- if (width < HOST_BITS_PER_INT)
- result = (result << width) | (c & ((1 << width) - 1));
- else
- result = c;
- token_buffer[num_chars - 1] = c;
- }
- }
-
- token_buffer[num_chars] = 0;
-
- if (c != '\'')
- cpp_error (pfile, "malformatted character constant");
- else if (num_chars == 0)
- cpp_error (pfile, "empty character constant");
- else if (num_chars > max_chars)
- {
- num_chars = max_chars;
- cpp_error (pfile, "character constant too long");
- }
- else if (num_chars != 1 && ! CPP_TRADITIONAL (pfile))
- cpp_warning (pfile, "multi-character character constant");
-
- /* If char type is signed, sign-extend the constant. */
- if (! wide_flag)
- {
- int num_bits = num_chars * width;
-
- if (cpp_lookup (pfile, (U_CHAR *)"__CHAR_UNSIGNED__",
- sizeof ("__CHAR_UNSIGNED__")-1, -1)
- || ((result >> (num_bits - 1)) & 1) == 0)
- op.value
- = result & (~((HOST_WIDE_UINT)0) >> (HOST_BITS_PER_WIDE_INT - num_bits));
- else
- op.value
- = result | ~(~((HOST_WIDE_UINT)0) >> (HOST_BITS_PER_WIDE_INT - num_bits));
- }
- else
- {
-#ifdef MULTIBYTE_CHARS
- /* Set the initial shift state and convert the next sequence. */
- result = 0;
- /* In all locales L'\0' is zero and mbtowc will return zero,
- so don't use it. */
- if (num_chars > 1
- || (num_chars == 1 && token_buffer[0] != '\0'))
- {
- wchar_t wc;
- (void) mbtowc (NULL, NULL, 0);
- if (mbtowc (& wc, token_buffer, num_chars) == num_chars)
- result = wc;
- else
- cpp_pedwarn (pfile,"Ignoring invalid multibyte character");
- }
-#endif
- op.value = result;
- }
- }
-
- /* This is always a signed type. */
- op.unsignedp = 0;
- op.op = CHAR;
-
- return op;
-
- case CPP_NAME:
- if (CPP_WARN_UNDEF (pfile) && !skip_evaluation)
- cpp_warning (pfile, "`%.*s' is not defined",
- (int) (tok_end - tok_start), tok_start);
- return parse_number (pfile, "0", 0);
-
- case CPP_OTHER:
- /* See if it is a special token of length 2. */
- if (tok_start + 2 == tok_end)
- {
- for (toktab = tokentab2; toktab->operator != NULL; toktab++)
- if (tok_start[0] == toktab->operator[0]
- && tok_start[1] == toktab->operator[1])
- break;
- if (toktab->token == ERROR)
- {
- char *buf = (char *) alloca (40);
- sprintf (buf, "`%s' not allowed in operand of `#if'", tok_start);
- cpp_error (pfile, buf);
- }
- op.op = toktab->token;
- return op;
- }
- /* fall through */
- default:
- op.op = *tok_start;
- return op;
- }
-}
-
-
-/* Parse a C escape sequence. STRING_PTR points to a variable
- containing a pointer to the string to parse. That pointer
- is updated past the characters we use. The value of the
- escape sequence is returned.
-
- A negative value means the sequence \ newline was seen,
- which is supposed to be equivalent to nothing at all.
-
- If \ is followed by a null character, we return a negative
- value and leave the string pointer pointing at the null character.
-
- If \ is followed by 000, we return 0 and leave the string pointer
- after the zeros. A value of 0 does not mean end of string. */
-
-HOST_WIDE_INT
-cpp_parse_escape (pfile, string_ptr, result_mask)
- cpp_reader *pfile;
- char **string_ptr;
- HOST_WIDE_INT result_mask;
-{
- register int c = *(*string_ptr)++;
- switch (c)
- {
- case 'a':
- return TARGET_BELL;
- case 'b':
- return TARGET_BS;
- case 'e':
- case 'E':
- if (CPP_OPTIONS (pfile)->pedantic)
- cpp_pedwarn (pfile, "non-ANSI-standard escape sequence, `\\%c'", c);
- return 033;
- case 'f':
- return TARGET_FF;
- case 'n':
- return TARGET_NEWLINE;
- case 'r':
- return TARGET_CR;
- case 't':
- return TARGET_TAB;
- case 'v':
- return TARGET_VT;
- case '\n':
- return -2;
- case 0:
- (*string_ptr)--;
- return 0;
-
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- {
- register HOST_WIDE_INT i = c - '0';
- register int count = 0;
- while (++count < 3)
- {
- c = *(*string_ptr)++;
- if (c >= '0' && c <= '7')
- i = (i << 3) + c - '0';
- else
- {
- (*string_ptr)--;
- break;
- }
- }
- if (i != (i & result_mask))
- {
- i &= result_mask;
- cpp_pedwarn (pfile, "octal escape sequence out of range");
- }
- return i;
- }
- case 'x':
- {
- register HOST_WIDE_UINT i = 0, overflow = 0;
- register int digits_found = 0, digit;
- for (;;)
- {
- c = *(*string_ptr)++;
- if (c >= '0' && c <= '9')
- digit = c - '0';
- else if (c >= 'a' && c <= 'f')
- digit = c - 'a' + 10;
- else if (c >= 'A' && c <= 'F')
- digit = c - 'A' + 10;
- else
- {
- (*string_ptr)--;
- break;
- }
- overflow |= i ^ (i << 4 >> 4);
- i = (i << 4) + digit;
- digits_found = 1;
- }
- if (!digits_found)
- cpp_error (pfile, "\\x used with no following hex digits");
- if (overflow | (i != (i & result_mask)))
- {
- i &= result_mask;
- cpp_pedwarn (pfile, "hex escape sequence out of range");
- }
- return i;
- }
- default:
- return c;
- }
-}
-
-static void
-integer_overflow (pfile)
- cpp_reader *pfile;
-{
- if (CPP_PEDANTIC (pfile))
- cpp_pedwarn (pfile, "integer overflow in preprocessor expression");
-}
-
-static HOST_WIDE_INT
-left_shift (pfile, a, unsignedp, b)
- cpp_reader *pfile;
- HOST_WIDE_INT a;
- int unsignedp;
- HOST_WIDE_UINT b;
-{
- if (b >= HOST_BITS_PER_WIDE_INT)
- {
- if (! unsignedp && a != 0)
- integer_overflow (pfile);
- return 0;
- }
- else if (unsignedp)
- return (HOST_WIDE_UINT) a << b;
- else
- {
- long l = a << b;
- if (l >> b != a)
- integer_overflow (pfile);
- return l;
- }
-}
-
-static HOST_WIDE_INT
-right_shift (pfile, a, unsignedp, b)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
- HOST_WIDE_INT a;
- int unsignedp;
- HOST_WIDE_UINT b;
-{
- if (b >= HOST_BITS_PER_WIDE_INT)
- return unsignedp ? 0 : a >> (HOST_BITS_PER_WIDE_INT - 1);
- else if (unsignedp)
- return (HOST_WIDE_UINT) a >> b;
- else
- return a >> b;
-}
-
-/* These priorities are all even, so we can handle associatively. */
-#define PAREN_INNER_PRIO 0
-#define COMMA_PRIO 4
-#define COND_PRIO (COMMA_PRIO+2)
-#define OROR_PRIO (COND_PRIO+2)
-#define ANDAND_PRIO (OROR_PRIO+2)
-#define OR_PRIO (ANDAND_PRIO+2)
-#define XOR_PRIO (OR_PRIO+2)
-#define AND_PRIO (XOR_PRIO+2)
-#define EQUAL_PRIO (AND_PRIO+2)
-#define LESS_PRIO (EQUAL_PRIO+2)
-#define SHIFT_PRIO (LESS_PRIO+2)
-#define PLUS_PRIO (SHIFT_PRIO+2)
-#define MUL_PRIO (PLUS_PRIO+2)
-#define UNARY_PRIO (MUL_PRIO+2)
-#define PAREN_OUTER_PRIO (UNARY_PRIO+2)
-
-#define COMPARE(OP) \
- top->unsignedp = 0;\
- top->value = (unsigned1 || unsigned2) \
- ? (unsigned long) v1 OP (unsigned long) v2 : (v1 OP v2)
-
-/* Parse and evaluate a C expression, reading from PFILE.
- Returns the value of the expression. */
-
-HOST_WIDE_INT
-cpp_parse_expr (pfile)
- cpp_reader *pfile;
-{
- /* The implementation is an operator precedence parser,
- i.e. a bottom-up parser, using a stack for not-yet-reduced tokens.
-
- The stack base is 'stack', and the current stack pointer is 'top'.
- There is a stack element for each operator (only),
- and the most recently pushed operator is 'top->op'.
- An operand (value) is stored in the 'value' field of the stack
- element of the operator that precedes it.
- In that case the 'flags' field has the HAVE_VALUE flag set. */
-
-#define INIT_STACK_SIZE 20
- struct operation init_stack[INIT_STACK_SIZE];
- struct operation *stack = init_stack;
- struct operation *limit = stack + INIT_STACK_SIZE;
- register struct operation *top = stack;
- int lprio, rprio;
- int skip_evaluation = 0;
-
- top->rprio = 0;
- top->flags = 0;
- for (;;)
- {
- struct operation op;
- char flags = 0;
-
- /* Read a token */
- op = cpp_lex (pfile, skip_evaluation);
-
- /* See if the token is an operand, in which case go to set_value.
- If the token is an operator, figure out its left and right
- priorities, and then goto maybe_reduce. */
-
- switch (op.op)
- {
- case NAME:
- abort ();
- case INT: case CHAR:
- top->value = op.value;
- top->unsignedp = op.unsignedp;
- goto set_value;
- case 0:
- lprio = 0; goto maybe_reduce;
- case '+': case '-':
- /* Is this correct if unary ? FIXME */
- flags = RIGHT_OPERAND_REQUIRED;
- lprio = PLUS_PRIO; rprio = lprio + 1; goto maybe_reduce;
- case '!': case '~':
- flags = RIGHT_OPERAND_REQUIRED;
- rprio = UNARY_PRIO; lprio = rprio + 1; goto maybe_reduce;
- case '*': case '/': case '%':
- lprio = MUL_PRIO; goto binop;
- case '<': case '>': case LEQ: case GEQ:
- lprio = LESS_PRIO; goto binop;
- case EQUAL: case NOTEQUAL:
- lprio = EQUAL_PRIO; goto binop;
- case LSH: case RSH:
- lprio = SHIFT_PRIO; goto binop;
- case '&': lprio = AND_PRIO; goto binop;
- case '^': lprio = XOR_PRIO; goto binop;
- case '|': lprio = OR_PRIO; goto binop;
- case ANDAND: lprio = ANDAND_PRIO; goto binop;
- case OROR: lprio = OROR_PRIO; goto binop;
- case ',':
- lprio = COMMA_PRIO; goto binop;
- case '(':
- lprio = PAREN_OUTER_PRIO; rprio = PAREN_INNER_PRIO;
- goto maybe_reduce;
- case ')':
- lprio = PAREN_INNER_PRIO; rprio = PAREN_OUTER_PRIO;
- goto maybe_reduce;
- case ':':
- lprio = COND_PRIO; rprio = COND_PRIO;
- goto maybe_reduce;
- case '?':
- lprio = COND_PRIO + 1; rprio = COND_PRIO;
- goto maybe_reduce;
- binop:
- flags = LEFT_OPERAND_REQUIRED|RIGHT_OPERAND_REQUIRED;
- rprio = lprio + 1;
- goto maybe_reduce;
- default:
- cpp_error (pfile, "invalid character in #if");
- goto syntax_error;
- }
-
- set_value:
- /* Push a value onto the stack. */
- if (top->flags & HAVE_VALUE)
- {
- cpp_error (pfile, "syntax error in #if");
- goto syntax_error;
- }
- top->flags |= HAVE_VALUE;
- continue;
-
- maybe_reduce:
- /* Push an operator, and check if we can reduce now. */
- while (top->rprio > lprio)
- {
- HOST_WIDE_INT v1 = top[-1].value, v2 = top[0].value;
- int unsigned1 = top[-1].unsignedp, unsigned2 = top[0].unsignedp;
- top--;
- if ((top[1].flags & LEFT_OPERAND_REQUIRED)
- && ! (top[0].flags & HAVE_VALUE))
- {
- cpp_error (pfile, "syntax error - missing left operand");
- goto syntax_error;
- }
- if ((top[1].flags & RIGHT_OPERAND_REQUIRED)
- && ! (top[1].flags & HAVE_VALUE))
- {
- cpp_error (pfile, "syntax error - missing right operand");
- goto syntax_error;
- }
- /* top[0].value = (top[1].op)(v1, v2);*/
- switch (top[1].op)
- {
- case '+':
- if (!(top->flags & HAVE_VALUE))
- { /* Unary '+' */
- top->value = v2;
- top->unsignedp = unsigned2;
- top->flags |= HAVE_VALUE;
- }
- else
- {
- top->value = v1 + v2;
- top->unsignedp = unsigned1 || unsigned2;
- if (! top->unsignedp && ! skip_evaluation
- && ! possible_sum_sign (v1, v2, top->value))
- integer_overflow (pfile);
- }
- break;
- case '-':
- if (!(top->flags & HAVE_VALUE))
- { /* Unary '-' */
- top->value = - v2;
- if (!skip_evaluation && (top->value & v2) < 0 && !unsigned2)
- integer_overflow (pfile);
- top->unsignedp = unsigned2;
- top->flags |= HAVE_VALUE;
- }
- else
- { /* Binary '-' */
- top->value = v1 - v2;
- top->unsignedp = unsigned1 || unsigned2;
- if (! top->unsignedp && ! skip_evaluation
- && ! possible_sum_sign (top->value, v2, v1))
- integer_overflow (pfile);
- }
- break;
- case '*':
- top->unsignedp = unsigned1 || unsigned2;
- if (top->unsignedp)
- top->value = (unsigned long) v1 * v2;
- else if (!skip_evaluation)
- {
- top->value = v1 * v2;
- if (v1
- && (top->value / v1 != v2
- || (top->value & v1 & v2) < 0))
- integer_overflow (pfile);
- }
- break;
- case '/':
- if (skip_evaluation)
- break;
- if (v2 == 0)
- {
- cpp_error (pfile, "division by zero in #if");
- v2 = 1;
- }
- top->unsignedp = unsigned1 || unsigned2;
- if (top->unsignedp)
- top->value = (unsigned long) v1 / v2;
- else
- {
- top->value = v1 / v2;
- if ((top->value & v1 & v2) < 0)
- integer_overflow (pfile);
- }
- break;
- case '%':
- if (skip_evaluation)
- break;
- if (v2 == 0)
- {
- cpp_error (pfile, "division by zero in #if");
- v2 = 1;
- }
- top->unsignedp = unsigned1 || unsigned2;
- if (top->unsignedp)
- top->value = (unsigned long) v1 % v2;
- else
- top->value = v1 % v2;
- break;
- case '!':
- if (top->flags & HAVE_VALUE)
- {
- cpp_error (pfile, "syntax error");
- goto syntax_error;
- }
- top->value = ! v2;
- top->unsignedp = 0;
- top->flags |= HAVE_VALUE;
- break;
- case '~':
- if (top->flags & HAVE_VALUE)
- {
- cpp_error (pfile, "syntax error");
- goto syntax_error;
- }
- top->value = ~ v2;
- top->unsignedp = unsigned2;
- top->flags |= HAVE_VALUE;
- break;
- case '<': COMPARE(<); break;
- case '>': COMPARE(>); break;
- case LEQ: COMPARE(<=); break;
- case GEQ: COMPARE(>=); break;
- case EQUAL:
- top->value = (v1 == v2);
- top->unsignedp = 0;
- break;
- case NOTEQUAL:
- top->value = (v1 != v2);
- top->unsignedp = 0;
- break;
- case LSH:
- if (skip_evaluation)
- break;
- top->unsignedp = unsigned1;
- if (v2 < 0 && ! unsigned2)
- top->value = right_shift (pfile, v1, unsigned1, -v2);
- else
- top->value = left_shift (pfile, v1, unsigned1, v2);
- break;
- case RSH:
- if (skip_evaluation)
- break;
- top->unsignedp = unsigned1;
- if (v2 < 0 && ! unsigned2)
- top->value = left_shift (pfile, v1, unsigned1, -v2);
- else
- top->value = right_shift (pfile, v1, unsigned1, v2);
- break;
-#define LOGICAL(OP) \
- top->value = v1 OP v2;\
- top->unsignedp = unsigned1 || unsigned2;
- case '&': LOGICAL(&); break;
- case '^': LOGICAL(^); break;
- case '|': LOGICAL(|); break;
- case ANDAND:
- top->value = v1 && v2; top->unsignedp = 0;
- if (!v1) skip_evaluation--;
- break;
- case OROR:
- top->value = v1 || v2; top->unsignedp = 0;
- if (v1) skip_evaluation--;
- break;
- case ',':
- if (CPP_PEDANTIC (pfile))
- cpp_pedwarn (pfile, "comma operator in operand of `#if'");
- top->value = v2;
- top->unsignedp = unsigned2;
- break;
- case '(': case '?':
- cpp_error (pfile, "syntax error in #if");
- goto syntax_error;
- case ':':
- if (top[0].op != '?')
- {
- cpp_error (pfile,
- "syntax error ':' without preceding '?'");
- goto syntax_error;
- }
- else if (! (top[1].flags & HAVE_VALUE)
- || !(top[-1].flags & HAVE_VALUE)
- || !(top[0].flags & HAVE_VALUE))
- {
- cpp_error (pfile, "bad syntax for ?: operator");
- goto syntax_error;
- }
- else
- {
- top--;
- if (top->value) skip_evaluation--;
- top->value = top->value ? v1 : v2;
- top->unsignedp = unsigned1 || unsigned2;
- }
- break;
- case ')':
- if ((top[1].flags & HAVE_VALUE)
- || ! (top[0].flags & HAVE_VALUE)
- || top[0].op != '('
- || (top[-1].flags & HAVE_VALUE))
- {
- cpp_error (pfile, "mismatched parentheses in #if");
- goto syntax_error;
- }
- else
- {
- top--;
- top->value = v1;
- top->unsignedp = unsigned1;
- top->flags |= HAVE_VALUE;
- }
- break;
- default:
- fprintf (stderr,
- top[1].op >= ' ' && top[1].op <= '~'
- ? "unimplemented operator '%c'\n"
- : "unimplemented operator '\\%03o'\n",
- top[1].op);
- }
- }
- if (op.op == 0)
- {
- if (top != stack)
- cpp_error (pfile, "internal error in #if expression");
- if (stack != init_stack)
- free (stack);
- return top->value;
- }
- top++;
-
- /* Check for and handle stack overflow. */
- if (top == limit)
- {
- struct operation *new_stack;
- int old_size = (char *) limit - (char *) stack;
- int new_size = 2 * old_size;
- if (stack != init_stack)
- new_stack = (struct operation *) xrealloc (stack, new_size);
- else
- {
- new_stack = (struct operation *) xmalloc (new_size);
- copy_memory ((char *) stack, (char *) new_stack, old_size);
- }
- stack = new_stack;
- top = (struct operation *) ((char *) new_stack + old_size);
- limit = (struct operation *) ((char *) new_stack + new_size);
- }
-
- top->flags = flags;
- top->rprio = rprio;
- top->op = op.op;
- if ((op.op == OROR && top[-1].value)
- || (op.op == ANDAND && !top[-1].value)
- || (op.op == '?' && !top[-1].value))
- {
- skip_evaluation++;
- }
- else if (op.op == ':')
- {
- if (top[-2].value) /* Was condition true? */
- skip_evaluation++;
- else
- skip_evaluation--;
- }
- }
- syntax_error:
- if (stack != init_stack)
- free (stack);
- skip_rest_of_line (pfile);
- return 0;
-}
diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c
deleted file mode 100755
index 6f190ef..0000000
--- a/gcc/cppfiles.c
+++ /dev/null
@@ -1,1065 +0,0 @@
-/* Part of CPP library. (include file handling)
- Copyright (C) 1986, 87, 89, 92 - 95, 98, 1999 Free Software Foundation, Inc.
- Written by Per Bothner, 1994.
- Based on CCCP program by Paul Rubin, June 1986
- Adapted to ANSI C, Richard Stallman, Jan 1987
- Split out of cpplib.c, Zack Weinberg, Oct 1998
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding! */
-
-#include "config.h"
-#include "system.h"
-#include "cpplib.h"
-
-/* The entry points to this file are: find_include_file, finclude,
- include_hash, append_include_chain, deps_output, and file_cleanup.
- file_cleanup is only called through CPP_BUFFER(pfile)->cleanup,
- so it's static anyway. */
-
-/* CYGNUS LOCAL - obscured headers */
-static int open_include_file_name (cpp_reader*, char *);
-/* END CYGNUS LOCAL - obscured headers */
-static struct include_hash *redundant_include_p
- (cpp_reader *,
- struct include_hash *,
- struct file_name_list *);
-static struct file_name_map *read_name_map (cpp_reader *,
- const char *);
-static char *read_filename_string (int, FILE *);
-static char *remap_filename (cpp_reader *, char *,
- struct file_name_list *);
-static long safe_read (int, char *, int);
-static void simplify_pathname (char *);
-static struct file_name_list *actual_directory (cpp_reader *, char *);
-
-/* Windows does not natively support inodes, and neither does MSDOS. */
-#if (defined _WIN32 && !defined CYGWIN) || defined __MSDOS__
-#define INO_T_EQ(a, b) 0
-#else
-#define INO_T_EQ(a, b) ((a) == (b))
-#endif
-
-/* Append an entry for dir DIR to list LIST, simplifying it if
- possible. SYS says whether this is a system include directory.
- *** DIR is modified in place. It must be writable and permanently
- allocated. LIST is a pointer to the head pointer, because we actually
- *prepend* the dir, and reverse the list later (in merge_include_chains). */
-void
-append_include_chain (pfile, list, dir, sysp)
- cpp_reader *pfile;
- struct file_name_list **list;
- const char *dir;
- int sysp;
-{
- struct file_name_list *new;
- struct stat st;
- unsigned int len;
- char * newdir = xstrdup (dir);
-
- simplify_pathname (newdir);
- if (stat (newdir, &st))
- {
- /* Dirs that don't exist are silently ignored. */
- if (errno != ENOENT)
- cpp_perror_with_name (pfile, newdir);
- return;
- }
-
- if (!S_ISDIR (st.st_mode))
- {
- cpp_message (pfile, 1, "%s: %s: Not a directory", progname, newdir);
- return;
- }
-
- len = strlen(newdir);
- if (len > pfile->max_include_len)
- pfile->max_include_len = len;
-
- new = (struct file_name_list *)xmalloc (sizeof (struct file_name_list));
- new->name = newdir;
- new->nlen = len;
- new->next = *list;
- new->ino = st.st_ino;
- new->dev = st.st_dev;
- new->sysp = sysp;
- new->name_map = NULL;
-
- *list = new;
-}
-
-/* Merge the four include chains together in the order quote, bracket,
- system, after. Remove duplicate dirs (as determined by
- INO_T_EQ()). The system_include and after_include chains are never
- referred to again after this function; all access is through the
- bracket_include path.
-
- For the future: Check if the directory is empty (but
- how?) and possibly preload the include hash. */
-
-void
-merge_include_chains (opts)
- struct cpp_options *opts;
-{
- struct file_name_list *prev, *next, *cur, *other;
- struct file_name_list *quote, *brack, *systm, *after;
- struct file_name_list *qtail, *btail, *stail, *atail;
-
- qtail = opts->quote_include;
- btail = opts->bracket_include;
- stail = opts->system_include;
- atail = opts->after_include;
-
- /* Nreverse the four lists. */
- prev = 0;
- for (cur = qtail; cur; cur = next)
- {
- next = cur->next;
- cur->next = prev;
- prev = cur;
- }
- quote = prev;
-
- prev = 0;
- for (cur = btail; cur; cur = next)
- {
- next = cur->next;
- cur->next = prev;
- prev = cur;
- }
- brack = prev;
-
- prev = 0;
- for (cur = stail; cur; cur = next)
- {
- next = cur->next;
- cur->next = prev;
- prev = cur;
- }
- systm = prev;
-
- prev = 0;
- for (cur = atail; cur; cur = next)
- {
- next = cur->next;
- cur->next = prev;
- prev = cur;
- }
- after = prev;
-
- /* Paste together bracket, system, and after include chains. */
- if (stail)
- stail->next = after;
- else
- systm = after;
- if (btail)
- btail->next = systm;
- else
- brack = systm;
-
- /* This is a bit tricky.
- First we drop dupes from the quote-include list.
- Then we drop dupes from the bracket-include list.
- Finally, if qtail and brack are the same directory,
- we cut out qtail.
-
- We can't just merge the lists and then uniquify them because
- then we may lose directories from the <> search path that should
- be there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however
- safe to treat -Ibar -Ifoo -I- -Ifoo -Iquux as if written
- -Ibar -I- -Ifoo -Iquux. */
-
- for (cur = quote; cur; cur = cur->next)
- {
- for (other = quote; other != cur; other = other->next)
- if (INO_T_EQ (cur->ino, other->ino)
- && cur->dev == other->dev)
- {
- prev->next = cur->next;
- free (cur->name);
- free (cur);
- cur = prev;
- break;
- }
- prev = cur;
- }
- qtail = prev;
-
- for (cur = brack; cur; cur = cur->next)
- {
- for (other = brack; other != cur; other = other->next)
- if (INO_T_EQ (cur->ino, other->ino)
- && cur->dev == other->dev)
- {
- prev->next = cur->next;
- free (cur->name);
- free (cur);
- cur = prev;
- break;
- }
- prev = cur;
- }
-
- if (quote)
- {
- if (INO_T_EQ (qtail->ino, brack->ino) && qtail->dev == brack->dev)
- {
- if (quote == qtail)
- {
- free (quote->name);
- free (quote);
- quote = brack;
- }
- else
- {
- cur = quote;
- while (cur->next != qtail)
- cur = cur->next;
- cur->next = brack;
- free (qtail->name);
- free (qtail);
- }
- }
- else
- qtail->next = brack;
- }
- else
- quote = brack;
-
- opts->quote_include = quote;
- opts->bracket_include = brack;
- opts->system_include = NULL;
- opts->after_include = NULL;
-}
-
-/* Look up or add an entry to the table of all includes. This table
- is indexed by the name as it appears in the #include line. The
- ->next_this_file chain stores all different files with the same
- #include name (there are at least three ways this can happen). The
- hash function could probably be improved a bit. */
-
-struct include_hash *
-include_hash (pfile, fname, add)
- cpp_reader *pfile;
- char *fname;
- int add;
-{
- unsigned int hash = 0;
- struct include_hash *l, *m;
- char *f = fname;
-
- while (*f)
- hash += *f++;
-
- l = pfile->all_include_files[hash % ALL_INCLUDE_HASHSIZE];
- m = 0;
- for (; l; m = l, l = l->next)
- if (!strcmp (l->nshort, fname))
- return l;
-
- if (!add)
- return 0;
-
- l = (struct include_hash *) xmalloc (sizeof (struct include_hash));
- l->next = NULL;
- l->next_this_file = NULL;
- l->foundhere = NULL;
- l->buf = NULL;
- l->limit = NULL;
- if (m)
- m->next = l;
- else
- pfile->all_include_files[hash % ALL_INCLUDE_HASHSIZE] = l;
-
- return l;
-}
-
-/* Return 0 if the file pointed to by IHASH has never been included before,
- -1 if it has been included before and need not be again,
- or a pointer to an IHASH entry which is the file to be reread.
- "Never before" is with respect to the position in ILIST.
-
- This will not detect redundancies involving odd uses of the
- `current directory' rule for "" includes. They aren't quite
- pathological, but I think they are rare enough not to worry about.
- The simplest example is:
-
- top.c:
- #include "a/a.h"
- #include "b/b.h"
-
- a/a.h:
- #include "../b/b.h"
-
- and the problem is that for `current directory' includes,
- ihash->foundhere is not on any of the global include chains,
- so the test below (i->foundhere == l) may be false even when
- the directories are in fact the same. */
-
-static struct include_hash *
-redundant_include_p (pfile, ihash, ilist)
- cpp_reader *pfile;
- struct include_hash *ihash;
- struct file_name_list *ilist;
-{
- struct file_name_list *l;
- struct include_hash *i;
-
- if (! ihash->foundhere)
- return 0;
-
- for (i = ihash; i; i = i->next_this_file)
- for (l = ilist; l; l = l->next)
- if (i->foundhere == l)
- /* The control_macro works like this: If it's NULL, the file
- is to be included again. If it's "", the file is never to
- be included again. If it's a string, the file is not to be
- included again if the string is the name of a defined macro. */
- return (i->control_macro
- && (i->control_macro[0] == '\0'
- || cpp_lookup (pfile, i->control_macro, -1, -1)))
- ? (struct include_hash *)-1 : i;
-
- return 0;
-}
-
-static int
-file_cleanup (pbuf, pfile)
- cpp_buffer *pbuf;
- cpp_reader *pfile;
-{
- if (pbuf->buf)
- {
- free (pbuf->buf);
- pbuf->buf = 0;
- }
- if (pfile->system_include_depth)
- pfile->system_include_depth--;
- return 0;
-}
-
-/* Search for include file FNAME in the include chain starting at
- SEARCH_START. Return -2 if this file doesn't need to be included
- (because it was included already and it's marked idempotent),
- -1 if an error occurred, or a file descriptor open on the file.
- *IHASH is set to point to the include hash entry for this file, and
- *BEFORE is 1 if the file was included before (but needs to be read
- again). */
-int
-find_include_file (pfile, fname, search_start, ihash, before)
- cpp_reader *pfile;
- char *fname;
- struct file_name_list *search_start;
- struct include_hash **ihash;
- int *before;
-{
- struct file_name_list *l;
- struct include_hash *ih, *jh;
- int f, len;
- char *name;
-
- ih = include_hash (pfile, fname, 1);
- jh = redundant_include_p (pfile, ih,
- fname[0] == '/' ? ABSOLUTE_PATH : search_start);
-
- if (jh != 0)
- {
- *before = 1;
- *ihash = jh;
-
- if (jh == (struct include_hash *)-1)
- return -2;
- else
- {
- /* CYGNUS LOCAL - obscured headers */
- return open_include_file_name (pfile, jh->name);
- /* END CYGNUS LOCAL - obscured headers */
- }
- }
-
- if (ih->foundhere)
- /* A file is already known by this name, but it's not the same file.
- Allocate another include_hash block and add it to the next_this_file
- chain. */
- {
- jh = (struct include_hash *)xmalloc (sizeof (struct include_hash));
- while (ih->next_this_file) ih = ih->next_this_file;
-
- ih->next_this_file = jh;
- jh = ih;
- ih = ih->next_this_file;
-
- ih->next = NULL;
- ih->next_this_file = NULL;
- ih->buf = NULL;
- ih->limit = NULL;
- }
- *before = 0;
- *ihash = ih;
- ih->nshort = xstrdup (fname);
- ih->control_macro = NULL;
-
- /* If the pathname is absolute, just open it. */
- if (fname[0] == '/')
- {
- ih->foundhere = ABSOLUTE_PATH;
- ih->name = ih->nshort;
- /* CYGNUS LOCAL - obscured headers */
- return open_include_file_name (pfile, ih->name);
- /* END CYGNUS LOCAL - obscured headers */
- }
-
- /* Search directory path, trying to open the file. */
-
- len = strlen (fname);
- name = xmalloc (len + pfile->max_include_len + 2 + INCLUDE_LEN_FUDGE);
-
- for (l = search_start; l; l = l->next)
- {
- copy_memory (l->name, name, l->nlen);
- name[l->nlen] = '/';
- strcpy (&name[l->nlen+1], fname);
- simplify_pathname (name);
- if (CPP_OPTIONS (pfile)->remap)
- name = remap_filename (pfile, name, l);
-
- /* CYGNUS LOCAL - obscured headers */
- f = open_include_file_name (pfile, name);
- /* END CYGNUS LOCAL - obscured headers */
-#ifdef EACCES
- if (f == -1 && errno == EACCES)
- {
- cpp_error(pfile, "included file `%s' exists but is not readable",
- name);
- return -1;
- }
-#endif
-
- if (f >= 0)
- {
- ih->foundhere = l;
- ih->name = xrealloc (name, strlen (name)+1);
- return f;
- }
- }
-
- if (jh)
- {
- jh->next_this_file = NULL;
- free (ih);
- }
- free (name);
- *ihash = (struct include_hash *)-1;
- return -1;
-}
-
-/* The file_name_map structure holds a mapping of file names for a
- particular directory. This mapping is read from the file named
- FILE_NAME_MAP_FILE in that directory. Such a file can be used to
- map filenames on a file system with severe filename restrictions,
- such as DOS. The format of the file name map file is just a series
- of lines with two tokens on each line. The first token is the name
- to map, and the second token is the actual name to use. */
-
-struct file_name_map
-{
- struct file_name_map *map_next;
- char *map_from;
- char *map_to;
-};
-
-#define FILE_NAME_MAP_FILE "header.gcc"
-
-/* Read a space delimited string of unlimited length from a stdio
- file. */
-
-static char *
-read_filename_string (ch, f)
- int ch;
- FILE *f;
-{
- char *alloc, *set;
- int len;
-
- len = 20;
- set = alloc = xmalloc (len + 1);
- if (! is_space[ch])
- {
- *set++ = ch;
- while ((ch = getc (f)) != EOF && ! is_space[ch])
- {
- if (set - alloc == len)
- {
- len *= 2;
- alloc = xrealloc (alloc, len + 1);
- set = alloc + len / 2;
- }
- *set++ = ch;
- }
- }
- *set = '\0';
- ungetc (ch, f);
- return alloc;
-}
-
-/* This structure holds a linked list of file name maps, one per directory. */
-
-struct file_name_map_list
-{
- struct file_name_map_list *map_list_next;
- char *map_list_name;
- struct file_name_map *map_list_map;
-};
-
-/* Read the file name map file for DIRNAME. */
-
-static struct file_name_map *
-read_name_map (pfile, dirname)
- cpp_reader *pfile;
- const char *dirname;
-{
- register struct file_name_map_list *map_list_ptr;
- char *name;
- FILE *f;
-
- for (map_list_ptr = CPP_OPTIONS (pfile)->map_list; map_list_ptr;
- map_list_ptr = map_list_ptr->map_list_next)
- if (! strcmp (map_list_ptr->map_list_name, dirname))
- return map_list_ptr->map_list_map;
-
- map_list_ptr = ((struct file_name_map_list *)
- xmalloc (sizeof (struct file_name_map_list)));
- map_list_ptr->map_list_name = xstrdup (dirname);
-
- name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
- strcpy (name, dirname);
- if (*dirname)
- strcat (name, "/");
- strcat (name, FILE_NAME_MAP_FILE);
- f = fopen (name, "r");
- if (!f)
- map_list_ptr->map_list_map = (struct file_name_map *)-1;
- else
- {
- int ch;
- int dirlen = strlen (dirname);
-
- while ((ch = getc (f)) != EOF)
- {
- char *from, *to;
- struct file_name_map *ptr;
-
- if (is_space[ch])
- continue;
- from = read_filename_string (ch, f);
- while ((ch = getc (f)) != EOF && is_hor_space[ch])
- ;
- to = read_filename_string (ch, f);
-
- ptr = ((struct file_name_map *)
- xmalloc (sizeof (struct file_name_map)));
- ptr->map_from = from;
-
- /* Make the real filename absolute. */
- if (*to == '/')
- ptr->map_to = to;
- else
- {
- ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
- strcpy (ptr->map_to, dirname);
- ptr->map_to[dirlen] = '/';
- strcpy (ptr->map_to + dirlen + 1, to);
- free (to);
- }
-
- ptr->map_next = map_list_ptr->map_list_map;
- map_list_ptr->map_list_map = ptr;
-
- while ((ch = getc (f)) != '\n')
- if (ch == EOF)
- break;
- }
- fclose (f);
- }
-
- map_list_ptr->map_list_next = CPP_OPTIONS (pfile)->map_list;
- CPP_OPTIONS (pfile)->map_list = map_list_ptr;
-
- return map_list_ptr->map_list_map;
-}
-
-/* Remap NAME based on the file_name_map (if any) for LOC. */
-
-static char *
-remap_filename (pfile, name, loc)
- cpp_reader *pfile;
- char *name;
- struct file_name_list *loc;
-{
- struct file_name_map *map;
- const char *from, *p, *dir;
-
- if (! loc->name_map)
- loc->name_map = read_name_map (pfile,
- loc->name
- ? loc->name : ".");
-
- if (loc->name_map == (struct file_name_map *)-1)
- return name;
-
- from = name + strlen (loc->name) + 1;
-
- for (map = loc->name_map; map; map = map->map_next)
- if (!strcmp (map->map_from, from))
- return map->map_to;
-
- /* Try to find a mapping file for the particular directory we are
- looking in. Thus #include <sys/types.h> will look up sys/types.h
- in /usr/include/header.gcc and look up types.h in
- /usr/include/sys/header.gcc. */
- p = strrchr (name, '/');
- if (!p)
- p = name;
- if (loc && loc->name
- && strlen (loc->name) == (size_t) (p - name)
- && !strncmp (loc->name, name, p - name))
- /* FILENAME is in SEARCHPTR, which we've already checked. */
- return name;
-
- if (p == name)
- {
- dir = ".";
- from = name;
- }
- else
- {
- char * newdir = (char *) alloca (p - name + 1);
- copy_memory (name, newdir, p - name);
- newdir[p - name] = '\0';
- dir = newdir;
- from = p + 1;
- }
-
- for (map = read_name_map (pfile, dir); map; map = map->map_next)
- if (! strcmp (map->map_from, name))
- return map->map_to;
-
- return name;
-}
-
-/* CYGNUS LOCAL - obscured headers */
-static int
-open_include_file_name (pfile, filename)
- cpp_reader *pfile;
- char *filename;
-{
- return open (filename, O_RDONLY, 0666);
-}
-/* END CYGNUS LOCAL - obscured headers */
-
-/* Read the contents of FD into the buffer on the top of PFILE's stack.
- IHASH points to the include hash entry for the file associated with
- FD.
-
- The caller is responsible for the cpp_push_buffer. */
-
-int
-finclude (pfile, fd, ihash)
- cpp_reader *pfile;
- int fd;
- struct include_hash *ihash;
-{
- struct stat st;
- size_t st_size;
- long i, length;
- cpp_buffer *fp;
-#if 0
- int missing_newline = 0;
-#endif
-
- if (fstat (fd, &st) < 0)
- goto perror_fail;
-
- fp = CPP_BUFFER (pfile);
- fp->nominal_fname = fp->fname = ihash->name;
- fp->ihash = ihash;
- fp->system_header_p = (ihash->foundhere != ABSOLUTE_PATH
- && ihash->foundhere->sysp);
- fp->lineno = 1;
- fp->colno = 1;
- fp->cleanup = file_cleanup;
-
- /* The ->actual_dir field is only used when ignore_srcdir is not in effect;
- see do_include */
- if (!CPP_OPTIONS (pfile)->ignore_srcdir)
- fp->actual_dir = actual_directory (pfile, fp->fname);
-
- if (S_ISREG (st.st_mode))
- {
- st_size = (size_t) st.st_size;
- if (st_size != st.st_size || st_size + 2 < st_size)
- {
- cpp_error (pfile, "file `%s' too large", ihash->name);
- goto fail;
- }
- fp->buf = (U_CHAR *) xmalloc (st_size + 2);
- fp->alimit = fp->buf + st_size + 2;
- fp->cur = fp->buf;
-
- /* Read the file contents, knowing that st_size is an upper bound
- on the number of bytes we can read. */
- length = safe_read (fd, fp->buf, st_size);
- fp->rlimit = fp->buf + length;
- if (length < 0)
- goto perror_fail;
- }
- else if (S_ISDIR (st.st_mode))
- {
- cpp_pop_buffer (pfile);
- cpp_error (pfile, "directory `%s' specified in #include", ihash->name);
- goto fail;
- }
- else
- {
- /* Cannot count its file size before reading.
- First read the entire file into heap and
- copy them into buffer on stack. */
-
- size_t bsize = 2000;
-
- st_size = 0;
- fp->buf = (U_CHAR *) xmalloc (bsize + 2);
-
- for (;;)
- {
- i = safe_read (fd, fp->buf + st_size, bsize - st_size);
- if (i < 0)
- goto perror_fail;
- st_size += i;
- if (st_size != bsize)
- break; /* End of file */
- bsize *= 2;
- fp->buf = (U_CHAR *) xrealloc (fp->buf, bsize + 2);
- }
- fp->cur = fp->buf;
- length = st_size;
- }
-
- /* FIXME: Broken in presence of trigraphs (consider ??/<EOF>)
- and doesn't warn about a missing newline. */
- if ((length > 0 && fp->buf[length - 1] != '\n')
- || (length > 1 && fp->buf[length - 2] == '\\'))
- fp->buf[length++] = '\n';
-
- fp->buf[length] = '\0';
- fp->rlimit = fp->buf + length;
-
- close (fd);
- pfile->input_stack_listing_current = 0;
-
-#if 0
- if (!no_trigraphs)
- trigraph_pcp (fp);
-#endif
- return 1;
-
- perror_fail:
- cpp_pop_buffer (pfile);
- cpp_error_from_errno (pfile, ihash->name);
- fail:
- close (fd);
- return 0;
-}
-
-static struct file_name_list *
-actual_directory (pfile, fname)
- cpp_reader *pfile;
- char *fname;
-{
- char *last_slash, *dir;
- size_t dlen;
- struct file_name_list *x;
-
- dir = xstrdup (fname);
- last_slash = strrchr (dir, '/');
- if (last_slash)
- {
- if (last_slash == dir)
- {
- dlen = 1;
- last_slash[1] = '\0';
- }
- else
- {
- dlen = last_slash - dir;
- *last_slash = '\0';
- }
- }
- else
- {
- dir[0] = '.';
- dir[1] = '\0';
- dlen = 1;
- }
-
- if (dlen > pfile->max_include_len)
- pfile->max_include_len = dlen;
-
- for (x = pfile->actual_dirs; x; x = x->alloc)
- if (!strcmp (x->name, dir))
- {
- free (dir);
- return x;
- }
-
- /* Not found, make a new one. */
- x = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
- x->name = dir;
- x->nlen = dlen;
- x->next = CPP_OPTIONS (pfile)->quote_include;
- x->alloc = pfile->actual_dirs;
- x->sysp = 0;
- x->name_map = NULL;
-
- pfile->actual_dirs = x;
- return x;
-}
-
-/* Read LEN bytes at PTR from descriptor DESC, for file FILENAME,
- retrying if necessary. If MAX_READ_LEN is defined, read at most
- that bytes at a time. Return a negative value if an error occurs,
- otherwise return the actual number of bytes read,
- which must be LEN unless end-of-file was reached. */
-
-static long
-safe_read (desc, ptr, len)
- int desc;
- char *ptr;
- int len;
-{
- int left, rcount, nchars;
-
- left = len;
- while (left > 0) {
- rcount = left;
-#ifdef MAX_READ_LEN
- if (rcount > MAX_READ_LEN)
- rcount = MAX_READ_LEN;
-#endif
- nchars = read (desc, ptr, rcount);
- if (nchars < 0)
- {
-#ifdef EINTR
- if (errno == EINTR)
- continue;
-#endif
- return nchars;
- }
- if (nchars == 0)
- break;
- ptr += nchars;
- left -= nchars;
- }
- return len - left;
-}
-
-/* Add output to `deps_buffer' for the -M switch.
- STRING points to the text to be output.
- SPACER is ':' for targets, ' ' for dependencies, zero for text
- to be inserted literally. */
-
-void
-deps_output (pfile, string, spacer)
- cpp_reader *pfile;
- char *string;
- int spacer;
-{
- int size;
- int cr = 0;
-
- if (!*string)
- return;
-
- size = strlen (string);
-
-#ifndef MAX_OUTPUT_COLUMNS
-#define MAX_OUTPUT_COLUMNS 72
-#endif
- if (pfile->deps_column > 0
- && (pfile->deps_column + size) > MAX_OUTPUT_COLUMNS)
- {
- size += 5;
- cr = 1;
- pfile->deps_column = 0;
- }
-
- if (pfile->deps_size + size + 8 > pfile->deps_allocated_size)
- {
- pfile->deps_allocated_size = (pfile->deps_size + size + 50) * 2;
- pfile->deps_buffer = (char *) xrealloc (pfile->deps_buffer,
- pfile->deps_allocated_size);
- }
-
- if (cr)
- {
- copy_memory (" \\\n ", &pfile->deps_buffer[pfile->deps_size], 5);
- pfile->deps_size += 5;
- }
-
- if (spacer == ' ' && pfile->deps_column > 0)
- pfile->deps_buffer[pfile->deps_size++] = ' ';
- copy_memory (string, &pfile->deps_buffer[pfile->deps_size], size);
- pfile->deps_size += size;
- pfile->deps_column += size;
- if (spacer == ':')
- pfile->deps_buffer[pfile->deps_size++] = ':';
- pfile->deps_buffer[pfile->deps_size] = 0;
-}
-
-/* Simplify a path name in place, deleting redundant components. This
- reduces OS overhead and guarantees that equivalent paths compare
- the same (modulo symlinks).
-
- Transforms made:
- foo/bar/../quux foo/quux
- foo/./bar foo/bar
- foo//bar foo/bar
- /../quux /quux
- //quux //quux (POSIX allows leading // as a namespace escape)
-
- Guarantees no trailing slashes. All transforms reduce the length
- of the string.
- */
-static void
-simplify_pathname (path)
- char *path;
-{
- char *from, *to;
- char *base;
- int absolute = 0;
-
-#if defined _WIN32 || defined __MSDOS__
- /* Convert all backslashes to slashes. */
- for (from = path; *from; from++)
- if (*from == '\\') *from = '/';
-
- /* Skip over leading drive letter if present. */
- if (ISALPHA (path[0]) && path[1] == ':')
- from = to = &path[2];
- else
- from = to = path;
-#else
- from = to = path;
-#endif
-
- /* Remove redundant initial /s. */
- if (*from == '/')
- {
- absolute = 1;
- to++;
- from++;
- if (*from == '/')
- {
- if (*++from == '/')
- /* 3 or more initial /s are equivalent to 1 /. */
- while (*++from == '/');
- else
- /* On some hosts // differs from /; Posix allows this. */
- to++;
- }
- }
- base = to;
-
- for (;;)
- {
- while (*from == '/')
- from++;
-
- if (from[0] == '.' && from[1] == '/')
- from += 2;
- else if (from[0] == '.' && from[1] == '\0')
- goto done;
- else if (from[0] == '.' && from[1] == '.' && from[2] == '/')
- {
- if (base == to)
- {
- if (absolute)
- from += 3;
- else
- {
- *to++ = *from++;
- *to++ = *from++;
- *to++ = *from++;
- base = to;
- }
- }
- else
- {
- to -= 2;
- while (to > base && *to != '/') to--;
- if (*to == '/')
- to++;
- from += 3;
- }
- }
- else if (from[0] == '.' && from[1] == '.' && from[2] == '\0')
- {
- if (base == to)
- {
- if (!absolute)
- {
- *to++ = *from++;
- *to++ = *from++;
- }
- }
- else
- {
- to -= 2;
- while (to > base && *to != '/') to--;
- if (*to == '/')
- to++;
- }
- goto done;
- }
- else
- /* Copy this component and trailing /, if any. */
- while ((*to++ = *from++) != '/')
- {
- if (!to[-1])
- {
- to--;
- goto done;
- }
- }
-
- }
-
- done:
- /* Trim trailing slash */
- if (to[0] == '/' && (!absolute || to > path+1))
- to--;
-
- /* Change the empty string to "." so that stat() on the result
- will always work. */
- if (to == path)
- *to++ = '.';
-
- *to = '\0';
-
- return;
-}
diff --git a/gcc/cpphash.c b/gcc/cpphash.c
deleted file mode 100755
index 2ae3ad6..0000000
--- a/gcc/cpphash.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/* Part of CPP library. (Macro hash table support.)
- Copyright (C) 1986, 87, 89, 92-95, 1996, 1998 Free Software Foundation, Inc.
- Written by Per Bothner, 1994.
- Based on CCCP program by Paul Rubin, June 1986
- Adapted to ANSI C, Richard Stallman, Jan 1987
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding! */
-
-#include "config.h"
-#include "system.h"
-#include "cpplib.h"
-#include "cpphash.h"
-
-static HASHNODE *hashtab[HASHSIZE];
-
-/* Return hash function on name. must be compatible with the one
- computed a step at a time, elsewhere */
-
-int
-hashf (name, len, hashsize)
- register const U_CHAR *name;
- register int len;
- int hashsize;
-{
- register int r = 0;
-
- while (len--)
- r = HASHSTEP (r, *name++);
-
- return MAKE_POS (r) % hashsize;
-}
-
-/* Find the most recent hash node for name "name" (ending with first
- non-identifier char) installed by install
-
- If LEN is >= 0, it is the length of the name.
- Otherwise, compute the length by scanning the entire name.
-
- If HASH is >= 0, it is the precomputed hash code.
- Otherwise, compute the hash code. */
-
-HASHNODE *
-cpp_lookup (pfile, name, len, hash)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
- const U_CHAR *name;
- int len;
- int hash;
-{
- register const U_CHAR *bp;
- register HASHNODE *bucket;
-
- if (len < 0)
- {
- for (bp = name; is_idchar[*bp]; bp++) ;
- len = bp - name;
- }
-
- if (hash < 0)
- hash = hashf (name, len, HASHSIZE);
-
- bucket = hashtab[hash];
- while (bucket) {
- if (bucket->length == len && strncmp (bucket->name, name, len) == 0)
- return bucket;
- bucket = bucket->next;
- }
- return (HASHNODE *) 0;
-}
-
-/*
- * Delete a hash node. Some weirdness to free junk from macros.
- * More such weirdness will have to be added if you define more hash
- * types that need it.
- */
-
-/* Note that the DEFINITION of a macro is removed from the hash table
- but its storage is not freed. This would be a storage leak
- except that it is not reasonable to keep undefining and redefining
- large numbers of macros many times.
- In any case, this is necessary, because a macro can be #undef'd
- in the middle of reading the arguments to a call to it.
- If #undef freed the DEFINITION, that would crash. */
-
-void
-delete_macro (hp)
- HASHNODE *hp;
-{
-
- if (hp->prev != NULL)
- hp->prev->next = hp->next;
- if (hp->next != NULL)
- hp->next->prev = hp->prev;
-
- /* make sure that the bucket chain header that
- the deleted guy was on points to the right thing afterwards. */
- if (hp == *hp->bucket_hdr)
- *hp->bucket_hdr = hp->next;
-
- if (hp->type == T_MACRO)
- {
- DEFINITION *d = hp->value.defn;
- struct reflist *ap, *nextap;
-
- for (ap = d->pattern; ap != NULL; ap = nextap)
- {
- nextap = ap->next;
- free (ap);
- }
- if (d->nargs >= 0)
- free (d->args.argnames);
- free (d);
- }
-
- free (hp);
-}
-
-/* Install a name in the main hash table, even if it is already there.
- name stops with first non alphanumeric, except leading '#'.
- caller must check against redefinition if that is desired.
- delete_macro () removes things installed by install () in fifo order.
- this is important because of the `defined' special symbol used
- in #if, and also if pushdef/popdef directives are ever implemented.
-
- If LEN is >= 0, it is the length of the name.
- Otherwise, compute the length by scanning the entire name.
-
- If HASH is >= 0, it is the precomputed hash code.
- Otherwise, compute the hash code. */
-
-HASHNODE *
-install (name, len, type, ivalue, value, hash)
- U_CHAR *name;
- int len;
- enum node_type type;
- int ivalue;
- char *value;
- int hash;
-{
- register HASHNODE *hp;
- register int i, bucket;
- register U_CHAR *p;
-
- if (len < 0) {
- p = name;
- while (is_idchar[*p])
- p++;
- len = p - name;
- }
-
- if (hash < 0)
- hash = hashf (name, len, HASHSIZE);
-
- i = sizeof (HASHNODE) + len + 1;
- hp = (HASHNODE *) xmalloc (i);
- bucket = hash;
- hp->bucket_hdr = &hashtab[bucket];
- hp->next = hashtab[bucket];
- hashtab[bucket] = hp;
- hp->prev = NULL;
- if (hp->next != NULL)
- hp->next->prev = hp;
- hp->type = type;
- hp->length = len;
- if (hp->type == T_CONST)
- hp->value.ival = ivalue;
- else
- hp->value.cpval = value;
- hp->name = ((U_CHAR *) hp) + sizeof (HASHNODE);
- copy_memory (name, hp->name, len);
- hp->name[len] = 0;
- return hp;
-}
-
-void
-cpp_hash_cleanup (pfile)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
-{
- register int i;
- for (i = HASHSIZE; --i >= 0; )
- {
- while (hashtab[i])
- delete_macro (hashtab[i]);
- }
-}
diff --git a/gcc/cpphash.h b/gcc/cpphash.h
deleted file mode 100755
index b773951..0000000
--- a/gcc/cpphash.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Part of CPP library. (Macro hash table support.)
- Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* different kinds of things that can appear in the value field
- of a hash node. Actually, this may be useless now. */
-union hashval {
- int ival;
- char *cpval;
- DEFINITION *defn;
-};
-
-struct hashnode {
- struct hashnode *next; /* double links for easy deletion */
- struct hashnode *prev;
- struct hashnode **bucket_hdr; /* also, a back pointer to this node's hash
- chain is kept, in case the node is the head
- of the chain and gets deleted. */
- enum node_type type; /* type of special token */
- int length; /* length of token, for quick comparison */
- U_CHAR *name; /* the actual name */
- union hashval value; /* pointer to expansion, or whatever */
-};
-
-typedef struct hashnode HASHNODE;
-
-/* Some definitions for the hash table. The hash function MUST be
- computed as shown in hashf () below. That is because the rescan
- loop computes the hash value `on the fly' for most tokens,
- in order to avoid the overhead of a lot of procedure calls to
- the hashf () function. Hashf () only exists for the sake of
- politeness, for use when speed isn't so important. */
-
-#define HASHSIZE 1403
-#define HASHSTEP(old, c) ((old << 2) + c)
-#define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */
-
-extern HASHNODE *install (U_CHAR *,int,enum node_type, int,char *,int);
-extern int hashf (const U_CHAR *, int, int);
-extern void delete_macro (HASHNODE *);
diff --git a/gcc/cpplib.c b/gcc/cpplib.c
deleted file mode 100755
index bc51639..0000000
--- a/gcc/cpplib.c
+++ /dev/null
@@ -1,5902 +0,0 @@
-/* CPP Library.
- Copyright (C) 1986, 87, 89, 92-98, 1999 Free Software Foundation, Inc.
- Contributed by Per Bothner, 1994-95.
- Based on CCCP program by Paul Rubin, June 1986
- Adapted to ANSI C, Richard Stallman, Jan 1987
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the
- Free Software Foundation; either version 2, or (at your option) any
- later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#include "config.h"
-#include "system.h"
-
-#ifndef STDC_VALUE
-#define STDC_VALUE 1
-#endif
-
-#include <signal.h>
-
-#ifdef HAVE_SYS_TIMES_H
-#include <sys/times.h>
-#endif
-
-#ifdef HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-#include "cpplib.h"
-#include "cpphash.h"
-#include "output.h"
-#include "prefix.h"
-
-#ifndef GET_ENV_PATH_LIST
-#define GET_ENV_PATH_LIST(VAR,NAME) do { (VAR) = getenv(NAME); } while (0)
-#endif
-
-/* By default, colon separates directories in a path. */
-#ifndef PATH_SEPARATOR
-#define PATH_SEPARATOR ':'
-#endif
-
-#ifndef STANDARD_INCLUDE_DIR
-#define STANDARD_INCLUDE_DIR "/usr/include"
-#endif
-
-/* Symbols to predefine. */
-
-#ifdef CPP_PREDEFINES
-static char *predefs = CPP_PREDEFINES;
-#else
-static char *predefs = "";
-#endif
-
-/* We let tm.h override the types used here, to handle trivial differences
- such as the choice of unsigned int or long unsigned int for size_t.
- When machines start needing nontrivial differences in the size type,
- it would be best to do something here to figure out automatically
- from other information what type to use. */
-
-/* The string value for __SIZE_TYPE__. */
-
-#ifndef SIZE_TYPE
-#define SIZE_TYPE "long unsigned int"
-#endif
-
-/* The string value for __PTRDIFF_TYPE__. */
-
-#ifndef PTRDIFF_TYPE
-#define PTRDIFF_TYPE "long int"
-#endif
-
-/* The string value for __WCHAR_TYPE__. */
-
-/* CYGNUS LOCAL vmakarov */
-#ifndef NO_BUILTIN_WCHAR_TYPE
-/* END CYGNUS LOCAL */
-#ifndef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-#endif
-#define CPP_WCHAR_TYPE(PFILE) \
- (CPP_OPTIONS(PFILE)->cplusplus ? "__wchar_t" : WCHAR_TYPE)
-/* CYGNUS LOCAL vmakarov */
-#endif
-/* END CYGNUS LOCAL */
-
-/* The string value for __REGISTER_PREFIX__ */
-
-#ifndef REGISTER_PREFIX
-#define REGISTER_PREFIX ""
-#endif
-
-#define SKIP_WHITE_SPACE(p) do { while (is_hor_space[*p]) p++; } while (0)
-#define SKIP_ALL_WHITE_SPACE(p) do { while (is_space[*p]) p++; } while (0)
-
-#define PEEKN(N) (CPP_BUFFER(pfile)->rlimit - CPP_BUFFER(pfile)->cur >= (N) ? CPP_BUFFER(pfile)->cur[N] : EOF)
-#define FORWARD(N) CPP_FORWARD(CPP_BUFFER(pfile), (N))
-#define GETC() CPP_BUF_GET(CPP_BUFFER(pfile))
-#define PEEKC() CPP_BUF_PEEK(CPP_BUFFER(pfile))
-/* CPP_IS_MACRO_BUFFER is true if the buffer contains macro expansion.
- (Note that it is false while we're expanding marco *arguments*.) */
-#define CPP_IS_MACRO_BUFFER(PBUF) ((PBUF)->cleanup == macro_cleanup)
-
-/* Move all backslash-newline pairs out of embarrassing places.
- Exchange all such pairs following BP
- with any potentially-embarrassing characters that follow them.
- Potentially-embarrassing characters are / and *
- (because a backslash-newline inside a comment delimiter
- would cause it not to be recognized). */
-
-#define NEWLINE_FIX \
- do {while (PEEKC() == '\\' && PEEKN(1) == '\n') FORWARD(2); } while(0)
-
-/* Same, but assume we've already read the potential '\\' into C. */
-#define NEWLINE_FIX1(C) do { \
- while ((C) == '\\' && PEEKC() == '\n') { FORWARD(1); (C) = GETC(); } \
-} while(0)
-
-struct cpp_pending {
- struct cpp_pending *next;
- char *cmd;
- char *arg;
-};
-
-/* Forward declarations. */
-
-extern void cpp_hash_cleanup (cpp_reader *);
-
-static char *my_strerror (int);
-static void path_include (cpp_reader *, char *);
-static void initialize_builtins (cpp_reader *);
-static void initialize_char_syntax (void);
-#if 0
-static void trigraph_pcp ();
-#endif
-static void validate_else (cpp_reader *, char *);
-static int comp_def_part (int, U_CHAR *, int, U_CHAR *,
- int, int);
-#ifdef abort
-extern void fancy_abort ();
-#endif
-/* CYGNUS LOCAL - obscured headers */
-static int open_include_file_name (cpp_reader*, char *);
-/* END CYGNUS LOCAL - obscured headers */
-static int check_macro_name (cpp_reader *, U_CHAR *, char *);
-static int compare_defs (cpp_reader *,
- DEFINITION *, DEFINITION *);
-static HOST_WIDE_INT eval_if_expression (cpp_reader *);
-static int change_newlines (U_CHAR *, int);
-static void push_macro_expansion (cpp_reader *,
- U_CHAR *, int, HASHNODE *);
-static struct cpp_pending *nreverse_pending (struct cpp_pending *);
-
-static void conditional_skip (cpp_reader *, int,
- enum node_type, U_CHAR *);
-static void skip_if_group (cpp_reader *);
-static int parse_name (cpp_reader *, int);
-static void print_help (void);
-
-/* Last arg to output_line_command. */
-enum file_change_code {same_file, enter_file, leave_file};
-
-/* External declarations. */
-
-extern HOST_WIDE_INT cpp_parse_expr (cpp_reader *);
-
-extern char *version_string;
-extern struct tm *localtime ();
-
-
-/* #include "file" looks in source file dir, then stack. */
-/* #include <file> just looks in the stack. */
-/* -I directories are added to the end, then the defaults are added. */
-/* The */
-static struct default_include {
- char *fname; /* The name of the directory. */
- char *component; /* The component containing the directory */
- int cplusplus; /* Only look here if we're compiling C++. */
- int cxx_aware; /* Includes in this directory don't need to
- be wrapped in extern "C" when compiling
- C++. */
-} include_defaults_array[]
-#ifdef INCLUDE_DEFAULTS
- = INCLUDE_DEFAULTS;
-#else
- = {
- /* Pick up GNU C++ specific include files. */
- { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },
-#ifdef CROSS_COMPILE
- /* This is the dir for fixincludes. Put it just before
- the files that we fix. */
- { GCC_INCLUDE_DIR, "GCC", 0, 0 },
- /* For cross-compilation, this dir name is generated
- automatically in Makefile.in. */
- { CROSS_INCLUDE_DIR, "GCC",0, 0 },
-#ifdef TOOL_INCLUDE_DIR
- /* This is another place that the target system's headers might be. */
- { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1 },
-#endif
-#else /* not CROSS_COMPILE */
-#ifdef LOCAL_INCLUDE_DIR
- /* This should be /usr/local/include and should come before
- the fixincludes-fixed header files. */
- { LOCAL_INCLUDE_DIR, 0, 0, 1 },
-#endif
-#ifdef TOOL_INCLUDE_DIR
- /* This is here ahead of GCC_INCLUDE_DIR because assert.h goes here.
- Likewise, behind LOCAL_INCLUDE_DIR, where glibc puts its assert.h. */
- { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1 },
-#endif
- /* This is the dir for fixincludes. Put it just before
- the files that we fix. */
- { GCC_INCLUDE_DIR, "GCC", 0, 0 },
- /* Some systems have an extra dir of include files. */
-#ifdef SYSTEM_INCLUDE_DIR
- { SYSTEM_INCLUDE_DIR, 0, 0, 0 },
-#endif
-#ifndef STANDARD_INCLUDE_COMPONENT
-#define STANDARD_INCLUDE_COMPONENT 0
-#endif
- { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0 },
-#endif /* not CROSS_COMPILE */
- { 0, 0, 0, 0 }
- };
-#endif /* no INCLUDE_DEFAULTS */
-
-/* `struct directive' defines one #-directive, including how to handle it. */
-
-struct directive {
- int length; /* Length of name */
- int (*func) /* Function to handle directive */
- (cpp_reader *, struct directive *);
- char *name; /* Name of directive */
- enum node_type type; /* Code which describes which directive. */
-};
-
-/* These functions are declared to return int instead of void since they
- are going to be placed in a table and some old compilers have trouble with
- pointers to functions returning void. */
-
-static int do_define (cpp_reader *, struct directive *);
-static int do_line (cpp_reader *, struct directive *);
-static int do_include (cpp_reader *, struct directive *);
-static int do_undef (cpp_reader *, struct directive *);
-static int do_error (cpp_reader *, struct directive *);
-static int do_pragma (cpp_reader *, struct directive *);
-static int do_ident (cpp_reader *, struct directive *);
-static int do_if (cpp_reader *, struct directive *);
-static int do_xifdef (cpp_reader *, struct directive *);
-static int do_else (cpp_reader *, struct directive *);
-static int do_elif (cpp_reader *, struct directive *);
-static int do_endif (cpp_reader *, struct directive *);
-static int do_warning (cpp_reader *, struct directive *);
-
-#define IS_INCLUDE_DIRECTIVE_TYPE(t) \
- ((int) T_INCLUDE <= (int) (t) && (int) (t) <= (int) T_IMPORT)
-
-/* Here is the actual list of #-directives, most-often-used first.
- The initialize_builtins function assumes #define is the very first. */
-
-static struct directive directive_table[] = {
- { 6, do_define, "define", T_DEFINE },
- { 5, do_xifdef, "ifdef", T_IFDEF },
- { 6, do_xifdef, "ifndef", T_IFNDEF },
- { 7, do_include, "include", T_INCLUDE },
- { 12, do_include, "include_next", T_INCLUDE_NEXT },
- { 6, do_include, "import", T_IMPORT },
- { 5, do_endif, "endif", T_ENDIF },
- { 4, do_else, "else", T_ELSE },
- { 2, do_if, "if", T_IF },
- { 4, do_elif, "elif", T_ELIF },
- { 5, do_undef, "undef", T_UNDEF },
- { 5, do_error, "error", T_ERROR },
- { 7, do_warning, "warning", T_WARNING },
- { 6, do_pragma, "pragma", T_PRAGMA },
- { 4, do_line, "line", T_LINE },
- { 5, do_ident, "ident", T_IDENT },
- { -1, 0, "", T_UNUSED }
-};
-
-/* table to tell if char can be part of a C identifier. */
-U_CHAR is_idchar[256] = { 0 };
-/* table to tell if char can be first char of a c identifier. */
-U_CHAR is_idstart[256] = { 0 };
-/* table to tell if c is horizontal space. */
-U_CHAR is_hor_space[256] = { 0 };
-/* table to tell if c is horizontal or vertical space. */
-U_CHAR is_space[256] = { 0 };
-
-/* Initialize syntactic classifications of characters. */
-static void
-initialize_char_syntax()
-{
- register int i;
-
- /*
- * Set up is_idchar and is_idstart tables. These should be
- * faster than saying (is_alpha (c) || c == '_'), etc.
- * Set up these things before calling any routines tthat
- * refer to them.
- * XXX We should setlocale(LC_CTYPE, "C") here for safety.
- */
- for (i = 0; i < 256; i++)
- {
- is_idchar[i] = ISALNUM(i);
- is_idstart[i] = ISALPHA(i);
- }
-
- is_idchar['_'] = 1;
- is_idstart['_'] = 1;
-
- /* These will be reset later if -$ is in effect. */
- is_idchar['$'] = 1;
- is_idstart['$'] = 1;
-
- /* horizontal space table */
- is_hor_space[' '] = 1;
- is_hor_space['\t'] = 1;
- is_hor_space['\v'] = 1;
- is_hor_space['\f'] = 1;
- is_hor_space['\r'] = 1;
-
- is_space[' '] = 1;
- is_space['\t'] = 1;
- is_space['\v'] = 1;
- is_space['\f'] = 1;
- is_space['\n'] = 1;
- is_space['\r'] = 1;
-}
-
-
-/* Place into PFILE a quoted string representing the string SRC.
- Caller must reserve enough space in pfile->token_buffer. */
-
-static void
-quote_string(cpp_reader *pfile, char *src)
-{
- U_CHAR c;
-
- CPP_PUTC_Q(pfile, '\"');
- for (;; )
- switch ((c = *src++))
- {
- default:
- if (ISPRINT(c))
- CPP_PUTC_Q(pfile, c);
- else
- {
- sprintf((char *)CPP_PWRITTEN(pfile), "\\%03o", c);
- CPP_ADJUST_WRITTEN(pfile, 4);
- }
- break;
-
- case '\"':
- case '\\':
- CPP_PUTC_Q(pfile, '\\');
- CPP_PUTC_Q(pfile, c);
- break;
-
- case '\0':
- CPP_PUTC_Q(pfile, '\"');
- CPP_NUL_TERMINATE_Q(pfile);
- return;
- }
-}
-
-/* Re-allocates PFILE->token_buffer so it will hold at least N more chars. */
-
-void
-cpp_grow_buffer(cpp_reader *pfile, long n)
-{
- long old_written = CPP_WRITTEN(pfile);
- pfile->token_buffer_size = n + 2 * pfile->token_buffer_size;
- pfile->token_buffer = (U_CHAR *)
- xrealloc(pfile->token_buffer, pfile->token_buffer_size);
- CPP_SET_WRITTEN(pfile, old_written);
-}
-
-
-/*
- * process a given definition string, for initialization
- * If STR is just an identifier, define it with value 1.
- * If STR has anything after the identifier, then it should
- * be identifier=definition.
- */
-
-void
-cpp_define(cpp_reader *pfile, U_CHAR *str)
-{
- U_CHAR *buf, *p;
-
- buf = str;
- p = str;
- if (!is_idstart[*p])
- {
- cpp_error(pfile, "malformed option `-D %s'", str);
- return;
- }
- while (is_idchar[*++p])
- ;
- if (*p == '(') {
- while (is_idchar[*++p] || *p == ',' || is_hor_space[*p])
- ;
- if (*p++ != ')')
- p = (U_CHAR *) str; /* Error */
- }
- if (*p == 0)
- {
- buf = (U_CHAR *) alloca(p - buf + 4);
- strcpy((char *)buf, str);
- strcat((char *)buf, " 1");
- }
- else if (*p != '=')
- {
- cpp_error(pfile, "malformed option `-D %s'", str);
- return;
- }
- else
- {
- U_CHAR *q;
- /* Copy the entire option so we can modify it. */
- buf = (U_CHAR *) alloca(2 * strlen(str) + 1);
- strncpy(buf, str, p - str);
- /* Change the = to a space. */
- buf[p - str] = ' ';
- /* Scan for any backslash-newline and remove it. */
- p++;
- q = &buf[p - str];
- while (*p)
- {
- if (*p == '\\' && p[1] == '\n')
- p += 2;
- else
- *q++ = *p++;
- }
- *q = 0;
- }
-
- if (cpp_push_buffer(pfile, buf, strlen(buf)) != NULL)
- {
- do_define(pfile, NULL);
- cpp_pop_buffer(pfile);
- }
-}
-
-/* Given a colon-separated list of file names PATH,
- add all the names to the search path for include files. */
-
-static void
-path_include(cpp_reader *pfile, char *path)
-{
- char *p;
-
- p = path;
-
- if (*p)
- while (1) {
- char *q = p;
- char *name;
-
- /* Find the end of this name. */
- while (*q != 0 && *q != PATH_SEPARATOR) q++;
- if (p == q) {
- /* An empty name in the path stands for the current directory. */
- name = (char *) xmalloc(2);
- name[0] = '.';
- name[1] = 0;
- } else {
- /* Otherwise use the directory that is named. */
- name = (char *) xmalloc(q - p + 1);
- copy_memory(p, name, q - p);
- name[q - p] = 0;
- }
-
- append_include_chain(pfile,
- &(CPP_OPTIONS(pfile)->bracket_include), name, 0);
-
- /* Advance past this name. */
- p = q;
- if (*p == 0)
- break;
- /* Skip the colon. */
- p++;
- }
-}
-
-void
-cpp_options_init(cpp_options *opts)
-{
- zero_memory((char *) opts, sizeof *opts);
- opts->in_fname = NULL;
- opts->out_fname = NULL;
-
- opts->dollars_in_ident = 1;
- initialize_char_syntax();
-
- opts->no_line_commands = 0;
- opts->no_trigraphs = 1;
- opts->put_out_comments = 0;
- opts->print_include_names = 0;
- opts->dump_macros = dump_none;
- opts->no_output = 0;
- opts->remap = 0;
- opts->cplusplus = 0;
- opts->cplusplus_comments = 1;
-
- opts->verbose = 0;
- opts->objc = 0;
- opts->lang_asm = 0;
- opts->for_lint = 0;
- opts->chill = 0;
- opts->pedantic_errors = 0;
- opts->inhibit_warnings = 0;
- opts->warn_comments = 0;
- opts->warn_import = 1;
- opts->warnings_are_errors = 0;
-}
-
-enum cpp_token
-null_underflow(cpp_reader *pfile ATTRIBUTE_UNUSED)
-{
- return CPP_EOF;
-}
-
-int
-null_cleanup(cpp_buffer *pbuf ATTRIBUTE_UNUSED, cpp_reader *pfile ATTRIBUTE_UNUSED)
-{
- return 0;
-}
-
-int
-macro_cleanup(cpp_buffer *pbuf, cpp_reader *pfile ATTRIBUTE_UNUSED)
-{
- HASHNODE *macro = (HASHNODE *) pbuf->data;
- if (macro->type == T_DISABLED)
- macro->type = T_MACRO;
- if (macro->type != T_MACRO || pbuf->buf != macro->value.defn->expansion)
- free(pbuf->buf);
- return 0;
-}
-
-/* Assuming we have read '/'.
- If this is the start of a comment (followed by '*' or '/'),
- skip to the end of the comment, and return ' '.
- Return EOF if we reached the end of file before the end of the comment.
- If not the start of a comment, return '/'. */
-
-static int
-skip_comment(cpp_reader *pfile, long *linep)
-{
- int c = 0;
- while (PEEKC() == '\\' && PEEKN(1) == '\n')
- {
- if (linep)
- (*linep)++;
- FORWARD(2);
- }
- if (PEEKC() == '*')
- {
- FORWARD(1);
- for (;; )
- {
- int prev_c = c;
- c = GETC();
- if (c == EOF)
- return EOF;
- while (c == '\\' && PEEKC() == '\n')
- {
- if (linep)
- (*linep)++;
- FORWARD(1), c = GETC();
- }
- if (prev_c == '*' && c == '/')
- return ' ';
- if (c == '\n' && linep)
- (*linep)++;
- }
- }
- else if (PEEKC() == '/' && CPP_OPTIONS(pfile)->cplusplus_comments)
- {
- FORWARD(1);
- for (;; )
- {
- c = GETC();
- if (c == EOF)
- return ' '; /* Allow // to be terminated by EOF. */
- while (c == '\\' && PEEKC() == '\n')
- {
- FORWARD(1);
- c = GETC();
- if (linep)
- (*linep)++;
- }
- if (c == '\n')
- {
- /* Don't consider final '\n' to be part of comment. */
- FORWARD(-1);
- return ' ';
- }
- }
- }
- else
- return '/';
-}
-
-/* Skip whitespace \-newline and comments. Does not macro-expand. */
-
-void
-cpp_skip_hspace(cpp_reader *pfile)
-{
- while (1)
- {
- int c = PEEKC();
- if (c == EOF)
- return; /* FIXME */
- if (is_hor_space[c])
- {
- if ((c == '\f' || c == '\v') && CPP_PEDANTIC(pfile))
- cpp_pedwarn(pfile, "%s in preprocessing directive",
- c == '\f' ? "formfeed" : "vertical tab");
- FORWARD(1);
- }
- else if (c == '/')
- {
- FORWARD(1);
- c = skip_comment(pfile, NULL);
- if (c == '/')
- FORWARD(-1);
- if (c == EOF || c == '/')
- return;
- }
- else if (c == '\\' && PEEKN(1) == '\n') {
- FORWARD(2);
- }
- else if (c == '@' && CPP_BUFFER(pfile)->has_escapes
- && is_hor_space[PEEKN(1)])
- FORWARD(2);
- else return;
- }
-}
-
-/* Read the rest of the current line.
- The line is appended to PFILE's output buffer. */
-
-static void
-copy_rest_of_line(cpp_reader *pfile)
-{
- struct cpp_options *opts = CPP_OPTIONS(pfile);
- for (;; )
- {
- int c = GETC();
- int nextc;
- switch (c)
- {
- case EOF:
- goto end_directive;
- case '\\':
- if (PEEKC() == '\n')
- {
- FORWARD(1);
- continue;
- }
- case '\'':
- case '\"':
- goto scan_directive_token;
- break;
- case '/':
- nextc = PEEKC();
- if (nextc == '*' || (opts->cplusplus_comments && nextc == '/'))
- goto scan_directive_token;
- break;
- case '\f':
- case '\v':
- if (CPP_PEDANTIC(pfile))
- cpp_pedwarn(pfile, "%s in preprocessing directive",
- c == '\f' ? "formfeed" : "vertical tab");
- break;
-
- case '\n':
- FORWARD(-1);
- goto end_directive;
-scan_directive_token:
- FORWARD(-1);
- cpp_get_token(pfile);
- continue;
- }
- CPP_PUTC(pfile, c);
- }
-end_directive:;
- CPP_NUL_TERMINATE(pfile);
-}
-
-void
-skip_rest_of_line(cpp_reader *pfile)
-{
- long old = CPP_WRITTEN(pfile);
- copy_rest_of_line(pfile);
- CPP_SET_WRITTEN(pfile, old);
-}
-
-/* Handle a possible # directive.
- '#' has already been read. */
-
-int
-handle_directive(cpp_reader *pfile)
-{ int c;
- register struct directive *kt;
- int ident_length;
- U_CHAR *ident;
- long old_written = CPP_WRITTEN(pfile);
-
- cpp_skip_hspace(pfile);
-
- c = PEEKC();
- if (c >= '0' && c <= '9')
- {
- /* Handle # followed by a line number. */
- if (CPP_PEDANTIC(pfile))
- cpp_pedwarn(pfile, "`#' followed by integer");
- do_line(pfile, NULL);
- goto done_a_directive;
- }
-
- /* Now find the directive name. */
- CPP_PUTC(pfile, '#');
- parse_name(pfile, GETC());
- ident = pfile->token_buffer + old_written + 1;
- ident_length = CPP_PWRITTEN(pfile) - ident;
- if (ident_length == 0 && PEEKC() == '\n')
- {
- /* A line of just `#' becomes blank. */
- goto done_a_directive;
- }
-
-#if 0
- if (ident_length == 0 || !is_idstart[*ident]) {
- U_CHAR *p = ident;
- while (is_idchar[*p]) {
- if (*p < '0' || *p > '9')
- break;
- p++;
- }
- /* Avoid error for `###' and similar cases unless -pedantic. */
- if (p == ident) {
- while (*p == '#' || is_hor_space[*p]) p++;
- if (*p == '\n') {
- if (pedantic && !lang_asm)
- cpp_warning(pfile, "invalid preprocessor directive");
- return 0;
- }
- }
-
- if (!lang_asm)
- cpp_error(pfile, "invalid preprocessor directive name");
-
- return 0;
- }
-#endif
- /*
- * Decode the keyword and call the appropriate expansion
- * routine, after moving the input pointer up to the next line.
- */
- for (kt = directive_table;; kt++) {
- if (kt->length <= 0)
- goto not_a_directive;
- if (kt->length == ident_length
- && !strncmp(kt->name, ident, ident_length))
- break;
- }
-
- /* We may want to pass through #define, #pragma, and #include.
- Other directives may create output, but we don't want the directive
- itself out, so we pop it now. For example conditionals may emit
- #failed ... #endfailed stuff. */
-
- if (!(kt->type == T_DEFINE
- || kt->type == T_PRAGMA
- || (IS_INCLUDE_DIRECTIVE_TYPE(kt->type)
- && CPP_OPTIONS(pfile)->dump_includes)))
- CPP_SET_WRITTEN(pfile, old_written);
-
- (*kt->func)(pfile, kt);
-
- if (kt->type == T_DEFINE)
- {
- if (CPP_OPTIONS(pfile)->dump_macros == dump_names)
- {
- /* Skip "#define". */
- U_CHAR *p = pfile->token_buffer + old_written + 7;
-
- SKIP_WHITE_SPACE(p);
- while (is_idchar[*p]) p++;
- pfile->limit = p;
- CPP_PUTC(pfile, '\n');
- }
- else if (CPP_OPTIONS(pfile)->dump_macros != dump_definitions)
- CPP_SET_WRITTEN(pfile, old_written);
- }
-
-done_a_directive:
- return 1;
-
-not_a_directive:
- return 0; }
-
-/* Pass a directive through to the output file.
- BUF points to the contents of the directive, as a contiguous string.
- m LIMIT points to the first character past the end of the directive.
- KEYWORD is the keyword-table entry for the directive. */
-
-static void
-pass_thru_directive(U_CHAR *buf, U_CHAR *limit, cpp_reader *pfile, struct directive *keyword)
-{
- register unsigned keyword_length = keyword->length;
-
- CPP_RESERVE(pfile, 1 + keyword_length + (limit - buf));
- CPP_PUTC_Q(pfile, '#');
- CPP_PUTS_Q(pfile, keyword->name, keyword_length);
- if (limit != buf && buf[0] != ' ')
- CPP_PUTC_Q(pfile, ' ');
- CPP_PUTS_Q(pfile, buf, limit - buf);
-#if 0
- CPP_PUTS_Q(pfile, '\n');
- /* Count the line we have just made in the output,
- to get in sync properly. */
- pfile->lineno++;
-#endif
-}
-
-/* The arglist structure is built by do_define to tell
- collect_definition where the argument names begin. That
- is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
- would contain pointers to the strings x, y, and z.
- Collect_definition would then build a DEFINITION node,
- with reflist nodes pointing to the places x, y, and z had
- appeared. So the arglist is just convenience data passed
- between these two routines. It is not kept around after
- the current #define has been processed and entered into the
- hash table. */
-
-struct arglist {
- struct arglist *next;
- U_CHAR *name;
- int length;
- int argno;
- char rest_args;
-};
-
-/* Read a replacement list for a macro with parameters.
- Build the DEFINITION structure.
- Reads characters of text starting at BUF until END.
- ARGLIST specifies the formal parameters to look for
- in the text of the definition; NARGS is the number of args
- in that list, or -1 for a macro name that wants no argument list.
- MACRONAME is the macro name itself (so we can avoid recursive expansion)
- and NAMELEN is its length in characters.
-
- Note that comments, backslash-newlines, and leading white space
- have already been deleted from the argument. */
-
-static DEFINITION *
-collect_expansion(cpp_reader *pfile, U_CHAR *buf, U_CHAR *limit, int nargs, struct arglist *arglist)
-{
- DEFINITION *defn;
- register U_CHAR *p, *lastp, *exp_p;
- struct reflist *endpat = NULL;
- /* Pointer to first nonspace after last ## seen. */
- U_CHAR *concat = 0;
- /* Pointer to first nonspace after last single-# seen. */
- U_CHAR *stringify = 0;
- int maxsize;
- int expected_delimiter = '\0';
-
- /* Scan thru the replacement list, ignoring comments and quoted
- strings, picking up on the macro calls. It does a linear search
- thru the arg list on every potential symbol. Profiling might say
- that something smarter should happen. */
-
- if (limit < buf)
- abort();
-
- /* Find the beginning of the trailing whitespace. */
- p = buf;
- while (p < limit && is_space[limit[-1]]) limit--;
-
- /* Allocate space for the text in the macro definition.
- Leading and trailing whitespace chars need 2 bytes each.
- Each other input char may or may not need 1 byte,
- so this is an upper bound. The extra 5 are for invented
- leading and trailing newline-marker and final null. */
- maxsize = (sizeof (DEFINITION)
- + (limit - p) + 5);
- /* Occurrences of '@' get doubled, so allocate extra space for them. */
- while (p < limit)
- if (*p++ == '@')
- maxsize++;
- defn = (DEFINITION *) xcalloc(1, maxsize);
-
- defn->nargs = nargs;
- exp_p = defn->expansion = (U_CHAR *) defn + sizeof (DEFINITION);
- lastp = exp_p;
-
- p = buf;
-
- /* Add one initial space escape-marker to prevent accidental
- token-pasting (often removed by macroexpand). */
- *exp_p++ = '@';
- *exp_p++ = ' ';
-
- if (limit - p >= 2 && p[0] == '#' && p[1] == '#') {
- cpp_error(pfile, "`##' at start of macro definition");
- p += 2;
- }
-
- /* Process the main body of the definition. */
- while (p < limit) {
- int skipped_arg = 0;
- register U_CHAR c = *p++;
-
- *exp_p++ = c;
-
- if (!CPP_TRADITIONAL(pfile)) {
- switch (c) {
- case '\'':
- case '\"':
- if (expected_delimiter != '\0') {
- if (c == expected_delimiter)
- expected_delimiter = '\0';
- } else
- expected_delimiter = c;
- break;
-
- case '\\':
- if (p < limit && expected_delimiter) {
- /* In a string, backslash goes through
- and makes next char ordinary. */
- *exp_p++ = *p++;
- }
- break;
-
- case '@':
- /* An '@' in a string or character constant stands for itself,
- and does not need to be escaped. */
- if (!expected_delimiter)
- *exp_p++ = c;
- break;
-
- case '#':
- /* # is ordinary inside a string. */
- if (expected_delimiter)
- break;
- if (p < limit && *p == '#') {
- /* ##: concatenate preceding and following tokens. */
- /* Take out the first #, discard preceding whitespace. */
- exp_p--;
- while (exp_p > lastp && is_hor_space[exp_p[-1]])
- --exp_p;
- /* Skip the second #. */
- p++;
- /* Discard following whitespace. */
- SKIP_WHITE_SPACE(p);
- concat = p;
- if (p == limit)
- cpp_error(pfile, "`##' at end of macro definition");
- } else if (nargs >= 0) {
- /* Single #: stringify following argument ref.
- Don't leave the # in the expansion. */
- exp_p--;
- SKIP_WHITE_SPACE(p);
- if (p == limit || !is_idstart[*p]
- || (*p == 'L' && p + 1 < limit && (p[1] == '\'' || p[1] == '"')))
- cpp_error(pfile,
- "`#' operator is not followed by a macro argument name");
- else
- stringify = p;
- }
- break;
- }
- } else {
- /* In -traditional mode, recognize arguments inside strings and
- character constants, and ignore special properties of #.
- Arguments inside strings are considered "stringified", but no
- extra quote marks are supplied. */
- switch (c) {
- case '\'':
- case '\"':
- if (expected_delimiter != '\0') {
- if (c == expected_delimiter)
- expected_delimiter = '\0';
- } else
- expected_delimiter = c;
- break;
-
- case '\\':
- /* Backslash quotes delimiters and itself, but not macro args. */
- if (expected_delimiter != 0 && p < limit
- && (*p == expected_delimiter || *p == '\\')) {
- *exp_p++ = *p++;
- continue;
- }
- break;
-
- case '/':
- if (expected_delimiter != '\0') /* No comments inside strings. */
- break;
- if (*p == '*') {
- /* If we find a comment that wasn't removed by handle_directive,
- this must be -traditional. So replace the comment with
- nothing at all. */
- exp_p--;
- p += 1;
- while (p < limit && !(p[-2] == '*' && p[-1] == '/'))
- p++;
-#if 0
- /* Mark this as a concatenation-point, as if it had been ##. */
- concat = p;
-#endif
- }
- break;
- }
- }
-
- /* Handle the start of a symbol. */
- if (is_idchar[c] && nargs > 0) {
- U_CHAR *id_beg = p - 1;
- int id_len;
-
- --exp_p;
- while (p != limit && is_idchar[*p]) p++;
- id_len = p - id_beg;
-
- if (is_idstart[c]
- && !(id_len == 1 && c == 'L' && (*p == '\'' || *p == '"'))) {
- register struct arglist *arg;
-
- for (arg = arglist; arg != NULL; arg = arg->next) {
- struct reflist *tpat;
-
- if (arg->name[0] == c
- && arg->length == id_len
- && strncmp(arg->name, id_beg, id_len) == 0) {
- if (expected_delimiter && CPP_OPTIONS(pfile)->warn_stringify) {
- if (CPP_TRADITIONAL(pfile)) {
- cpp_warning(pfile, "macro argument `%.*s' is stringified.",
- id_len, arg->name);
- } else {
- cpp_warning(pfile,
- "macro arg `%.*s' would be stringified with -traditional.",
- id_len, arg->name);
- }
- }
- /* If ANSI, don't actually substitute inside a string. */
- if (!CPP_TRADITIONAL(pfile) && expected_delimiter)
- break;
- /* make a pat node for this arg and append it to the end of
- the pat list */
- tpat = (struct reflist *) xmalloc(sizeof (struct reflist));
- tpat->next = NULL;
- tpat->raw_before = concat == id_beg;
- tpat->raw_after = 0;
- tpat->rest_args = arg->rest_args;
- tpat->stringify = (CPP_TRADITIONAL(pfile)
- ? expected_delimiter != '\0'
- : stringify == id_beg);
-
- if (endpat == NULL)
- defn->pattern = tpat;
- else
- endpat->next = tpat;
- endpat = tpat;
-
- tpat->argno = arg->argno;
- tpat->nchars = exp_p - lastp;
- {
- register U_CHAR *p1 = p;
- SKIP_WHITE_SPACE(p1);
- if (p1 + 2 <= limit && p1[0] == '#' && p1[1] == '#')
- tpat->raw_after = 1;
- }
- lastp = exp_p; /* place to start copying from next time */
- skipped_arg = 1;
- break;
- }
- }
- }
-
- /* If this was not a macro arg, copy it into the expansion. */
- if (!skipped_arg) {
- register U_CHAR *lim1 = p;
- p = id_beg;
- while (p != lim1)
- *exp_p++ = *p++;
- if (stringify == id_beg)
- cpp_error(pfile,
- "`#' operator should be followed by a macro argument name");
- }
- }
- }
-
- if (!CPP_TRADITIONAL(pfile) && expected_delimiter == 0)
- {
- /* If ANSI, put in a "@ " marker to prevent token pasting.
- But not if "inside a string" (which in ANSI mode
- happens only for -D option). */
- *exp_p++ = '@';
- *exp_p++ = ' ';
- }
-
- *exp_p = '\0';
-
- defn->length = exp_p - defn->expansion;
-
- /* Crash now if we overrun the allocated size. */
- if (defn->length + 1 > maxsize)
- abort();
-
-#if 0
-/* This isn't worth the time it takes. */
-/* give back excess storage */
- defn->expansion = (U_CHAR *) xrealloc(defn->expansion, defn->length + 1);
-#endif
-
- return defn;
-}
-
-/*
- * special extension string that can be added to the last macro argument to
- * allow it to absorb the "rest" of the arguments when expanded. Ex:
- * #define wow(a, b...) process (b, a, b)
- * { wow (1, 2, 3); } -> { process (2, 3, 1, 2, 3); }
- * { wow (one, two); } -> { process (two, one, two); }
- * if this "rest_arg" is used with the concat token '##' and if it is not
- * supplied then the token attached to with ## will not be outputted. Ex:
- * #define wow (a, b...) process (b ## , a, ## b)
- * { wow (1, 2); } -> { process (2, 1, 2); }
- * { wow (one); } -> { process (one); {
- */
-static char rest_extension[] = "...";
-#define REST_EXTENSION_LENGTH (sizeof (rest_extension) - 1)
-
-/* Create a DEFINITION node from a #define directive. Arguments are
- as for do_define. */
-
-static MACRODEF
-create_definition(U_CHAR *buf, U_CHAR *limit, cpp_reader *pfile, int predefinition)
-{
- U_CHAR *bp; /* temp ptr into input buffer */
- U_CHAR *symname; /* remember where symbol name starts */
- int sym_length; /* and how long it is */
- int rest_args = 0;
- long line, col;
- char *file = CPP_BUFFER(pfile) ? CPP_BUFFER(pfile)->nominal_fname : "";
- DEFINITION *defn;
- int arglengths = 0; /* Accumulate lengths of arg names
- plus number of args. */
- MACRODEF mdef;
- cpp_buf_line_and_col(CPP_BUFFER(pfile), &line, &col);
-
- bp = buf;
-
- while (is_hor_space[*bp])
- bp++;
-
- symname = bp; /* remember where it starts */
-
- sym_length = check_macro_name(pfile, bp, "macro");
- bp += sym_length;
-
- /* Lossage will occur if identifiers or control keywords are broken
- across lines using backslash. This is not the right place to take
- care of that. */
-
- if (*bp == '(') {
- struct arglist *arg_ptrs = NULL;
- int argno = 0;
-
- bp++; /* skip '(' */
- SKIP_WHITE_SPACE(bp);
-
- /* Loop over macro argument names. */
- while (*bp != ')') {
- struct arglist *temp;
-
- temp = (struct arglist *) alloca(sizeof (struct arglist));
- temp->name = bp;
- temp->next = arg_ptrs;
- temp->argno = argno++;
- temp->rest_args = 0;
- arg_ptrs = temp;
-
- if (rest_args)
- cpp_pedwarn(pfile, "another parameter follows `%s'", rest_extension);
-
- if (!is_idstart[*bp])
- cpp_pedwarn(pfile, "invalid character in macro parameter name");
-
- /* Find the end of the arg name. */
- while (is_idchar[*bp]) {
- bp++;
- /* do we have a "special" rest-args extension here? */
- if ((size_t)(limit - bp) > REST_EXTENSION_LENGTH
- && strncmp(rest_extension, bp, REST_EXTENSION_LENGTH) == 0) {
- rest_args = 1;
- temp->rest_args = 1;
- break;
- }
- }
- temp->length = bp - temp->name;
- if (rest_args == 1)
- bp += REST_EXTENSION_LENGTH;
- arglengths += temp->length + 2;
- SKIP_WHITE_SPACE(bp);
- if (temp->length == 0 || (*bp != ',' && *bp != ')')) {
- cpp_error(pfile, "badly punctuated parameter list in `#define'");
- goto nope;
- }
- if (*bp == ',') {
- bp++;
- SKIP_WHITE_SPACE(bp);
- }
- if (bp >= limit) {
- cpp_error(pfile, "unterminated parameter list in `#define'");
- goto nope;
- }
- {
- struct arglist *otemp;
-
- for (otemp = temp->next; otemp != NULL; otemp = otemp->next)
- if (temp->length == otemp->length
- && strncmp(temp->name, otemp->name, temp->length) == 0) {
- U_CHAR *name;
-
- name = (U_CHAR *) alloca(temp->length + 1);
- (void) strncpy(name, temp->name, temp->length);
- name[temp->length] = '\0';
- cpp_error(pfile,
- "duplicate argument name `%s' in `#define'", name);
- goto nope;
- }
- }
- }
-
- ++bp; /* skip paren */
- SKIP_WHITE_SPACE(bp);
- /* now everything from bp before limit is the definition. */
- defn = collect_expansion(pfile, bp, limit, argno, arg_ptrs);
- defn->rest_args = rest_args;
-
- /* Now set defn->args.argnames to the result of concatenating
- the argument names in reverse order
- with comma-space between them. */
- defn->args.argnames = (U_CHAR *) xmalloc(arglengths + 1);
- {
- struct arglist *temp;
- int i = 0;
- for (temp = arg_ptrs; temp; temp = temp->next) {
- copy_memory(temp->name, &defn->args.argnames[i], temp->length);
- i += temp->length;
- if (temp->next != 0) {
- defn->args.argnames[i++] = ',';
- defn->args.argnames[i++] = ' ';
- }
- }
- defn->args.argnames[i] = 0;
- }
- } else {
- /* Simple expansion or empty definition. */
-
- if (bp < limit)
- {
- if (is_hor_space[*bp]) {
- bp++;
- SKIP_WHITE_SPACE(bp);
- } else {
- switch (*bp) {
- case '!': case '"': case '#': case '%': case '&': case '\'':
- case ')': case '*': case '+': case ',': case '-': case '.':
- case '/': case ':': case ';': case '<': case '=': case '>':
- case '?': case '[': case '\\': case ']': case '^': case '{':
- case '|': case '}': case '~':
- cpp_warning(pfile, "missing white space after `#define %.*s'",
- sym_length, symname);
- break;
-
- default:
- cpp_pedwarn(pfile, "missing white space after `#define %.*s'",
- sym_length, symname);
- break;
- }
- }
- }
- /* now everything from bp before limit is the definition. */
- defn = collect_expansion(pfile, bp, limit, -1, NULL);
- defn->args.argnames = (U_CHAR *) "";
- }
-
- defn->line = line;
- defn->file = file;
-
- /* OP is null if this is a predefinition */
- defn->predefined = predefinition;
- mdef.defn = defn;
- mdef.symnam = symname;
- mdef.symlen = sym_length;
-
- return mdef;
-
-nope:
- mdef.defn = 0;
- return mdef;
-}
-
-/* Check a purported macro name SYMNAME, and yield its length.
- USAGE is the kind of name this is intended for. */
-
-static int
-check_macro_name(cpp_reader *pfile, U_CHAR *symname, char *usage)
-{
- U_CHAR *p;
- int sym_length;
-
- for (p = symname; is_idchar[*p]; p++)
- ;
- sym_length = p - symname;
- if (sym_length == 0
- || (sym_length == 1 && *symname == 'L' && (*p == '\'' || *p == '"')))
- cpp_error(pfile, "invalid %s name", usage);
- else if (!is_idstart[*symname]) {
- U_CHAR *msg; /* what pain... */
- msg = (U_CHAR *) alloca(sym_length + 1);
- copy_memory(symname, msg, sym_length);
- msg[sym_length] = 0;
- cpp_error(pfile, "invalid %s name `%s'", usage, msg);
- } else {
- if (!strncmp(symname, "defined", 7) && sym_length == 7)
- cpp_error(pfile, "invalid %s name `defined'", usage);
- }
- return sym_length;
-}
-
-/* Return zero if two DEFINITIONs are isomorphic. */
-
-static int
-compare_defs(cpp_reader *pfile, DEFINITION *d1, DEFINITION *d2)
-{
- register struct reflist *a1, *a2;
- register U_CHAR *p1 = d1->expansion;
- register U_CHAR *p2 = d2->expansion;
- int first = 1;
-
- if (d1->nargs != d2->nargs)
- return 1;
- if (CPP_PEDANTIC(pfile)
- && strcmp((char *)d1->args.argnames, (char *)d2->args.argnames))
- return 1;
- for (a1 = d1->pattern, a2 = d2->pattern; a1 && a2;
- a1 = a1->next, a2 = a2->next) {
- if (!((a1->nchars == a2->nchars && !strncmp(p1, p2, a1->nchars))
- || !comp_def_part(first, p1, a1->nchars, p2, a2->nchars, 0))
- || a1->argno != a2->argno
- || a1->stringify != a2->stringify
- || a1->raw_before != a2->raw_before
- || a1->raw_after != a2->raw_after)
- return 1;
- first = 0;
- p1 += a1->nchars;
- p2 += a2->nchars;
- }
- if (a1 != a2)
- return 1;
- if (comp_def_part(first, p1, d1->length - (p1 - d1->expansion),
- p2, d2->length - (p2 - d2->expansion), 1))
- return 1;
- return 0;
-}
-
-/* Return 1 if two parts of two macro definitions are effectively different.
- One of the parts starts at BEG1 and has LEN1 chars;
- the other has LEN2 chars at BEG2.
- Any sequence of whitespace matches any other sequence of whitespace.
- FIRST means these parts are the first of a macro definition;
- so ignore leading whitespace entirely.
- LAST means these parts are the last of a macro definition;
- so ignore trailing whitespace entirely. */
-
-static int
-comp_def_part(int first, U_CHAR *beg1, int len1, U_CHAR *beg2, int len2, int last)
-{
- register U_CHAR *end1 = beg1 + len1;
- register U_CHAR *end2 = beg2 + len2;
- if (first) {
- while (beg1 != end1 && is_space[*beg1]) beg1++;
- while (beg2 != end2 && is_space[*beg2]) beg2++;
- }
- if (last) {
- while (beg1 != end1 && is_space[end1[-1]]) end1--;
- while (beg2 != end2 && is_space[end2[-1]]) end2--;
- }
- while (beg1 != end1 && beg2 != end2) {
- if (is_space[*beg1] && is_space[*beg2]) {
- while (beg1 != end1 && is_space[*beg1]) beg1++;
- while (beg2 != end2 && is_space[*beg2]) beg2++;
- } else if (*beg1 == *beg2) {
- beg1++; beg2++;
- } else break;
- }
- return (beg1 != end1) || (beg2 != end2);
-}
-
-/* Process a #define command.
- KEYWORD is the keyword-table entry for #define,
- or NULL for a "predefined" macro. */
-
-static int
-do_define(cpp_reader *pfile, struct directive *keyword)
-{
- int hashcode;
- MACRODEF mdef;
- HASHNODE *hp;
- int save_put_out_comments;
- long here;
- U_CHAR *macro, *buf, *end;
-
- here = CPP_WRITTEN(pfile);
-
- save_put_out_comments = CPP_OPTIONS(pfile)->put_out_comments;
- CPP_OPTIONS(pfile)->put_out_comments = CPP_TRADITIONAL(pfile);
- copy_rest_of_line(pfile);
- CPP_OPTIONS(pfile)->put_out_comments = save_put_out_comments;
-
- /* Copy out the line so we can pop the token buffer. */
- buf = pfile->token_buffer + here;
- end = CPP_PWRITTEN(pfile);
- macro = alloca(end - buf + 1);
- copy_memory(buf, macro, end - buf + 1);
- end = macro + (end - buf);
-
- CPP_SET_WRITTEN(pfile, here);
-
-#if 0
- /* If this is a precompiler run (with -pcp) pass thru #define commands. */
- if (pcp_outfile && keyword)
- pass_thru_directive(macro, end, pfile, keyword);
-#endif
-
- mdef = create_definition(macro, end, pfile, keyword == NULL);
- if (mdef.defn == 0)
- goto nope;
-
- hashcode = hashf(mdef.symnam, mdef.symlen, HASHSIZE);
-
- if ((hp = cpp_lookup(pfile, mdef.symnam, mdef.symlen, hashcode)) != NULL)
- {
- int ok = 0;
- /* Redefining a precompiled key is ok. */
- if (hp->type == T_PCSTRING)
- ok = 1;
- /* Redefining a macro is ok if the definitions are the same. */
- else if (hp->type == T_MACRO)
- ok = !compare_defs(pfile, mdef.defn, hp->value.defn);
- /* Redefining a constant is ok with -D. */
- else if (hp->type == T_CONST)
- ok = !CPP_OPTIONS(pfile)->done_initializing;
- /* Print the warning if it's not ok. */
- if (!ok)
- {
- U_CHAR *msg; /* what pain... */
-
- /* If we are passing through #define and #undef directives, do
- that for this re-definition now. */
- if (CPP_OPTIONS(pfile)->debug_output && keyword)
- pass_thru_directive(macro, end, pfile, keyword);
-
- msg = (U_CHAR *) alloca(mdef.symlen + 22);
- *msg = '`';
- copy_memory(mdef.symnam, msg + 1, mdef.symlen);
- strcpy((char *) (msg + mdef.symlen + 1), "' redefined");
- cpp_pedwarn(pfile, msg);
- if (hp->type == T_MACRO)
- cpp_pedwarn_with_file_and_line(pfile, hp->value.defn->file, hp->value.defn->line,
- "this is the location of the previous definition");
- }
- /* Replace the old definition. */
- hp->type = T_MACRO;
- hp->value.defn = mdef.defn;
- }
- else
- {
- /* If we are passing through #define and #undef directives, do
- that for this new definition now. */
- if (CPP_OPTIONS(pfile)->debug_output && keyword)
- pass_thru_directive(macro, end, pfile, keyword);
- install(mdef.symnam, mdef.symlen, T_MACRO, 0,
- (char *) mdef.defn, hashcode);
- }
-
- return 0;
-
-nope:
-
- return 1;
-}
-
-/* This structure represents one parsed argument in a macro call.
- `raw' points to the argument text as written (`raw_length' is its length).
- `expanded' points to the argument's macro-expansion
- (its length is `expand_length').
- `stringified_length' is the length the argument would have
- if stringified.
- `use_count' is the number of times this macro arg is substituted
- into the macro. If the actual use count exceeds 10,
- the value stored is 10. */
-
-/* raw and expanded are relative to ARG_BASE */
-#define ARG_BASE ((pfile)->token_buffer)
-
-struct argdata {
- /* Strings relative to pfile->token_buffer */
- long raw, expanded, stringified;
- int raw_length, expand_length;
- int stringified_length;
- char newlines;
- char use_count;
-};
-
-/* Allocate a new cpp_buffer for PFILE, and push it on the input buffer stack.
- If BUFFER != NULL, then use the LENGTH characters in BUFFER
- as the new input buffer.
- Return the new buffer, or NULL on failure. */
-
-cpp_buffer *
-cpp_push_buffer(cpp_reader *pfile, U_CHAR *buffer, long length)
-{
- register cpp_buffer *buf = CPP_BUFFER(pfile);
- if (buf == pfile->buffer_stack)
- {
- cpp_fatal(pfile, "%s: macro or `#include' recursion too deep",
- buf->fname);
- return NULL;
- }
- buf--;
- zero_memory((char *) buf, sizeof (cpp_buffer));
- CPP_BUFFER(pfile) = buf;
- buf->if_stack = pfile->if_stack;
- buf->cleanup = null_cleanup;
- buf->underflow = null_underflow;
- buf->buf = buf->cur = buffer;
- buf->alimit = buf->rlimit = buffer + length;
-
- return buf;
-}
-
-cpp_buffer *
-cpp_pop_buffer(cpp_reader *pfile)
-{
- cpp_buffer *buf = CPP_BUFFER(pfile);
- (*buf->cleanup)(buf, pfile);
- return ++CPP_BUFFER(pfile);
-}
-
-/* Scan until CPP_BUFFER (PFILE) is exhausted into PFILE->token_buffer.
- Pop the buffer when done. */
-
-void
-cpp_scan_buffer(cpp_reader *pfile)
-{
- cpp_buffer *buffer = CPP_BUFFER(pfile);
- for (;; )
- {
- enum cpp_token token = cpp_get_token(pfile);
- if (token == CPP_EOF) /* Should not happen ... */
- break;
- if (token == CPP_POP && CPP_BUFFER(pfile) == buffer)
- {
- cpp_pop_buffer(pfile);
- break;
- }
- }
-}
-
-/*
- * Rescan a string (which may have escape marks) into pfile's buffer.
- * Place the result in pfile->token_buffer.
- *
- * The input is copied before it is scanned, so it is safe to pass
- * it something from the token_buffer that will get overwritten
- * (because it follows CPP_WRITTEN). This is used by do_include.
- */
-
-static void
-cpp_expand_to_buffer(cpp_reader *pfile, U_CHAR *buf, int length)
-{
- register cpp_buffer *ip;
-#if 0
- cpp_buffer obuf;
-#endif
- U_CHAR *limit = buf + length;
- U_CHAR *buf1;
-#if 0
- int odepth = indepth;
-#endif
-
- if (length < 0)
- abort();
-
- /* Set up the input on the input stack. */
-
- buf1 = (U_CHAR *) alloca(length + 1);
- {
- register U_CHAR *p1 = buf;
- register U_CHAR *p2 = buf1;
-
- while (p1 != limit)
- *p2++ = *p1++;
- }
- buf1[length] = 0;
-
- ip = cpp_push_buffer(pfile, buf1, length);
- if (ip == NULL)
- return;
- ip->has_escapes = 1;
-#if 0
- ip->lineno = obuf.lineno = 1;
-#endif
-
- /* Scan the input, create the output. */
- cpp_scan_buffer(pfile);
-
-#if 0
- if (indepth != odepth)
- abort();
-#endif
-
- CPP_NUL_TERMINATE(pfile);
-}
-
-
-static void
-adjust_position(U_CHAR *buf, U_CHAR *limit, long *linep, long *colp)
-{
- while (buf < limit)
- {
- U_CHAR ch = *buf++;
- if (ch == '\n')
- (*linep)++, (*colp) = 1;
- else
- (*colp)++;
- }
-}
-
-/* Move line_base forward, updating lineno and colno. */
-
-static void
-update_position(register cpp_buffer *pbuf)
-{
- unsigned char *old_pos = pbuf->buf + pbuf->line_base;
- unsigned char *new_pos = pbuf->cur;
- register struct parse_marker *mark;
- for (mark = pbuf->marks; mark != NULL; mark = mark->next)
- {
- if (pbuf->buf + mark->position < new_pos)
- new_pos = pbuf->buf + mark->position;
- }
- pbuf->line_base += new_pos - old_pos;
- adjust_position(old_pos, new_pos, &pbuf->lineno, &pbuf->colno);
-}
-
-void
-cpp_buf_line_and_col(register cpp_buffer *pbuf, long *linep, long *colp)
-{
- long dummy;
- if (colp == NULL)
- colp = &dummy;
- if (pbuf)
- {
- *linep = pbuf->lineno;
- *colp = pbuf->colno;
- adjust_position(pbuf->buf + pbuf->line_base, pbuf->cur, linep, colp);
- }
- else
- {
- *linep = 0;
- *colp = 0;
- }
-}
-
-/* Return the cpp_buffer that corresponds to a file (not a macro). */
-
-cpp_buffer *
-cpp_file_buffer(cpp_reader *pfile)
-{
- cpp_buffer *ip = CPP_BUFFER(pfile);
-
- for (; ip != CPP_NULL_BUFFER(pfile); ip = CPP_PREV_BUFFER(ip))
- if (ip->fname != NULL)
- return ip;
- return NULL;
-}
-
-static long
-count_newlines(register U_CHAR *buf, register U_CHAR *limit)
-{
- register long count = 0;
- while (buf < limit)
- {
- U_CHAR ch = *buf++;
- if (ch == '\n')
- count++;
- }
- return count;
-}
-
-/*
- * write out a #line command, for instance, after an #include file.
- * If CONDITIONAL is nonzero, we can omit the #line if it would
- * appear to be a no-op, and we can output a few newlines instead
- * if we want to increase the line number by a small amount.
- * FILE_CHANGE says whether we are entering a file, leaving, or neither.
- */
-
-static void
-output_line_command(cpp_reader *pfile, int conditional, enum file_change_code file_change)
-{
- long line, col;
- cpp_buffer *ip = CPP_BUFFER(pfile);
-
- if (ip->fname == NULL)
- return;
-
- update_position(ip);
-
- if (CPP_OPTIONS(pfile)->no_line_commands
- || CPP_OPTIONS(pfile)->no_output)
- return;
-
- line = CPP_BUFFER(pfile)->lineno;
- col = CPP_BUFFER(pfile)->colno;
- adjust_position(CPP_LINE_BASE(ip), ip->cur, &line, &col);
-
- if (CPP_OPTIONS(pfile)->no_line_commands)
- return;
-
- if (conditional) {
- if (line == pfile->lineno)
- return;
-
- /* If the inherited line number is a little too small,
- output some newlines instead of a #line command. */
- if (line > pfile->lineno && line < pfile->lineno + 8) {
- CPP_RESERVE(pfile, 20);
- while (line > pfile->lineno) {
- CPP_PUTC_Q(pfile, '\n');
- pfile->lineno++;
- }
- return;
- }
- }
-
-#if 0
- /* Don't output a line number of 0 if we can help it. */
- if (ip->lineno == 0 && ip->bufp - ip->buf < ip->length
- && *ip->bufp == '\n') {
- ip->lineno++;
- ip->bufp++;
- }
-#endif
-
- CPP_RESERVE(pfile, 4 * strlen(ip->nominal_fname) + 50);
- {
-#ifdef OUTPUT_LINE_COMMANDS
- static char sharp_line[] = "#line ";
-#else
- static char sharp_line[] = "# ";
-#endif
- CPP_PUTS_Q(pfile, sharp_line, sizeof(sharp_line)-1);
- }
-
- sprintf((char *) CPP_PWRITTEN(pfile), "%ld ", line);
- CPP_ADJUST_WRITTEN(pfile, strlen(CPP_PWRITTEN(pfile)));
-
- quote_string(pfile, ip->nominal_fname);
- if (file_change != same_file) {
- CPP_PUTC_Q(pfile, ' ');
- CPP_PUTC_Q(pfile, file_change == enter_file ? '1' : '2');
- }
- /* Tell cc1 if following text comes from a system header file. */
- if (ip->system_header_p) {
- CPP_PUTC_Q(pfile, ' ');
- CPP_PUTC_Q(pfile, '3');
- }
-#ifndef NO_IMPLICIT_EXTERN_C
- /* Tell cc1plus if following text should be treated as C. */
- if (ip->system_header_p == 2 && CPP_OPTIONS(pfile)->cplusplus) {
- CPP_PUTC_Q(pfile, ' ');
- CPP_PUTC_Q(pfile, '4');
- }
-#endif
- CPP_PUTC_Q(pfile, '\n');
- pfile->lineno = line;
-}
-
-/*
- * Parse a macro argument and append the info on PFILE's token_buffer.
- * REST_ARGS means to absorb the rest of the args.
- * Return nonzero to indicate a syntax error.
- */
-
-static enum cpp_token
-macarg(cpp_reader *pfile, int rest_args)
-{
- int paren = 0;
- enum cpp_token token;
- char save_put_out_comments = CPP_OPTIONS(pfile)->put_out_comments;
- CPP_OPTIONS(pfile)->put_out_comments = 0;
-
- /* Try to parse as much of the argument as exists at this
- input stack level. */
- pfile->no_macro_expand++;
- for (;; )
- {
- token = cpp_get_token(pfile);
- switch (token)
- {
- case CPP_EOF:
- goto done;
- case CPP_POP:
- /* If we've hit end of file, it's an error (reported by caller).
- Ditto if it's the end of cpp_expand_to_buffer text.
- If we've hit end of macro, just continue. */
- if (!CPP_IS_MACRO_BUFFER(CPP_BUFFER(pfile)))
- goto done;
- break;
- case CPP_LPAREN:
- paren++;
- break;
- case CPP_RPAREN:
- if (--paren < 0)
- goto found;
- break;
- case CPP_COMMA:
- /* if we've returned to lowest level and
- we aren't absorbing all args */
- if (paren == 0 && rest_args == 0)
- goto found;
- break;
-found:
- /* Remove ',' or ')' from argument buffer. */
- CPP_ADJUST_WRITTEN(pfile, -1);
- goto done;
- default:;
- }
- }
-
-done:
- CPP_OPTIONS(pfile)->put_out_comments = save_put_out_comments;
- pfile->no_macro_expand--;
-
- return token;
-}
-
-/* Turn newlines to spaces in the string of length LENGTH at START,
- except inside of string constants.
- The string is copied into itself with its beginning staying fixed. */
-
-static int
-change_newlines(U_CHAR *start, int length)
-{
- register U_CHAR *ibp;
- register U_CHAR *obp;
- register U_CHAR *limit;
- register int c;
-
- ibp = start;
- limit = start + length;
- obp = start;
-
- while (ibp < limit) {
- *obp++ = c = *ibp++;
- switch (c) {
-
- case '\'':
- case '\"':
- /* Notice and skip strings, so that we don't delete newlines in them. */
- {
- int quotec = c;
- while (ibp < limit) {
- *obp++ = c = *ibp++;
- if (c == quotec)
- break;
- if (c == '\n' && quotec == '\'')
- break;
- }
- }
- break;
- }
- }
-
- return obp - start;
-}
-
-
-static struct tm *
-timestamp(cpp_reader *pfile)
-{
- if (!pfile->timebuf) {
- time_t t = time((time_t *) 0);
- pfile->timebuf = localtime(&t);
- }
- return pfile->timebuf;
-}
-
-static char *monthnames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",};
-
-/*
- * expand things like __FILE__. Place the expansion into the output
- * buffer *without* rescanning.
- */
-
-static void
-special_symbol(HASHNODE *hp, cpp_reader *pfile)
-{
- char *buf;
- int len;
- int true_indepth;
- cpp_buffer *ip = NULL;
- struct tm *timebuf;
-
- int paren = 0; /* For special `defined' keyword */
-
-#if 0
- if (pcp_outfile && pcp_inside_if
- && hp->type != T_SPEC_DEFINED && hp->type != T_CONST)
- cpp_error(pfile,
- "Predefined macro `%s' used inside `#if' during precompilation",
- hp->name);
-#endif
-
- for (ip = CPP_BUFFER(pfile);; ip = CPP_PREV_BUFFER(ip))
- {
- if (ip == CPP_NULL_BUFFER(pfile))
- {
- cpp_error(pfile, "cccp error: not in any file?!");
- return; /* the show must go on */
- }
- if (ip->fname != NULL)
- break;
- }
-
- switch (hp->type)
- {
- case T_FILE:
- case T_BASE_FILE:
- {
- char *string;
- if (hp->type == T_BASE_FILE)
- {
- while (CPP_PREV_BUFFER(ip) != CPP_NULL_BUFFER(pfile))
- ip = CPP_PREV_BUFFER(ip);
- }
- string = ip->nominal_fname;
-
- if (!string)
- string = "";
- CPP_RESERVE(pfile, 3 + 4 * strlen(string));
- quote_string(pfile, string);
- return;
- }
-
- case T_INCLUDE_LEVEL:
- true_indepth = 0;
- ip = CPP_BUFFER(pfile);
- for (; ip != CPP_NULL_BUFFER(pfile); ip = CPP_PREV_BUFFER(ip))
- if (ip->fname != NULL)
- true_indepth++;
-
- buf = (char *) alloca(8); /* Eight bytes ought to be more than enough */
- sprintf(buf, "%d", true_indepth - 1);
- break;
-
- case T_VERSION:
- buf = (char *) alloca(3 + strlen(version_string));
- sprintf(buf, "\"%s\"", version_string);
- break;
-
-#ifndef NO_BUILTIN_SIZE_TYPE
- case T_SIZE_TYPE:
- buf = SIZE_TYPE;
- break;
-#endif
-
-#ifndef NO_BUILTIN_PTRDIFF_TYPE
- case T_PTRDIFF_TYPE:
- buf = PTRDIFF_TYPE;
- break;
-#endif
-
-/* CYGNUS LOCAL vmakarov */
-#ifndef NO_BUILTIN_WCHAR_TYPE
-/* END CYGNUS LOCAL */
- case T_WCHAR_TYPE:
- buf = CPP_WCHAR_TYPE(pfile);
- break;
-/* CYGNUS LOCAL vmakarov */
-#endif
-/* END CYGNUS LOCAL */
-
- case T_REGISTER_PREFIX_TYPE:
- buf = REGISTER_PREFIX;
- break;
-
- case T_CONST:
- buf = (char *) alloca(4 * sizeof (int));
- sprintf(buf, "%d", hp->value.ival);
-#ifdef STDC_0_IN_SYSTEM_HEADERS
- if (ip->system_header_p
- && hp->length == 8 && memcmp(hp->name, "__STDC__", 8) == 0
- && !cpp_lookup(pfile, (U_CHAR *) "__STRICT_ANSI__", -1, -1))
- strcpy(buf, "0");
-#endif
-#if 0
- if (pcp_inside_if && pcp_outfile)
- /* Output a precondition for this macro use */
- fprintf(pcp_outfile, "#define %s %d\n", hp->name, hp->value.ival);
-#endif
- break;
-
- case T_SPECLINE:
- {
- long line = ip->lineno;
- long col = ip->colno;
- adjust_position(CPP_LINE_BASE(ip), ip->cur, &line, &col);
-
- buf = (char *) alloca(10);
- sprintf(buf, "%ld", line);
- }
- break;
-
- case T_DATE:
- case T_TIME:
- buf = (char *) alloca(20);
- timebuf = timestamp(pfile);
- if (hp->type == T_DATE)
- sprintf(buf, "\"%s %2d %4d\"", monthnames[timebuf->tm_mon],
- timebuf->tm_mday, timebuf->tm_year + 1900);
- else
- sprintf(buf, "\"%02d:%02d:%02d\"", timebuf->tm_hour, timebuf->tm_min,
- timebuf->tm_sec);
- break;
-
- case T_SPEC_DEFINED:
- buf = " 0 "; /* Assume symbol is not defined */
- ip = CPP_BUFFER(pfile);
- SKIP_WHITE_SPACE(ip->cur);
- if (*ip->cur == '(')
- {
- paren++;
- ip->cur++; /* Skip over the paren */
- SKIP_WHITE_SPACE(ip->cur);
- }
-
- if (!is_idstart[*ip->cur])
- goto oops;
- if (ip->cur[0] == 'L' && (ip->cur[1] == '\'' || ip->cur[1] == '"'))
- goto oops;
- if ((hp = cpp_lookup(pfile, ip->cur, -1, -1)))
- {
-#if 0
- if (pcp_outfile && pcp_inside_if
- && (hp->type == T_CONST
- || (hp->type == T_MACRO && hp->value.defn->predefined)))
- /* Output a precondition for this macro use. */
- fprintf(pcp_outfile, "#define %s\n", hp->name);
-#endif
- buf = " 1 ";
- }
-#if 0
- else
- if (pcp_outfile && pcp_inside_if)
- {
- /* Output a precondition for this macro use */
- U_CHAR *cp = ip->bufp;
- fprintf(pcp_outfile, "#undef ");
- while (is_idchar[*cp]) /* Ick! */
- fputc(*cp++, pcp_outfile);
- putc('\n', pcp_outfile);
- }
-#endif
- while (is_idchar[*ip->cur])
- ++ip->cur;
- SKIP_WHITE_SPACE(ip->cur);
- if (paren)
- {
- if (*ip->cur != ')')
- goto oops;
- ++ip->cur;
- }
- break;
-
-oops:
-
- cpp_error(pfile, "`defined' without an identifier");
- break;
-
- default:
- cpp_error(pfile, "cccp error: invalid special hash type"); /* time for gdb */
- abort();
- }
- len = strlen(buf);
- CPP_RESERVE(pfile, len + 1);
- CPP_PUTS_Q(pfile, buf, len);
- CPP_NUL_TERMINATE_Q(pfile);
-
- return;
-}
-
-/* Write out a #define command for the special named MACRO_NAME
- to PFILE's token_buffer. */
-
-static void
-dump_special_to_buffer(cpp_reader *pfile, char *macro_name)
-{
- static char define_directive[] = "#define ";
- int macro_name_length = strlen(macro_name);
- output_line_command(pfile, 0, same_file);
- CPP_RESERVE(pfile, sizeof(define_directive) + macro_name_length);
- CPP_PUTS_Q(pfile, define_directive, sizeof(define_directive)-1);
- CPP_PUTS_Q(pfile, macro_name, macro_name_length);
- CPP_PUTC_Q(pfile, ' ');
- cpp_expand_to_buffer(pfile, macro_name, macro_name_length);
- CPP_PUTC(pfile, '\n');
-}
-
-/* Initialize the built-in macros. */
-
-static void
-initialize_builtins(cpp_reader *pfile)
-{
- install((U_CHAR *)"__LINE__", -1, T_SPECLINE, 0, 0, -1);
- install((U_CHAR *)"__DATE__", -1, T_DATE, 0, 0, -1);
- install((U_CHAR *)"__FILE__", -1, T_FILE, 0, 0, -1);
- install((U_CHAR *)"__BASE_FILE__", -1, T_BASE_FILE, 0, 0, -1);
- install((U_CHAR *)"__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL, 0, 0, -1);
- install((U_CHAR *)"__VERSION__", -1, T_VERSION, 0, 0, -1);
-#ifndef NO_BUILTIN_SIZE_TYPE
- install((U_CHAR *)"__SIZE_TYPE__", -1, T_SIZE_TYPE, 0, 0, -1);
-#endif
-#ifndef NO_BUILTIN_PTRDIFF_TYPE
- install((U_CHAR *)"__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE, 0, 0, -1);
-#endif
-/* CYGNUS LOCAL vmakarov */
-#ifndef NO_BUILTIN_WCHAR_TYPE
-/* END CYGNUS LOCAL */
- install((U_CHAR *)"__WCHAR_TYPE__", -1, T_WCHAR_TYPE, 0, 0, -1);
-/* CYGNUS LOCAL vmakarov */
-#endif
-/* END CYGNUS LOCAL */
- install((U_CHAR *)"__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE, 0, 0, -1);
- install((U_CHAR *)"__TIME__", -1, T_TIME, 0, 0, -1);
- if (!CPP_TRADITIONAL(pfile))
- install((U_CHAR *)"__STDC__", -1, T_CONST, STDC_VALUE, 0, -1);
- if (CPP_OPTIONS(pfile)->objc)
- install((U_CHAR *)"__OBJC__", -1, T_CONST, 1, 0, -1);
-/* This is supplied using a -D by the compiler driver
- so that it is present only when truly compiling with GNU C. */
-/* install ("__GNUC__", -1, T_CONST, 2, 0, -1); */
-
- if (CPP_OPTIONS(pfile)->debug_output)
- {
- dump_special_to_buffer(pfile, "__BASE_FILE__");
- dump_special_to_buffer(pfile, "__VERSION__");
-#ifndef NO_BUILTIN_SIZE_TYPE
- dump_special_to_buffer(pfile, "__SIZE_TYPE__");
-#endif
-#ifndef NO_BUILTIN_PTRDIFF_TYPE
- dump_special_to_buffer(pfile, "__PTRDIFF_TYPE__");
-#endif
-/* CYGNUS LOCAL vmakarov */
-#ifndef NO_BUILTIN_WCHAR_TYPE
-/* END CYGNUS LOCAL */
- dump_special_to_buffer(pfile, "__WCHAR_TYPE__");
-/* CYGNUS LOCAL vmakarov */
-#endif
-/* END CYGNUS LOCAL */
- dump_special_to_buffer(pfile, "__DATE__");
- dump_special_to_buffer(pfile, "__TIME__");
- if (!CPP_TRADITIONAL(pfile))
- dump_special_to_buffer(pfile, "__STDC__");
- if (CPP_OPTIONS(pfile)->objc)
- dump_special_to_buffer(pfile, "__OBJC__");
- }
-}
-
-/* Return 1 iff a token ending in C1 followed directly by a token C2
- could cause mis-tokenization. */
-
-static int
-unsafe_chars(int c1, int c2)
-{
- switch (c1)
- {
- case '+': case '-':
- if (c2 == c1 || c2 == '=')
- return 1;
- goto letter;
- case '.':
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- case 'e': case 'E': case 'p': case 'P':
- if (c2 == '-' || c2 == '+')
- return 1; /* could extend a pre-processing number */
- goto letter;
- case 'L':
- if (c2 == '\'' || c2 == '\"')
- return 1; /* Could turn into L"xxx" or L'xxx'. */
- goto letter;
-letter:
- case '_':
- case 'a': case 'b': case 'c': case 'd': case 'f':
- case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
- case 'm': case 'n': case 'o': case 'q': case 'r':
- case 's': case 't': case 'u': case 'v': case 'w': case 'x':
- case 'y': case 'z':
- case 'A': case 'B': case 'C': case 'D': case 'F':
- case 'G': case 'H': case 'I': case 'J': case 'K':
- case 'M': case 'N': case 'O': case 'Q': case 'R':
- case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
- case 'Y': case 'Z':
- /* We're in the middle of either a name or a pre-processing number. */
- return (is_idchar[c2] || c2 == '.');
- case '<': case '>': case '!': case '%': case '#': case ':':
- case '^': case '&': case '|': case '*': case '/': case '=':
- return (c2 == c1 || c2 == '=');
- }
- return 0;
-}
-
-/* Expand a macro call.
- HP points to the symbol that is the macro being called.
- Put the result of expansion onto the input stack
- so that subsequent input by our caller will use it.
-
- If macro wants arguments, caller has already verified that
- an argument list follows; arguments come from the input stack. */
-
-static void
-macroexpand(cpp_reader *pfile, HASHNODE *hp)
-{
- int nargs;
- DEFINITION *defn = hp->value.defn;
- register U_CHAR *xbuf;
- long start_line, start_column;
- int xbuf_len;
- struct argdata *args;
- long old_written = CPP_WRITTEN(pfile);
-#if 0
- int start_line = instack[indepth].lineno;
-#endif
- int rest_args, rest_zero;
- register int i;
-
-#if 0
- CHECK_DEPTH(return; );
-#endif
-
-#if 0
- /* This macro is being used inside a #if, which means it must be */
- /* recorded as a precondition. */
- if (pcp_inside_if && pcp_outfile && defn->predefined)
- dump_single_macro(hp, pcp_outfile);
-#endif
-
- pfile->output_escapes++;
- cpp_buf_line_and_col(cpp_file_buffer(pfile), &start_line, &start_column);
-
- nargs = defn->nargs;
-
- if (nargs >= 0)
- {
- enum cpp_token token;
-
- args = (struct argdata *) alloca((nargs + 1) * sizeof (struct argdata));
-
- for (i = 0; i < nargs; i++)
- {
- args[i].raw = args[i].expanded = 0;
- args[i].raw_length = 0;
- args[i].expand_length = args[i].stringified_length = -1;
- args[i].use_count = 0;
- }
-
- /* Parse all the macro args that are supplied. I counts them.
- The first NARGS args are stored in ARGS.
- The rest are discarded. If rest_args is set then we assume
- macarg absorbed the rest of the args. */
- i = 0;
- rest_args = 0;
- rest_args = 0;
- FORWARD(1); /* Discard the open-parenthesis before the first arg. */
- do
- {
- if (rest_args)
- continue;
- if (i < nargs || (nargs == 0 && i == 0))
- {
- /* if we are working on last arg which absorbs rest of args... */
- if (i == nargs - 1 && defn->rest_args)
- rest_args = 1;
- args[i].raw = CPP_WRITTEN(pfile);
- token = macarg(pfile, rest_args);
- args[i].raw_length = CPP_WRITTEN(pfile) - args[i].raw;
- args[i].newlines = 0; /* FIXME */
- }
- else
- token = macarg(pfile, 0);
- if (token == CPP_EOF || token == CPP_POP)
- {
- cpp_error_with_line(pfile, start_line, start_column,
- "unterminated macro call");
- return;
- }
- i++;
- } while (token == CPP_COMMA);
-
- /* If we got one arg but it was just whitespace, call that 0 args. */
- if (i == 1)
- {
- register U_CHAR *bp = ARG_BASE + args[0].raw;
- register U_CHAR *lim = bp + args[0].raw_length;
- /* cpp.texi says for foo ( ) we provide one argument.
- However, if foo wants just 0 arguments, treat this as 0. */
- if (nargs == 0)
- while (bp != lim && is_space[*bp]) bp++;
- if (bp == lim)
- i = 0;
- }
-
- /* Don't output an error message if we have already output one for
- a parse error above. */
- rest_zero = 0;
- if (nargs == 0 && i > 0)
- {
- cpp_error(pfile, "arguments given to macro `%s'", hp->name);
- }
- else if (i < nargs)
- {
- /* traditional C allows foo() if foo wants one argument. */
- if (nargs == 1 && i == 0 && CPP_TRADITIONAL(pfile))
- ;
- /* the rest args token is allowed to absorb 0 tokens */
- else if (i == nargs - 1 && defn->rest_args)
- rest_zero = 1;
- else if (i == 0)
- cpp_error(pfile, "macro `%s' used without args", hp->name);
- else if (i == 1)
- cpp_error(pfile, "macro `%s' used with just one arg", hp->name);
- else
- cpp_error(pfile, "macro `%s' used with only %d args",
- hp->name, i);
- }
- else if (i > nargs)
- {
- cpp_error(pfile,
- "macro `%s' used with too many (%d) args", hp->name, i);
- }
- }
-
- /* If macro wants zero args, we parsed the arglist for checking only.
- Read directly from the macro definition. */
- if (nargs <= 0)
- {
- xbuf = defn->expansion;
- xbuf_len = defn->length;
- }
- else
- {
- register U_CHAR *exp = defn->expansion;
- register int offset; /* offset in expansion,
- copied a piece at a time */
- register int totlen; /* total amount of exp buffer filled so far */
-
- register struct reflist *ap, *last_ap;
-
- /* Macro really takes args. Compute the expansion of this call. */
-
- /* Compute length in characters of the macro's expansion.
- Also count number of times each arg is used. */
- xbuf_len = defn->length;
- for (ap = defn->pattern; ap != NULL; ap = ap->next)
- {
- if (ap->stringify)
- {
- register struct argdata *arg = &args[ap->argno];
- /* Stringify if it hasn't already been */
- if (arg->stringified_length < 0)
- {
- int arglen = arg->raw_length;
- int escaped = 0;
- int in_string = 0;
- int c;
- /* Initially need_space is -1. Otherwise, 1 means the
- previous character was a space, but we suppressed it;
- 0 means the previous character was a non-space. */
- int need_space = -1;
- i = 0;
- arg->stringified = CPP_WRITTEN(pfile);
- if (!CPP_TRADITIONAL(pfile))
- CPP_PUTC(pfile, '\"'); /* insert beginning quote */
- for (; i < arglen; i++)
- {
- c = (ARG_BASE + arg->raw)[i];
-
- if (!in_string)
- {
- /* Internal sequences of whitespace are replaced by
- one space except within an string or char token.*/
- if (is_space[c])
- {
- if (CPP_WRITTEN(pfile) > (unsigned)arg->stringified
- && (CPP_PWRITTEN(pfile))[-1] == '@')
- {
- /* "@ " escape markers are removed */
- CPP_ADJUST_WRITTEN(pfile, -1);
- continue;
- }
- if (need_space == 0)
- need_space = 1;
- continue;
- }
- else if (need_space > 0)
- CPP_PUTC(pfile, ' ');
- need_space = 0;
- }
-
- if (escaped)
- escaped = 0;
- else
- {
- if (c == '\\')
- escaped = 1;
- if (in_string)
- {
- if (c == in_string)
- in_string = 0;
- }
- else if (c == '\"' || c == '\'')
- in_string = c;
- }
-
- /* Escape these chars */
- if (c == '\"' || (in_string && c == '\\'))
- CPP_PUTC(pfile, '\\');
- if (ISPRINT(c))
- CPP_PUTC(pfile, c);
- else
- {
- CPP_RESERVE(pfile, 4);
- sprintf((char *)CPP_PWRITTEN(pfile), "\\%03o",
- (unsigned int) c);
- CPP_ADJUST_WRITTEN(pfile, 4);
- }
- }
- if (!CPP_TRADITIONAL(pfile))
- CPP_PUTC(pfile, '\"'); /* insert ending quote */
- arg->stringified_length
- = CPP_WRITTEN(pfile) - arg->stringified;
- }
- xbuf_len += args[ap->argno].stringified_length;
- }
- else if (ap->raw_before || ap->raw_after || CPP_TRADITIONAL(pfile))
- /* Add 4 for two newline-space markers to prevent
- token concatenation. */
- xbuf_len += args[ap->argno].raw_length + 4;
- else
- {
- /* We have an ordinary (expanded) occurrence of the arg.
- So compute its expansion, if we have not already. */
- if (args[ap->argno].expand_length < 0)
- {
- args[ap->argno].expanded = CPP_WRITTEN(pfile);
- cpp_expand_to_buffer(pfile,
- ARG_BASE + args[ap->argno].raw,
- args[ap->argno].raw_length);
-
- args[ap->argno].expand_length
- = CPP_WRITTEN(pfile) - args[ap->argno].expanded;
- }
-
- /* Add 4 for two newline-space markers to prevent
- token concatenation. */
- xbuf_len += args[ap->argno].expand_length + 4;
- }
- if (args[ap->argno].use_count < 10)
- args[ap->argno].use_count++;
- }
-
- xbuf = (U_CHAR *) xmalloc(xbuf_len + 1);
-
- /* Generate in XBUF the complete expansion
- with arguments substituted in.
- TOTLEN is the total size generated so far.
- OFFSET is the index in the definition
- of where we are copying from. */
- offset = totlen = 0;
- for (last_ap = NULL, ap = defn->pattern; ap != NULL;
- last_ap = ap, ap = ap->next)
- {
- register struct argdata *arg = &args[ap->argno];
- int count_before = totlen;
-
- /* Add chars to XBUF. */
- for (i = 0; i < ap->nchars; i++, offset++)
- xbuf[totlen++] = exp[offset];
-
- /* If followed by an empty rest arg with concatenation,
- delete the last run of nonwhite chars. */
- if (rest_zero && totlen > count_before
- && ((ap->rest_args && ap->raw_before)
- || (last_ap != NULL && last_ap->rest_args
- && last_ap->raw_after)))
- {
- /* Delete final whitespace. */
- while (totlen > count_before && is_space[xbuf[totlen - 1]])
- totlen--;
-
- /* Delete the nonwhites before them. */
- while (totlen > count_before && !is_space[xbuf[totlen - 1]])
- totlen--;
- }
-
- if (ap->stringify != 0)
- {
- copy_memory(ARG_BASE + arg->stringified,
- xbuf + totlen, arg->stringified_length);
- totlen += arg->stringified_length;
- }
- else if (ap->raw_before || ap->raw_after || CPP_TRADITIONAL(pfile))
- {
- U_CHAR *p1 = ARG_BASE + arg->raw;
- U_CHAR *l1 = p1 + arg->raw_length;
- if (ap->raw_before)
- {
- while (p1 != l1 && is_space[*p1]) p1++;
- while (p1 != l1 && is_idchar[*p1])
- xbuf[totlen++] = *p1++;
- }
- if (ap->raw_after)
- {
- /* Arg is concatenated after: delete trailing whitespace,
- whitespace markers, and no-reexpansion markers. */
- while (p1 != l1)
- {
- if (is_space[l1[-1]]) l1--;
- else if (l1[-1] == '@')
- {
- U_CHAR *p2 = l1 - 1;
- /* If whitespace is preceded by an odd number
- of `@' signs, the last `@' was a whitespace
- marker; drop it too. */
- while (p2 != p1 && p2[0] == '@') p2--;
- if ((l1 - p2) & 1)
- l1--;
- break;
- }
- else if (l1[-1] == '-')
- {
- U_CHAR *p2 = l1 - 1;
- /* If a `-' is preceded by an odd number of
- `@' signs then it and the last `@' are
- a no-reexpansion marker. */
- while (p2 != p1 && p2[0] == '@') p2--;
- if ((l1 - p2) & 1)
- l1 -= 2;
- else
- break;
- }
- else break;
- }
- }
-
- /* Delete any no-reexpansion marker that precedes
- an identifier at the beginning of the argument. */
- if (p1[0] == '@' && p1[1] == '-')
- p1 += 2;
-
- copy_memory(p1, xbuf + totlen, l1 - p1);
- totlen += l1 - p1;
- }
- else
- {
- U_CHAR *expanded = ARG_BASE + arg->expanded;
- if (!ap->raw_before && totlen > 0 && arg->expand_length
- && !CPP_TRADITIONAL(pfile)
- && unsafe_chars(xbuf[totlen-1], expanded[0]))
- {
- xbuf[totlen++] = '@';
- xbuf[totlen++] = ' ';
- }
-
- copy_memory(expanded, xbuf + totlen, arg->expand_length);
- totlen += arg->expand_length;
-
- if (!ap->raw_after && totlen > 0 && offset < defn->length
- && !CPP_TRADITIONAL(pfile)
- && unsafe_chars(xbuf[totlen-1], exp[offset]))
- {
- xbuf[totlen++] = '@';
- xbuf[totlen++] = ' ';
- }
-
- /* If a macro argument with newlines is used multiple times,
- then only expand the newlines once. This avoids creating
- output lines which don't correspond to any input line,
- which confuses gdb and gcov. */
- if (arg->use_count > 1 && arg->newlines > 0)
- {
- /* Don't bother doing change_newlines for subsequent
- uses of arg. */
- arg->use_count = 1;
- arg->expand_length
- = change_newlines(expanded, arg->expand_length);
- }
- }
-
- if (totlen > xbuf_len)
- abort();
- }
-
- /* if there is anything left of the definition
- after handling the arg list, copy that in too. */
-
- for (i = offset; i < defn->length; i++)
- {
- /* if we've reached the end of the macro */
- if (exp[i] == ')')
- rest_zero = 0;
- if (!(rest_zero && last_ap != NULL && last_ap->rest_args
- && last_ap->raw_after))
- xbuf[totlen++] = exp[i];
- }
-
- xbuf[totlen] = 0;
- xbuf_len = totlen;
-
- }
-
- pfile->output_escapes--;
-
- /* Now put the expansion on the input stack
- so our caller will commence reading from it. */
- push_macro_expansion(pfile, xbuf, xbuf_len, hp);
- CPP_BUFFER(pfile)->has_escapes = 1;
-
- /* Pop the space we've used in the token_buffer for argument expansion. */
- CPP_SET_WRITTEN(pfile, old_written);
-
- /* Recursive macro use sometimes works traditionally.
- #define foo(x,y) bar (x (y,0), y)
- foo (foo, baz) */
-
- if (!CPP_TRADITIONAL(pfile))
- hp->type = T_DISABLED;
-}
-
-static void
-push_macro_expansion(cpp_reader *pfile, register U_CHAR *xbuf, int xbuf_len, HASHNODE *hp)
-{
- register cpp_buffer *mbuf = cpp_push_buffer(pfile, xbuf, xbuf_len);
- if (mbuf == NULL)
- return;
- mbuf->cleanup = macro_cleanup;
- mbuf->data = hp;
-
- /* The first chars of the expansion should be a "@ " added by
- collect_expansion. This is to prevent accidental token-pasting
- between the text preceding the macro invocation, and the macro
- expansion text.
-
- We would like to avoid adding unneeded spaces (for the sake of
- tools that use cpp, such as imake). In some common cases we can
- tell that it is safe to omit the space.
-
- The character before the macro invocation cannot have been an
- idchar (or else it would have been pasted with the idchars of
- the macro name). Therefore, if the first non-space character
- of the expansion is an idchar, we do not need the extra space
- to prevent token pasting.
-
- Also, we don't need the extra space if the first char is '(',
- or some other (less common) characters. */
-
- if (xbuf[0] == '@' && xbuf[1] == ' '
- && (is_idchar[xbuf[2]] || xbuf[2] == '(' || xbuf[2] == '\''
- || xbuf[2] == '\"'))
- mbuf->cur += 2;
-}
-
-/* Like cpp_get_token, except that it does not read past end-of-line.
- Also, horizontal space is skipped, and macros are popped. */
-
-static enum cpp_token
-get_directive_token(cpp_reader *pfile)
-{
- for (;; )
- {
- long old_written = CPP_WRITTEN(pfile);
- enum cpp_token token;
- cpp_skip_hspace(pfile);
- if (PEEKC() == '\n')
- return CPP_VSPACE;
- token = cpp_get_token(pfile);
- switch (token)
- {
- case CPP_POP:
- if (!CPP_IS_MACRO_BUFFER(CPP_BUFFER(pfile)))
- return token;
- /* ... else fall though ... */
- case CPP_HSPACE: case CPP_COMMENT:
- CPP_SET_WRITTEN(pfile, old_written);
- break;
- default:
- return token;
- }
- }
-}
-
-/* Handle #include and #import.
- This function expects to see "fname" or <fname> on the input.
-
- The input is normally in part of the output_buffer following
- CPP_WRITTEN, and will get overwritten by output_line_command.
- I.e. in input file specification has been popped by handle_directive.
- This is safe. */
-
-static int
-do_include(cpp_reader *pfile, struct directive *keyword)
-{
- int importing = (keyword->type == T_IMPORT);
- int skip_dirs = (keyword->type == T_INCLUDE_NEXT);
- int angle_brackets = 0; /* 0 for "...", 1 for <...> */
- int before; /* included before? */
- long flen;
- char *fbeg, *fend;
- cpp_buffer *fp;
-
- enum cpp_token token;
-
- /* Chain of dirs to search */
- struct include_hash *ihash;
- struct file_name_list *search_start;
-
- long old_written = CPP_WRITTEN(pfile);
-
- int fd;
-
- if (CPP_PEDANTIC(pfile) && !CPP_BUFFER(pfile)->system_header_p)
- {
- if (importing)
- cpp_pedwarn(pfile, "ANSI C does not allow `#import'");
- if (skip_dirs)
- cpp_pedwarn(pfile, "ANSI C does not allow `#include_next'");
- }
-
- if (importing && CPP_OPTIONS(pfile)->warn_import
- && !CPP_OPTIONS(pfile)->inhibit_warnings
- && !CPP_BUFFER(pfile)->system_header_p && !pfile->import_warning)
- {
- pfile->import_warning = 1;
- cpp_warning(pfile, "`#import' is obsolete, use an #ifdef wrapper in the header file");
- }
-
- pfile->parsing_include_directive++;
- token = get_directive_token(pfile);
- pfile->parsing_include_directive--;
-
- if (token == CPP_STRING)
- {
- fbeg = pfile->token_buffer + old_written + 1;
- fend = CPP_PWRITTEN(pfile) - 1;
- *fend = '\0';
- if (fbeg[-1] == '<')
- angle_brackets = 1;
- }
- else
- {
- cpp_error(pfile,
- "`#%s' expects \"FILENAME\" or <FILENAME>", keyword->name);
- CPP_SET_WRITTEN(pfile, old_written);
- skip_rest_of_line(pfile);
- return 0;
- }
-
- token = get_directive_token(pfile);
- if (token != CPP_VSPACE)
- {
- cpp_error(pfile, "junk at end of `#include'");
- skip_rest_of_line(pfile);
- }
-
- CPP_SET_WRITTEN(pfile, old_written);
-
- flen = fend - fbeg;
-
- if (flen == 0)
- {
- cpp_error(pfile, "empty file name in `#%s'", keyword->name);
- return 0;
- }
-
- search_start = 0;
-
- for (fp = CPP_BUFFER(pfile);
- fp != CPP_NULL_BUFFER(pfile);
- fp = CPP_PREV_BUFFER(fp))
- if (fp->fname != NULL)
- break;
-
- if (fp == CPP_NULL_BUFFER(pfile))
- {
- cpp_fatal(pfile, "cpp internal error: fp == NULL_BUFFER in do_include");
- return 1;
- }
-
- /* For #include_next, skip in the search path past the dir in which the
- containing file was found. Treat files specified using an absolute path
- as if there are no more directories to search. Treat the primary source
- file like any other included source, but generate a warning. */
- if (skip_dirs && CPP_PREV_BUFFER(fp) != CPP_NULL_BUFFER(pfile))
- {
- if (fp->ihash->foundhere != ABSOLUTE_PATH)
- search_start = fp->ihash->foundhere->next;
- }
- else
- {
- if (skip_dirs)
- cpp_warning(pfile, "#include_next in primary source file");
-
- if (angle_brackets)
- search_start = CPP_OPTIONS(pfile)->bracket_include;
- else
- {
- if (!CPP_OPTIONS(pfile)->ignore_srcdir)
- {
- if (fp)
- search_start = fp->actual_dir;
- }
- else
- search_start = CPP_OPTIONS(pfile)->quote_include;
- }
- }
-
- if (!search_start)
- {
- cpp_error(pfile, "No include path in which to find %s", fbeg);
- return 0;
- }
-
- fd = find_include_file(pfile, fbeg, search_start, &ihash, &before);
-
- if (fd == -2)
- return 0;
-
- if (fd == -1)
- {
- if (CPP_OPTIONS(pfile)->print_deps_missing_files
- && CPP_PRINT_DEPS(pfile) > (angle_brackets ||
- (pfile->system_include_depth > 0)))
- {
- if (!angle_brackets)
- deps_output(pfile, fbeg, ' ');
- else
- {
- char *p;
- struct file_name_list *ptr;
- /* If requested as a system header, assume it belongs in
- the first system header directory. */
- if (CPP_OPTIONS(pfile)->bracket_include)
- ptr = CPP_OPTIONS(pfile)->bracket_include;
- else
- ptr = CPP_OPTIONS(pfile)->quote_include;
-
- p = (char *) alloca(strlen(ptr->name)
- + strlen(fbeg) + 2);
- if (*ptr->name != '\0')
- {
- strcpy(p, ptr->name);
- strcat(p, "/");
- }
- strcat(p, fbeg);
- deps_output(pfile, p, ' ');
- }
- }
- /* If -M was specified, and this header file won't be added to
- the dependency list, then don't count this as an error,
- because we can still produce correct output. Otherwise, we
- can't produce correct output, because there may be
- dependencies we need inside the missing file, and we don't
- know what directory this missing file exists in. */
- else if (CPP_PRINT_DEPS(pfile)
- && (CPP_PRINT_DEPS(pfile)
- <= (angle_brackets || (pfile->system_include_depth > 0))))
- cpp_warning(pfile, "No include path in which to find %s", fbeg);
- else
- cpp_error_from_errno(pfile, fbeg);
-
- return 0;
- }
-
- /* For -M, add the file to the dependencies on its first inclusion. */
- if (!before && (CPP_PRINT_DEPS(pfile)
- > (angle_brackets || (pfile->system_include_depth > 0))))
- deps_output(pfile, ihash->name, ' ');
-
- /* Handle -H option. */
- if (CPP_OPTIONS(pfile)->print_include_names)
- {
- fp = CPP_BUFFER(pfile);
- while ((fp = CPP_PREV_BUFFER(fp)) != CPP_NULL_BUFFER(pfile))
- putc('.', stderr);
- fprintf(stderr, " %s\n", ihash->name);
- }
-
- /* Actually process the file */
-
- if (importing)
- ihash->control_macro = "";
-
- if (cpp_push_buffer(pfile, NULL, 0) == NULL)
- {
- close(fd);
- return 0;
- }
-
- if (angle_brackets)
- pfile->system_include_depth++; /* Decremented in file_cleanup. */
-
- if (finclude(pfile, fd, ihash))
- {
- output_line_command(pfile, 0, enter_file);
- pfile->only_seen_white = 2;
- }
-
- return 0;
-}
-
-
-/* Convert a character string literal into a nul-terminated string.
- The input string is [IN ... LIMIT).
- The result is placed in RESULT. RESULT can be the same as IN.
- The value returned in the end of the string written to RESULT,
- or NULL on error. */
-
-static U_CHAR *
-convert_string(cpp_reader *pfile, register U_CHAR *result, register U_CHAR *in, register U_CHAR *limit, int handle_escapes)
-{
- U_CHAR c;
- c = *in++;
- if (c != '\"')
- return NULL;
- while (in < limit)
- {
- U_CHAR c = *in++;
- switch (c)
- {
- case '\0':
- return NULL;
- case '\"':
- limit = in;
- break;
- case '\\':
- if (handle_escapes)
- {
- char *bpc = (char *) in;
- int i = (U_CHAR) cpp_parse_escape(pfile, &bpc, 0x00ff);
- in = (U_CHAR *) bpc;
- if (i >= 0)
- *result++ = (U_CHAR)c;
- break;
- }
- /* else fall through */
- default:
- *result++ = c;
- }
- }
- *result = 0;
- return result;
-}
-
-/*
- * interpret #line command. Remembers previously seen fnames
- * in its very own hash table.
- */
-#define FNAME_HASHSIZE 37
-
-static int
-do_line(cpp_reader *pfile, struct directive *keyword ATTRIBUTE_UNUSED)
-{
- cpp_buffer *ip = CPP_BUFFER(pfile);
- int new_lineno;
- long old_written = CPP_WRITTEN(pfile);
- enum file_change_code file_change = same_file;
- enum cpp_token token;
-
- token = get_directive_token(pfile);
-
- if (token != CPP_NUMBER
- || !ISDIGIT(pfile->token_buffer[old_written]))
- {
- cpp_error(pfile, "invalid format `#line' command");
- goto bad_line_directive;
- }
-
- /* The Newline at the end of this line remains to be processed.
- To put the next line at the specified line number,
- we must store a line number now that is one less. */
- new_lineno = atoi((char *)(pfile->token_buffer + old_written)) - 1;
- CPP_SET_WRITTEN(pfile, old_written);
-
- /* NEW_LINENO is one less than the actual line number here. */
- if (CPP_PEDANTIC(pfile) && new_lineno < 0)
- cpp_pedwarn(pfile, "line number out of range in `#line' command");
-
-#if 0 /* #line 10"foo.c" is supposed to be allowed. */
- if (PEEKC() && !is_space[PEEKC()]) {
- cpp_error(pfile, "invalid format `#line' command");
- goto bad_line_directive;
- }
-#endif
-
- token = get_directive_token(pfile);
-
- if (token == CPP_STRING) {
- U_CHAR *fname = pfile->token_buffer + old_written;
- U_CHAR *end_name;
- static HASHNODE *fname_table[FNAME_HASHSIZE];
- HASHNODE *hp, **hash_bucket;
- U_CHAR *p;
- long num_start;
- int fname_length;
-
- /* Turn the file name, which is a character string literal,
- into a null-terminated string. Do this in place. */
- end_name = convert_string(pfile, fname, fname, CPP_PWRITTEN(pfile), 1);
- if (end_name == NULL)
- {
- cpp_error(pfile, "invalid format `#line' command");
- goto bad_line_directive;
- }
-
- fname_length = end_name - fname;
-
- num_start = CPP_WRITTEN(pfile);
- token = get_directive_token(pfile);
- if (token != CPP_VSPACE && token != CPP_EOF && token != CPP_POP) {
- p = pfile->token_buffer + num_start;
- if (CPP_PEDANTIC(pfile))
- cpp_pedwarn(pfile, "garbage at end of `#line' command");
-
- if (token != CPP_NUMBER || *p < '0' || *p > '4' || p[1] != '\0')
- {
- cpp_error(pfile, "invalid format `#line' command");
- goto bad_line_directive;
- }
- if (*p == '1')
- file_change = enter_file;
- else if (*p == '2')
- file_change = leave_file;
- else if (*p == '3')
- ip->system_header_p = 1;
- else /* if (*p == '4') */
- ip->system_header_p = 2;
-
- CPP_SET_WRITTEN(pfile, num_start);
- token = get_directive_token(pfile);
- p = pfile->token_buffer + num_start;
- if (token == CPP_NUMBER && p[1] == '\0' && (*p == '3' || *p== '4')) {
- ip->system_header_p = *p == '3' ? 1 : 2;
- token = get_directive_token(pfile);
- }
- if (token != CPP_VSPACE) {
- cpp_error(pfile, "invalid format `#line' command");
- goto bad_line_directive;
- }
- }
-
- hash_bucket = &fname_table[hashf(fname, fname_length, FNAME_HASHSIZE)];
- for (hp = *hash_bucket; hp != NULL; hp = hp->next)
- if (hp->length == fname_length
- && strncmp(hp->value.cpval, fname, fname_length) == 0) {
- ip->nominal_fname = hp->value.cpval;
- break;
- }
- if (hp == 0) {
- /* Didn't find it; cons up a new one. */
- hp = (HASHNODE *) xcalloc(1, sizeof (HASHNODE) + fname_length + 1);
- hp->next = *hash_bucket;
- *hash_bucket = hp;
-
- hp->length = fname_length;
- ip->nominal_fname = hp->value.cpval = ((char *) hp) + sizeof (HASHNODE);
- copy_memory(fname, hp->value.cpval, fname_length);
- }
- }
- else if (token != CPP_VSPACE && token != CPP_EOF) {
- cpp_error(pfile, "invalid format `#line' command");
- goto bad_line_directive;
- }
-
- ip->lineno = new_lineno;
-bad_line_directive:
- skip_rest_of_line(pfile);
- CPP_SET_WRITTEN(pfile, old_written);
- output_line_command(pfile, 0, file_change);
- return 0;
-}
-
-/*
- * remove the definition of a symbol from the symbol table.
- * according to un*x /lib/cpp, it is not an error to undef
- * something that has no definitions, so it isn't one here either.
- */
-
-static int
-do_undef(cpp_reader *pfile, struct directive *keyword)
-{
- int sym_length;
- HASHNODE *hp;
- U_CHAR *buf, *name, *limit;
- int c;
- long here = CPP_WRITTEN(pfile);
- enum cpp_token token;
-
- cpp_skip_hspace(pfile);
- c = GETC();
- if (!is_idstart[c])
- {
- cpp_error(pfile, "token after #undef is not an identifier");
- skip_rest_of_line(pfile);
- return 1;
- }
-
- parse_name(pfile, c);
- buf = pfile->token_buffer + here;
- limit = CPP_PWRITTEN(pfile);
-
- /* Copy out the token so we can pop the token buffer. */
- name = alloca(limit - buf + 1);
- copy_memory(buf, name, limit - buf);
- name[limit - buf] = '\0';
-
- token = get_directive_token(pfile);
- if (token != CPP_VSPACE && token != CPP_POP)
- {
- cpp_pedwarn(pfile, "junk on line after #undef");
- skip_rest_of_line(pfile);
- }
-
- CPP_SET_WRITTEN(pfile, here);
-
-#if 0
- /* If this is a precompiler run (with -pcp) pass thru #undef commands. */
- if (pcp_outfile && keyword)
- pass_thru_directive(buf, limit, pfile, keyword);
-#endif
-
- sym_length = check_macro_name(pfile, name, "macro");
-
- while ((hp = cpp_lookup(pfile, name, sym_length, -1)) != NULL)
- {
- /* If we are generating additional info for debugging (with -g) we
- need to pass through all effective #undef commands. */
- if (CPP_OPTIONS(pfile)->debug_output && keyword)
- pass_thru_directive(name, name+sym_length, pfile, keyword);
- if (hp->type != T_MACRO)
- cpp_warning(pfile, "undefining `%s'", hp->name);
- delete_macro(hp);
- }
-
- return 0;
-}
-
-/* Wrap do_undef for -U processing. */
-static void
-cpp_undef(cpp_reader *pfile, U_CHAR *macro)
-{
- if (cpp_push_buffer(pfile, macro, strlen(macro)))
- {
- do_undef(pfile, NULL);
- cpp_pop_buffer(pfile);
- }
-}
-
-
-/*
- * Report an error detected by the program we are processing.
- * Use the text of the line in the error message.
- * (We use error because it prints the filename & line#.)
- */
-
-static int
-do_error(cpp_reader *pfile, struct directive *keyword ATTRIBUTE_UNUSED)
-{
- long here = CPP_WRITTEN(pfile);
- U_CHAR *text;
- copy_rest_of_line(pfile);
- text = pfile->token_buffer + here;
- SKIP_WHITE_SPACE(text);
-
- cpp_error(pfile, "#error %s", text);
- CPP_SET_WRITTEN(pfile, here);
- return 0;
-}
-
-/*
- * Report a warning detected by the program we are processing.
- * Use the text of the line in the warning message, then continue.
- */
-
-static int
-do_warning(cpp_reader *pfile, struct directive *keyword ATTRIBUTE_UNUSED)
-{
- U_CHAR *text;
- long here = CPP_WRITTEN(pfile);
- copy_rest_of_line(pfile);
- text = pfile->token_buffer + here;
- SKIP_WHITE_SPACE(text);
-
- if (CPP_PEDANTIC(pfile) && !CPP_BUFFER(pfile)->system_header_p)
- cpp_pedwarn(pfile, "ANSI C does not allow `#warning'");
-
- /* Use `pedwarn' not `warning', because #warning isn't in the C Standard;
- if -pedantic-errors is given, #warning should cause an error. */
- cpp_pedwarn(pfile, "#warning %s", text);
- CPP_SET_WRITTEN(pfile, here);
- return 0;
-}
-
-/* Report program identification. */
-
-static int
-do_ident(cpp_reader *pfile, struct directive *keyword ATTRIBUTE_UNUSED)
-{
- /* Allow #ident in system headers, since that's not user's fault. */
- if (CPP_PEDANTIC(pfile) && !CPP_BUFFER(pfile)->system_header_p)
- cpp_pedwarn(pfile, "ANSI C does not allow `#ident'");
-
- skip_rest_of_line(pfile); /* Correct? Appears to match cccp. */
-
- return 0;
-}
-
-/* Just check for some recognized pragmas that need validation here,
- and leave the text in the token buffer to be output. */
-
-static int
-do_pragma(cpp_reader *pfile, struct directive *keyword ATTRIBUTE_UNUSED)
-{
- long here = CPP_WRITTEN(pfile);
- U_CHAR *buf;
-
- copy_rest_of_line(pfile);
- buf = pfile->token_buffer + here;
- SKIP_WHITE_SPACE(buf);
-
- if (!strncmp(buf, "once", 4))
- {
- cpp_buffer *ip = NULL;
-
- /* Allow #pragma once in system headers, since that's not the user's
- fault. */
- if (!CPP_BUFFER(pfile)->system_header_p)
- cpp_warning(pfile, "`#pragma once' is obsolete");
-
- for (ip = CPP_BUFFER(pfile);; ip = CPP_PREV_BUFFER(ip))
- {
- if (ip == CPP_NULL_BUFFER(pfile))
- return 0;
- if (ip->fname != NULL)
- break;
- }
-
- if (CPP_PREV_BUFFER(ip) == CPP_NULL_BUFFER(pfile))
- cpp_warning(pfile, "`#pragma once' outside include file");
- else
- ip->ihash->control_macro = ""; /* never repeat */
- }
-
- if (!strncmp(buf, "implementation", 14))
- {
- /* Be quiet about `#pragma implementation' for a file only if it hasn't
- been included yet. */
- struct include_hash *ptr;
- U_CHAR *p = buf + 14, *fname, *fcopy;
- SKIP_WHITE_SPACE(p);
- if (*p == '\n' || *p != '\"')
- return 0;
-
- fname = p + 1;
- p = (U_CHAR *) strchr(fname, '\"');
-
- fcopy = alloca(p - fname + 1);
- copy_memory(fname, fcopy, p - fname);
- fcopy[p-fname] = '\0';
-
- ptr = include_hash(pfile, fcopy, 0);
- if (ptr)
- cpp_warning(pfile,
- "`#pragma implementation' for `%s' appears after file is included",
- fcopy);
- }
-
- return 0;
-}
-
-
-/*
- * handle #if command by
- * 1) inserting special `defined' keyword into the hash table
- * that gets turned into 0 or 1 by special_symbol (thus,
- * if the luser has a symbol called `defined' already, it won't
- * work inside the #if command)
- * 2) rescan the input into a temporary output buffer
- * 3) pass the output buffer to the yacc parser and collect a value
- * 4) clean up the mess left from steps 1 and 2.
- * 5) call conditional_skip to skip til the next #endif (etc.),
- * or not, depending on the value from step 3.
- */
-
-static int
-do_if(cpp_reader *pfile, struct directive *keyword ATTRIBUTE_UNUSED)
-{
- HOST_WIDE_INT value = eval_if_expression(pfile);
- conditional_skip(pfile, value == 0, T_IF, NULL);
- return 0;
-}
-
-/*
- * handle a #elif directive by not changing if_stack either.
- * see the comment above do_else.
- */
-
-static int
-do_elif(cpp_reader *pfile, struct directive *keyword ATTRIBUTE_UNUSED)
-{
- if (pfile->if_stack == CPP_BUFFER(pfile)->if_stack) {
- cpp_error(pfile, "`#elif' not within a conditional");
- return 0;
- } else {
- if (pfile->if_stack->type != T_IF && pfile->if_stack->type != T_ELIF) {
- cpp_error(pfile, "`#elif' after `#else'");
-#if 0
- fprintf(stderr, " (matches line %d", pfile->if_stack->lineno);
-#endif
- if (pfile->if_stack->fname != NULL && CPP_BUFFER(pfile)->fname != NULL
- && strcmp(pfile->if_stack->fname,
- CPP_BUFFER(pfile)->nominal_fname) != 0)
- fprintf(stderr, ", file %s", pfile->if_stack->fname);
- fprintf(stderr, ")\n");
- }
- pfile->if_stack->type = T_ELIF;
- }
-
- if (pfile->if_stack->if_succeeded)
- skip_if_group(pfile);
- else {
- HOST_WIDE_INT value = eval_if_expression(pfile);
- if (value == 0)
- skip_if_group(pfile);
- else {
- ++pfile->if_stack->if_succeeded; /* continue processing input */
- output_line_command(pfile, 1, same_file);
- }
- }
- return 0;
-}
-
-/*
- * evaluate a #if expression in BUF, of length LENGTH,
- * then parse the result as a C expression and return the value as an int.
- */
-
-static HOST_WIDE_INT
-eval_if_expression(cpp_reader *pfile)
-{
- HASHNODE *save_defined;
- HOST_WIDE_INT value;
- long old_written = CPP_WRITTEN(pfile);
-
- save_defined = install((U_CHAR *)"defined", -1, T_SPEC_DEFINED, 0, 0, -1);
- pfile->pcp_inside_if = 1;
-
- value = cpp_parse_expr(pfile);
- pfile->pcp_inside_if = 0;
- delete_macro(save_defined); /* clean up special symbol */
-
- CPP_SET_WRITTEN(pfile, old_written); /* Pop */
-
- return value;
-}
-
-/*
- * routine to handle ifdef/ifndef. Try to look up the symbol,
- * then do or don't skip to the #endif/#else/#elif depending
- * on what directive is actually being processed.
- */
-
-static int
-do_xifdef(cpp_reader *pfile, struct directive *keyword)
-{
- int skip;
- cpp_buffer *ip = CPP_BUFFER(pfile);
- U_CHAR *ident;
- int ident_length;
- enum cpp_token token;
- int start_of_file = 0;
- U_CHAR *control_macro = 0;
- int old_written = CPP_WRITTEN(pfile);
-
- /* Detect a #ifndef at start of file (not counting comments). */
- if (ip->fname != 0 && keyword->type == T_IFNDEF)
- start_of_file = pfile->only_seen_white == 2;
-
- pfile->no_macro_expand++;
- token = get_directive_token(pfile);
- pfile->no_macro_expand--;
-
- ident = pfile->token_buffer + old_written;
- ident_length = CPP_WRITTEN(pfile) - old_written;
- CPP_SET_WRITTEN(pfile, old_written); /* Pop */
-
- if (token == CPP_VSPACE || token == CPP_POP || token == CPP_EOF)
- {
- skip = (keyword->type == T_IFDEF);
- if (!CPP_TRADITIONAL(pfile))
- cpp_pedwarn(pfile, "`#%s' with no argument", keyword->name);
- }
- else if (token == CPP_NAME)
- {
- HASHNODE *hp = cpp_lookup(pfile, ident, ident_length, -1);
- skip = (hp == NULL) ^ (keyword->type == T_IFNDEF);
- if (start_of_file && !skip)
- {
- control_macro = (U_CHAR *) xmalloc(ident_length + 1);
- copy_memory(ident, control_macro, ident_length + 1);
- }
- }
- else
- {
- skip = (keyword->type == T_IFDEF);
- if (!CPP_TRADITIONAL(pfile))
- cpp_error(pfile, "`#%s' with invalid argument", keyword->name);
- }
-
- if (!CPP_TRADITIONAL(pfile))
- { int c;
- cpp_skip_hspace(pfile);
- c = PEEKC();
- if (c != EOF && c != '\n')
- cpp_pedwarn(pfile, "garbage at end of `#%s' argument", keyword->name); }
- skip_rest_of_line(pfile);
-
-#if 0
- if (pcp_outfile) {
- /* Output a precondition for this macro. */
- if (hp && hp->value.defn->predefined)
- fprintf(pcp_outfile, "#define %s\n", hp->name);
- else {
- U_CHAR *cp = buf;
- fprintf(pcp_outfile, "#undef ");
- while (is_idchar[*cp]) /* Ick! */
- fputc(*cp++, pcp_outfile);
- putc('\n', pcp_outfile);
- }
-#endif
-
- conditional_skip(pfile, skip, T_IF, control_macro);
- return 0;
-}
-
-/* Push TYPE on stack; then, if SKIP is nonzero, skip ahead.
- If this is a #ifndef starting at the beginning of a file,
- CONTROL_MACRO is the macro name tested by the #ifndef.
- Otherwise, CONTROL_MACRO is 0. */
-
-static void
-conditional_skip(cpp_reader *pfile, int skip, enum node_type type, U_CHAR *control_macro)
-{
- IF_STACK_FRAME *temp;
-
- temp = (IF_STACK_FRAME *) xcalloc(1, sizeof (IF_STACK_FRAME));
- temp->fname = CPP_BUFFER(pfile)->nominal_fname;
-#if 0
- temp->lineno = CPP_BUFFER(pfile)->lineno;
-#endif
- temp->next = pfile->if_stack;
- temp->control_macro = control_macro;
- pfile->if_stack = temp;
-
- pfile->if_stack->type = type;
-
- if (skip != 0) {
- skip_if_group(pfile);
- return;
- } else {
- ++pfile->if_stack->if_succeeded;
- output_line_command(pfile, 1, same_file);
- }
-}
-
-/* Subroutine of skip_if_group. Examine one preprocessing directive and
- return 0 if skipping should continue, 1 if it should halt. Also
- adjusts the if_stack as appropriate.
- The `#' has been read, but not the identifier. */
-
-static int
-consider_directive_while_skipping(cpp_reader *pfile, IF_STACK_FRAME *stack)
-{
- long ident_len, ident;
- struct directive *kt;
- IF_STACK_FRAME *temp;
-
- cpp_skip_hspace(pfile);
-
- ident = CPP_WRITTEN(pfile);
- parse_name(pfile, GETC());
- ident_len = CPP_WRITTEN(pfile) - ident;
-
- CPP_SET_WRITTEN(pfile, ident);
-
- for (kt = directive_table; kt->length >= 0; kt++)
- if (kt->length == ident_len
- && strncmp(pfile->token_buffer + ident, kt->name, kt->length) == 0)
- switch (kt->type)
- {
- case T_IF:
- case T_IFDEF:
- case T_IFNDEF:
- temp = (IF_STACK_FRAME *) xmalloc(sizeof (IF_STACK_FRAME));
- temp->next = pfile->if_stack;
- pfile->if_stack = temp;
- temp->fname = CPP_BUFFER(pfile)->nominal_fname;
- temp->type = kt->type;
- return 0;
-
- case T_ELSE:
- if (CPP_PEDANTIC(pfile) && pfile->if_stack != stack)
- validate_else(pfile, "#else");
- /* fall through */
- case T_ELIF:
- if (pfile->if_stack->type == T_ELSE)
- cpp_error(pfile, "`%s' after `#else'", kt->name);
-
- if (pfile->if_stack == stack)
- return 1;
- else
- {
- pfile->if_stack->type = kt->type;
- return 0;
- }
-
- case T_ENDIF:
- if (CPP_PEDANTIC(pfile) && pfile->if_stack != stack)
- validate_else(pfile, "#endif");
-
- if (pfile->if_stack == stack)
- return 1;
-
- temp = pfile->if_stack;
- pfile->if_stack = temp->next;
- free(temp);
- return 0;
-
- default:
- return 0;
- }
-
- /* Don't let erroneous code go by. */
- if (!CPP_OPTIONS(pfile)->lang_asm && CPP_PEDANTIC(pfile))
- cpp_pedwarn(pfile, "invalid preprocessor directive name");
- return 0;
-}
-
-/* skip to #endif, #else, or #elif. adjust line numbers, etc.
- * leaves input ptr at the sharp sign found.
- */
-static void
-skip_if_group(cpp_reader *pfile)
-{
- int c;
- IF_STACK_FRAME *save_if_stack = pfile->if_stack; /* don't pop past here */
- U_CHAR *beg_of_line;
- long old_written;
-
- if (CPP_OPTIONS(pfile)->output_conditionals)
- {
- CPP_PUTS(pfile, "#failed\n", 8);
- pfile->lineno++;
- output_line_command(pfile, 1, same_file);
- }
-
- old_written = CPP_WRITTEN(pfile);
-
- for (;; )
- {
- beg_of_line = CPP_BUFFER(pfile)->cur;
-
- if (!CPP_TRADITIONAL(pfile))
- cpp_skip_hspace(pfile);
- c = GETC();
- if (c == '\n')
- {
- if (CPP_OPTIONS(pfile)->output_conditionals)
- CPP_PUTC(pfile, c);
- continue;
- }
- else if (c == '#')
- {
- if (consider_directive_while_skipping(pfile, save_if_stack))
- break;
- }
- else if (c == EOF)
- return; /* Caller will issue error. */
-
- FORWARD(-1);
- if (CPP_OPTIONS(pfile)->output_conditionals)
- {
- CPP_PUTS(pfile, beg_of_line, CPP_BUFFER(pfile)->cur - beg_of_line);
- copy_rest_of_line(pfile);
- }
- else
- {
- copy_rest_of_line(pfile);
- CPP_SET_WRITTEN(pfile, old_written); /* discard it */
- }
-
- c = GETC();
- if (c == EOF)
- return; /* Caller will issue error. */
- else
- {
- /* \n */
- if (CPP_OPTIONS(pfile)->output_conditionals)
- CPP_PUTC(pfile, c);
- }
- }
-
- /* Back up to the beginning of this line. Caller will process the
- directive. */
- CPP_BUFFER(pfile)->cur = beg_of_line;
- pfile->only_seen_white = 1;
- if (CPP_OPTIONS(pfile)->output_conditionals)
- {
- CPP_PUTS(pfile, "#endfailed\n", 11);
- pfile->lineno++;
- }
-}
-
-/*
- * handle a #else directive. Do this by just continuing processing
- * without changing if_stack ; this is so that the error message
- * for missing #endif's etc. will point to the original #if. It
- * is possible that something different would be better.
- */
-
-static int
-do_else(cpp_reader *pfile, struct directive *keyword ATTRIBUTE_UNUSED)
-{
- cpp_buffer *ip = CPP_BUFFER(pfile);
-
- if (CPP_PEDANTIC(pfile))
- validate_else(pfile, "#else");
- skip_rest_of_line(pfile);
-
- if (pfile->if_stack == CPP_BUFFER(pfile)->if_stack) {
- cpp_error(pfile, "`#else' not within a conditional");
- return 0;
- } else {
- /* #ifndef can't have its special treatment for containing the whole file
- if it has a #else clause. */
- pfile->if_stack->control_macro = 0;
-
- if (pfile->if_stack->type != T_IF && pfile->if_stack->type != T_ELIF) {
- cpp_error(pfile, "`#else' after `#else'");
- fprintf(stderr, " (matches line %d", pfile->if_stack->lineno);
- if (strcmp(pfile->if_stack->fname, ip->nominal_fname) != 0)
- fprintf(stderr, ", file %s", pfile->if_stack->fname);
- fprintf(stderr, ")\n");
- }
- pfile->if_stack->type = T_ELSE;
- }
-
- if (pfile->if_stack->if_succeeded)
- skip_if_group(pfile);
- else {
- ++pfile->if_stack->if_succeeded; /* continue processing input */
- output_line_command(pfile, 1, same_file);
- }
- return 0;
-}
-
-/*
- * unstack after #endif command
- */
-
-static int
-do_endif(cpp_reader *pfile, struct directive *keyword ATTRIBUTE_UNUSED)
-{
- if (CPP_PEDANTIC(pfile))
- validate_else(pfile, "#endif");
- skip_rest_of_line(pfile);
-
- if (pfile->if_stack == CPP_BUFFER(pfile)->if_stack)
- cpp_error(pfile, "unbalanced `#endif'");
- else
- {
- IF_STACK_FRAME *temp = pfile->if_stack;
- pfile->if_stack = temp->next;
- if (temp->control_macro != 0)
- {
- /* This #endif matched a #ifndef at the start of the file.
- See if it is at the end of the file. */
- struct parse_marker start_mark;
- int c;
-
- parse_set_mark(&start_mark, pfile);
-
- for (;; )
- {
- cpp_skip_hspace(pfile);
- c = GETC();
- if (c != '\n')
- break;
- }
- parse_goto_mark(&start_mark, pfile);
- parse_clear_mark(&start_mark);
-
- if (c == EOF)
- {
- /* This #endif ends a #ifndef
- that contains all of the file (aside from whitespace).
- Arrange not to include the file again
- if the macro that was tested is defined. */
- struct cpp_buffer *ip;
- for (ip = CPP_BUFFER(pfile);; ip = CPP_PREV_BUFFER(ip))
- if (ip->fname != NULL)
- break;
- ip->ihash->control_macro = temp->control_macro;
- }
- }
- free(temp);
- output_line_command(pfile, 1, same_file);
- }
- return 0;
-}
-
-/* When an #else or #endif is found while skipping failed conditional,
- if -pedantic was specified, this is called to warn about text after
- the command name. P points to the first char after the command name. */
-
-static void
-validate_else(cpp_reader *pfile, char *directive)
-{
- int c;
- cpp_skip_hspace(pfile);
- c = PEEKC();
- if (c != EOF && c != '\n')
- cpp_pedwarn(pfile,
- "text following `%s' violates ANSI standard", directive);
-}
-
-/* Get the next token, and add it to the text in pfile->token_buffer.
- Return the kind of token we got. */
-
-enum cpp_token
-cpp_get_token(cpp_reader *pfile)
-{
- register int c, c2, c3;
- long old_written;
- long start_line, start_column;
- enum cpp_token token;
- struct cpp_options *opts = CPP_OPTIONS(pfile);
- CPP_BUFFER(pfile)->prev = CPP_BUFFER(pfile)->cur;
-get_next:
- c = GETC();
- if (c == EOF)
- {
-handle_eof:
- if (CPP_BUFFER(pfile)->seen_eof)
- {
- if (cpp_pop_buffer(pfile) != CPP_NULL_BUFFER(pfile))
- goto get_next;
- else
- return CPP_EOF;
- }
- else
- {
- cpp_buffer *next_buf
- = CPP_PREV_BUFFER(CPP_BUFFER(pfile));
- CPP_BUFFER(pfile)->seen_eof = 1;
- if (CPP_BUFFER(pfile)->nominal_fname
- && next_buf != CPP_NULL_BUFFER(pfile))
- {
- /* We're about to return from an #include file.
- Emit #line information now (as part of the CPP_POP) result.
- But the #line refers to the file we will pop to. */
- cpp_buffer *cur_buffer = CPP_BUFFER(pfile);
- CPP_BUFFER(pfile) = next_buf;
- pfile->input_stack_listing_current = 0;
- output_line_command(pfile, 0, leave_file);
- CPP_BUFFER(pfile) = cur_buffer;
- }
- return CPP_POP;
- }
- }
- else
- {
- switch (c)
- {
- long newlines;
- struct parse_marker start_mark;
- case '/':
- if (PEEKC() == '=')
- goto op2;
- if (opts->put_out_comments)
- parse_set_mark(&start_mark, pfile);
- newlines = 0;
- cpp_buf_line_and_col(cpp_file_buffer(pfile),
- &start_line, &start_column);
- c = skip_comment(pfile, &newlines);
- if (opts->put_out_comments && (c == '/' || c == EOF))
- parse_clear_mark(&start_mark);
- if (c == '/')
- goto randomchar;
- if (c == EOF)
- {
- cpp_error_with_line(pfile, start_line, start_column,
- "unterminated comment");
- goto handle_eof;
- }
- c = '/'; /* Initial letter of comment. */
-return_comment:
- /* Comments are equivalent to spaces.
- For -traditional, a comment is equivalent to nothing. */
- if (opts->put_out_comments)
- {
- cpp_buffer *pbuf = CPP_BUFFER(pfile);
- U_CHAR *start = pbuf->buf + start_mark.position;
- int len = pbuf->cur - start;
- CPP_RESERVE(pfile, 1 + len);
- CPP_PUTC_Q(pfile, c);
- CPP_PUTS_Q(pfile, start, len);
- pfile->lineno += newlines;
- parse_clear_mark(&start_mark);
- return CPP_COMMENT;
- }
- else if (CPP_TRADITIONAL(pfile))
- {
- return CPP_COMMENT;
- }
- else
- {
-#if 0
- /* This may not work if cpp_get_token is called recursively,
- since many places look for horizontal space. */
- if (newlines)
- {
- /* Copy the newlines into the output buffer, in order to
- avoid the pain of a #line every time a multiline comment
- is seen. */
- CPP_RESERVE(pfile, newlines);
- while (--newlines >= 0)
- {
- CPP_PUTC_Q(pfile, '\n');
- pfile->lineno++;
- }
- return CPP_VSPACE;
- }
-#endif
- CPP_RESERVE(pfile, 1);
- CPP_PUTC_Q(pfile, ' ');
- return CPP_HSPACE;
- }
-#if 0
- if (opts->for_lint) {
- U_CHAR *argbp;
- int cmdlen, arglen;
- char *lintcmd = get_lintcmd(ibp, limit, &argbp, &arglen, &cmdlen);
-
- if (lintcmd != NULL) {
- /* I believe it is always safe to emit this newline: */
- obp[-1] = '\n';
- copy_memory("#pragma lint ", (char *) obp, 13);
- obp += 13;
- copy_memory(lintcmd, (char *) obp, cmdlen);
- obp += cmdlen;
-
- if (arglen != 0) {
- *(obp++) = ' ';
- copy_memory(argbp, (char *) obp, arglen);
- obp += arglen;
- }
-
- /* OK, now bring us back to the state we were in before we entered
- this branch. We need #line because the newline for the pragma
- could mess things up. */
- output_line_command(pfile, 0, same_file);
- *(obp++) = ' '; /* just in case, if comments are copied thru */
- *(obp++) = '/';
- }
- }
-#endif
-
- case '#':
-#if 0
- /* If this is expanding a macro definition, don't recognize
- preprocessor directives. */
- if (ip->macro != 0)
- goto randomchar;
- /* If this is expand_into_temp_buffer, recognize them
- only after an actual newline at this level,
- not at the beginning of the input level. */
- if (ip->fname == 0 && beg_of_line == ip->buf)
- goto randomchar;
- if (ident_length)
- goto specialchar;
-#endif
-
- if (!pfile->only_seen_white)
- goto randomchar;
- if (handle_directive(pfile))
- return CPP_DIRECTIVE;
- pfile->only_seen_white = 0;
- return CPP_OTHER;
-
- case '\"':
- case '\'':
- /* A single quoted string is treated like a double -- some
- programs (e.g., troff) are perverse this way */
- cpp_buf_line_and_col(cpp_file_buffer(pfile),
- &start_line, &start_column);
- old_written = CPP_WRITTEN(pfile);
-string:
- CPP_PUTC(pfile, c);
- while (1)
- {
- int cc = GETC();
- if (cc == EOF)
- {
- if (CPP_IS_MACRO_BUFFER(CPP_BUFFER(pfile)))
- {
- /* try harder: this string crosses a macro expansion
- boundary. This can happen naturally if -traditional.
- Otherwise, only -D can make a macro with an unmatched
- quote. */
- cpp_buffer *next_buf
- = CPP_PREV_BUFFER(CPP_BUFFER(pfile));
- (*CPP_BUFFER(pfile)->cleanup)
- (CPP_BUFFER(pfile), pfile);
- CPP_BUFFER(pfile) = next_buf;
- continue;
- }
- if (!CPP_TRADITIONAL(pfile))
- {
- cpp_error_with_line(pfile, start_line, start_column,
- "unterminated string or character constant");
- if (pfile->multiline_string_line != start_line
- && pfile->multiline_string_line != 0)
- cpp_error_with_line(pfile,
- pfile->multiline_string_line, -1,
- "possible real start of unterminated constant");
- pfile->multiline_string_line = 0;
- }
- break;
- }
- CPP_PUTC(pfile, cc);
- switch (cc)
- {
- case '\n':
- /* Traditionally, end of line ends a string constant with
- no error. So exit the loop and record the new line. */
- if (CPP_TRADITIONAL(pfile))
- goto while2end;
- if (c == '\'')
- {
- cpp_error_with_line(pfile, start_line, start_column,
- "unterminated character constant");
- goto while2end;
- }
- if (CPP_PEDANTIC(pfile)
- && pfile->multiline_string_line == 0)
- {
- cpp_pedwarn_with_line(pfile, start_line, start_column,
- "string constant runs past end of line");
- }
- if (pfile->multiline_string_line == 0)
- pfile->multiline_string_line = start_line;
- break;
-
- case '\\':
- cc = GETC();
- if (cc == '\n')
- {
- /* Backslash newline is replaced by nothing at all. */
- CPP_ADJUST_WRITTEN(pfile, -1);
- pfile->lineno++;
- }
- else
- {
- /* ANSI stupidly requires that in \\ the second \
- is *not* prevented from combining with a newline. */
- NEWLINE_FIX1(cc);
- if (cc != EOF)
- CPP_PUTC(pfile, cc);
- }
- break;
-
- case '\"':
- case '\'':
- if (cc == c)
- goto while2end;
- break;
- }
- }
-while2end:
- pfile->lineno += count_newlines(pfile->token_buffer + old_written,
- CPP_PWRITTEN(pfile));
- pfile->only_seen_white = 0;
- return c == '\'' ? CPP_CHAR : CPP_STRING;
-
- case '$':
- if (!opts->dollars_in_ident)
- goto randomchar;
- goto letter;
-
- case ':':
- if (opts->cplusplus && PEEKC() == ':')
- goto op2;
- goto randomchar;
-
- case '&':
- case '+':
- case '|':
- NEWLINE_FIX;
- c2 = PEEKC();
- if (c2 == c || c2 == '=')
- goto op2;
- goto randomchar;
-
- case '*':
- case '!':
- case '%':
- case '=':
- case '^':
- NEWLINE_FIX;
- if (PEEKC() == '=')
- goto op2;
- goto randomchar;
-
- case '-':
- NEWLINE_FIX;
- c2 = PEEKC();
- if (c2 == '-' && opts->chill)
- {
- /* Chill style comment */
- if (opts->put_out_comments)
- parse_set_mark(&start_mark, pfile);
- FORWARD(1); /* Skip second '-'. */
- for (;; )
- {
- c = GETC();
- if (c == EOF)
- break;
- if (c == '\n')
- {
- /* Don't consider final '\n' to be part of comment. */
- FORWARD(-1);
- break;
- }
- }
- c = '-';
- goto return_comment;
- }
- if (c2 == '-' || c2 == '=' || c2 == '>')
- goto op2;
- goto randomchar;
-
- case '<':
- if (pfile->parsing_include_directive)
- {
- for (;; )
- {
- CPP_PUTC(pfile, c);
- if (c == '>')
- break;
- c = GETC();
- NEWLINE_FIX1(c);
- if (c == '\n' || c == EOF)
- {
- cpp_error(pfile,
- "missing '>' in `#include <FILENAME>'");
- break;
- }
- }
- return CPP_STRING;
- }
- /* else fall through */
- case '>':
- NEWLINE_FIX;
- c2 = PEEKC();
- if (c2 == '=')
- goto op2;
- if (c2 != c)
- goto randomchar;
- FORWARD(1);
- CPP_RESERVE(pfile, 4);
- CPP_PUTC(pfile, c);
- CPP_PUTC(pfile, c2);
- NEWLINE_FIX;
- c3 = PEEKC();
- if (c3 == '=')
- CPP_PUTC_Q(pfile, GETC());
- CPP_NUL_TERMINATE_Q(pfile);
- pfile->only_seen_white = 0;
- return CPP_OTHER;
-
- case '@':
- if (CPP_BUFFER(pfile)->has_escapes)
- {
- c = GETC();
- if (c == '-')
- {
- if (pfile->output_escapes)
- CPP_PUTS(pfile, "@-", 2);
- parse_name(pfile, GETC());
- return CPP_NAME;
- }
- else if (is_space [c])
- {
- CPP_RESERVE(pfile, 2);
- if (pfile->output_escapes)
- CPP_PUTC_Q(pfile, '@');
- CPP_PUTC_Q(pfile, c);
- return CPP_HSPACE;
- }
- }
- if (pfile->output_escapes)
- {
- CPP_PUTS(pfile, "@@", 2);
- return CPP_OTHER;
- }
- goto randomchar;
-
- case '.':
- NEWLINE_FIX;
- c2 = PEEKC();
- if (ISDIGIT(c2))
- {
- CPP_RESERVE(pfile, 2);
- CPP_PUTC_Q(pfile, '.');
- c = GETC();
- goto number;
- }
- /* FIXME - misses the case "..\\\n." */
- if (c2 == '.' && PEEKN(1) == '.')
- {
- CPP_RESERVE(pfile, 4);
- CPP_PUTC_Q(pfile, '.');
- CPP_PUTC_Q(pfile, '.');
- CPP_PUTC_Q(pfile, '.');
- FORWARD(2);
- CPP_NUL_TERMINATE_Q(pfile);
- pfile->only_seen_white = 0;
- return CPP_3DOTS;
- }
- goto randomchar;
-
-op2:
- token = CPP_OTHER;
- pfile->only_seen_white = 0;
-op2any:
- CPP_RESERVE(pfile, 3);
- CPP_PUTC_Q(pfile, c);
- CPP_PUTC_Q(pfile, GETC());
- CPP_NUL_TERMINATE_Q(pfile);
- return token;
-
- case 'L':
- NEWLINE_FIX;
- c2 = PEEKC();
- if ((c2 == '\'' || c2 == '\"') && !CPP_TRADITIONAL(pfile))
- {
- CPP_PUTC(pfile, c);
- c = GETC();
- goto string;
- }
- goto letter;
-
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
-number:
- c2 = '.';
- for (;; )
- {
- CPP_RESERVE(pfile, 2);
- CPP_PUTC_Q(pfile, c);
- NEWLINE_FIX;
- c = PEEKC();
- if (c == EOF)
- break;
- if (!is_idchar[c] && c != '.'
- && ((c2 != 'e' && c2 != 'E'
- && ((c2 != 'p' && c2 != 'P') || CPP_C89(pfile)))
- || (c != '+' && c != '-')))
- break;
- FORWARD(1);
- c2= c;
- }
- CPP_NUL_TERMINATE_Q(pfile);
- pfile->only_seen_white = 0;
- return CPP_NUMBER;
- case 'b': case 'c': case 'd': case 'h': case 'o':
- case 'B': case 'C': case 'D': case 'H': case 'O':
- if (opts->chill && PEEKC() == '\'')
- {
- pfile->only_seen_white = 0;
- CPP_RESERVE(pfile, 2);
- CPP_PUTC_Q(pfile, c);
- CPP_PUTC_Q(pfile, '\'');
- FORWARD(1);
- for (;; )
- {
- c = GETC();
- if (c == EOF)
- goto chill_number_eof;
- if (!is_idchar[c])
- {
- if (c == '\\' && PEEKC() == '\n')
- {
- FORWARD(2);
- continue;
- }
- break;
- }
- CPP_PUTC(pfile, c);
- }
- if (c == '\'')
- {
- CPP_RESERVE(pfile, 2);
- CPP_PUTC_Q(pfile, c);
- CPP_NUL_TERMINATE_Q(pfile);
- return CPP_STRING;
- }
- else
- {
- FORWARD(-1);
-chill_number_eof:
- CPP_NUL_TERMINATE(pfile);
- return CPP_NUMBER;
- }
- }
- else
- goto letter;
- case '_':
- case 'a': case 'e': case 'f': case 'g': case 'i': case 'j':
- case 'k': case 'l': case 'm': case 'n': case 'p': case 'q':
- case 'r': case 's': case 't': case 'u': case 'v': case 'w':
- case 'x': case 'y': case 'z':
- case 'A': case 'E': case 'F': case 'G': case 'I': case 'J':
- case 'K': case 'M': case 'N': case 'P': case 'Q': case 'R':
- case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
- case 'Y': case 'Z':
-letter:
- {
- HASHNODE *hp;
- unsigned char *ident;
- int before_name_written = CPP_WRITTEN(pfile);
- int ident_len;
- parse_name(pfile, c);
- pfile->only_seen_white = 0;
- if (pfile->no_macro_expand)
- return CPP_NAME;
- ident = pfile->token_buffer + before_name_written;
- ident_len = CPP_PWRITTEN(pfile) - ident;
- hp = cpp_lookup(pfile, ident, ident_len, -1);
- if (!hp)
- return CPP_NAME;
- if (hp->type == T_DISABLED)
- {
- if (pfile->output_escapes)
- { /* Return "@-IDENT", followed by '\0'. */
- int i;
- CPP_RESERVE(pfile, 3);
- ident = pfile->token_buffer + before_name_written;
- CPP_ADJUST_WRITTEN(pfile, 2);
- for (i = ident_len; i >= 0; i--) ident[i+2] = ident[i];
- ident[0] = '@';
- ident[1] = '-';
- }
- return CPP_NAME;
- }
-
- /* If macro wants an arglist, verify that a '(' follows.
- first skip all whitespace, copying it to the output
- after the macro name. Then, if there is no '(',
- decide this is not a macro call and leave things that way. */
- if (hp->type == T_MACRO && hp->value.defn->nargs >= 0)
- {
- struct parse_marker macro_mark;
- int is_macro_call, macbuf_whitespace = 0;
-
- parse_set_mark(&macro_mark, pfile);
- for (;; )
- {
- cpp_skip_hspace(pfile);
- c = PEEKC();
- is_macro_call = c == '(';
- if (c != EOF)
- {
- if (c != '\n')
- break;
- FORWARD(1);
- }
- else
- {
- if (CPP_IS_MACRO_BUFFER(CPP_BUFFER(pfile)))
- {
- if (macro_mark.position !=
- (CPP_BUFFER(pfile)->cur
- - CPP_BUFFER(pfile)->buf))
- macbuf_whitespace = 1;
-
- parse_clear_mark(&macro_mark);
- cpp_pop_buffer(pfile);
- parse_set_mark(&macro_mark, pfile);
- }
- else
- break;
- }
- }
- if (!is_macro_call)
- {
- parse_goto_mark(&macro_mark, pfile);
- if (macbuf_whitespace)
- CPP_PUTC(pfile, ' ');
- }
- parse_clear_mark(&macro_mark);
- if (!is_macro_call)
- return CPP_NAME;
- }
- /* This is now known to be a macro call. */
-
- /* it might not actually be a macro. */
- if (hp->type != T_MACRO) {
- int xbuf_len; U_CHAR *xbuf;
- CPP_SET_WRITTEN(pfile, before_name_written);
- special_symbol(hp, pfile);
- xbuf_len = CPP_WRITTEN(pfile) - before_name_written;
- xbuf = (U_CHAR *) xmalloc(xbuf_len + 1);
- CPP_SET_WRITTEN(pfile, before_name_written);
- copy_memory(CPP_PWRITTEN(pfile), xbuf, xbuf_len + 1);
- push_macro_expansion(pfile, xbuf, xbuf_len, hp);
- }
- else
- {
- /* Expand the macro, reading arguments as needed,
- and push the expansion on the input stack. */
- macroexpand(pfile, hp);
- CPP_SET_WRITTEN(pfile, before_name_written);
- }
-
- /* An extra "@ " is added to the end of a macro expansion
- to prevent accidental token pasting. We prefer to avoid
- unneeded extra spaces (for the sake of cpp-using tools like
- imake). Here we remove the space if it is safe to do so. */
- if (pfile->buffer->rlimit - pfile->buffer->cur >= 3
- && pfile->buffer->rlimit[-2] == '@'
- && pfile->buffer->rlimit[-1] == ' ')
- {
- int c1 = pfile->buffer->rlimit[-3];
- int c2 = CPP_BUF_PEEK(CPP_PREV_BUFFER(CPP_BUFFER(pfile)));
- if (c2 == EOF || !unsafe_chars(c1, c2))
- pfile->buffer->rlimit -= 2;
- }
- }
- goto get_next;
-
- case ' ': case '\t': case '\v': case '\r':
- for (;; )
- {
- CPP_PUTC(pfile, c);
- c = PEEKC();
- if (c == EOF || !is_hor_space[c])
- break;
- FORWARD(1);
- }
- return CPP_HSPACE;
-
- case '\\':
- c2 = PEEKC();
- if (c2 != '\n')
- goto randomchar;
- token = CPP_HSPACE;
- goto op2any;
-
- case '\n':
- CPP_PUTC(pfile, c);
- if (pfile->only_seen_white == 0)
- pfile->only_seen_white = 1;
- pfile->lineno++;
- output_line_command(pfile, 1, same_file);
- return CPP_VSPACE;
-
- case '(': token = CPP_LPAREN; goto char1;
- case ')': token = CPP_RPAREN; goto char1;
- case '{': token = CPP_LBRACE; goto char1;
- case '}': token = CPP_RBRACE; goto char1;
- case ',': token = CPP_COMMA; goto char1;
- case ';': token = CPP_SEMICOLON; goto char1;
-
-randomchar:
- default:
- token = CPP_OTHER;
-char1:
- pfile->only_seen_white = 0;
- CPP_PUTC(pfile, c);
- return token;
- }
- }
-}
-
-/* Like cpp_get_token, but skip spaces and comments. */
-
-enum cpp_token
-cpp_get_non_space_token(cpp_reader *pfile)
-{
- int old_written = CPP_WRITTEN(pfile);
- for (;; )
- {
- enum cpp_token token = cpp_get_token(pfile);
- if (token != CPP_COMMENT && token != CPP_POP
- && token != CPP_HSPACE && token != CPP_VSPACE)
- return token;
- CPP_SET_WRITTEN(pfile, old_written);
- }
-}
-
-/* Parse an identifier starting with C. */
-
-static int
-parse_name(cpp_reader *pfile, int c)
-{
- for (;; )
- {
- if (!is_idchar[c])
- {
- if (c == '\\' && PEEKC() == '\n')
- {
- FORWARD(2);
- continue;
- }
- FORWARD(-1);
- break;
- }
-
- if (c == '$' && CPP_PEDANTIC(pfile))
- cpp_pedwarn(pfile, "`$' in identifier");
-
- CPP_RESERVE(pfile, 2); /* One more for final NUL. */
- CPP_PUTC_Q(pfile, c);
- c = GETC();
- if (c == EOF)
- break;
- }
- CPP_NUL_TERMINATE_Q(pfile);
- return 1;
-}
-
-/* This is called after options have been processed.
- * Check options for consistency, and setup for processing input
- * from the file named FNAME. (Use standard input if FNAME==NULL.)
- * Return 1 on success, 0 on failure.
- */
-
-int
-cpp_start_read(cpp_reader *pfile, char *fname)
-{
- struct cpp_options *opts = CPP_OPTIONS(pfile);
- struct cpp_pending *pend;
- char *p;
- int f;
- cpp_buffer *fp;
- struct include_hash *ih_fake;
-
- /* The code looks at the defaults through this pointer, rather than through
- the constant structure above. This pointer gets changed if an environment
- variable specifies other defaults. */
- struct default_include *include_defaults = include_defaults_array;
-
- /* Now that we know dollars_in_ident for real,
- reset is_idchar/is_idstart. */
- is_idchar['$'] = opts->dollars_in_ident;
- is_idstart['$'] = opts->dollars_in_ident;
-
- /* Add dirs from CPATH after dirs from -I. */
- /* There seems to be confusion about what CPATH should do,
- so for the moment it is not documented. */
- /* Some people say that CPATH should replace the standard include dirs,
- but that seems pointless: it comes before them, so it overrides them
- anyway. */
- GET_ENV_PATH_LIST(p, "CPATH");
- if (p != 0 && !opts->no_standard_includes)
- path_include(pfile, p);
-
- /* Do partial setup of input buffer for the sake of generating
- early #line directives (when -g is in effect). */
- fp = cpp_push_buffer(pfile, NULL, 0);
- if (!fp)
- return 0;
- if (opts->in_fname == NULL || *opts->in_fname == 0)
- {
- opts->in_fname = fname;
- if (opts->in_fname == NULL)
- opts->in_fname = "";
- }
- fp->nominal_fname = fp->fname = opts->in_fname;
- fp->lineno = 0;
-
- /* Install __LINE__, etc. Must follow initialize_char_syntax
- and option processing. */
- initialize_builtins(pfile);
-
- /* Do standard #defines that identify system and machine type. */
-
- if (!opts->inhibit_predefs)
- {
- char *p = (char *) alloca(strlen(predefs) + 1);
- strcpy(p, predefs);
- while (*p)
- {
- char *q;
- while (*p == ' ' || *p == '\t')
- p++;
- /* Handle -D options. */
- if (p[0] == '-' && p[1] == 'D')
- {
- q = &p[2];
- while (*p && *p != ' ' && *p != '\t')
- p++;
- if (*p != 0)
- *p++= 0;
- if (opts->debug_output)
- output_line_command(pfile, 0, same_file);
- cpp_define(pfile, q);
- while (*p == ' ' || *p == '\t')
- p++;
- }
- else
- {
- abort();
- }
- }
- }
-
- /* Now handle the command line options. */
-
- /* Do -U's, -D's and -A's in the order they were seen. */
- /* First reverse the list. */
- opts->pending = nreverse_pending(opts->pending);
-
- for (pend = opts->pending; pend; pend = pend->next)
- {
- if (pend->cmd != NULL && pend->cmd[0] == '-')
- {
- switch (pend->cmd[1])
- {
- case 'U':
- if (opts->debug_output)
- output_line_command(pfile, 0, same_file);
- cpp_undef(pfile, pend->arg);
- break;
- case 'D':
- if (opts->debug_output)
- output_line_command(pfile, 0, same_file);
- cpp_define(pfile, pend->arg);
- break;
- }
- }
- }
-
- opts->done_initializing = 1;
-
- { /* Read the appropriate environment variable and if it exists
- replace include_defaults with the listed path. */
- char *epath = 0;
- switch ((opts->objc << 1) + opts->cplusplus)
- {
- case 0:
- GET_ENV_PATH_LIST(epath, "C_INCLUDE_PATH");
- break;
- case 1:
- GET_ENV_PATH_LIST(epath, "CPLUS_INCLUDE_PATH");
- break;
- case 2:
- GET_ENV_PATH_LIST(epath, "OBJC_INCLUDE_PATH");
- break;
- case 3:
- GET_ENV_PATH_LIST(epath, "OBJCPLUS_INCLUDE_PATH");
- break;
- }
- /* If the environment var for this language is set,
- add to the default list of include directories. */
- if (epath) {
- char *nstore = (char *) alloca(strlen(epath) + 2);
- int num_dirs;
- char *startp, *endp;
-
- for (num_dirs = 1, startp = epath; *startp; startp++)
- if (*startp == PATH_SEPARATOR)
- num_dirs++;
- include_defaults
- = (struct default_include *) xmalloc((num_dirs
- * sizeof (struct default_include))
- + sizeof (include_defaults_array));
- startp = endp = epath;
- num_dirs = 0;
- while (1) {
- /* Handle cases like c:/usr/lib:d:/gcc/lib */
- if ((*endp == PATH_SEPARATOR)
- || *endp == 0) {
- strncpy(nstore, startp, endp-startp);
- if (endp == startp)
- strcpy(nstore, ".");
- else
- nstore[endp-startp] = '\0';
-
- include_defaults[num_dirs].fname = xstrdup(nstore);
- include_defaults[num_dirs].component = 0;
- include_defaults[num_dirs].cplusplus = opts->cplusplus;
- include_defaults[num_dirs].cxx_aware = 1;
- num_dirs++;
- if (*endp == '\0')
- break;
- endp = startp = endp + 1;
- } else
- endp++;
- }
- /* Put the usual defaults back in at the end. */
- copy_memory((char *) include_defaults_array,
- (char *) &include_defaults[num_dirs],
- sizeof (include_defaults_array));
- }
- }
-
- /* Unless -fnostdinc,
- tack on the standard include file dirs to the specified list */
- if (!opts->no_standard_includes) {
- struct default_include *p = include_defaults;
- char *specd_prefix = opts->include_prefix;
- char *default_prefix = xstrdup(GCC_INCLUDE_DIR);
- int default_len = 0;
- /* Remove the `include' from /usr/local/lib/gcc.../include. */
- if (!strcmp(default_prefix + strlen(default_prefix) - 8, "/include")) {
- default_len = strlen(default_prefix) - 7;
- default_prefix[default_len] = 0;
- }
- /* Search "translated" versions of GNU directories.
- These have /usr/local/lib/gcc... replaced by specd_prefix. */
- if (specd_prefix != 0 && default_len != 0)
- for (p = include_defaults; p->fname; p++) {
- /* Some standard dirs are only for C++. */
- if (!p->cplusplus
- || (opts->cplusplus && !opts->no_standard_cplusplus_includes)) {
- /* Does this dir start with the prefix? */
- if (!strncmp(p->fname, default_prefix, default_len)) {
- /* Yes; change prefix and add to search list. */
- int this_len = strlen(specd_prefix)
- + strlen(p->fname) - default_len;
- char *str = (char *) xmalloc(this_len + 1);
- strcpy(str, specd_prefix);
- strcat(str, p->fname + default_len);
-
- append_include_chain(pfile, &opts->system_include,
- str, !p->cxx_aware);
- }
- }
- }
- /* Search ordinary names for GNU include directories. */
- for (p = include_defaults; p->fname; p++) {
- /* Some standard dirs are only for C++. */
- if (!p->cplusplus
- || (opts->cplusplus && !opts->no_standard_cplusplus_includes)) {
- const char *str = update_path(p->fname, p->component);
- append_include_chain(pfile, &opts->system_include,
- str, !p->cxx_aware);
- }
- }
- }
-
- merge_include_chains(opts);
-
- /* With -v, print the list of dirs to search. */
- if (opts->verbose) {
- struct file_name_list *p;
- fprintf(stderr, "#include \"...\" search starts here:\n");
- for (p = opts->quote_include; p; p = p->next) {
- if (p == opts->bracket_include)
- fprintf(stderr, "#include <...> search starts here:\n");
- fprintf(stderr, " %s\n", p->name);
- }
- fprintf(stderr, "End of search list.\n");
- }
-
- /* Copy the entire contents of the main input file into
- the stacked input buffer previously allocated for it. */
- if (fname == NULL || *fname == 0) {
- fname = "";
- f = 0;
- } else if ((f = open(fname, O_RDONLY, 0666)) < 0)
- cpp_pfatal_with_name(pfile, fname);
-
- /* -MG doesn't select the form of output and must be specified with one of
- -M or -MM. -MG doesn't make sense with -MD or -MMD since they don't
- inhibit compilation. */
- if (opts->print_deps_missing_files
- && (opts->print_deps == 0 || !opts->no_output))
- {
- cpp_fatal(pfile, "-MG must be specified with one of -M or -MM");
- return 0;
- }
-
- /* Either of two environment variables can specify output of deps.
- Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
- where OUTPUT_FILE is the file to write deps info to
- and DEPS_TARGET is the target to mention in the deps. */
-
- if (opts->print_deps == 0
- && (getenv("SUNPRO_DEPENDENCIES") != 0
- || getenv("DEPENDENCIES_OUTPUT") != 0)) {
- char *spec = getenv("DEPENDENCIES_OUTPUT");
- char *s;
- char *output_file;
-
- if (spec == 0)
- {
- spec = getenv("SUNPRO_DEPENDENCIES");
- opts->print_deps = 2;
- }
- else
- opts->print_deps = 1;
-
- s = spec;
- /* Find the space before the DEPS_TARGET, if there is one. */
- /* This should use index. (mrs) */
- while (*s != 0 && *s != ' ') s++;
- if (*s != 0)
- {
- opts->deps_target = s + 1;
- output_file = (char *) xmalloc(s - spec + 1);
- copy_memory(spec, output_file, s - spec);
- output_file[s - spec] = 0;
- }
- else
- {
- opts->deps_target = 0;
- output_file = spec;
- }
-
- opts->deps_file = output_file;
- opts->print_deps_append = 1;
- }
-
- /* For -M, print the expected object file name
- as the target of this Make-rule. */
- if (opts->print_deps)
- {
- pfile->deps_allocated_size = 200;
- pfile->deps_buffer = (char *) xmalloc(pfile->deps_allocated_size);
- pfile->deps_buffer[0] = 0;
- pfile->deps_size = 0;
- pfile->deps_column = 0;
-
- if (opts->deps_target)
- deps_output(pfile, opts->deps_target, ':');
- else if (*opts->in_fname == 0)
- deps_output(pfile, "-", ':');
- else
- {
- char *p, *q, *r;
- int len, x;
- static char *known_suffixes[] = { ".c", ".C", ".s", ".S", ".m",
- ".cc", ".cxx", ".cpp", ".cp",
- ".c++", 0};
-
- /* Discard all directory prefixes from filename. */
- if ((q = strrchr(opts->in_fname, '/')) != NULL
-#ifdef DIR_SEPARATOR
- && (q = strrchr(opts->in_fname, DIR_SEPARATOR)) != NULL
-#endif
- )
- ++q;
- else
- q = opts->in_fname;
-
- /* Copy remainder to mungable area. */
- p = (char *) alloca(strlen(q) + 8);
- strcpy(p, q);
-
- /* Output P, but remove known suffixes. */
- len = strlen(p);
- q = p + len;
- /* Point to the filename suffix. */
- r = strrchr(p, '.');
- /* Compare against the known suffixes. */
- x = 0;
- while (known_suffixes[x] != 0)
- {
- if (strncmp(known_suffixes[x], r, q - r) == 0)
- {
- /* Make q point to the bit we're going to overwrite
- with an object suffix. */
- q = r;
- break;
- }
- x++;
- }
-
- /* Supply our own suffix. */
- strcpy(q, ".o");
-
- deps_output(pfile, p, ':');
- deps_output(pfile, opts->in_fname, ' ');
- }
- }
-
-#if 0
- /* Make sure data ends with a newline. And put a null after it. */
-
- if ((fp->length > 0 && fp->buf[fp->length - 1] != '\n')
- /* Backslash-newline at end is not good enough. */
- || (fp->length > 1 && fp->buf[fp->length - 2] == '\\')) {
- fp->buf[fp->length++] = '\n';
- missing_newline = 1;
- }
- fp->buf[fp->length] = '\0';
-
- /* Unless inhibited, convert trigraphs in the input. */
-
- if (!no_trigraphs)
- trigraph_pcp(fp);
-#endif
-
- /* Must call finclude() on the main input before processing
- -include switches; otherwise the -included text winds up
- after the main input. */
- ih_fake = (struct include_hash *) xmalloc(sizeof (struct include_hash));
- ih_fake->next = 0;
- ih_fake->next_this_file = 0;
- ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */
- ih_fake->name = fname;
- ih_fake->control_macro = 0;
- ih_fake->buf = (char *)-1;
- ih_fake->limit = 0;
- if (!finclude(pfile, f, ih_fake))
- return 0;
- output_line_command(pfile, 0, same_file);
- pfile->only_seen_white = 2;
-
- /* The -imacros files can be scanned now, but the -include files
- have to be pushed onto the include stack and processed later,
- in the main loop calling cpp_get_token. That means the -include
- files have to be processed in reverse order of the pending list,
- which means the pending list has to be reversed again, which
- means the -imacros files have to be done separately and first. */
-
- pfile->no_record_file++;
- opts->no_output++;
- for (pend = opts->pending; pend; pend = pend->next)
- {
- if (pend->cmd != NULL)
- {
- if (strcmp(pend->cmd, "-imacros") == 0)
- {
- int fd = open(pend->arg, O_RDONLY, 0666);
- if (fd < 0)
- {
- cpp_perror_with_name(pfile, pend->arg);
- return 0;
- }
- if (!cpp_push_buffer(pfile, NULL, 0))
- return 0;
-
- ih_fake = (struct include_hash *)
- xmalloc(sizeof (struct include_hash));
- ih_fake->next = 0;
- ih_fake->next_this_file = 0;
- ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */
- ih_fake->name = pend->arg;
- ih_fake->control_macro = 0;
- ih_fake->buf = (char *)-1;
- ih_fake->limit = 0;
- if (!finclude(pfile, fd, ih_fake))
- cpp_scan_buffer(pfile);
- free(ih_fake);
- }
- }
- }
- opts->no_output--;
- opts->pending = nreverse_pending(opts->pending);
- for (pend = opts->pending; pend; pend = pend->next)
- {
- if (pend->cmd != NULL)
- {
- if (strcmp(pend->cmd, "-include") == 0)
- {
- int fd = open(pend->arg, O_RDONLY, 0666);
- if (fd < 0)
- {
- cpp_perror_with_name(pfile, pend->arg);
- return 0;
- }
- if (!cpp_push_buffer(pfile, NULL, 0))
- return 0;
-
- ih_fake = (struct include_hash *)
- xmalloc(sizeof (struct include_hash));
- ih_fake->next = 0;
- ih_fake->next_this_file = 0;
- ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */
- ih_fake->name = pend->arg;
- ih_fake->control_macro = 0;
- ih_fake->buf = (char *)-1;
- ih_fake->limit = 0;
- if (finclude(pfile, fd, ih_fake))
- output_line_command(pfile, 0, enter_file);
- }
- }
- }
- pfile->no_record_file--;
-
- /* Free the pending list. */
- for (pend = opts->pending; pend; )
- {
- struct cpp_pending *next = pend->next;
- free(pend);
- pend = next;
- }
- opts->pending = NULL;
-
-
- return 1;
-}
-
-void
-cpp_reader_init(cpp_reader *pfile)
-{
- zero_memory((char *) pfile, sizeof (cpp_reader));
- pfile->get_token = cpp_get_token;
-
- pfile->token_buffer_size = 200;
- pfile->token_buffer = (U_CHAR *) xmalloc(pfile->token_buffer_size);
- CPP_SET_WRITTEN(pfile, 0);
-
- pfile->timebuf = NULL;
- pfile->only_seen_white = 1;
- pfile->buffer = CPP_NULL_BUFFER(pfile);
- pfile->actual_dirs = NULL;
-}
-
-static struct cpp_pending *
-nreverse_pending(struct cpp_pending *list)
-{
- register struct cpp_pending *prev = 0, *next, *pend;
- for (pend = list; pend; pend = next)
- {
- next = pend->next;
- pend->next = prev;
- prev = pend;
- }
- return prev;
-}
-
-static void
-push_pending(cpp_reader *pfile, char *cmd, char *arg)
-{
- struct cpp_pending *pend
- = (struct cpp_pending *) xmalloc(sizeof (struct cpp_pending));
- pend->cmd = cmd;
- pend->arg = arg;
- pend->next = CPP_OPTIONS(pfile)->pending;
- CPP_OPTIONS(pfile)->pending = pend;
-}
-
-
-static void
-print_help()
-{
- printf("Usage: %s [switches] input output\n", progname);
- printf("Switches:\n");
- printf(" -include <file> Include the contents of <file> before other files\n");
- printf(" -imacros <file> Accept definition of marcos in <file>\n");
- printf(" -iprefix <path> Specify <path> as a prefix for next two options\n");
- printf(" -iwithprefix <dir> Add <dir> to the end of the system include paths\n");
- printf(" -iwithprefixbefore <dir> Add <dir> to the end of the main include paths\n");
- printf(" -isystem <dir> Add <dir> to the start of the system include paths\n");
- printf(" -idirafter <dir> Add <dir> to the end of the system include paths\n");
- printf(" -I <dir> Add <dir> to the end of the main include paths\n");
- printf(" -nostdinc Do not search the system include directories\n");
- printf(" -nostdinc++ Do not search the system include directories for C++\n");
- printf(" -o <file> Put output into <file>\n");
- printf(" -pedantic Issue all warnings demanded by strict ANSI C\n");
- printf(" -traditional Follow K&R pre-processor behaviour\n");
- printf(" -trigraphs Support ANSI C trigraphs\n");
- printf(" -lang-c Assume that the input sources are in C\n");
- printf(" -lang-c89 Assume that the input sources are in C89\n");
- printf(" -lang-c++ Assume that the input sources are in C++\n");
- printf(" -lang-objc Assume that the input sources are in ObjectiveC\n");
- printf(" -lang-objc++ Assume that the input sources are in ObjectiveC++\n");
- printf(" -lang-asm Assume that the input sources are in assembler\n");
- printf(" -lang-chill Assume that the input sources are in Chill\n");
- printf(" -+ Allow parsing of C++ style features\n");
- printf(" -w Inhibit warning messages\n");
- printf(" -Wtrigraphs Warn if trigraphs are encountered\n");
- printf(" -Wno-trigraphs Do not warn about trigraphs\n");
- printf(" -Wcomment{s} Warn if one comment starts inside another\n");
- printf(" -Wno-comment{s} Do not warn about comments\n");
- printf(" -Wtraditional Warn if a macro argument is/would be turned into\n");
- printf(" a string if -tradtional is specified\n");
- printf(" -Wno-traditional Do not warn about stringification\n");
- printf(" -Wundef Warn if an undefined macro is used by #if\n");
- printf(" -Wno-undef Do not warn about testing udefined macros\n");
- printf(" -Wimport Warn about the use of the #import directive\n");
- printf(" -Wno-import Do not warn about the use of #import\n");
- printf(" -Werror Treat all warnings as errors\n");
- printf(" -Wno-error Do not treat warnings as errors\n");
- printf(" -Wall Enable all preprocessor warnings\n");
- printf(" -M Generate make dependencies\n");
- printf(" -MM As -M, but ignore system header files\n");
- printf(" -MD As -M, but put output in a .d file\n");
- printf(" -MMD As -MD, but ignore system header files\n");
- printf(" -MG Treat missing header file as generated files\n");
- printf(" -g Include #define and #undef directives in the output\n");
- printf(" -D<macro> Define a <macro> with string '1' as its value\n");
- printf(" -D<macro>=<val> Define a <macro> with <val> as its value\n");
- printf(" -U<macro> Undefine <macro> \n");
- printf(" -u or -undef Do not predefine any macros\n");
- printf(" -v Display the version number\n");
- printf(" -H Print the name of header files as they are used\n");
- printf(" -C Do not discard comments\n");
- printf(" -dM Display a list of macro definitions active at end\n");
- printf(" -dD Preserve macro definitions in output\n");
- printf(" -dN As -dD except that only the names are preserved\n");
- printf(" -dI Include #include directives in the output\n");
- printf(" -ifoutput Describe skipped code blocks in output \n");
- printf(" -P Do not generate #line directives\n");
- printf(" -$ Do not include '$' in identifiers\n");
- printf(" -remap Remap file names when including files.\n");
- printf(" -h or --help Display this information\n");
-}
-
-
-/* Handle one command-line option in (argc, argv).
- Can be called multiple times, to handle multiple sets of options.
- Returns number of strings consumed. */
-int
-cpp_handle_option(cpp_reader *pfile, int argc, char **argv)
-{
- struct cpp_options *opts = CPP_OPTIONS(pfile);
- int i = 0;
-
- if (argv[i][0] != '-') {
- if (opts->out_fname != NULL)
- {
- print_help();
- cpp_fatal(pfile, "Too many arguments");
- }
- else if (opts->in_fname != NULL)
- opts->out_fname = argv[i];
- else
- opts->in_fname = argv[i];
- } else {
- switch (argv[i][1]) {
-
-missing_filename:
- cpp_fatal(pfile, "Filename missing after `%s' option", argv[i]);
- return argc;
-missing_dirname:
- cpp_fatal(pfile, "Directory name missing after `%s' option", argv[i]);
- return argc;
-
- case 'I': /* Add directory to path for includes. */
- if (!strcmp(argv[i] + 2, "-"))
- {
- if (!opts->ignore_srcdir)
- {
- opts->ignore_srcdir = 1;
- /* Don't use any preceding -I directories for #include <...>. */
- opts->quote_include = opts->bracket_include;
- opts->bracket_include = 0;
- }
- }
- else
- {
- char *fname;
- if (argv[i][2] != 0)
- fname = argv[i] + 2;
- else if (i + 1 == argc)
- goto missing_dirname;
- else
- fname = argv[++i];
- append_include_chain(pfile, &opts->bracket_include, fname, 0);
- }
- break;
-
- case 'i':
- /* Add directory to beginning of system include path, as a system
- include directory. */
- if (!strcmp(argv[i], "-isystem"))
- {
- if (i + 1 == argc)
- goto missing_filename;
- append_include_chain(pfile, &opts->system_include, argv[++i], 1);
- }
- /* Add directory to end of path for includes,
- with the default prefix at the front of its name. */
- else if (!strcmp(argv[i], "-iwithprefix"))
- {
- char *fname;
- if (i + 1 == argc)
- goto missing_dirname;
- ++i;
-
- if (opts->include_prefix != 0)
- {
- fname = xmalloc(strlen(opts->include_prefix)
- + strlen(argv[i]) + 1);
- strcpy(fname, opts->include_prefix);
- strcat(fname, argv[i]);
- }
- else
- {
- fname = xmalloc(strlen(GCC_INCLUDE_DIR)
- + strlen(argv[i]) + 1);
- strcpy(fname, GCC_INCLUDE_DIR);
- /* Remove the `include' from /usr/local/lib/gcc.../include. */
- if (!strcmp(fname + strlen(fname) - 8, "/include"))
- fname[strlen(fname) - 7] = 0;
- strcat(fname, argv[i]);
- }
-
- append_include_chain(pfile, &opts->system_include, fname, 0);
- }
- /* Add directory to main path for includes,
- with the default prefix at the front of its name. */
- else if (!strcmp(argv[i], "-iwithprefix"))
- {
- char *fname;
- if (i + 1 == argc)
- goto missing_dirname;
- ++i;
-
- if (opts->include_prefix != 0)
- {
- fname = xmalloc(strlen(opts->include_prefix)
- + strlen(argv[i]) + 1);
- strcpy(fname, opts->include_prefix);
- strcat(fname, argv[i]);
- }
- else
- {
- fname = xmalloc(strlen(GCC_INCLUDE_DIR)
- + strlen(argv[i]) + 1);
- strcpy(fname, GCC_INCLUDE_DIR);
- /* Remove the `include' from /usr/local/lib/gcc.../include. */
- if (!strcmp(fname + strlen(fname) - 8, "/include"))
- fname[strlen(fname) - 7] = 0;
- strcat(fname, argv[i]);
- }
-
- append_include_chain(pfile, &opts->bracket_include, fname, 0);
- }
- /* Add directory to end of path for includes. */
- else if (!strcmp(argv[i], "-idirafter"))
- {
- if (i + 1 == argc)
- goto missing_dirname;
- append_include_chain(pfile, &opts->after_include, argv[++i], 0);
- }
- else if (!strcmp(argv[i], "-include") || !strcmp(argv[i], "-imacros"))
- {
- if (i + 1 == argc)
- goto missing_filename;
- else
- push_pending(pfile, argv[i], argv[i+1]), i++;
- }
- else if (!strcmp(argv[i], "-iprefix"))
- {
- if (i + 1 == argc)
- goto missing_filename;
- else
- opts->include_prefix = argv[++i];
- }
- else if (!strcmp(argv[i], "-ifoutput"))
- opts->output_conditionals = 1;
-
- break;
-
- case 'o':
- if (opts->out_fname != NULL)
- {
- cpp_fatal(pfile, "Output filename specified twice");
- return argc;
- }
- if (i + 1 == argc)
- goto missing_filename;
- opts->out_fname = argv[++i];
- if (!strcmp(opts->out_fname, "-"))
- opts->out_fname = "";
- break;
-
- case 'p':
- if (!strcmp(argv[i], "-pedantic"))
- CPP_PEDANTIC(pfile) = 1;
- else if (!strcmp(argv[i], "-pedantic-errors")) {
- CPP_PEDANTIC(pfile) = 1;
- opts->pedantic_errors = 1;
- }
-#if 0
- else if (!strcmp(argv[i], "-pcp")) {
- char *pcp_fname = argv[++i];
- pcp_outfile = ((pcp_fname[0] != '-' || pcp_fname[1] != '\0')
- ? fopen(pcp_fname, "w")
- : fdopen(dup(fileno(stdout)), "w"));
- if (pcp_outfile == 0)
- cpp_pfatal_with_name(pfile, pcp_fname);
- no_precomp = 1;
- }
-#endif
- break;
-
- case 't':
- if (!strcmp(argv[i], "-traditional")) {
- opts->traditional = 1;
- opts->cplusplus_comments = 0;
- } else if (!strcmp(argv[i], "-trigraphs")) {
- if (!opts->chill)
- opts->no_trigraphs = 0;
- }
- break;
-
- case 'l':
- if (!strcmp(argv[i], "-lang-c"))
- opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0,
- opts->objc = 0;
- if (!strcmp(argv[i], "-lang-c89"))
- opts->cplusplus = 0, opts->cplusplus_comments = 0, opts->c89 = 1,
- opts->objc = 0;
- if (!strcmp(argv[i], "-lang-c++"))
- opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->c89 = 0,
- opts->objc = 0;
- if (!strcmp(argv[i], "-lang-objc"))
- opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0,
- opts->objc = 1;
- if (!strcmp(argv[i], "-lang-objc++"))
- opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->c89 = 0,
- opts->objc = 1;
- if (!strcmp(argv[i], "-lang-asm"))
- opts->lang_asm = 1;
- if (!strcmp(argv[i], "-lint"))
- opts->for_lint = 1;
- if (!strcmp(argv[i], "-lang-chill"))
- opts->objc = 0, opts->cplusplus = 0, opts->chill = 1,
- opts->traditional = 1, opts->no_trigraphs = 1,
- opts->traditional = 1, opts->cplusplus_comments = 0;
- break;
-
- case '+':
- opts->cplusplus = 1, opts->cplusplus_comments = 1;
- break;
-
- case 'w':
- opts->inhibit_warnings = 1;
- break;
-
- case 'W':
- if (!strcmp(argv[i], "-Wtrigraphs"))
- opts->warn_trigraphs = 1;
- else if (!strcmp(argv[i], "-Wno-trigraphs"))
- opts->warn_trigraphs = 0;
- else if (!strcmp(argv[i], "-Wcomment"))
- opts->warn_comments = 1;
- else if (!strcmp(argv[i], "-Wno-comment"))
- opts->warn_comments = 0;
- else if (!strcmp(argv[i], "-Wcomments"))
- opts->warn_comments = 1;
- else if (!strcmp(argv[i], "-Wno-comments"))
- opts->warn_comments = 0;
- else if (!strcmp(argv[i], "-Wtraditional"))
- opts->warn_stringify = 1;
- else if (!strcmp(argv[i], "-Wno-traditional"))
- opts->warn_stringify = 0;
- else if (!strcmp(argv[i], "-Wundef"))
- opts->warn_undef = 1;
- else if (!strcmp(argv[i], "-Wno-undef"))
- opts->warn_undef = 0;
- else if (!strcmp(argv[i], "-Wimport"))
- opts->warn_import = 1;
- else if (!strcmp(argv[i], "-Wno-import"))
- opts->warn_import = 0;
- else if (!strcmp(argv[i], "-Werror"))
- opts->warnings_are_errors = 1;
- else if (!strcmp(argv[i], "-Wno-error"))
- opts->warnings_are_errors = 0;
- else if (!strcmp(argv[i], "-Wall"))
- {
- opts->warn_trigraphs = 1;
- opts->warn_comments = 1;
- }
- break;
-
- case 'M':
- /* The style of the choices here is a bit mixed.
- The chosen scheme is a hybrid of keeping all options in one string
- and specifying each option in a separate argument:
- -M|-MM|-MD file|-MMD file [-MG]. An alternative is:
- -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely:
- -M[M][G][D file]. This is awkward to handle in specs, and is not
- as extensible. */
- /* ??? -MG must be specified in addition to one of -M or -MM.
- This can be relaxed in the future without breaking anything.
- The converse isn't true. */
-
- /* -MG isn't valid with -MD or -MMD. This is checked for later. */
- if (!strcmp(argv[i], "-MG"))
- {
- opts->print_deps_missing_files = 1;
- break;
- }
- if (!strcmp(argv[i], "-M"))
- opts->print_deps = 2;
- else if (!strcmp(argv[i], "-MM"))
- opts->print_deps = 1;
- else if (!strcmp(argv[i], "-MD"))
- opts->print_deps = 2;
- else if (!strcmp(argv[i], "-MMD"))
- opts->print_deps = 1;
- /* For -MD and -MMD options, write deps on file named by next arg. */
- if (!strcmp(argv[i], "-MD") || !strcmp(argv[i], "-MMD"))
- {
- if (i+1 == argc)
- goto missing_filename;
- opts->deps_file = argv[++i];
- }
- else
- {
- /* For -M and -MM, write deps on standard output
- and suppress the usual output. */
- opts->no_output = 1;
- }
- break;
-
- case 'd':
- {
- char *p = argv[i] + 2;
- char c;
- while ((c = *p++) != 0) {
- /* Arg to -d specifies what parts of macros to dump */
- switch (c) {
- case 'M':
- opts->dump_macros = dump_only;
- opts->no_output = 1;
- break;
- case 'N':
- opts->dump_macros = dump_names;
- break;
- case 'D':
- opts->dump_macros = dump_definitions;
- break;
- case 'I':
- opts->dump_includes = 1;
- break;
- }
- }
- }
- break;
-
- case 'g':
- if (argv[i][2] == '3')
- opts->debug_output = 1;
- break;
-
- case '-':
- if (strcmp(argv[i], "--help") != 0)
- return i;
- print_help();
- break;
-
- case 'v':
- fprintf(stderr, "GNU CPP version %s", version_string);
-#ifdef TARGET_VERSION
- TARGET_VERSION;
-#endif
- fprintf(stderr, "\n");
- opts->verbose = 1;
- break;
-
- case 'H':
- opts->print_include_names = 1;
- break;
-
- case 'D':
- if (argv[i][2] != 0)
- push_pending(pfile, "-D", argv[i] + 2);
- else if (i + 1 == argc)
- {
- cpp_fatal(pfile, "Macro name missing after -D option");
- return argc;
- }
- else
- i++, push_pending(pfile, "-D", argv[i]);
- break;
-
- case 'U': /* JF #undef something */
- if (argv[i][2] != 0)
- push_pending(pfile, "-U", argv[i] + 2);
- else if (i + 1 == argc)
- {
- cpp_fatal(pfile, "Macro name missing after -U option");
- return argc;
- }
- else
- push_pending(pfile, "-U", argv[i+1]), i++;
- break;
-
- case 'C':
- opts->put_out_comments = 1;
- break;
-
- case 'E': /* -E comes from cc -E; ignore it. */
- break;
-
- case 'P':
- opts->no_line_commands = 1;
- break;
-
- case '$': /* Don't include $ in identifiers. */
- opts->dollars_in_ident = 0;
- break;
-
- case 'n':
- if (!strcmp(argv[i], "-nostdinc"))
- /* -nostdinc causes no default include directories.
- You must specify all include-file directories with -I. */
- opts->no_standard_includes = 1;
- else if (!strcmp(argv[i], "-nostdinc++"))
- /* -nostdinc++ causes no default C++-specific include directories. */
- opts->no_standard_cplusplus_includes = 1;
-#if 0
- else if (!strcmp(argv[i], "-noprecomp"))
- no_precomp = 1;
-#endif
- break;
-
- case 'r':
- if (!strcmp(argv[i], "-remap"))
- opts->remap = 1;
- break;
-
- case 'u':
- /* Sun compiler passes undocumented switch "-undef".
- Let's assume it means to inhibit the predefined symbols. */
- opts->inhibit_predefs = 1;
- break;
-
- case '\0': /* JF handle '-' as file name meaning stdin or stdout */
- if (opts->in_fname == NULL) {
- opts->in_fname = "";
- break;
- } else if (opts->out_fname == NULL) {
- opts->out_fname = "";
- break;
- } /* else fall through into error */
-
- default:
- return i;
- }
- }
-
- return i + 1;
-}
-
-/* Handle command-line options in (argc, argv).
- Can be called multiple times, to handle multiple sets of options.
- Returns if an unrecognized option is seen.
- Returns number of strings consumed. */
-
-int
-cpp_handle_options(cpp_reader *pfile, int argc, char **argv)
-{
- int i;
- int strings_processed;
- for (i = 0; i < argc; i += strings_processed)
- {
- strings_processed = cpp_handle_option(pfile, argc - i, argv + i);
- if (strings_processed == 0)
- break;
- }
- return i;
-}
-
-void
-cpp_finish(cpp_reader *pfile)
-{
- struct cpp_options *opts = CPP_OPTIONS(pfile);
-
- if (opts->print_deps)
- {
- /* Stream on which to print the dependency information. */
- FILE *deps_stream;
-
- /* Don't actually write the deps file if compilation has failed. */
- if (pfile->errors == 0)
- {
- char *deps_mode = opts->print_deps_append ? "a" : "w";
- if (opts->deps_file == 0)
- deps_stream = stdout;
- else if ((deps_stream = fopen(opts->deps_file, deps_mode)) == 0)
- cpp_pfatal_with_name(pfile, opts->deps_file);
- fputs(pfile->deps_buffer, deps_stream);
- putc('\n', deps_stream);
- if (opts->deps_file)
- {
- if (ferror(deps_stream) || fclose(deps_stream) != 0)
- cpp_fatal(pfile, "I/O error on output");
- }
- }
- }
-
-#if 0
- /* Debugging: dump statistics on the include hash table. */
- {
- struct include_hash *x;
- int i, j;
-
- for(i = 0; i < ALL_INCLUDE_HASHSIZE; i++)
- {
- x = pfile->all_include_files[i];
- j = 0;
- while(x)
- {
- j++;
- x = x->next;
- }
- fprintf(stderr, "%d/%d ", i, j);
- }
- fputc('\n', stderr);
- }
-#endif
-
-}
-
-/* Free resources used by PFILE.
- This is the cpp_reader 'finalizer' or 'destructor' (in C++ terminology). */
-
-void
-cpp_cleanup(cpp_reader *pfile)
-{
- int i;
- while ( CPP_BUFFER(pfile) != CPP_NULL_BUFFER(pfile))
- cpp_pop_buffer(pfile);
-
- if (pfile->token_buffer)
- {
- free(pfile->token_buffer);
- pfile->token_buffer = NULL;
- }
-
- if (pfile->deps_buffer)
- {
- free(pfile->deps_buffer);
- pfile->deps_buffer = NULL;
- pfile->deps_allocated_size = 0;
- }
-
- while (pfile->if_stack)
- {
- IF_STACK_FRAME *temp = pfile->if_stack;
- pfile->if_stack = temp->next;
- free(temp);
- }
-
- for (i = ALL_INCLUDE_HASHSIZE; --i >= 0; )
- {
- struct include_hash *imp = pfile->all_include_files[i];
- while (imp)
- {
- struct include_hash *next = imp->next;
-#if 0
- /* This gets freed elsewhere - I think. */
- free(imp->name);
-#endif
- free(imp);
- imp = next;
- }
- pfile->all_include_files[i] = 0;
- }
-
- cpp_hash_cleanup(pfile);
-}
-
-/* Initialize PMARK to remember the current position of PFILE. */
-
-void
-parse_set_mark(struct parse_marker *pmark, cpp_reader *pfile)
-{
- cpp_buffer *pbuf = CPP_BUFFER(pfile);
- pmark->next = pbuf->marks;
- pbuf->marks = pmark;
- pmark->buf = pbuf;
- pmark->position = pbuf->cur - pbuf->buf;
-}
-
-/* Cleanup PMARK - we no longer need it. */
-
-void
-parse_clear_mark(struct parse_marker *pmark)
-{
- struct parse_marker **pp = &pmark->buf->marks;
- for (;; pp = &(*pp)->next) {
- if (*pp == NULL) abort();
- if (*pp == pmark) break;
- }
- *pp = pmark->next;
-}
-
-/* Backup the current position of PFILE to that saved in PMARK. */
-
-void
-parse_goto_mark(struct parse_marker *pmark, cpp_reader *pfile)
-{
- cpp_buffer *pbuf = CPP_BUFFER(pfile);
- if (pbuf != pmark->buf)
- cpp_fatal(pfile, "internal error %s", "parse_goto_mark");
- pbuf->cur = pbuf->buf + pmark->position;
-}
-
-/* Reset PMARK to point to the current position of PFILE. (Same
- as parse_clear_mark (PMARK), parse_set_mark (PMARK, PFILE) but faster. */
-
-void
-parse_move_mark(struct parse_marker *pmark, cpp_reader *pfile)
-{
- cpp_buffer *pbuf = CPP_BUFFER(pfile);
- if (pbuf != pmark->buf)
- cpp_fatal(pfile, "internal error %s", "parse_move_mark");
- pmark->position = pbuf->cur - pbuf->buf;
-}
-
-
-void
-cpp_print_file_and_line(cpp_reader *pfile)
-{
- cpp_buffer *ip = cpp_file_buffer(pfile);
-
- if (ip != NULL)
- {
- long line, col;
- cpp_buf_line_and_col(ip, &line, &col);
- cpp_file_line_for_message(pfile, ip->nominal_fname,
- line, pfile->show_column ? col : -1);
- }
-}
-
-static void
-v_cpp_error(cpp_reader *pfile, const char *msg, va_list ap)
-{
- cpp_print_containing_files(pfile);
- cpp_print_file_and_line(pfile);
- v_cpp_message(pfile, 1, msg, ap);
-}
-
-void
-cpp_error(cpp_reader * pfile, const char *msg, ...)
-{
- va_list ap;
-
- va_start(ap, msg);
-
-
- v_cpp_error(pfile, msg, ap);
- va_end(ap);
-}
-
-/* Print error message but don't count it. */
-
-static void
-v_cpp_warning(cpp_reader *pfile, const char *msg, va_list ap)
-{
- if (CPP_OPTIONS(pfile)->inhibit_warnings)
- return;
-
- if (CPP_OPTIONS(pfile)->warnings_are_errors)
- pfile->errors++;
-
- cpp_print_containing_files(pfile);
- cpp_print_file_and_line(pfile);
- v_cpp_message(pfile, 0, msg, ap);
-}
-
-void
-cpp_warning(cpp_reader * pfile, const char *msg, ...)
-{
- va_list ap;
-
- va_start(ap, msg);
-
-
- v_cpp_warning(pfile, msg, ap);
- va_end(ap);
-}
-
-/* Print an error message and maybe count it. */
-
-void
-cpp_pedwarn(cpp_reader * pfile, const char *msg, ...)
-{
- va_list ap;
-
- va_start(ap, msg);
-
-
- if (CPP_OPTIONS(pfile)->pedantic_errors)
- v_cpp_error(pfile, msg, ap);
- else
- v_cpp_warning(pfile, msg, ap);
- va_end(ap);
-}
-
-static void
-v_cpp_error_with_line(cpp_reader *pfile, int line, int column, const char *msg, va_list ap)
-{
- cpp_buffer *ip = cpp_file_buffer(pfile);
-
- cpp_print_containing_files(pfile);
-
- if (ip != NULL)
- cpp_file_line_for_message(pfile, ip->nominal_fname, line, column);
-
- v_cpp_message(pfile, 1, msg, ap);
-}
-
-void
-cpp_error_with_line(cpp_reader * pfile, int line, int column, const char *msg, ...)
-{
- va_list ap;
-
- va_start(ap, msg);
-
-
- v_cpp_error_with_line(pfile, line, column, msg, ap);
- va_end(ap);
-}
-
-static void
-v_cpp_warning_with_line(cpp_reader *pfile, int line, int column, const char *msg, va_list ap)
-{
- cpp_buffer *ip;
-
- if (CPP_OPTIONS(pfile)->inhibit_warnings)
- return;
-
- if (CPP_OPTIONS(pfile)->warnings_are_errors)
- pfile->errors++;
-
- cpp_print_containing_files(pfile);
-
- ip = cpp_file_buffer(pfile);
-
- if (ip != NULL)
- cpp_file_line_for_message(pfile, ip->nominal_fname, line, column);
-
- v_cpp_message(pfile, 0, msg, ap);
-}
-
-#if 0
-static void
-cpp_warning_with_line(cpp_reader * pfile, int line, int column, const char *msg, ...)
-{
- va_list ap;
-
- va_start(ap, msg);
-
-
- v_cpp_warning_with_line(pfile, line, column, msg, ap);
- va_end(ap);
-}
-#endif
-
-void
-cpp_pedwarn_with_line(cpp_reader * pfile, int line, int column, const char *msg, ...)
-{
- va_list ap;
-
- va_start(ap, msg);
-
-
- if (CPP_OPTIONS(pfile)->pedantic_errors)
- v_cpp_error_with_line(pfile, column, line, msg, ap);
- else
- v_cpp_warning_with_line(pfile, line, column, msg, ap);
- va_end(ap);
-}
-
-/* Report a warning (or an error if pedantic_errors)
- giving specified file name and line number, not current. */
-
-void
-cpp_pedwarn_with_file_and_line(cpp_reader *pfile, char *file, int line, const char *msg, ...)
-{
- va_list ap;
-
- va_start(ap, msg);
-
-
- if (!CPP_OPTIONS(pfile)->pedantic_errors
- && CPP_OPTIONS(pfile)->inhibit_warnings)
- return;
- if (file != NULL)
- cpp_file_line_for_message(pfile, file, line, -1);
- v_cpp_message(pfile, CPP_OPTIONS(pfile)->pedantic_errors, msg, ap);
- va_end(ap);
-}
-
-/* my_strerror - return the descriptive text associated with an
- `errno' code. */
-
-static char *
-my_strerror(int errnum)
-{
- char *result;
-
-#ifndef HAVE_STRERROR
- result = (char *) ((errnum < sys_nerr) ? sys_errlist[errnum] : 0);
-#else
- result = strerror(errnum);
-#endif
-
- if (!result)
- result = "undocumented I/O error";
-
- return result;
-}
-
-/* Error including a message from `errno'. */
-
-void
-cpp_error_from_errno(cpp_reader *pfile, const char *name)
-{
- cpp_message_from_errno(pfile, 1, name);
-}
-
-void
-cpp_message_from_errno(cpp_reader *pfile, int is_error, const char *name)
-{
- int e = errno;
- cpp_buffer *ip = cpp_file_buffer(pfile);
-
- cpp_print_containing_files(pfile);
-
- if (ip != NULL)
- cpp_file_line_for_message(pfile, ip->nominal_fname, ip->lineno, -1);
-
- cpp_message(pfile, is_error, "%s: %s", name, my_strerror(e));
-}
-
-void
-cpp_perror_with_name(cpp_reader *pfile, const char *name)
-{
- cpp_message(pfile, 1, "%s: %s: %s", progname, name, my_strerror(errno));
-}
-
-/* TODO:
- * No pre-compiled header file support.
- *
- * Possibly different enum token codes for each C/C++ token.
- *
- * Find and cleanup remaining uses of static variables,
- *
- * Support for trigraphs.
- *
- * Support -dM flag (dump_all_macros).
- *
- * Support for_lint flag.
- */
diff --git a/gcc/cpplib.h b/gcc/cpplib.h
deleted file mode 100755
index b4cfd72..0000000
--- a/gcc/cpplib.h
+++ /dev/null
@@ -1,737 +0,0 @@
-/* Definitions for CPP library.
- Copyright (C) 1995, 96-98, 1999 Free Software Foundation, Inc.
- Written by Per Bothner, 1994-95.
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding! */
-#ifndef __GCC_CPPLIB__
-#define __GCC_CPPLIB__
-
-#include <sys/types.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef unsigned char U_CHAR;
-
-typedef struct cpp_reader cpp_reader;
-typedef struct cpp_buffer cpp_buffer;
-typedef struct cpp_options cpp_options;
-typedef struct hashnode cpp_hashnode;
-
-enum cpp_token {
- CPP_EOF = -1,
- CPP_OTHER = 0,
- CPP_COMMENT = 1,
- CPP_HSPACE,
- CPP_VSPACE, /* newlines and #line directives */
- CPP_NAME,
- CPP_NUMBER,
- CPP_CHAR,
- CPP_STRING,
- CPP_DIRECTIVE,
- CPP_LPAREN, /* "(" */
- CPP_RPAREN, /* ")" */
- CPP_LBRACE, /* "{" */
- CPP_RBRACE, /* "}" */
- CPP_COMMA, /* "," */
- CPP_SEMICOLON,/* ";" */
- CPP_3DOTS, /* "..." */
-#if 0
- CPP_ANDAND, /* "&&" */
- CPP_OROR, /* "||" */
- CPP_LSH, /* "<<" */
- CPP_RSH, /* ">>" */
- CPP_EQL, /* "==" */
- CPP_NEQ, /* "!=" */
- CPP_LEQ, /* "<=" */
- CPP_GEQ, /* ">=" */
- CPP_PLPL, /* "++" */
- CPP_MINMIN, /* "--" */
-#endif
- /* POP_TOKEN is returned when we've popped a cpp_buffer. */
- CPP_POP
-};
-
-typedef enum cpp_token (*parse_underflow_t) (cpp_reader *);
-typedef int (*parse_cleanup_t) (cpp_buffer *, cpp_reader *);
-
-/* A parse_marker indicates a previous position,
- which we can backtrack to. */
-
-struct parse_marker {
- cpp_buffer *buf;
- struct parse_marker *next;
- int position;
-};
-
-extern void parse_set_mark (struct parse_marker *, cpp_reader *);
-extern void parse_clear_mark (struct parse_marker *);
-extern void parse_goto_mark (struct parse_marker *, cpp_reader *);
-extern void parse_move_mark (struct parse_marker *, cpp_reader *);
-
-extern int cpp_handle_option (cpp_reader *, int, char **);
-extern int cpp_handle_options (cpp_reader *, int, char **);
-extern enum cpp_token cpp_get_token (cpp_reader *);
-extern void cpp_skip_hspace (cpp_reader *);
-extern enum cpp_token cpp_get_non_space_token (cpp_reader *);
-
-/* This frees resources used by PFILE. */
-extern void cpp_cleanup (cpp_reader *PFILE);
-
-/* If we have a huge buffer, may need to cache more recent counts */
-#define CPP_LINE_BASE(BUF) ((BUF)->buf + (BUF)->line_base)
-
-struct cpp_buffer {
- unsigned char *buf;
- unsigned char *cur;
- unsigned char *rlimit; /* end of valid data */
- unsigned char *alimit; /* end of allocated buffer */
- unsigned char *prev; /* start of current token */
-
- char *fname;
- /* Filename specified with #line command. */
- char *nominal_fname;
- /* Actual directory of this file, used only for "" includes */
- struct file_name_list *actual_dir;
-
- /* Pointer into the include hash table. Used for include_next and
- to record control macros.
- ->fname is an alias to ->ihash->fname. */
- struct include_hash *ihash;
-
- long line_base;
- long lineno; /* Line number at CPP_LINE_BASE. */
- long colno; /* Column number at CPP_LINE_BASE. */
- parse_underflow_t underflow;
- parse_cleanup_t cleanup;
- void *data;
- struct parse_marker *marks;
- /* Value of if_stack at start of this file.
- Used to prohibit unmatched #endif (etc) in an include file. */
- struct if_stack *if_stack;
-
-
- /* True if this is a header file included using <FILENAME>. */
- char system_header_p;
- char seen_eof;
-
- /* True if buffer contains escape sequences.
- Currently there are three kinds:
- "@-" means following identifier should not be macro-expanded.
- "@ " means a token-separator. This turns into " " in final output
- if not stringizing and needed to separate tokens; otherwise nothing.
- "@@" means a normal '@'.
- (An '@' inside a string stands for itself and is never an escape.) */
- char has_escapes;
-};
-
-struct cpp_pending; /* Forward declaration - for C++. */
-struct file_name_map_list;
-
-/* Maximum nesting of cpp_buffers. We use a static limit, partly for
- efficiency, and partly to limit runaway recursion. */
-#define CPP_STACK_MAX 200
-
-/* A cpp_reader encapsulates the "state" of a pre-processor run.
- Applying cpp_get_token repeatedly yields a stream of pre-processor
- tokens. Usually, there is only one cpp_reader object active. */
-
-struct cpp_reader
-{
- parse_underflow_t get_token;
- cpp_buffer *buffer;
- cpp_options *opts;
-
- /* A buffer used for both for cpp_get_token's output, and also internally. */
- unsigned char *token_buffer;
- /* Allocated size of token_buffer. CPP_RESERVE allocates space. */
- unsigned int token_buffer_size;
- /* End of the written part of token_buffer. */
- unsigned char *limit;
-
- /* Error counter for exit code */
- int errors;
-
- /* Line where a newline was first seen in a string constant. */
- int multiline_string_line;
-
- /* Current depth in #include directives that use <...>. */
- int system_include_depth;
-
- /* Hash table of other included files. See cppfiles.c */
-#define ALL_INCLUDE_HASHSIZE 71
- struct include_hash *all_include_files[ALL_INCLUDE_HASHSIZE];
-
- /* Chain of `actual directory' file_name_list entries,
- for "" inclusion. */
- struct file_name_list *actual_dirs;
-
- /* Current maximum length of directory names in the search path
- for include files. (Altered as we get more of them.) */
- unsigned int max_include_len;
-
- struct if_stack *if_stack;
-
- /* Nonzero means we are inside an IF during a -pcp run. In this mode
- macro expansion is done, and preconditions are output for all macro
- uses requiring them. */
- char pcp_inside_if;
-
- /* Nonzero means we have printed (while error reporting) a list of
- containing files that matches the current status. */
- char input_stack_listing_current;
-
- /* If non-zero, macros are not expanded. */
- char no_macro_expand;
-
- /* Print column number in error messages. */
- char show_column;
-
- /* We're printed a warning recommending against using #import. */
- char import_warning;
-
- /* If true, character between '<' and '>' are a single (string) token. */
- char parsing_include_directive;
-
- /* True if escape sequences (as described for has_escapes in
- parse_buffer) should be emitted. */
- char output_escapes;
-
- /* 0: Have seen non-white-space on this line.
- 1: Only seen white space so far on this line.
- 2: Only seen white space so far in this file. */
- char only_seen_white;
-
- /* Nonzero means this file was included with a -imacros or -include
- command line and should not be recorded as an include file. */
-
- int no_record_file;
-
- long lineno;
-
- struct tm *timebuf;
-
- /* Buffer of -M output. */
- char *deps_buffer;
-
- /* Number of bytes allocated in above. */
- int deps_allocated_size;
-
- /* Number of bytes used. */
- int deps_size;
-
- /* Number of bytes since the last newline. */
- int deps_column;
-
-#ifdef __cplusplus
- ~cpp_reader () { cpp_cleanup (this); }
-#endif
-
- cpp_buffer buffer_stack[CPP_STACK_MAX];
-};
-
-#define CPP_FATAL_LIMIT 1000
-/* True if we have seen a "fatal" error. */
-#define CPP_FATAL_ERRORS(READER) ((READER)->errors >= CPP_FATAL_LIMIT)
-
-#define CPP_BUF_PEEK(BUFFER) \
- ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur : EOF)
-#define CPP_BUF_GET(BUFFER) \
- ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur++ : EOF)
-#define CPP_FORWARD(BUFFER, N) ((BUFFER)->cur += (N))
-
-/* Macros for manipulating the token_buffer. */
-
-#define CPP_OUT_BUFFER(PFILE) ((PFILE)->token_buffer)
-
-/* Number of characters currently in PFILE's output buffer. */
-#define CPP_WRITTEN(PFILE) ((size_t)((PFILE)->limit - (PFILE)->token_buffer))
-#define CPP_PWRITTEN(PFILE) ((PFILE)->limit)
-
-/* Make sure PFILE->token_buffer has space for at least N more characters. */
-#define CPP_RESERVE(PFILE, N) \
- (CPP_WRITTEN (PFILE) + (size_t)(N) > (PFILE)->token_buffer_size \
- && (cpp_grow_buffer (PFILE, N), 0))
-
-/* Append string STR (of length N) to PFILE's output buffer.
- Assume there is enough space. */
-#define CPP_PUTS_Q(PFILE, STR, N) \
- (bcopy (STR, (PFILE)->limit, (N)), (PFILE)->limit += (N))
-/* Append string STR (of length N) to PFILE's output buffer. Make space. */
-#define CPP_PUTS(PFILE, STR, N) CPP_RESERVE(PFILE, N), CPP_PUTS_Q(PFILE, STR,N)
-/* Append character CH to PFILE's output buffer. Assume sufficient space. */
-#define CPP_PUTC_Q(PFILE, CH) (*(PFILE)->limit++ = (CH))
-/* Append character CH to PFILE's output buffer. Make space if need be. */
-#define CPP_PUTC(PFILE, CH) (CPP_RESERVE (PFILE, 1), CPP_PUTC_Q (PFILE, CH))
-/* Make sure PFILE->limit is followed by '\0'. */
-#define CPP_NUL_TERMINATE_Q(PFILE) (*(PFILE)->limit = 0)
-#define CPP_NUL_TERMINATE(PFILE) (CPP_RESERVE(PFILE, 1), *(PFILE)->limit = 0)
-#define CPP_ADJUST_WRITTEN(PFILE,DELTA) ((PFILE)->limit += (DELTA))
-#define CPP_SET_WRITTEN(PFILE,N) ((PFILE)->limit = (PFILE)->token_buffer + (N))
-
-#define CPP_OPTIONS(PFILE) ((PFILE)->opts)
-
-#define CPP_BUFFER(PFILE) ((PFILE)->buffer)
-#define CPP_PREV_BUFFER(BUFFER) ((BUFFER)+1)
-/* The bottom of the buffer stack. */
-#define CPP_NULL_BUFFER(PFILE) (&(PFILE)->buffer_stack[CPP_STACK_MAX])
-
-/* Pointed to by cpp_reader.opts. */
-struct cpp_options {
- char *in_fname;
-
- /* Name of output file, for error messages. */
- char *out_fname;
-
- struct file_name_map_list *map_list;
-
- /* Non-0 means -v, so print the full set of include dirs. */
- char verbose;
-
- /* Nonzero means use extra default include directories for C++. */
-
- char cplusplus;
-
- /* Nonzero means handle cplusplus style comments */
-
- char cplusplus_comments;
-
- /* Nonzero means handle #import, for objective C. */
-
- char objc;
-
- /* Nonzero means this is an assembly file, and allow
- unknown directives, which could be comments. */
-
- int lang_asm;
-
- /* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */
-
- char for_lint;
-
- /* Nonzero means handle CHILL comment syntax
- and output CHILL string delimiter for __DATE___ etc. */
-
- char chill;
-
- /* Nonzero means copy comments into the output file. */
-
- char put_out_comments;
-
- /* Nonzero means don't process the ANSI trigraph sequences. */
-
- char no_trigraphs;
-
- /* Nonzero means print the names of included files rather than
- the preprocessed output. 1 means just the #include "...",
- 2 means #include <...> as well. */
-
- char print_deps;
-
- /* Nonzero if missing .h files in -M output are assumed to be generated
- files and not errors. */
-
- char print_deps_missing_files;
-
- /* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
- char print_deps_append;
-
- /* Nonzero means print names of header files (-H). */
-
- char print_include_names;
-
- /* Nonzero means try to make failure to fit ANSI C an error. */
-
- char pedantic_errors;
-
- /* Nonzero means don't print warning messages. -w. */
-
- char inhibit_warnings;
-
- /* Nonzero means warn if slash-star appears in a comment. */
-
- char warn_comments;
-
- /* Nonzero means warn if there are any trigraphs. */
-
- char warn_trigraphs;
-
- /* Nonzero means warn if #import is used. */
-
- char warn_import;
-
- /* Nonzero means warn if a macro argument is (or would be)
- stringified with -traditional. */
-
- char warn_stringify;
-
- /* Nonzero means turn warnings into errors. */
-
- char warnings_are_errors;
-
- /* Nonzero causes output not to be done,
- but directives such as #define that have side effects
- are still obeyed. */
-
- char no_output;
-
- /* Nonzero means we should look for header.gcc files that remap file
- names. */
- char remap;
-
- /* Nonzero means don't output line number information. */
-
- char no_line_commands;
-
-/* Nonzero means output the text in failing conditionals,
- inside #failed ... #endfailed. */
-
- char output_conditionals;
-
- /* Nonzero means -I- has been seen,
- so don't look for #include "foo" the source-file directory. */
- char ignore_srcdir;
-
- /* Zero means dollar signs are punctuation.
- This used to be needed for conformance to the C Standard,
- before the C Standard was corrected. */
- char dollars_in_ident;
-
- /* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */
- char traditional;
-
- /* Nonzero means warn if undefined identifiers are evaluated in an #if. */
- char warn_undef;
-
- /* Nonzero for the 1989 C Standard, including corrigenda and amendments. */
- char c89;
-
- /* Nonzero means give all the error messages the ANSI standard requires. */
- char pedantic;
-
- char done_initializing;
-
- /* Search paths for include files. system_include, after_include are
- only used during option parsing. */
- struct file_name_list *quote_include; /* First dir to search for "file" */
- struct file_name_list *bracket_include;/* First dir to search for <file> */
- struct file_name_list *system_include; /* First dir with system headers */
- struct file_name_list *after_include; /* Headers to search after system */
-
- /* Directory prefix that should replace `/usr' in the standard
- include file directories. */
- char *include_prefix;
-
- char inhibit_predefs;
- char no_standard_includes;
- char no_standard_cplusplus_includes;
-
-/* dump_only means inhibit output of the preprocessed text
- and instead output the definitions of all user-defined
- macros in a form suitable for use as input to cccp.
- dump_names means pass #define and the macro name through to output.
- dump_definitions means pass the whole definition (plus #define) through
-*/
-
- enum {dump_none = 0, dump_only, dump_names, dump_definitions}
- dump_macros;
-
-/* Nonzero means pass all #define and #undef directives which we actually
- process through to the output stream. This feature is used primarily
- to allow cc1 to record the #defines and #undefs for the sake of
- debuggers which understand about preprocessor macros, but it may
- also be useful with -E to figure out how symbols are defined, and
- where they are defined. */
- int debug_output;
-
- /* Nonzero means pass #include lines through to the output,
- even if they are ifdefed out. */
- int dump_includes;
-
- /* Pending -D, -U and -A options, in reverse order. */
- struct cpp_pending *pending;
-
- /* File name which deps are being written to.
- This is 0 if deps are being written to stdout. */
- char *deps_file;
-
- /* Target-name to write with the dependency information. */
- char *deps_target;
-};
-
-#define CPP_TRADITIONAL(PFILE) (CPP_OPTIONS(PFILE)-> traditional)
-#define CPP_WARN_UNDEF(PFILE) (CPP_OPTIONS(PFILE)->warn_undef)
-#define CPP_C89(PFILE) (CPP_OPTIONS(PFILE)->c89)
-#define CPP_PEDANTIC(PFILE) (CPP_OPTIONS (PFILE)->pedantic)
-#define CPP_PRINT_DEPS(PFILE) (CPP_OPTIONS (PFILE)->print_deps)
-
-/* List of directories to look for include files in. */
-struct file_name_list
-{
- struct file_name_list *next;
- struct file_name_list *alloc; /* for the cache of
- current directory entries */
- char *name;
- unsigned int nlen;
- /* We use these to tell if the directory mentioned here is a duplicate
- of an earlier directory on the search path. */
- ino_t ino;
- dev_t dev;
- /* If the following is nonzero, it is a C-language system include
- directory. */
- int sysp;
- /* Mapping of file names for this directory.
- Only used on MS-DOS and related platforms. */
- struct file_name_map *name_map;
-};
-#define ABSOLUTE_PATH ((struct file_name_list *)-1)
-
-/* This structure is used for the table of all includes. It is
- indexed by the `short name' (the name as it appeared in the
- #include statement) which is stored in *nshort. */
-struct include_hash
-{
- struct include_hash *next;
- /* Next file with the same short name but a
- different (partial) pathname). */
- struct include_hash *next_this_file;
-
- /* Location of the file in the include search path.
- Used for include_next */
- struct file_name_list *foundhere;
- char *name; /* (partial) pathname of file */
- char *nshort; /* name of file as referenced in #include */
- char *control_macro; /* macro, if any, preventing reinclusion - see
- redundant_include_p */
- char *buf, *limit; /* for file content cache, not yet implemented */
-};
-
-/* If a buffer's dir field is SELF_DIR_DUMMY, it means the file was found
- via the same directory as the file that #included it. */
-#define SELF_DIR_DUMMY ((struct file_name_list *) (~0))
-
-
-/* Name under which this program was invoked. */
-
-extern char *progname;
-
-/* The structure of a node in the hash table. The hash table
- has entries for all tokens defined by #define commands (type T_MACRO),
- plus some special tokens like __LINE__ (these each have their own
- type, and the appropriate code is run when that type of node is seen.
- It does not contain control words like "#define", which are recognized
- by a separate piece of code. */
-
-/* different flavors of hash nodes --- also used in keyword table */
-enum node_type {
- T_DEFINE = 1, /* the `#define' keyword */
- T_INCLUDE, /* the `#include' keyword */
- T_INCLUDE_NEXT, /* the `#include_next' keyword */
- T_IMPORT, /* the `#import' keyword */
- T_IFDEF, /* the `#ifdef' keyword */
- T_IFNDEF, /* the `#ifndef' keyword */
- T_IF, /* the `#if' keyword */
- T_ELSE, /* `#else' */
- T_PRAGMA, /* `#pragma' */
- T_ELIF, /* `#elif' */
- T_UNDEF, /* `#undef' */
- T_LINE, /* `#line' */
- T_ERROR, /* `#error' */
- T_WARNING, /* `#warning' */
- T_ENDIF, /* `#endif' */
- T_SCCS, /* `#sccs', used on system V. */
- T_IDENT, /* `#ident', used on system V. */
- T_ASSERT, /* `#assert', taken from system V. */
- T_UNASSERT, /* `#unassert', taken from system V. */
- T_SPECLINE, /* special symbol `__LINE__' */
- T_DATE, /* `__DATE__' */
- T_FILE, /* `__FILE__' */
- T_BASE_FILE, /* `__BASE_FILE__' */
- T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
- T_VERSION, /* `__VERSION__' */
- T_SIZE_TYPE, /* `__SIZE_TYPE__' */
- T_PTRDIFF_TYPE, /* `__PTRDIFF_TYPE__' */
- T_WCHAR_TYPE, /* `__WCHAR_TYPE__' */
- T_REGISTER_PREFIX_TYPE, /* `__REGISTER_PREFIX__' */
- T_TIME, /* `__TIME__' */
- T_CONST, /* Constant value, used by `__STDC__' */
- T_MACRO, /* macro defined by `#define' */
- T_DISABLED, /* macro temporarily turned off for rescan */
- T_SPEC_DEFINED, /* special `defined' macro for use in #if statements */
- T_PCSTRING, /* precompiled string (hashval is KEYDEF *) */
- T_UNUSED /* Used for something not defined. */
- };
-
-/* Structure returned by create_definition */
-typedef struct macrodef MACRODEF;
-struct macrodef
-{
- struct definition *defn;
- unsigned char *symnam;
- int symlen;
-};
-
-/* Structure allocated for every #define. For a simple replacement
- such as
- #define foo bar ,
- nargs = -1, the `pattern' list is null, and the expansion is just
- the replacement text. Nargs = 0 means a functionlike macro with no args,
- e.g.,
- #define getchar() getc (stdin) .
- When there are args, the expansion is the replacement text with the
- args squashed out, and the reflist is a list describing how to
- build the output from the input: e.g., "3 chars, then the 1st arg,
- then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg".
- The chars here come from the expansion. Whatever is left of the
- expansion after the last arg-occurrence is copied after that arg.
- Note that the reflist can be arbitrarily long---
- its length depends on the number of times the arguments appear in
- the replacement text, not how many args there are. Example:
- #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and
- pattern list
- { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
- where (x, y) means (nchars, argno). */
-
-typedef struct definition DEFINITION;
-struct definition {
- int nargs;
- int length; /* length of expansion string */
- int predefined; /* True if the macro was builtin or */
- /* came from the command line */
- unsigned char *expansion;
- int line; /* Line number of definition */
- char *file; /* File of definition */
- char rest_args; /* Nonzero if last arg. absorbs the rest */
- struct reflist {
- struct reflist *next;
- char stringify; /* nonzero if this arg was preceded by a
- # operator. */
- char raw_before; /* Nonzero if a ## operator before arg. */
- char raw_after; /* Nonzero if a ## operator after arg. */
- char rest_args; /* Nonzero if this arg. absorbs the rest */
- int nchars; /* Number of literal chars to copy before
- this arg occurrence. */
- int argno; /* Number of arg to substitute (origin-0) */
- } *pattern;
- union {
- /* Names of macro args, concatenated in reverse order
- with comma-space between them.
- The only use of this is that we warn on redefinition
- if this differs between the old and new definitions. */
- unsigned char *argnames;
- } args;
-};
-
-extern unsigned char is_idchar[256];
-extern unsigned char is_hor_space[256];
-extern unsigned char is_space[256];
-
-/* Stack of conditionals currently in progress
- (including both successful and failing conditionals). */
-
-struct if_stack {
- struct if_stack *next; /* for chaining to the next stack frame */
- char *fname; /* copied from input when frame is made */
- int lineno; /* similarly */
- int if_succeeded; /* true if a leg of this if-group
- has been passed through rescan */
- unsigned char *control_macro; /* For #ifndef at start of file,
- this is the macro name tested. */
- enum node_type type; /* type of last directive seen in this group */
-};
-typedef struct if_stack IF_STACK_FRAME;
-
-/* Find the largest host integer type and set its size and type.
- Watch out: on some crazy hosts `long' is shorter than `int'. */
-
-#ifndef HOST_WIDE_INT
-#include "machmode.h"
-#endif
-
-extern void cpp_buf_line_and_col (cpp_buffer *, long *, long *);
-extern cpp_buffer* cpp_file_buffer (cpp_reader *);
-extern void cpp_define (cpp_reader*, unsigned char *);
-
-extern void cpp_error (cpp_reader *, const char *, ...)
- ATTRIBUTE_PRINTF_2;
-extern void cpp_warning (cpp_reader *, const char *, ...)
- ATTRIBUTE_PRINTF_2;
-extern void cpp_pedwarn (cpp_reader *, const char *, ...)
- ATTRIBUTE_PRINTF_2;
-extern void cpp_error_with_line (cpp_reader *, int, int, const char *, ...)
- ATTRIBUTE_PRINTF_4;
-extern void cpp_pedwarn_with_line (cpp_reader *, int, int, const char *, ...)
- ATTRIBUTE_PRINTF_4;
-extern void cpp_pedwarn_with_file_and_line (cpp_reader *, char *, int, const char *, ...)
- ATTRIBUTE_PRINTF_4;
-extern void cpp_message_from_errno (cpp_reader *, int, const char *);
-extern void cpp_error_from_errno (cpp_reader *, const char *);
-extern void cpp_perror_with_name (cpp_reader *, const char *);
-extern void v_cpp_message (cpp_reader *, int, const char *, va_list);
-
-extern void cpp_grow_buffer (cpp_reader *, long);
-extern HOST_WIDE_INT cpp_parse_escape (cpp_reader *, char **, HOST_WIDE_INT);
-extern cpp_buffer *cpp_push_buffer (cpp_reader *,
- unsigned char *, long);
-extern cpp_buffer *cpp_pop_buffer (cpp_reader *);
-
-extern cpp_hashnode *cpp_lookup (cpp_reader *, const unsigned char *,
- int, int);
-extern void cpp_reader_init (cpp_reader *);
-extern void cpp_options_init (cpp_options *);
-extern int cpp_start_read (cpp_reader *, char *);
-extern int cpp_read_check_assertion (cpp_reader *);
-extern int scan_decls (cpp_reader *, int, char **);
-extern void skip_rest_of_line (cpp_reader *);
-extern void cpp_finish (cpp_reader *);
-
-/* From cpperror.c */
-extern void cpp_fatal (cpp_reader *, const char *, ...)
- ATTRIBUTE_PRINTF_2;
-extern void cpp_message (cpp_reader *, int, const char *, ...)
- ATTRIBUTE_PRINTF_3;
-extern void cpp_pfatal_with_name (cpp_reader *, const char *);
-extern void cpp_file_line_for_message (cpp_reader *, char *, int, int);
-extern void cpp_print_containing_files (cpp_reader *);
-
-/* In cppfiles.c */
-extern void append_include_chain (cpp_reader *,
- struct file_name_list **,
- const char *, int);
-extern void merge_include_chains (struct cpp_options *);
-extern int find_include_file (cpp_reader *, char *,
- struct file_name_list *,
- struct include_hash **,
- int *);
-extern int finclude (cpp_reader *, int,
- struct include_hash *);
-extern void deps_output (cpp_reader *, char *, int);
-extern struct include_hash *include_hash (cpp_reader *, char *, int);
-
-#ifndef INCLUDE_LEN_FUDGE
-#define INCLUDE_LEN_FUDGE 0
-#endif
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* __GCC_CPPLIB__ */
-
diff --git a/gcc/cppmain.c b/gcc/cppmain.c
deleted file mode 100755
index 8323915..0000000
--- a/gcc/cppmain.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/* CPP main program, using CPP Library.
- Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
- Written by Per Bothner, 1994-95.
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding! */
-
-#ifndef EMACS
-#include "config.h"
-#include "system.h"
-#else
-#include <stdio.h>
-
-extern char *getenv ();
-#endif /* not EMACS */
-
-#include "cpplib.h"
-
-char *progname;
-
-cpp_reader parse_in;
-cpp_options options;
-
-#ifdef abort
-/* More 'friendly' abort that prints the line and file.
- config.h can #define abort fancy_abort if you like that sort of thing. */
-void
-fatal (s)
- char *s;
-{
- fputs (s, stderr);
- exit (EXIT_FAILURE);
-}
-
-void
-fancy_abort ()
-{
- fatal ("Internal gcc abort.");
-}
-#endif
-
-
-int
-main (argc, argv)
- int argc;
- char **argv;
-{
- char *p;
- int argi = 1; /* Next argument to handle. */
- struct cpp_options *opts = &options;
-
- p = argv[0] + strlen (argv[0]);
- while (p != argv[0] && p[-1] != '/') --p;
- progname = p;
-
- cpp_reader_init (&parse_in);
- parse_in.opts = opts;
-
- cpp_options_init (opts);
-
- argi += cpp_handle_options (&parse_in, argc - argi , argv + argi);
- if (argi < argc && ! CPP_FATAL_ERRORS (&parse_in))
- cpp_fatal (&parse_in, "Invalid option `%s'", argv[argi]);
- if (CPP_FATAL_ERRORS (&parse_in))
- exit (EXIT_FAILURE);
-
- parse_in.show_column = 1;
-
- if (! cpp_start_read (&parse_in, opts->in_fname))
- exit (EXIT_FAILURE);
-
- /* Now that we know the input file is valid, open the output. */
-
- if (!opts->out_fname || !strcmp (opts->out_fname, ""))
- opts->out_fname = "stdout";
- else if (! freopen (opts->out_fname, "w", stdout))
- cpp_pfatal_with_name (&parse_in, opts->out_fname);
-
- for (;;)
- {
- enum cpp_token kind;
- if (! opts->no_output)
- {
- fwrite (parse_in.token_buffer, 1, CPP_WRITTEN (&parse_in), stdout);
- }
- CPP_SET_WRITTEN (&parse_in, 0);
- kind = cpp_get_token (&parse_in);
- if (kind == CPP_EOF)
- break;
- }
-
- cpp_finish (&parse_in);
-
- if (parse_in.errors)
- exit (EXIT_FAILURE);
- exit (EXIT_SUCCESS);
-}
diff --git a/gcc/cross-make b/gcc/cross-make
deleted file mode 100755
index 84be67f..0000000
--- a/gcc/cross-make
+++ /dev/null
@@ -1,14 +0,0 @@
-# Build libgcc1.a for a cross-compiler.
-# By default this expects the user to provide libgcc1.a,
-# and gives up immediately if the user has not done so.
-LIBGCC1 = $(CROSS_LIBGCC1)
-
-# Dir to search for system headers. Normally /usr/include.
-# Use CROSS_INCLUDE_DIR not TOOL_INCLUDE_DIR for other vendor's headers.
-SYSTEM_HEADER_DIR = $(tooldir)/sys-include
-
-# Don't try to compile the things we can't compile.
-ALL = all.cross
-
-# Don't install assert.h in /usr/local/include.
-assertdir = $(tooldir)/include
diff --git a/gcc/cstamp-h.in b/gcc/cstamp-h.in
deleted file mode 100755
index 9788f70..0000000
--- a/gcc/cstamp-h.in
+++ /dev/null
@@ -1 +0,0 @@
-timestamp
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 21042b0..8298494 100755
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -8666,17 +8666,6 @@ gen_compile_unit_die (main_input_filename)
sprintf (producer, "%s %s", language_string, version_string);
-#ifdef MIPS_DEBUGGING_INFO
- /* The MIPS/SGI compilers place the 'cc' command line options in the producer
- string. The SGI debugger looks for -g, -g1, -g2, or -g3; if they do
- not appear in the producer string, the debugger reaches the conclusion
- that the object file is stripped and has no debugging information.
- To get the MIPS/SGI debugger to believe that there is debugging
- information in the object file, we add a -g to the producer string. */
- if (debug_info_level > DINFO_LEVEL_TERSE)
- strcat (producer, " -g");
-#endif
-
add_AT_string (comp_unit_die, DW_AT_producer, producer);
if (strcmp (language_string, "GNU C++") == 0)
diff --git a/gcc/extend.texi b/gcc/extend.texi
deleted file mode 100755
index 31b74e0..0000000
--- a/gcc/extend.texi
+++ /dev/null
@@ -1,3747 +0,0 @@
-@c Copyright (C) 1988,89,92,93,94,96,99 Free Software Foundation, Inc.
-@c This is part of the GCC manual.
-@c For copying conditions, see the file gcc.texi.
-
-@node C Extensions
-@chapter Extensions to the C Language Family
-@cindex extensions, C language
-@cindex C language extensions
-
-GNU C provides several language features not found in ANSI standard C.
-(The @samp{-pedantic} option directs GNU CC to print a warning message if
-any of these features is used.) To test for the availability of these
-features in conditional compilation, check for a predefined macro
-@code{__GNUC__}, which is always defined under GNU CC.
-
-These extensions are available in C and Objective C. Most of them are
-also available in C++. @xref{C++ Extensions,,Extensions to the
-C++ Language}, for extensions that apply @emph{only} to C++.
-
-@c CYGNUS LOCAL Interrupt Functions
-@c The entry "Interrupt Functions" in the following menu are needed for
-@c Cygnus-only sections of the doc. Unfortunately makeinfo gets confused if
-@c comments to this effect are inside the menu.
-
-@c The only difference between the two versions of this menu is that the
-@c version for clear INTERNALS has an extra node, "Constraints" (which
-@c appears in a separate chapter in the other version of the manual).
-@ifset INTERNALS
-@menu
-* Statement Exprs:: Putting statements and declarations inside expressions.
-* Local Labels:: Labels local to a statement-expression.
-* Labels as Values:: Getting pointers to labels, and computed gotos.
-* Nested Functions:: As in Algol and Pascal, lexical scoping of functions.
-* Constructing Calls:: Dispatching a call to another function.
-* Naming Types:: Giving a name to the type of some expression.
-* Typeof:: @code{typeof}: referring to the type of an expression.
-* Lvalues:: Using @samp{?:}, @samp{,} and casts in lvalues.
-* Conditionals:: Omitting the middle operand of a @samp{?:} expression.
-* Long Long:: Double-word integers---@code{long long int}.
-* Complex:: Data types for complex numbers.
-* Hex Floats:: Hexadecimal floating-point constants.
-* Zero Length:: Zero-length arrays.
-* Variable Length:: Arrays whose length is computed at run time.
-* Macro Varargs:: Macros with variable number of arguments.
-* Subscripting:: Any array can be subscripted, even if not an lvalue.
-* Pointer Arith:: Arithmetic on @code{void}-pointers and function pointers.
-* Initializers:: Non-constant initializers.
-* Constructors:: Constructor expressions give structures, unions
- or arrays as values.
-* Labeled Elements:: Labeling elements of initializers.
-* Cast to Union:: Casting to union type from any member of the union.
-* Case Ranges:: `case 1 ... 9' and such.
-* Function Attributes:: Declaring that functions have no side effects,
- or that they can never return.
-* Function Prototypes:: Prototype declarations and old-style definitions.
-* Interrupt Functions:: Compiling functions for interrupt calls
-* C++ Comments:: C++ comments are recognized.
-* Dollar Signs:: Dollar sign is allowed in identifiers.
-* Character Escapes:: @samp{\e} stands for the character @key{ESC}.
-* Variable Attributes:: Specifying attributes of variables.
-* Type Attributes:: Specifying attributes of types.
-* Alignment:: Inquiring about the alignment of a type or variable.
-* Inline:: Defining inline functions (as fast as macros).
-* Extended Asm:: Assembler instructions with C expressions as operands.
- (With them you can define ``built-in'' functions.)
-* Asm Labels:: Specifying the assembler name to use for a C symbol.
-* Explicit Reg Vars:: Defining variables residing in specified registers.
-* Alternate Keywords:: @code{__const__}, @code{__asm__}, etc., for header files.
-* Incomplete Enums:: @code{enum foo;}, with details to follow.
-* Function Names:: Printable strings which are the name of the current
- function.
-* Return Address:: Getting the return or frame address of a function.
-* Other Builtins:: Other built-in functions.
-@end menu
-@end ifset
-@ifclear INTERNALS
-@menu
-* Statement Exprs:: Putting statements and declarations inside expressions.
-* Local Labels:: Labels local to a statement-expression.
-* Labels as Values:: Getting pointers to labels, and computed gotos.
-* Nested Functions:: As in Algol and Pascal, lexical scoping of functions.
-* Constructing Calls:: Dispatching a call to another function.
-* Naming Types:: Giving a name to the type of some expression.
-* Typeof:: @code{typeof}: referring to the type of an expression.
-* Lvalues:: Using @samp{?:}, @samp{,} and casts in lvalues.
-* Conditionals:: Omitting the middle operand of a @samp{?:} expression.
-* Long Long:: Double-word integers---@code{long long int}.
-* Complex:: Data types for complex numbers.
-* Hex Floats:: Hexadecimal floating-point constants.
-* Zero Length:: Zero-length arrays.
-* Variable Length:: Arrays whose length is computed at run time.
-* Macro Varargs:: Macros with variable number of arguments.
-* Subscripting:: Any array can be subscripted, even if not an lvalue.
-* Pointer Arith:: Arithmetic on @code{void}-pointers and function pointers.
-* Initializers:: Non-constant initializers.
-* Constructors:: Constructor expressions give structures, unions
- or arrays as values.
-* Labeled Elements:: Labeling elements of initializers.
-* Cast to Union:: Casting to union type from any member of the union.
-* Case Ranges:: `case 1 ... 9' and such.
-* Function Attributes:: Declaring that functions have no side effects,
- or that they can never return.
-* Function Prototypes:: Prototype declarations and old-style definitions.
-* Interrupt Functions:: Compiling functions for interrupt calls
-* C++ Comments:: C++ comments are recognized.
-* Dollar Signs:: Dollar sign is allowed in identifiers.
-* Character Escapes:: @samp{\e} stands for the character @key{ESC}.
-* Variable Attributes:: Specifying attributes of variables.
-* Type Attributes:: Specifying attributes of types.
-* Alignment:: Inquiring about the alignment of a type or variable.
-* Inline:: Defining inline functions (as fast as macros).
-* Extended Asm:: Assembler instructions with C expressions as operands.
- (With them you can define ``built-in'' functions.)
-* Constraints:: Constraints for asm operands
-* Asm Labels:: Specifying the assembler name to use for a C symbol.
-* Explicit Reg Vars:: Defining variables residing in specified registers.
-* Alternate Keywords:: @code{__const__}, @code{__asm__}, etc., for header files.
-* Incomplete Enums:: @code{enum foo;}, with details to follow.
-* Function Names:: Printable strings which are the name of the current
- function.
-* Return Address:: Getting the return or frame address of a function.
-@end menu
-@end ifclear
-
-@node Statement Exprs
-@section Statements and Declarations in Expressions
-@cindex statements inside expressions
-@cindex declarations inside expressions
-@cindex expressions containing statements
-@cindex macros, statements in expressions
-
-@c the above section title wrapped and causes an underfull hbox.. i
-@c changed it from "within" to "in". --mew 4feb93
-
-A compound statement enclosed in parentheses may appear as an expression
-in GNU C. This allows you to use loops, switches, and local variables
-within an expression.
-
-Recall that a compound statement is a sequence of statements surrounded
-by braces; in this construct, parentheses go around the braces. For
-example:
-
-@example
-(@{ int y = foo (); int z;
- if (y > 0) z = y;
- else z = - y;
- z; @})
-@end example
-
-@noindent
-is a valid (though slightly more complex than necessary) expression
-for the absolute value of @code{foo ()}.
-
-The last thing in the compound statement should be an expression
-followed by a semicolon; the value of this subexpression serves as the
-value of the entire construct. (If you use some other kind of statement
-last within the braces, the construct has type @code{void}, and thus
-effectively no value.)
-
-This feature is especially useful in making macro definitions ``safe'' (so
-that they evaluate each operand exactly once). For example, the
-``maximum'' function is commonly defined as a macro in standard C as
-follows:
-
-@example
-#define max(a,b) ((a) > (b) ? (a) : (b))
-@end example
-
-@noindent
-@cindex side effects, macro argument
-But this definition computes either @var{a} or @var{b} twice, with bad
-results if the operand has side effects. In GNU C, if you know the
-type of the operands (here let's assume @code{int}), you can define
-the macro safely as follows:
-
-@example
-#define maxint(a,b) \
- (@{int _a = (a), _b = (b); _a > _b ? _a : _b; @})
-@end example
-
-Embedded statements are not allowed in constant expressions, such as
-the value of an enumeration constant, the width of a bit field, or
-the initial value of a static variable.
-
-If you don't know the type of the operand, you can still do this, but you
-must use @code{typeof} (@pxref{Typeof}) or type naming (@pxref{Naming
-Types}).
-
-@node Local Labels
-@section Locally Declared Labels
-@cindex local labels
-@cindex macros, local labels
-
-Each statement expression is a scope in which @dfn{local labels} can be
-declared. A local label is simply an identifier; you can jump to it
-with an ordinary @code{goto} statement, but only from within the
-statement expression it belongs to.
-
-A local label declaration looks like this:
-
-@example
-__label__ @var{label};
-@end example
-
-@noindent
-or
-
-@example
-__label__ @var{label1}, @var{label2}, @dots{};
-@end example
-
-Local label declarations must come at the beginning of the statement
-expression, right after the @samp{(@{}, before any ordinary
-declarations.
-
-The label declaration defines the label @emph{name}, but does not define
-the label itself. You must do this in the usual way, with
-@code{@var{label}:}, within the statements of the statement expression.
-
-The local label feature is useful because statement expressions are
-often used in macros. If the macro contains nested loops, a @code{goto}
-can be useful for breaking out of them. However, an ordinary label
-whose scope is the whole function cannot be used: if the macro can be
-expanded several times in one function, the label will be multiply
-defined in that function. A local label avoids this problem. For
-example:
-
-@example
-#define SEARCH(array, target) \
-(@{ \
- __label__ found; \
- typeof (target) _SEARCH_target = (target); \
- typeof (*(array)) *_SEARCH_array = (array); \
- int i, j; \
- int value; \
- for (i = 0; i < max; i++) \
- for (j = 0; j < max; j++) \
- if (_SEARCH_array[i][j] == _SEARCH_target) \
- @{ value = i; goto found; @} \
- value = -1; \
- found: \
- value; \
-@})
-@end example
-
-@node Labels as Values
-@section Labels as Values
-@cindex labels as values
-@cindex computed gotos
-@cindex goto with computed label
-@cindex address of a label
-
-You can get the address of a label defined in the current function
-(or a containing function) with the unary operator @samp{&&}. The
-value has type @code{void *}. This value is a constant and can be used
-wherever a constant of that type is valid. For example:
-
-@example
-void *ptr;
-@dots{}
-ptr = &&foo;
-@end example
-
-To use these values, you need to be able to jump to one. This is done
-with the computed goto statement@footnote{The analogous feature in
-Fortran is called an assigned goto, but that name seems inappropriate in
-C, where one can do more than simply store label addresses in label
-variables.}, @code{goto *@var{exp};}. For example,
-
-@example
-goto *ptr;
-@end example
-
-@noindent
-Any expression of type @code{void *} is allowed.
-
-One way of using these constants is in initializing a static array that
-will serve as a jump table:
-
-@example
-static void *array[] = @{ &&foo, &&bar, &&hack @};
-@end example
-
-Then you can select a label with indexing, like this:
-
-@example
-goto *array[i];
-@end example
-
-@noindent
-Note that this does not check whether the subscript is in bounds---array
-indexing in C never does that.
-
-Such an array of label values serves a purpose much like that of the
-@code{switch} statement. The @code{switch} statement is cleaner, so
-use that rather than an array unless the problem does not fit a
-@code{switch} statement very well.
-
-Another use of label values is in an interpreter for threaded code.
-The labels within the interpreter function can be stored in the
-threaded code for super-fast dispatching.
-
-You can use this mechanism to jump to code in a different function. If
-you do that, totally unpredictable things will happen. The best way to
-avoid this is to store the label address only in automatic variables and
-never pass it as an argument.
-
-@node Nested Functions
-@section Nested Functions
-@cindex nested functions
-@cindex downward funargs
-@cindex thunks
-
-A @dfn{nested function} is a function defined inside another function.
-(Nested functions are not supported for GNU C++.) The nested function's
-name is local to the block where it is defined. For example, here we
-define a nested function named @code{square}, and call it twice:
-
-@example
-@group
-foo (double a, double b)
-@{
- double square (double z) @{ return z * z; @}
-
- return square (a) + square (b);
-@}
-@end group
-@end example
-
-The nested function can access all the variables of the containing
-function that are visible at the point of its definition. This is
-called @dfn{lexical scoping}. For example, here we show a nested
-function which uses an inherited variable named @code{offset}:
-
-@example
-bar (int *array, int offset, int size)
-@{
- int access (int *array, int index)
- @{ return array[index + offset]; @}
- int i;
- @dots{}
- for (i = 0; i < size; i++)
- @dots{} access (array, i) @dots{}
-@}
-@end example
-
-Nested function definitions are permitted within functions in the places
-where variable definitions are allowed; that is, in any block, before
-the first statement in the block.
-
-It is possible to call the nested function from outside the scope of its
-name by storing its address or passing the address to another function:
-
-@example
-hack (int *array, int size)
-@{
- void store (int index, int value)
- @{ array[index] = value; @}
-
- intermediate (store, size);
-@}
-@end example
-
-Here, the function @code{intermediate} receives the address of
-@code{store} as an argument. If @code{intermediate} calls @code{store},
-the arguments given to @code{store} are used to store into @code{array}.
-But this technique works only so long as the containing function
-(@code{hack}, in this example) does not exit.
-
-If you try to call the nested function through its address after the
-containing function has exited, all hell will break loose. If you try
-to call it after a containing scope level has exited, and if it refers
-to some of the variables that are no longer in scope, you may be lucky,
-but it's not wise to take the risk. If, however, the nested function
-does not refer to anything that has gone out of scope, you should be
-safe.
-
-GNU CC implements taking the address of a nested function using a
-technique called @dfn{trampolines}. A paper describing them is
-available as @samp{http://master.debian.org/~karlheg/Usenix88-lexic.pdf}.
-
-A nested function can jump to a label inherited from a containing
-function, provided the label was explicitly declared in the containing
-function (@pxref{Local Labels}). Such a jump returns instantly to the
-containing function, exiting the nested function which did the
-@code{goto} and any intermediate functions as well. Here is an example:
-
-@example
-@group
-bar (int *array, int offset, int size)
-@{
- __label__ failure;
- int access (int *array, int index)
- @{
- if (index > size)
- goto failure;
- return array[index + offset];
- @}
- int i;
- @dots{}
- for (i = 0; i < size; i++)
- @dots{} access (array, i) @dots{}
- @dots{}
- return 0;
-
- /* @r{Control comes here from @code{access}
- if it detects an error.} */
- failure:
- return -1;
-@}
-@end group
-@end example
-
-A nested function always has internal linkage. Declaring one with
-@code{extern} is erroneous. If you need to declare the nested function
-before its definition, use @code{auto} (which is otherwise meaningless
-for function declarations).
-
-@example
-bar (int *array, int offset, int size)
-@{
- __label__ failure;
- auto int access (int *, int);
- @dots{}
- int access (int *array, int index)
- @{
- if (index > size)
- goto failure;
- return array[index + offset];
- @}
- @dots{}
-@}
-@end example
-
-@node Constructing Calls
-@section Constructing Function Calls
-@cindex constructing calls
-@cindex forwarding calls
-
-Using the built-in functions described below, you can record
-the arguments a function received, and call another function
-with the same arguments, without knowing the number or types
-of the arguments.
-
-You can also record the return value of that function call,
-and later return that value, without knowing what data type
-the function tried to return (as long as your caller expects
-that data type).
-
-@table @code
-@findex __builtin_apply_args
-@item __builtin_apply_args ()
-This built-in function returns a pointer of type @code{void *} to data
-describing how to perform a call with the same arguments as were passed
-to the current function.
-
-The function saves the arg pointer register, structure value address,
-and all registers that might be used to pass arguments to a function
-into a block of memory allocated on the stack. Then it returns the
-address of that block.
-
-@findex __builtin_apply
-@item __builtin_apply (@var{function}, @var{arguments}, @var{size})
-This built-in function invokes @var{function} (type @code{void (*)()})
-with a copy of the parameters described by @var{arguments} (type
-@code{void *}) and @var{size} (type @code{int}).
-
-The value of @var{arguments} should be the value returned by
-@code{__builtin_apply_args}. The argument @var{size} specifies the size
-of the stack argument data, in bytes.
-
-This function returns a pointer of type @code{void *} to data describing
-how to return whatever value was returned by @var{function}. The data
-is saved in a block of memory allocated on the stack.
-
-It is not always simple to compute the proper value for @var{size}. The
-value is used by @code{__builtin_apply} to compute the amount of data
-that should be pushed on the stack and copied from the incoming argument
-area.
-
-@findex __builtin_return
-@item __builtin_return (@var{result})
-This built-in function returns the value described by @var{result} from
-the containing function. You should specify, for @var{result}, a value
-returned by @code{__builtin_apply}.
-@end table
-
-@node Naming Types
-@section Naming an Expression's Type
-@cindex naming types
-
-You can give a name to the type of an expression using a @code{typedef}
-declaration with an initializer. Here is how to define @var{name} as a
-type name for the type of @var{exp}:
-
-@example
-typedef @var{name} = @var{exp};
-@end example
-
-This is useful in conjunction with the statements-within-expressions
-feature. Here is how the two together can be used to define a safe
-``maximum'' macro that operates on any arithmetic type:
-
-@example
-#define max(a,b) \
- (@{typedef _ta = (a), _tb = (b); \
- _ta _a = (a); _tb _b = (b); \
- _a > _b ? _a : _b; @})
-@end example
-
-@cindex underscores in variables in macros
-@cindex @samp{_} in variables in macros
-@cindex local variables in macros
-@cindex variables, local, in macros
-@cindex macros, local variables in
-
-The reason for using names that start with underscores for the local
-variables is to avoid conflicts with variable names that occur within the
-expressions that are substituted for @code{a} and @code{b}. Eventually we
-hope to design a new form of declaration syntax that allows you to declare
-variables whose scopes start only after their initializers; this will be a
-more reliable way to prevent such conflicts.
-
-@node Typeof
-@section Referring to a Type with @code{typeof}
-@findex typeof
-@findex sizeof
-@cindex macros, types of arguments
-
-Another way to refer to the type of an expression is with @code{typeof}.
-The syntax of using of this keyword looks like @code{sizeof}, but the
-construct acts semantically like a type name defined with @code{typedef}.
-
-There are two ways of writing the argument to @code{typeof}: with an
-expression or with a type. Here is an example with an expression:
-
-@example
-typeof (x[0](1))
-@end example
-
-@noindent
-This assumes that @code{x} is an array of functions; the type described
-is that of the values of the functions.
-
-Here is an example with a typename as the argument:
-
-@example
-typeof (int *)
-@end example
-
-@noindent
-Here the type described is that of pointers to @code{int}.
-
-If you are writing a header file that must work when included in ANSI C
-programs, write @code{__typeof__} instead of @code{typeof}.
-@xref{Alternate Keywords}.
-
-A @code{typeof}-construct can be used anywhere a typedef name could be
-used. For example, you can use it in a declaration, in a cast, or inside
-of @code{sizeof} or @code{typeof}.
-
-@itemize @bullet
-@item
-This declares @code{y} with the type of what @code{x} points to.
-
-@example
-typeof (*x) y;
-@end example
-
-@item
-This declares @code{y} as an array of such values.
-
-@example
-typeof (*x) y[4];
-@end example
-
-@item
-This declares @code{y} as an array of pointers to characters:
-
-@example
-typeof (typeof (char *)[4]) y;
-@end example
-
-@noindent
-It is equivalent to the following traditional C declaration:
-
-@example
-char *y[4];
-@end example
-
-To see the meaning of the declaration using @code{typeof}, and why it
-might be a useful way to write, let's rewrite it with these macros:
-
-@example
-#define pointer(T) typeof(T *)
-#define array(T, N) typeof(T [N])
-@end example
-
-@noindent
-Now the declaration can be rewritten this way:
-
-@example
-array (pointer (char), 4) y;
-@end example
-
-@noindent
-Thus, @code{array (pointer (char), 4)} is the type of arrays of 4
-pointers to @code{char}.
-@end itemize
-
-@node Lvalues
-@section Generalized Lvalues
-@cindex compound expressions as lvalues
-@cindex expressions, compound, as lvalues
-@cindex conditional expressions as lvalues
-@cindex expressions, conditional, as lvalues
-@cindex casts as lvalues
-@cindex generalized lvalues
-@cindex lvalues, generalized
-@cindex extensions, @code{?:}
-@cindex @code{?:} extensions
-Compound expressions, conditional expressions and casts are allowed as
-lvalues provided their operands are lvalues. This means that you can take
-their addresses or store values into them.
-
-Standard C++ allows compound expressions and conditional expressions as
-lvalues, and permits casts to reference type, so use of this extension
-is deprecated for C++ code.
-
-For example, a compound expression can be assigned, provided the last
-expression in the sequence is an lvalue. These two expressions are
-equivalent:
-
-@example
-(a, b) += 5
-a, (b += 5)
-@end example
-
-Similarly, the address of the compound expression can be taken. These two
-expressions are equivalent:
-
-@example
-&(a, b)
-a, &b
-@end example
-
-A conditional expression is a valid lvalue if its type is not void and the
-true and false branches are both valid lvalues. For example, these two
-expressions are equivalent:
-
-@example
-(a ? b : c) = 5
-(a ? b = 5 : (c = 5))
-@end example
-
-A cast is a valid lvalue if its operand is an lvalue. A simple
-assignment whose left-hand side is a cast works by converting the
-right-hand side first to the specified type, then to the type of the
-inner left-hand side expression. After this is stored, the value is
-converted back to the specified type to become the value of the
-assignment. Thus, if @code{a} has type @code{char *}, the following two
-expressions are equivalent:
-
-@example
-(int)a = 5
-(int)(a = (char *)(int)5)
-@end example
-
-An assignment-with-arithmetic operation such as @samp{+=} applied to a cast
-performs the arithmetic using the type resulting from the cast, and then
-continues as in the previous case. Therefore, these two expressions are
-equivalent:
-
-@example
-(int)a += 5
-(int)(a = (char *)(int) ((int)a + 5))
-@end example
-
-You cannot take the address of an lvalue cast, because the use of its
-address would not work out coherently. Suppose that @code{&(int)f} were
-permitted, where @code{f} has type @code{float}. Then the following
-statement would try to store an integer bit-pattern where a floating
-point number belongs:
-
-@example
-*&(int)f = 1;
-@end example
-
-This is quite different from what @code{(int)f = 1} would do---that
-would convert 1 to floating point and store it. Rather than cause this
-inconsistency, we think it is better to prohibit use of @samp{&} on a cast.
-
-If you really do want an @code{int *} pointer with the address of
-@code{f}, you can simply write @code{(int *)&f}.
-
-@node Conditionals
-@section Conditionals with Omitted Operands
-@cindex conditional expressions, extensions
-@cindex omitted middle-operands
-@cindex middle-operands, omitted
-@cindex extensions, @code{?:}
-@cindex @code{?:} extensions
-
-The middle operand in a conditional expression may be omitted. Then
-if the first operand is nonzero, its value is the value of the conditional
-expression.
-
-Therefore, the expression
-
-@example
-x ? : y
-@end example
-
-@noindent
-has the value of @code{x} if that is nonzero; otherwise, the value of
-@code{y}.
-
-This example is perfectly equivalent to
-
-@example
-x ? x : y
-@end example
-
-@cindex side effect in ?:
-@cindex ?: side effect
-@noindent
-In this simple case, the ability to omit the middle operand is not
-especially useful. When it becomes useful is when the first operand does,
-or may (if it is a macro argument), contain a side effect. Then repeating
-the operand in the middle would perform the side effect twice. Omitting
-the middle operand uses the value already computed without the undesirable
-effects of recomputing it.
-
-@node Long Long
-@section Double-Word Integers
-@cindex @code{long long} data types
-@cindex double-word arithmetic
-@cindex multiprecision arithmetic
-
-GNU C supports data types for integers that are twice as long as
-@code{int}. Simply write @code{long long int} for a signed integer, or
-@code{unsigned long long int} for an unsigned integer. To make an
-integer constant of type @code{long long int}, add the suffix @code{LL}
-to the integer. To make an integer constant of type @code{unsigned long
-long int}, add the suffix @code{ULL} to the integer.
-
-You can use these types in arithmetic like any other integer types.
-Addition, subtraction, and bitwise boolean operations on these types
-are open-coded on all types of machines. Multiplication is open-coded
-if the machine supports fullword-to-doubleword a widening multiply
-instruction. Division and shifts are open-coded only on machines that
-provide special support. The operations that are not open-coded use
-special library routines that come with GNU CC.
-
-There may be pitfalls when you use @code{long long} types for function
-arguments, unless you declare function prototypes. If a function
-expects type @code{int} for its argument, and you pass a value of type
-@code{long long int}, confusion will result because the caller and the
-subroutine will disagree about the number of bytes for the argument.
-Likewise, if the function expects @code{long long int} and you pass
-@code{int}. The best way to avoid such problems is to use prototypes.
-
-@node Complex
-@section Complex Numbers
-@cindex complex numbers
-
-GNU C supports complex data types. You can declare both complex integer
-types and complex floating types, using the keyword @code{__complex__}.
-
-For example, @samp{__complex__ double x;} declares @code{x} as a
-variable whose real part and imaginary part are both of type
-@code{double}. @samp{__complex__ short int y;} declares @code{y} to
-have real and imaginary parts of type @code{short int}; this is not
-likely to be useful, but it shows that the set of complex types is
-complete.
-
-To write a constant with a complex data type, use the suffix @samp{i} or
-@samp{j} (either one; they are equivalent). For example, @code{2.5fi}
-has type @code{__complex__ float} and @code{3i} has type
-@code{__complex__ int}. Such a constant always has a pure imaginary
-value, but you can form any complex value you like by adding one to a
-real constant.
-
-To extract the real part of a complex-valued expression @var{exp}, write
-@code{__real__ @var{exp}}. Likewise, use @code{__imag__} to
-extract the imaginary part.
-
-The operator @samp{~} performs complex conjugation when used on a value
-with a complex type.
-
-GNU CC can allocate complex automatic variables in a noncontiguous
-fashion; it's even possible for the real part to be in a register while
-the imaginary part is on the stack (or vice-versa). None of the
-supported debugging info formats has a way to represent noncontiguous
-allocation like this, so GNU CC describes a noncontiguous complex
-variable as if it were two separate variables of noncomplex type.
-If the variable's actual name is @code{foo}, the two fictitious
-variables are named @code{foo$real} and @code{foo$imag}. You can
-examine and set these two fictitious variables with your debugger.
-
-A future version of GDB will know how to recognize such pairs and treat
-them as a single variable with a complex type.
-
-@node Hex Floats
-@section Hex Floats
-@cindex hex floats
-GNU CC recognizes floating-point numbers written not only in the usual
-decimal notation, such as @code{1.55e1}, but also numbers such as
-@code{0x1.fp3} written in hexadecimal format. In that format the
-@code{0x} hex introducer and the @code{p} or @code{P} exponent field are
-mandatory. The exponent is a decimal number that indicates the power of
-2 by which the significand part will be multiplied. Thus @code{0x1.f} is
-1 15/16, @code{p3} multiplies it by 8, and the value of @code{0x1.fp3}
-is the same as @code{1.55e1}.
-
-Unlike for floating-point numbers in the decimal notation the exponent
-is always required in the hexadecimal notation. Otherwise the compiler
-would not be able to resolve the ambiguity of, e.g., @code{0x1.f}. This
-could mean @code{1.0f} or @code{1.9375} since @code{f} is also the
-extension for floating-point constants of type @code{float}.
-
-@node Zero Length
-@section Arrays of Length Zero
-@cindex arrays of length zero
-@cindex zero-length arrays
-@cindex length-zero arrays
-
-Zero-length arrays are allowed in GNU C. They are very useful as the last
-element of a structure which is really a header for a variable-length
-object:
-
-@example
-struct line @{
- int length;
- char contents[0];
-@};
-
-@{
- struct line *thisline = (struct line *)
- malloc (sizeof (struct line) + this_length);
- thisline->length = this_length;
-@}
-@end example
-
-In standard C, you would have to give @code{contents} a length of 1, which
-means either you waste space or complicate the argument to @code{malloc}.
-
-@node Variable Length
-@section Arrays of Variable Length
-@cindex variable-length arrays
-@cindex arrays of variable length
-
-Variable-length automatic arrays are allowed in GNU C. These arrays are
-declared like any other automatic arrays, but with a length that is not
-a constant expression. The storage is allocated at the point of
-declaration and deallocated when the brace-level is exited. For
-example:
-
-@example
-FILE *
-concat_fopen (char *s1, char *s2, char *mode)
-@{
- char str[strlen (s1) + strlen (s2) + 1];
- strcpy (str, s1);
- strcat (str, s2);
- return fopen (str, mode);
-@}
-@end example
-
-@cindex scope of a variable length array
-@cindex variable-length array scope
-@cindex deallocating variable length arrays
-Jumping or breaking out of the scope of the array name deallocates the
-storage. Jumping into the scope is not allowed; you get an error
-message for it.
-
-@cindex @code{alloca} vs variable-length arrays
-You can use the function @code{alloca} to get an effect much like
-variable-length arrays. The function @code{alloca} is available in
-many other C implementations (but not in all). On the other hand,
-variable-length arrays are more elegant.
-
-There are other differences between these two methods. Space allocated
-with @code{alloca} exists until the containing @emph{function} returns.
-The space for a variable-length array is deallocated as soon as the array
-name's scope ends. (If you use both variable-length arrays and
-@code{alloca} in the same function, deallocation of a variable-length array
-will also deallocate anything more recently allocated with @code{alloca}.)
-
-You can also use variable-length arrays as arguments to functions:
-
-@example
-struct entry
-tester (int len, char data[len][len])
-@{
- @dots{}
-@}
-@end example
-
-The length of an array is computed once when the storage is allocated
-and is remembered for the scope of the array in case you access it with
-@code{sizeof}.
-
-If you want to pass the array first and the length afterward, you can
-use a forward declaration in the parameter list---another GNU extension.
-
-@example
-struct entry
-tester (int len; char data[len][len], int len)
-@{
- @dots{}
-@}
-@end example
-
-@cindex parameter forward declaration
-The @samp{int len} before the semicolon is a @dfn{parameter forward
-declaration}, and it serves the purpose of making the name @code{len}
-known when the declaration of @code{data} is parsed.
-
-You can write any number of such parameter forward declarations in the
-parameter list. They can be separated by commas or semicolons, but the
-last one must end with a semicolon, which is followed by the ``real''
-parameter declarations. Each forward declaration must match a ``real''
-declaration in parameter name and data type.
-
-@node Macro Varargs
-@section Macros with Variable Numbers of Arguments
-@cindex variable number of arguments
-@cindex macro with variable arguments
-@cindex rest argument (in macro)
-
-In GNU C, a macro can accept a variable number of arguments, much as a
-function can. The syntax for defining the macro looks much like that
-used for a function. Here is an example:
-
-@example
-#define eprintf(format, args...) \
- fprintf (stderr, format , ## args)
-@end example
-
-Here @code{args} is a @dfn{rest argument}: it takes in zero or more
-arguments, as many as the call contains. All of them plus the commas
-between them form the value of @code{args}, which is substituted into
-the macro body where @code{args} is used. Thus, we have this expansion:
-
-@example
-eprintf ("%s:%d: ", input_file_name, line_number)
-@expansion{}
-fprintf (stderr, "%s:%d: " , input_file_name, line_number)
-@end example
-
-@noindent
-Note that the comma after the string constant comes from the definition
-of @code{eprintf}, whereas the last comma comes from the value of
-@code{args}.
-
-The reason for using @samp{##} is to handle the case when @code{args}
-matches no arguments at all. In this case, @code{args} has an empty
-value. In this case, the second comma in the definition becomes an
-embarrassment: if it got through to the expansion of the macro, we would
-get something like this:
-
-@example
-fprintf (stderr, "success!\n" , )
-@end example
-
-@noindent
-which is invalid C syntax. @samp{##} gets rid of the comma, so we get
-the following instead:
-
-@example
-fprintf (stderr, "success!\n")
-@end example
-
-This is a special feature of the GNU C preprocessor: @samp{##} before a
-rest argument that is empty discards the preceding sequence of
-non-whitespace characters from the macro definition. (If another macro
-argument precedes, none of it is discarded.)
-
-It might be better to discard the last preprocessor token instead of the
-last preceding sequence of non-whitespace characters; in fact, we may
-someday change this feature to do so. We advise you to write the macro
-definition so that the preceding sequence of non-whitespace characters
-is just a single token, so that the meaning will not change if we change
-the definition of this feature.
-
-@node Subscripting
-@section Non-Lvalue Arrays May Have Subscripts
-@cindex subscripting
-@cindex arrays, non-lvalue
-
-@cindex subscripting and function values
-Subscripting is allowed on arrays that are not lvalues, even though the
-unary @samp{&} operator is not. For example, this is valid in GNU C though
-not valid in other C dialects:
-
-@example
-@group
-struct foo @{int a[4];@};
-
-struct foo f();
-
-bar (int index)
-@{
- return f().a[index];
-@}
-@end group
-@end example
-
-@node Pointer Arith
-@section Arithmetic on @code{void}- and Function-Pointers
-@cindex void pointers, arithmetic
-@cindex void, size of pointer to
-@cindex function pointers, arithmetic
-@cindex function, size of pointer to
-
-In GNU C, addition and subtraction operations are supported on pointers to
-@code{void} and on pointers to functions. This is done by treating the
-size of a @code{void} or of a function as 1.
-
-A consequence of this is that @code{sizeof} is also allowed on @code{void}
-and on function types, and returns 1.
-
-The option @samp{-Wpointer-arith} requests a warning if these extensions
-are used.
-
-@node Initializers
-@section Non-Constant Initializers
-@cindex initializers, non-constant
-@cindex non-constant initializers
-
-As in standard C++, the elements of an aggregate initializer for an
-automatic variable are not required to be constant expressions in GNU C.
-Here is an example of an initializer with run-time varying elements:
-
-@example
-foo (float f, float g)
-@{
- float beat_freqs[2] = @{ f-g, f+g @};
- @dots{}
-@}
-@end example
-
-@node Constructors
-@section Constructor Expressions
-@cindex constructor expressions
-@cindex initializations in expressions
-@cindex structures, constructor expression
-@cindex expressions, constructor
-
-GNU C supports constructor expressions. A constructor looks like
-a cast containing an initializer. Its value is an object of the
-type specified in the cast, containing the elements specified in
-the initializer.
-
-Usually, the specified type is a structure. Assume that
-@code{struct foo} and @code{structure} are declared as shown:
-
-@example
-struct foo @{int a; char b[2];@} structure;
-@end example
-
-@noindent
-Here is an example of constructing a @code{struct foo} with a constructor:
-
-@example
-structure = ((struct foo) @{x + y, 'a', 0@});
-@end example
-
-@noindent
-This is equivalent to writing the following:
-
-@example
-@{
- struct foo temp = @{x + y, 'a', 0@};
- structure = temp;
-@}
-@end example
-
-You can also construct an array. If all the elements of the constructor
-are (made up of) simple constant expressions, suitable for use in
-initializers, then the constructor is an lvalue and can be coerced to a
-pointer to its first element, as shown here:
-
-@example
-char **foo = (char *[]) @{ "x", "y", "z" @};
-@end example
-
-Array constructors whose elements are not simple constants are
-not very useful, because the constructor is not an lvalue. There
-are only two valid ways to use it: to subscript it, or initialize
-an array variable with it. The former is probably slower than a
-@code{switch} statement, while the latter does the same thing an
-ordinary C initializer would do. Here is an example of
-subscripting an array constructor:
-
-@example
-output = ((int[]) @{ 2, x, 28 @}) [input];
-@end example
-
-Constructor expressions for scalar types and union types are is
-also allowed, but then the constructor expression is equivalent
-to a cast.
-
-@node Labeled Elements
-@section Labeled Elements in Initializers
-@cindex initializers with labeled elements
-@cindex labeled elements in initializers
-@cindex case labels in initializers
-
-Standard C requires the elements of an initializer to appear in a fixed
-order, the same as the order of the elements in the array or structure
-being initialized.
-
-In GNU C you can give the elements in any order, specifying the array
-indices or structure field names they apply to. This extension is not
-implemented in GNU C++.
-
-To specify an array index, write @samp{[@var{index}]} or
-@samp{[@var{index}] =} before the element value. For example,
-
-@example
-int a[6] = @{ [4] 29, [2] = 15 @};
-@end example
-
-@noindent
-is equivalent to
-
-@example
-int a[6] = @{ 0, 0, 15, 0, 29, 0 @};
-@end example
-
-@noindent
-The index values must be constant expressions, even if the array being
-initialized is automatic.
-
-To initialize a range of elements to the same value, write
-@samp{[@var{first} ... @var{last}] = @var{value}}. For example,
-
-@example
-int widths[] = @{ [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 @};
-@end example
-
-@noindent
-Note that the length of the array is the highest value specified
-plus one.
-
-In a structure initializer, specify the name of a field to initialize
-with @samp{@var{fieldname}:} before the element value. For example,
-given the following structure,
-
-@example
-struct point @{ int x, y; @};
-@end example
-
-@noindent
-the following initialization
-
-@example
-struct point p = @{ y: yvalue, x: xvalue @};
-@end example
-
-@noindent
-is equivalent to
-
-@example
-struct point p = @{ xvalue, yvalue @};
-@end example
-
-Another syntax which has the same meaning is @samp{.@var{fieldname} =}.,
-as shown here:
-
-@example
-struct point p = @{ .y = yvalue, .x = xvalue @};
-@end example
-
-You can also use an element label (with either the colon syntax or the
-period-equal syntax) when initializing a union, to specify which element
-of the union should be used. For example,
-
-@example
-union foo @{ int i; double d; @};
-
-union foo f = @{ d: 4 @};
-@end example
-
-@noindent
-will convert 4 to a @code{double} to store it in the union using
-the second element. By contrast, casting 4 to type @code{union foo}
-would store it into the union as the integer @code{i}, since it is
-an integer. (@xref{Cast to Union}.)
-
-You can combine this technique of naming elements with ordinary C
-initialization of successive elements. Each initializer element that
-does not have a label applies to the next consecutive element of the
-array or structure. For example,
-
-@example
-int a[6] = @{ [1] = v1, v2, [4] = v4 @};
-@end example
-
-@noindent
-is equivalent to
-
-@example
-int a[6] = @{ 0, v1, v2, 0, v4, 0 @};
-@end example
-
-Labeling the elements of an array initializer is especially useful
-when the indices are characters or belong to an @code{enum} type.
-For example:
-
-@example
-int whitespace[256]
- = @{ [' '] = 1, ['\t'] = 1, ['\h'] = 1,
- ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 @};
-@end example
-
-@node Case Ranges
-@section Case Ranges
-@cindex case ranges
-@cindex ranges in case statements
-
-You can specify a range of consecutive values in a single @code{case} label,
-like this:
-
-@example
-case @var{low} ... @var{high}:
-@end example
-
-@noindent
-This has the same effect as the proper number of individual @code{case}
-labels, one for each integer value from @var{low} to @var{high}, inclusive.
-
-This feature is especially useful for ranges of ASCII character codes:
-
-@example
-case 'A' ... 'Z':
-@end example
-
-@strong{Be careful:} Write spaces around the @code{...}, for otherwise
-it may be parsed wrong when you use it with integer values. For example,
-write this:
-
-@example
-case 1 ... 5:
-@end example
-
-@noindent
-rather than this:
-
-@example
-case 1...5:
-@end example
-
-@node Cast to Union
-@section Cast to a Union Type
-@cindex cast to a union
-@cindex union, casting to a
-
-A cast to union type is similar to other casts, except that the type
-specified is a union type. You can specify the type either with
-@code{union @var{tag}} or with a typedef name. A cast to union is actually
-a constructor though, not a cast, and hence does not yield an lvalue like
-normal casts. (@xref{Constructors}.)
-
-The types that may be cast to the union type are those of the members
-of the union. Thus, given the following union and variables:
-
-@example
-union foo @{ int i; double d; @};
-int x;
-double y;
-@end example
-
-@noindent
-both @code{x} and @code{y} can be cast to type @code{union} foo.
-
-Using the cast as the right-hand side of an assignment to a variable of
-union type is equivalent to storing in a member of the union:
-
-@example
-union foo u;
-@dots{}
-u = (union foo) x @equiv{} u.i = x
-u = (union foo) y @equiv{} u.d = y
-@end example
-
-You can also use the union cast as a function argument:
-
-@example
-void hack (union foo);
-@dots{}
-hack ((union foo) x);
-@end example
-
-@node Function Attributes
-@section Declaring Attributes of Functions
-@cindex function attributes
-@cindex declaring attributes of functions
-@cindex functions that never return
-@cindex functions that have no side effects
-@cindex functions in arbitrary sections
-@cindex @code{volatile} applied to function
-@cindex @code{const} applied to function
-@cindex functions with @code{printf}, @code{scanf} or @code{strftime} style arguments
-@cindex functions that are passed arguments in registers on the 386
-@cindex functions that pop the argument stack on the 386
-@cindex functions that do not pop the argument stack on the 386
-
-In GNU C, you declare certain things about functions called in your program
-which help the compiler optimize function calls and check your code more
-carefully.
-
-The keyword @code{__attribute__} allows you to specify special
-attributes when making a declaration. This keyword is followed by an
-attribute specification inside double parentheses. Nine attributes,
-@code{noreturn}, @code{const}, @code{format},
-@code{no_instrument_function}, @code{section},
-@code{constructor}, @code{destructor}, @code{unused} and @code{weak} are
-currently defined for functions. Other attributes, including
-@code{section} are supported for variables declarations (@pxref{Variable
-Attributes}) and for types (@pxref{Type Attributes}).
-
-You may also specify attributes with @samp{__} preceding and following
-each keyword. This allows you to use them in header files without
-being concerned about a possible macro of the same name. For example,
-you may use @code{__noreturn__} instead of @code{noreturn}.
-
-@table @code
-@cindex @code{noreturn} function attribute
-@item noreturn
-A few standard library functions, such as @code{abort} and @code{exit},
-cannot return. GNU CC knows this automatically. Some programs define
-their own functions that never return. You can declare them
-@code{noreturn} to tell the compiler this fact. For example,
-
-@smallexample
-void fatal () __attribute__ ((noreturn));
-
-void
-fatal (@dots{})
-@{
- @dots{} /* @r{Print error message.} */ @dots{}
- exit (1);
-@}
-@end smallexample
-
-The @code{noreturn} keyword tells the compiler to assume that
-@code{fatal} cannot return. It can then optimize without regard to what
-would happen if @code{fatal} ever did return. This makes slightly
-better code. More importantly, it helps avoid spurious warnings of
-uninitialized variables.
-
-Do not assume that registers saved by the calling function are
-restored before calling the @code{noreturn} function.
-
-It does not make sense for a @code{noreturn} function to have a return
-type other than @code{void}.
-
-The attribute @code{noreturn} is not implemented in GNU C versions
-earlier than 2.5. An alternative way to declare that a function does
-not return, which works in the current version and in some older
-versions, is as follows:
-
-@smallexample
-typedef void voidfn ();
-
-volatile voidfn fatal;
-@end smallexample
-
-@cindex @code{const} function attribute
-@item const
-Many functions do not examine any values except their arguments, and
-have no effects except the return value. Such a function can be subject
-to common subexpression elimination and loop optimization just as an
-arithmetic operator would be. These functions should be declared
-with the attribute @code{const}. For example,
-
-@smallexample
-int square (int) __attribute__ ((const));
-@end smallexample
-
-@noindent
-says that the hypothetical function @code{square} is safe to call
-fewer times than the program says.
-
-The attribute @code{const} is not implemented in GNU C versions earlier
-than 2.5. An alternative way to declare that a function has no side
-effects, which works in the current version and in some older versions,
-is as follows:
-
-@smallexample
-typedef int intfn ();
-
-extern const intfn square;
-@end smallexample
-
-This approach does not work in GNU C++ from 2.6.0 on, since the language
-specifies that the @samp{const} must be attached to the return value.
-
-@cindex pointer arguments
-Note that a function that has pointer arguments and examines the data
-pointed to must @emph{not} be declared @code{const}. Likewise, a
-function that calls a non-@code{const} function usually must not be
-@code{const}. It does not make sense for a @code{const} function to
-return @code{void}.
-
-@item format (@var{archetype}, @var{string-index}, @var{first-to-check})
-@cindex @code{format} function attribute
-The @code{format} attribute specifies that a function takes @code{printf},
-@code{scanf}, or @code{strftime} style arguments which should be type-checked
-against a format string. For example, the declaration:
-
-@smallexample
-extern int
-my_printf (void *my_object, const char *my_format, ...)
- __attribute__ ((format (printf, 2, 3)));
-@end smallexample
-
-@noindent
-causes the compiler to check the arguments in calls to @code{my_printf}
-for consistency with the @code{printf} style format string argument
-@code{my_format}.
-
-The parameter @var{archetype} determines how the format string is
-interpreted, and should be either @code{printf}, @code{scanf}, or
-@code{strftime}. The
-parameter @var{string-index} specifies which argument is the format
-string argument (starting from 1), while @var{first-to-check} is the
-number of the first argument to check against the format string. For
-functions where the arguments are not available to be checked (such as
-@code{vprintf}), specify the third parameter as zero. In this case the
-compiler only checks the format string for consistency.
-
-In the example above, the format string (@code{my_format}) is the second
-argument of the function @code{my_print}, and the arguments to check
-start with the third argument, so the correct parameters for the format
-attribute are 2 and 3.
-
-The @code{format} attribute allows you to identify your own functions
-which take format strings as arguments, so that GNU CC can check the
-calls to these functions for errors. The compiler always checks formats
-for the ANSI library functions @code{printf}, @code{fprintf},
-@code{sprintf}, @code{scanf}, @code{fscanf}, @code{sscanf}, @code{strftime},
-@code{vprintf}, @code{vfprintf} and @code{vsprintf} whenever such
-warnings are requested (using @samp{-Wformat}), so there is no need to
-modify the header file @file{stdio.h}.
-
-@item format_arg (@var{string-index})
-@cindex @code{format_arg} function attribute
-The @code{format_arg} attribute specifies that a function takes
-@code{printf} or @code{scanf} style arguments, modifies it (for example,
-to translate it into another language), and passes it to a @code{printf}
-or @code{scanf} style function. For example, the declaration:
-
-@smallexample
-extern char *
-my_dgettext (char *my_domain, const char *my_format)
- __attribute__ ((format_arg (2)));
-@end smallexample
-
-@noindent
-causes the compiler to check the arguments in calls to
-@code{my_dgettext} whose result is passed to a @code{printf},
-@code{scanf}, or @code{strftime} type function for consistency with the
-@code{printf} style format string argument @code{my_format}.
-
-The parameter @var{string-index} specifies which argument is the format
-string argument (starting from 1).
-
-The @code{format-arg} attribute allows you to identify your own
-functions which modify format strings, so that GNU CC can check the
-calls to @code{printf}, @code{scanf}, or @code{strftime} function whose
-operands are a call to one of your own function. The compiler always
-treats @code{gettext}, @code{dgettext}, and @code{dcgettext} in this
-manner.
-
-@item no_instrument_function
-@cindex @code{no_instrument_function} function attribute
-If @samp{-finstrument-functions} is given, profiling function calls will
-be generated at entry and exit of most user-compiled functions.
-Functions with this attribute will not be so instrumented.
-
-@item section ("section-name")
-@cindex @code{section} function attribute
-Normally, the compiler places the code it generates in the @code{text} section.
-Sometimes, however, you need additional sections, or you need certain
-particular functions to appear in special sections. The @code{section}
-attribute specifies that a function lives in a particular section.
-For example, the declaration:
-
-@smallexample
-extern void foobar (void) __attribute__ ((section ("bar")));
-@end smallexample
-
-@noindent
-puts the function @code{foobar} in the @code{bar} section.
-
-Some file formats do not support arbitrary sections so the @code{section}
-attribute is not available on all platforms.
-If you need to map the entire contents of a module to a particular
-section, consider using the facilities of the linker instead.
-
-@item constructor
-@itemx destructor
-@cindex @code{constructor} function attribute
-@cindex @code{destructor} function attribute
-The @code{constructor} attribute causes the function to be called
-automatically before execution enters @code{main ()}. Similarly, the
-@code{destructor} attribute causes the function to be called
-automatically after @code{main ()} has completed or @code{exit ()} has
-been called. Functions with these attributes are useful for
-initializing data that will be used implicitly during the execution of
-the program.
-
-These attributes are not currently implemented for Objective C.
-
-@item unused
-This attribute, attached to a function, means that the function is meant
-to be possibly unused. GNU CC will not produce a warning for this
-function. GNU C++ does not currently support this attribute as
-definitions without parameters are valid in C++.
-
-@item weak
-@cindex @code{weak} attribute
-The @code{weak} attribute causes the declaration to be emitted as a weak
-symbol rather than a global. This is primarily useful in defining
-library functions which can be overridden in user code, though it can
-also be used with non-function declarations. Weak symbols are supported
-for ELF targets, and also for a.out targets when using the GNU assembler
-and linker.
-
-@item alias ("target")
-@cindex @code{alias} attribute
-The @code{alias} attribute causes the declaration to be emitted as an
-alias for another symbol, which must be specified. For instance,
-
-@smallexample
-void __f () @{ /* do something */; @}
-void f () __attribute__ ((weak, alias ("__f")));
-@end smallexample
-
-declares @samp{f} to be a weak alias for @samp{__f}. In C++, the
-mangled name for the target must be used.
-
-Not all target machines support this attribute.
-
-@item no_check_memory_usage
-@cindex @code{no_check_memory_usage} function attribute
-If @samp{-fcheck-memory-usage} is given, calls to support routines will
-be generated before most memory accesses, to permit support code to
-record usage and detect uses of uninitialized or unallocated storage.
-Since the compiler cannot handle them properly, @code{asm} statements
-are not allowed. Declaring a function with this attribute disables the
-memory checking code for that function, permitting the use of @code{asm}
-statements without requiring separate compilation with different
-options, and allowing you to write support routines of your own if you
-wish, without getting infinite recursion if they get compiled with this
-option.
-
-@item regparm (@var{number})
-@cindex functions that are passed arguments in registers on the 386
-On the Intel 386, the @code{regparm} attribute causes the compiler to
-pass up to @var{number} integer arguments in registers @var{EAX},
-@var{EDX}, and @var{ECX} instead of on the stack. Functions that take a
-variable number of arguments will continue to be passed all of their
-arguments on the stack.
-
-@item stdcall
-@cindex functions that pop the argument stack on the 386
-On the Intel 386, the @code{stdcall} attribute causes the compiler to
-assume that the called function will pop off the stack space used to
-pass arguments, unless it takes a variable number of arguments.
-
-The PowerPC compiler for Windows NT currently ignores the @code{stdcall}
-attribute.
-
-@item cdecl
-@cindex functions that do pop the argument stack on the 386
-On the Intel 386, the @code{cdecl} attribute causes the compiler to
-assume that the calling function will pop off the stack space used to
-pass arguments. This is
-useful to override the effects of the @samp{-mrtd} switch.
-
-The PowerPC compiler for Windows NT currently ignores the @code{cdecl}
-attribute.
-
-@item longcall
-@cindex functions called via pointer on the RS/6000 and PowerPC
-On the RS/6000 and PowerPC, the @code{longcall} attribute causes the
-compiler to always call the function via a pointer, so that functions
-which reside further than 64 megabytes (67,108,864 bytes) from the
-current location can be called.
-
-@item dllimport
-@cindex functions which are imported from a dll on PowerPC Windows NT
-On the PowerPC running Windows NT, the @code{dllimport} attribute causes
-the compiler to call the function via a global pointer to the function
-pointer that is set up by the Windows NT dll library. The pointer name
-is formed by combining @code{__imp_} and the function name.
-
-@item dllexport
-@cindex functions which are exported from a dll on PowerPC Windows NT
-On the PowerPC running Windows NT, the @code{dllexport} attribute causes
-the compiler to provide a global pointer to the function pointer, so
-that it can be called with the @code{dllimport} attribute. The pointer
-name is formed by combining @code{__imp_} and the function name.
-
-@item exception (@var{except-func} [, @var{except-arg}])
-@cindex functions which specify exception handling on PowerPC Windows NT
-On the PowerPC running Windows NT, the @code{exception} attribute causes
-the compiler to modify the structured exception table entry it emits for
-the declared function. The string or identifier @var{except-func} is
-placed in the third entry of the structured exception table. It
-represents a function, which is called by the exception handling
-mechanism if an exception occurs. If it was specified, the string or
-identifier @var{except-arg} is placed in the fourth entry of the
-structured exception table.
-
-@item function_vector
-@cindex calling functions through the function vector on the H8/300 processors
-Use this option on the H8/300 and H8/300H to indicate that the specified
-function should be called through the function vector. Calling a
-function through the function vector will reduce code size, however;
-the function vector has a limited size (maximum 128 entries on the H8/300
-and 64 entries on the H8/300H) and shares space with the interrupt vector.
-
-You must use GAS and GLD from GNU binutils version 2.7 or later for
-this option to work correctly.
-
-@item interrupt_handler
-@cindex interrupt handler functions on the H8/300 processors
-Use this option on the H8/300 and H8/300H to indicate that the specified
-function is an interrupt handler. The compiler will generate function
-entry and exit sequences suitable for use in an interrupt handler when this
-attribute is present.
-
-@item eightbit_data
-@cindex eight bit data on the H8/300 and H8/300H
-Use this option on the H8/300 and H8/300H to indicate that the specified
-variable should be placed into the eight bit data section.
-The compiler will generate more efficient code for certain operations
-on data in the eight bit data area. Note the eight bit data area is limited to
-256 bytes of data.
-
-You must use GAS and GLD from GNU binutils version 2.7 or later for
-this option to work correctly.
-
-@item tiny_data
-@cindex tiny data section on the H8/300H
-Use this option on the H8/300H to indicate that the specified
-variable should be placed into the tiny data section.
-The compiler will generate more efficient code for loads and stores
-on data in the tiny data section. Note the tiny data area is limited to
-slightly under 32kbytes of data.
-
-@item interrupt
-@cindex interrupt handlers on the M32R/D
-Use this option on the M32R/D to indicate that the specified
-function is an interrupt handler. The compiler will generate function
-entry and exit sequences suitable for use in an interrupt handler when this
-attribute is present.
-
-@item model (@var{model-name})
-@cindex function addressability on the M32R/D
-Use this attribute on the M32R/D to set the addressability of an object,
-and the code generated for a function.
-The identifier @var{model-name} is one of @code{small}, @code{medium},
-or @code{large}, representing each of the code models.
-
-Small model objects live in the lower 16MB of memory (so that their
-addresses can be loaded with the @code{ld24} instruction), and are
-callable with the @code{bl} instruction.
-
-Medium model objects may live anywhere in the 32 bit address space (the
-compiler will generate @code{seth/add3} instructions to load their addresses),
-and are callable with the @code{bl} instruction.
-
-Large model objects may live anywhere in the 32 bit address space (the
-compiler will generate @code{seth/add3} instructions to load their addresses),
-and may not be reachable with the @code{bl} instruction (the compiler will
-generate the much slower @code{seth/add3/jl} instruction sequence).
-
-
-@c CYGNUS LOCAL nickc/thumb-pe
-@item naked
-@cindex naked function attribute on the ARM/PE
-This attribute specifies that the indicated function should have neither
-a funciton entry sequence nor a funciton exit sequence built for it by
-the compiler. It is then the programmer's responsibility to provide any
-necessary prologue and epilogue code.
-
-@item interfacearm
-@cindex interfacearm function attribute on the Thumb/PE
-The presence of this attribute atteched to a function indicates that the
-compiler should generate an ARM mode entry sequence for the function
-(despite the fact that the rest of the function is encoded using Thumb
-instructions) and that the function must return using the BX
-instruction, to ensure that the caller is returned to in the correct
-mode.
-
-@c END CYGNUS LOCAL
-
-@c CYGNUS LOCAL v850/law
-@item sda
-@cindex small data area on the V850
-Use this option on the V850 to indicate that the specified variable
-should be placed into the small data area. The compiler will generate
-more efficient code for loads and stores on data in this area section.
-Note the small data area is limited to 64kbytes of data. The area is
-pointed to by the GP register (register 4):
-
-@smallexample
-int __attribute__((sda)) variable;
-@end smallexample
-
-@item tda
-@cindex tiny data area on the V850
-Use this option on the V850 to indicate that the specified variable
-should be placed into the tiny data area. The compiler will generate
-more efficient code for loads and stores on data in this area section.
-Note the tiny data area is limited to slightly under 256 bytes of
-data. The area is pointed to by the EP register (register 30) and
-typically points to fast, internal RAM:
-
-@smallexample
-int __attribute__((tda)) variable;
-@end smallexample
-
-@item zda
-@cindex zero data area on the V850
-Use this option on the V850 to indicate that the specified variable
-should be placed into the zero data area. The compiler will generate
-more efficient code for loads and stores on data in this area section.
-Note the zero data area is limited to slightly under 64kbytes of
-data, and is located starting at address 0. Typically this area
-includes some of the V850's Special Function Registers:
-
-@smallexample
-int __attribute__((zda)) variable;
-@end smallexample
-@c END CYGNUS LOCAL
-@end table
-
-You can specify multiple attributes in a declaration by separating them
-by commas within the double parentheses or by immediately following an
-attribute declaration with another attribute declaration.
-
-@cindex @code{#pragma}, reason for not using
-@cindex pragma, reason for not using
-Some people object to the @code{__attribute__} feature, suggesting that ANSI C's
-@code{#pragma} should be used instead. There are two reasons for not
-doing this.
-
-@enumerate
-@item
-It is impossible to generate @code{#pragma} commands from a macro.
-
-@item
-There is no telling what the same @code{#pragma} might mean in another
-compiler.
-@end enumerate
-
-These two reasons apply to almost any application that might be proposed
-for @code{#pragma}. It is basically a mistake to use @code{#pragma} for
-@emph{anything}.
-
-@node Function Prototypes
-@section Prototypes and Old-Style Function Definitions
-@cindex function prototype declarations
-@cindex old-style function definitions
-@cindex promotion of formal parameters
-
-GNU C extends ANSI C to allow a function prototype to override a later
-old-style non-prototype definition. Consider the following example:
-
-@example
-/* @r{Use prototypes unless the compiler is old-fashioned.} */
-#ifdef __STDC__
-#define P(x) x
-#else
-#define P(x) ()
-#endif
-
-/* @r{Prototype function declaration.} */
-int isroot P((uid_t));
-
-/* @r{Old-style function definition.} */
-int
-isroot (x) /* ??? lossage here ??? */
- uid_t x;
-@{
- return x == 0;
-@}
-@end example
-
-Suppose the type @code{uid_t} happens to be @code{short}. ANSI C does
-not allow this example, because subword arguments in old-style
-non-prototype definitions are promoted. Therefore in this example the
-function definition's argument is really an @code{int}, which does not
-match the prototype argument type of @code{short}.
-
-This restriction of ANSI C makes it hard to write code that is portable
-to traditional C compilers, because the programmer does not know
-whether the @code{uid_t} type is @code{short}, @code{int}, or
-@code{long}. Therefore, in cases like these GNU C allows a prototype
-to override a later old-style definition. More precisely, in GNU C, a
-function prototype argument type overrides the argument type specified
-by a later old-style definition if the former type is the same as the
-latter type before promotion. Thus in GNU C the above example is
-equivalent to the following:
-
-@example
-int isroot (uid_t);
-
-int
-isroot (uid_t x)
-@{
- return x == 0;
-@}
-@end example
-
-GNU C++ does not support old-style function definitions, so this
-extension is irrelevant.
-
-@c CYGNUS LOCAL Interrupt Functions
-@node Interrupt Functions
-@section Compiling Functions for Interrupt Calls
-@cindex interrupts, functions compiled for
-@kindex #pragma interrupt
-@cindex calling conventions for interrupts
-
-When compiling code for certain platforms (currently the Hitachi H8/300
-and the Tandem ST-2000), you can instruct @code{@value{GCC}} that certain functions are
-meant to be called from hardware interrupts.
-
-To mark a function as callable from interrupt, include the line
-@samp{#pragma interrupt} somewhere before the beginning of the
-function's definition. (For maximum readability, you might place it
-immediately before the definition of the appropriate function.)
-@samp{#pragma interrupt} will affect only the next function defined; if
-you want to define more than one function with this property, include
-@samp{#pragma interrupt} before each of them.
-
-When you define a function with @samp{#pragma interrupt}, @code{@value{GCC}} alters its
-usual calling convention, to provide the right environment when the
-function is called from an interrupt. @emph{Such functions cannot be
-called in the usual way from your program}.
-
-You must use other facilities to actually associate these functions with
-particular interrupts; @code{@value{GCC}} can only compile them in the appropriate way.
-@c END CYGNUS LOCAL
-
-@node C++ Comments
-@section C++ Style Comments
-@cindex //
-@cindex C++ comments
-@cindex comments, C++ style
-
-In GNU C, you may use C++ style comments, which start with @samp{//} and
-continue until the end of the line. Many other C implementations allow
-such comments, and they are likely to be in a future C standard.
-However, C++ style comments are not recognized if you specify
-@w{@samp{-ansi}} or @w{@samp{-traditional}}, since they are incompatible
-with traditional constructs like @code{dividend//*comment*/divisor}.
-
-@node Dollar Signs
-@section Dollar Signs in Identifier Names
-@cindex $
-@cindex dollar signs in identifier names
-@cindex identifier names, dollar signs in
-
-In GNU C, you may normally use dollar signs in identifier names.
-This is because many traditional C implementations allow such identifiers.
-However, dollar signs in identifiers are not supported on a few target
-machines, typically because the target assembler does not allow them.
-
-@node Character Escapes
-@section The Character @key{ESC} in Constants
-
-You can use the sequence @samp{\e} in a string or character constant to
-stand for the ASCII character @key{ESC}.
-
-@node Alignment
-@section Inquiring on Alignment of Types or Variables
-@cindex alignment
-@cindex type alignment
-@cindex variable alignment
-
-The keyword @code{__alignof__} allows you to inquire about how an object
-is aligned, or the minimum alignment usually required by a type. Its
-syntax is just like @code{sizeof}.
-
-For example, if the target machine requires a @code{double} value to be
-aligned on an 8-byte boundary, then @code{__alignof__ (double)} is 8.
-This is true on many RISC machines. On more traditional machine
-designs, @code{__alignof__ (double)} is 4 or even 2.
-
-Some machines never actually require alignment; they allow reference to any
-data type even at an odd addresses. For these machines, @code{__alignof__}
-reports the @emph{recommended} alignment of a type.
-
-When the operand of @code{__alignof__} is an lvalue rather than a type, the
-value is the largest alignment that the lvalue is known to have. It may
-have this alignment as a result of its data type, or because it is part of
-a structure and inherits alignment from that structure. For example, after
-this declaration:
-
-@example
-struct foo @{ int x; char y; @} foo1;
-@end example
-
-@noindent
-the value of @code{__alignof__ (foo1.y)} is probably 2 or 4, the same as
-@code{__alignof__ (int)}, even though the data type of @code{foo1.y}
-does not itself demand any alignment.@refill
-
-A related feature which lets you specify the alignment of an object is
-@code{__attribute__ ((aligned (@var{alignment})))}; see the following
-section.
-
-@node Variable Attributes
-@section Specifying Attributes of Variables
-@cindex attribute of variables
-@cindex variable attributes
-
-The keyword @code{__attribute__} allows you to specify special
-attributes of variables or structure fields. This keyword is followed
-by an attribute specification inside double parentheses. Eight
-attributes are currently defined for variables: @code{aligned},
-@code{mode}, @code{nocommon}, @code{packed}, @code{section},
-@code{transparent_union}, @code{unused}, and @code{weak}. Other
-attributes are available for functions (@pxref{Function Attributes}) and
-for types (@pxref{Type Attributes}).
-
-You may also specify attributes with @samp{__} preceding and following
-each keyword. This allows you to use them in header files without
-being concerned about a possible macro of the same name. For example,
-you may use @code{__aligned__} instead of @code{aligned}.
-
-@table @code
-@cindex @code{aligned} attribute
-@item aligned (@var{alignment})
-This attribute specifies a minimum alignment for the variable or
-structure field, measured in bytes. For example, the declaration:
-
-@smallexample
-int x __attribute__ ((aligned (16))) = 0;
-@end smallexample
-
-@noindent
-causes the compiler to allocate the global variable @code{x} on a
-16-byte boundary. On a 68040, this could be used in conjunction with
-an @code{asm} expression to access the @code{move16} instruction which
-requires 16-byte aligned operands.
-
-You can also specify the alignment of structure fields. For example, to
-create a double-word aligned @code{int} pair, you could write:
-
-@smallexample
-struct foo @{ int x[2] __attribute__ ((aligned (8))); @};
-@end smallexample
-
-@noindent
-This is an alternative to creating a union with a @code{double} member
-that forces the union to be double-word aligned.
-
-It is not possible to specify the alignment of functions; the alignment
-of functions is determined by the machine's requirements and cannot be
-changed. You cannot specify alignment for a typedef name because such a
-name is just an alias, not a distinct type.
-
-As in the preceding examples, you can explicitly specify the alignment
-(in bytes) that you wish the compiler to use for a given variable or
-structure field. Alternatively, you can leave out the alignment factor
-and just ask the compiler to align a variable or field to the maximum
-useful alignment for the target machine you are compiling for. For
-example, you could write:
-
-@smallexample
-short array[3] __attribute__ ((aligned));
-@end smallexample
-
-Whenever you leave out the alignment factor in an @code{aligned} attribute
-specification, the compiler automatically sets the alignment for the declared
-variable or field to the largest alignment which is ever used for any data
-type on the target machine you are compiling for. Doing this can often make
-copy operations more efficient, because the compiler can use whatever
-instructions copy the biggest chunks of memory when performing copies to
-or from the variables or fields that you have aligned this way.
-
-The @code{aligned} attribute can only increase the alignment; but you
-can decrease it by specifying @code{packed} as well. See below.
-
-Note that the effectiveness of @code{aligned} attributes may be limited
-by inherent limitations in your linker. On many systems, the linker is
-only able to arrange for variables to be aligned up to a certain maximum
-alignment. (For some linkers, the maximum supported alignment may
-be very very small.) If your linker is only able to align variables
-up to a maximum of 8 byte alignment, then specifying @code{aligned(16)}
-in an @code{__attribute__} will still only provide you with 8 byte
-alignment. See your linker documentation for further information.
-
-@item mode (@var{mode})
-@cindex @code{mode} attribute
-This attribute specifies the data type for the declaration---whichever
-type corresponds to the mode @var{mode}. This in effect lets you
-request an integer or floating point type according to its width.
-
-You may also specify a mode of @samp{byte} or @samp{__byte__} to
-indicate the mode corresponding to a one-byte integer, @samp{word} or
-@samp{__word__} for the mode of a one-word integer, and @samp{pointer}
-or @samp{__pointer__} for the mode used to represent pointers.
-
-@item nocommon
-@cindex @code{nocommon} attribute
-This attribute specifies requests GNU CC not to place a variable
-``common'' but instead to allocate space for it directly. If you
-specify the @samp{-fno-common} flag, GNU CC will do this for all
-variables.
-
-Specifying the @code{nocommon} attribute for a variable provides an
-initialization of zeros. A variable may only be initialized in one
-source file.
-
-@item packed
-@cindex @code{packed} attribute
-The @code{packed} attribute specifies that a variable or structure field
-should have the smallest possible alignment---one byte for a variable,
-and one bit for a field, unless you specify a larger value with the
-@code{aligned} attribute.
-
-Here is a structure in which the field @code{x} is packed, so that it
-immediately follows @code{a}:
-
-@example
-struct foo
-@{
- char a;
- int x[2] __attribute__ ((packed));
-@};
-@end example
-
-@item section ("section-name")
-@cindex @code{section} variable attribute
-Normally, the compiler places the objects it generates in sections like
-@code{data} and @code{bss}. Sometimes, however, you need additional sections,
-or you need certain particular variables to appear in special sections,
-for example to map to special hardware. The @code{section}
-attribute specifies that a variable (or function) lives in a particular
-section. For example, this small program uses several specific section names:
-
-@smallexample
-struct duart a __attribute__ ((section ("DUART_A"))) = @{ 0 @};
-struct duart b __attribute__ ((section ("DUART_B"))) = @{ 0 @};
-char stack[10000] __attribute__ ((section ("STACK"))) = @{ 0 @};
-int init_data __attribute__ ((section ("INITDATA"))) = 0;
-
-main()
-@{
- /* Initialize stack pointer */
- init_sp (stack + sizeof (stack));
-
- /* Initialize initialized data */
- memcpy (&init_data, &data, &edata - &data);
-
- /* Turn on the serial ports */
- init_duart (&a);
- init_duart (&b);
-@}
-@end smallexample
-
-@noindent
-Use the @code{section} attribute with an @emph{initialized} definition
-of a @emph{global} variable, as shown in the example. GNU CC issues
-a warning and otherwise ignores the @code{section} attribute in
-uninitialized variable declarations.
-
-You may only use the @code{section} attribute with a fully initialized
-global definition because of the way linkers work. The linker requires
-each object be defined once, with the exception that uninitialized
-variables tentatively go in the @code{common} (or @code{bss}) section
-and can be multiply "defined". You can force a variable to be
-initialized with the @samp{-fno-common} flag or the @code{nocommon}
-attribute.
-
-Some file formats do not support arbitrary sections so the @code{section}
-attribute is not available on all platforms.
-If you need to map the entire contents of a module to a particular
-section, consider using the facilities of the linker instead.
-
-@item transparent_union
-This attribute, attached to a function parameter which is a union, means
-that the corresponding argument may have the type of any union member,
-but the argument is passed as if its type were that of the first union
-member. For more details see @xref{Type Attributes}. You can also use
-this attribute on a @code{typedef} for a union data type; then it
-applies to all function parameters with that type.
-
-@item unused
-This attribute, attached to a variable, means that the variable is meant
-to be possibly unused. GNU CC will not produce a warning for this
-variable.
-
-@item weak
-The @code{weak} attribute is described in @xref{Function Attributes}.
-
-@item model (@var{model-name})
-@cindex variable addressability on the M32R/D
-Use this attribute on the M32R/D to set the addressability of an object.
-The identifier @var{model-name} is one of @code{small}, @code{medium},
-or @code{large}, representing each of the code models.
-
-Small model objects live in the lower 16MB of memory (so that their
-addresses can be loaded with the @code{ld24} instruction).
-
-Medium and large model objects may live anywhere in the 32 bit address space
-(the compiler will generate @code{seth/add3} instructions to load their
-addresses).
-
-@end table
-
-To specify multiple attributes, separate them by commas within the
-double parentheses: for example, @samp{__attribute__ ((aligned (16),
-packed))}.
-
-@node Type Attributes
-@section Specifying Attributes of Types
-@cindex attribute of types
-@cindex type attributes
-
-The keyword @code{__attribute__} allows you to specify special
-attributes of @code{struct} and @code{union} types when you define such
-types. This keyword is followed by an attribute specification inside
-double parentheses. Three attributes are currently defined for types:
-@code{aligned}, @code{packed}, and @code{transparent_union}. Other
-attributes are defined for functions (@pxref{Function Attributes}) and
-for variables (@pxref{Variable Attributes}).
-
-You may also specify any one of these attributes with @samp{__}
-preceding and following its keyword. This allows you to use these
-attributes in header files without being concerned about a possible
-macro of the same name. For example, you may use @code{__aligned__}
-instead of @code{aligned}.
-
-You may specify the @code{aligned} and @code{transparent_union}
-attributes either in a @code{typedef} declaration or just past the
-closing curly brace of a complete enum, struct or union type
-@emph{definition} and the @code{packed} attribute only past the closing
-brace of a definition.
-
-You may also specify attributes between the enum, struct or union
-tag and the name of the type rather than after the closing brace.
-
-@table @code
-@cindex @code{aligned} attribute
-@item aligned (@var{alignment})
-This attribute specifies a minimum alignment (in bytes) for variables
-of the specified type. For example, the declarations:
-
-@smallexample
-struct S @{ short f[3]; @} __attribute__ ((aligned (8)));
-typedef int more_aligned_int __attribute__ ((aligned (8)));
-@end smallexample
-
-@noindent
-force the compiler to insure (as far as it can) that each variable whose
-type is @code{struct S} or @code{more_aligned_int} will be allocated and
-aligned @emph{at least} on a 8-byte boundary. On a Sparc, having all
-variables of type @code{struct S} aligned to 8-byte boundaries allows
-the compiler to use the @code{ldd} and @code{std} (doubleword load and
-store) instructions when copying one variable of type @code{struct S} to
-another, thus improving run-time efficiency.
-
-Note that the alignment of any given @code{struct} or @code{union} type
-is required by the ANSI C standard to be at least a perfect multiple of
-the lowest common multiple of the alignments of all of the members of
-the @code{struct} or @code{union} in question. This means that you @emph{can}
-effectively adjust the alignment of a @code{struct} or @code{union}
-type by attaching an @code{aligned} attribute to any one of the members
-of such a type, but the notation illustrated in the example above is a
-more obvious, intuitive, and readable way to request the compiler to
-adjust the alignment of an entire @code{struct} or @code{union} type.
-
-As in the preceding example, you can explicitly specify the alignment
-(in bytes) that you wish the compiler to use for a given @code{struct}
-or @code{union} type. Alternatively, you can leave out the alignment factor
-and just ask the compiler to align a type to the maximum
-useful alignment for the target machine you are compiling for. For
-example, you could write:
-
-@smallexample
-struct S @{ short f[3]; @} __attribute__ ((aligned));
-@end smallexample
-
-Whenever you leave out the alignment factor in an @code{aligned}
-attribute specification, the compiler automatically sets the alignment
-for the type to the largest alignment which is ever used for any data
-type on the target machine you are compiling for. Doing this can often
-make copy operations more efficient, because the compiler can use
-whatever instructions copy the biggest chunks of memory when performing
-copies to or from the variables which have types that you have aligned
-this way.
-
-In the example above, if the size of each @code{short} is 2 bytes, then
-the size of the entire @code{struct S} type is 6 bytes. The smallest
-power of two which is greater than or equal to that is 8, so the
-compiler sets the alignment for the entire @code{struct S} type to 8
-bytes.
-
-Note that although you can ask the compiler to select a time-efficient
-alignment for a given type and then declare only individual stand-alone
-objects of that type, the compiler's ability to select a time-efficient
-alignment is primarily useful only when you plan to create arrays of
-variables having the relevant (efficiently aligned) type. If you
-declare or use arrays of variables of an efficiently-aligned type, then
-it is likely that your program will also be doing pointer arithmetic (or
-subscripting, which amounts to the same thing) on pointers to the
-relevant type, and the code that the compiler generates for these
-pointer arithmetic operations will often be more efficient for
-efficiently-aligned types than for other types.
-
-The @code{aligned} attribute can only increase the alignment; but you
-can decrease it by specifying @code{packed} as well. See below.
-
-Note that the effectiveness of @code{aligned} attributes may be limited
-by inherent limitations in your linker. On many systems, the linker is
-only able to arrange for variables to be aligned up to a certain maximum
-alignment. (For some linkers, the maximum supported alignment may
-be very very small.) If your linker is only able to align variables
-up to a maximum of 8 byte alignment, then specifying @code{aligned(16)}
-in an @code{__attribute__} will still only provide you with 8 byte
-alignment. See your linker documentation for further information.
-
-@item packed
-This attribute, attached to an @code{enum}, @code{struct}, or
-@code{union} type definition, specified that the minimum required memory
-be used to represent the type.
-
-Specifying this attribute for @code{struct} and @code{union} types is
-equivalent to specifying the @code{packed} attribute on each of the
-structure or union members. Specifying the @samp{-fshort-enums}
-flag on the line is equivalent to specifying the @code{packed}
-attribute on all @code{enum} definitions.
-
-You may only specify this attribute after a closing curly brace on an
-@code{enum} definition, not in a @code{typedef} declaration, unless that
-declaration also contains the definition of the @code{enum}.
-
-@item transparent_union
-This attribute, attached to a @code{union} type definition, indicates
-that any function parameter having that union type causes calls to that
-function to be treated in a special way.
-
-First, the argument corresponding to a transparent union type can be of
-any type in the union; no cast is required. Also, if the union contains
-a pointer type, the corresponding argument can be a null pointer
-constant or a void pointer expression; and if the union contains a void
-pointer type, the corresponding argument can be any pointer expression.
-If the union member type is a pointer, qualifiers like @code{const} on
-the referenced type must be respected, just as with normal pointer
-conversions.
-
-Second, the argument is passed to the function using the calling
-conventions of first member of the transparent union, not the calling
-conventions of the union itself. All members of the union must have the
-same machine representation; this is necessary for this argument passing
-to work properly.
-
-Transparent unions are designed for library functions that have multiple
-interfaces for compatibility reasons. For example, suppose the
-@code{wait} function must accept either a value of type @code{int *} to
-comply with Posix, or a value of type @code{union wait *} to comply with
-the 4.1BSD interface. If @code{wait}'s parameter were @code{void *},
-@code{wait} would accept both kinds of arguments, but it would also
-accept any other pointer type and this would make argument type checking
-less useful. Instead, @code{<sys/wait.h>} might define the interface
-as follows:
-
-@smallexample
-typedef union
- @{
- int *__ip;
- union wait *__up;
- @} wait_status_ptr_t __attribute__ ((__transparent_union__));
-
-pid_t wait (wait_status_ptr_t);
-@end smallexample
-
-This interface allows either @code{int *} or @code{union wait *}
-arguments to be passed, using the @code{int *} calling convention.
-The program can call @code{wait} with arguments of either type:
-
-@example
-int w1 () @{ int w; return wait (&w); @}
-int w2 () @{ union wait w; return wait (&w); @}
-@end example
-
-With this interface, @code{wait}'s implementation might look like this:
-
-@example
-pid_t wait (wait_status_ptr_t p)
-@{
- return waitpid (-1, p.__ip, 0);
-@}
-@end example
-
-@item unused
-When attached to a type (including a @code{union} or a @code{struct}),
-this attribute means that variables of that type are meant to appear
-possibly unused. GNU CC will not produce a warning for any variables of
-that type, even if the variable appears to do nothing. This is often
-the case with lock or thread classes, which are usually defined and then
-not referenced, but contain constructors and destructors that have
-nontrivial bookkeeping functions.
-
-@end table
-
-To specify multiple attributes, separate them by commas within the
-double parentheses: for example, @samp{__attribute__ ((aligned (16),
-packed))}.
-
-@node Inline
-@section An Inline Function is As Fast As a Macro
-@cindex inline functions
-@cindex integrating function code
-@cindex open coding
-@cindex macros, inline alternative
-
-By declaring a function @code{inline}, you can direct GNU CC to
-integrate that function's code into the code for its callers. This
-makes execution faster by eliminating the function-call overhead; in
-addition, if any of the actual argument values are constant, their known
-values may permit simplifications at compile time so that not all of the
-inline function's code needs to be included. The effect on code size is
-less predictable; object code may be larger or smaller with function
-inlining, depending on the particular case. Inlining of functions is an
-optimization and it really ``works'' only in optimizing compilation. If
-you don't use @samp{-O}, no function is really inline.
-
-To declare a function inline, use the @code{inline} keyword in its
-declaration, like this:
-
-@example
-inline int
-inc (int *a)
-@{
- (*a)++;
-@}
-@end example
-
-(If you are writing a header file to be included in ANSI C programs, write
-@code{__inline__} instead of @code{inline}. @xref{Alternate Keywords}.)
-
-You can also make all ``simple enough'' functions inline with the option
-@samp{-finline-functions}. Note that certain usages in a function
-definition can make it unsuitable for inline substitution.
-
-Note that in C and Objective C, unlike C++, the @code{inline} keyword
-does not affect the linkage of the function.
-
-@cindex automatic @code{inline} for C++ member fns
-@cindex @code{inline} automatic for C++ member fns
-@cindex member fns, automatically @code{inline}
-@cindex C++ member fns, automatically @code{inline}
-GNU CC automatically inlines member functions defined within the class
-body of C++ programs even if they are not explicitly declared
-@code{inline}. (You can override this with @samp{-fno-default-inline};
-@pxref{C++ Dialect Options,,Options Controlling C++ Dialect}.)
-
-@cindex inline functions, omission of
-When a function is both inline and @code{static}, if all calls to the
-function are integrated into the caller, and the function's address is
-never used, then the function's own assembler code is never referenced.
-In this case, GNU CC does not actually output assembler code for the
-function, unless you specify the option @samp{-fkeep-inline-functions}.
-Some calls cannot be integrated for various reasons (in particular,
-calls that precede the function's definition cannot be integrated, and
-neither can recursive calls within the definition). If there is a
-nonintegrated call, then the function is compiled to assembler code as
-usual. The function must also be compiled as usual if the program
-refers to its address, because that can't be inlined.
-
-@cindex non-static inline function
-When an inline function is not @code{static}, then the compiler must assume
-that there may be calls from other source files; since a global symbol can
-be defined only once in any program, the function must not be defined in
-the other source files, so the calls therein cannot be integrated.
-Therefore, a non-@code{static} inline function is always compiled on its
-own in the usual fashion.
-
-If you specify both @code{inline} and @code{extern} in the function
-definition, then the definition is used only for inlining. In no case
-is the function compiled on its own, not even if you refer to its
-address explicitly. Such an address becomes an external reference, as
-if you had only declared the function, and had not defined it.
-
-This combination of @code{inline} and @code{extern} has almost the
-effect of a macro. The way to use it is to put a function definition in
-a header file with these keywords, and put another copy of the
-definition (lacking @code{inline} and @code{extern}) in a library file.
-The definition in the header file will cause most calls to the function
-to be inlined. If any uses of the function remain, they will refer to
-the single copy in the library.
-
-GNU C does not inline any functions when not optimizing. It is not
-clear whether it is better to inline or not, in this case, but we found
-that a correct implementation when not optimizing was difficult. So we
-did the easy thing, and turned it off.
-
-@node Extended Asm
-@section Assembler Instructions with C Expression Operands
-@cindex extended @code{asm}
-@cindex @code{asm} expressions
-@cindex assembler instructions
-@cindex registers
-
-In an assembler instruction using @code{asm}, you can specify the
-operands of the instruction using C expressions. This means you need not
-guess which registers or memory locations will contain the data you want
-to use.
-
-You must specify an assembler instruction template much like what
-appears in a machine description, plus an operand constraint string for
-each operand.
-
-For example, here is how to use the 68881's @code{fsinx} instruction:
-
-@example
-asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));
-@end example
-
-@noindent
-Here @code{angle} is the C expression for the input operand while
-@code{result} is that of the output operand. Each has @samp{"f"} as its
-operand constraint, saying that a floating point register is required.
-The @samp{=} in @samp{=f} indicates that the operand is an output; all
-output operands' constraints must use @samp{=}. The constraints use the
-same language used in the machine description (@pxref{Constraints}).
-
-Each operand is described by an operand-constraint string followed by
-the C expression in parentheses. A colon separates the assembler
-template from the first output operand and another separates the last
-output operand from the first input, if any. Commas separate the
-operands within each group. The total number of operands is limited to
-ten or to the maximum number of operands in any instruction pattern in
-the machine description, whichever is greater.
-
-If there are no output operands but there are input operands, you must
-place two consecutive colons surrounding the place where the output
-operands would go.
-
-Output operand expressions must be lvalues; the compiler can check this.
-The input operands need not be lvalues. The compiler cannot check
-whether the operands have data types that are reasonable for the
-instruction being executed. It does not parse the assembler instruction
-template and does not know what it means or even whether it is valid
-assembler input. The extended @code{asm} feature is most often used for
-machine instructions the compiler itself does not know exist. If
-the output expression cannot be directly addressed (for example, it is a
-bit field), your constraint must allow a register. In that case, GNU CC
-will use the register as the output of the @code{asm}, and then store
-that register into the output.
-
-The ordinary output operands must be write-only; GNU CC will assume that
-the values in these operands before the instruction are dead and need
-not be generated. Extended asm supports input-output or read-write
-operands. Use the constraint character @samp{+} to indicate such an
-operand and list it with the output operands.
-
-When the constraints for the read-write operand (or the operand in which
-only some of the bits are to be changed) allows a register, you may, as
-an alternative, logically split its function into two separate operands,
-one input operand and one write-only output operand. The connection
-between them is expressed by constraints which say they need to be in
-the same location when the instruction executes. You can use the same C
-expression for both operands, or different expressions. For example,
-here we write the (fictitious) @samp{combine} instruction with
-@code{bar} as its read-only source operand and @code{foo} as its
-read-write destination:
-
-@example
-asm ("combine %2,%0" : "=r" (foo) : "0" (foo), "g" (bar));
-@end example
-
-@noindent
-The constraint @samp{"0"} for operand 1 says that it must occupy the
-same location as operand 0. A digit in constraint is allowed only in an
-input operand and it must refer to an output operand.
-
-Only a digit in the constraint can guarantee that one operand will be in
-the same place as another. The mere fact that @code{foo} is the value
-of both operands is not enough to guarantee that they will be in the
-same place in the generated assembler code. The following would not
-work reliably:
-
-@example
-asm ("combine %2,%0" : "=r" (foo) : "r" (foo), "g" (bar));
-@end example
-
-Various optimizations or reloading could cause operands 0 and 1 to be in
-different registers; GNU CC knows no reason not to do so. For example, the
-compiler might find a copy of the value of @code{foo} in one register and
-use it for operand 1, but generate the output operand 0 in a different
-register (copying it afterward to @code{foo}'s own address). Of course,
-since the register for operand 1 is not even mentioned in the assembler
-code, the result will not work, but GNU CC can't tell that.
-
-Some instructions clobber specific hard registers. To describe this,
-write a third colon after the input operands, followed by the names of
-the clobbered hard registers (given as strings). Here is a realistic
-example for the VAX:
-
-@example
-asm volatile ("movc3 %0,%1,%2"
- : /* no outputs */
- : "g" (from), "g" (to), "g" (count)
- : "r0", "r1", "r2", "r3", "r4", "r5");
-@end example
-
-It is an error for a clobber description to overlap an input or output
-operand (for example, an operand describing a register class with one
-member, mentioned in the clobber list). Most notably, it is invalid to
-describe that an input operand is modified, but unused as output. It has
-to be specified as an input and output operand anyway. Note that if there
-are only unused output operands, you will then also need to specify
-@code{volatile} for the @code{asm} construct, as described below.
-
-If you refer to a particular hardware register from the assembler code,
-you will probably have to list the register after the third colon to
-tell the compiler the register's value is modified. In some assemblers,
-the register names begin with @samp{%}; to produce one @samp{%} in the
-assembler code, you must write @samp{%%} in the input.
-
-If your assembler instruction can alter the condition code register, add
-@samp{cc} to the list of clobbered registers. GNU CC on some machines
-represents the condition codes as a specific hardware register;
-@samp{cc} serves to name this register. On other machines, the
-condition code is handled differently, and specifying @samp{cc} has no
-effect. But it is valid no matter what the machine.
-
-If your assembler instruction modifies memory in an unpredictable
-fashion, add @samp{memory} to the list of clobbered registers. This
-will cause GNU CC to not keep memory values cached in registers across
-the assembler instruction.
-
-You can put multiple assembler instructions together in a single
-@code{asm} template, separated either with newlines (written as
-@samp{\n}) or with semicolons if the assembler allows such semicolons.
-The GNU assembler allows semicolons and most Unix assemblers seem to do
-so. The input operands are guaranteed not to use any of the clobbered
-registers, and neither will the output operands' addresses, so you can
-read and write the clobbered registers as many times as you like. Here
-is an example of multiple instructions in a template; it assumes the
-subroutine @code{_foo} accepts arguments in registers 9 and 10:
-
-@example
-asm ("movl %0,r9;movl %1,r10;call _foo"
- : /* no outputs */
- : "g" (from), "g" (to)
- : "r9", "r10");
-@end example
-
-Unless an output operand has the @samp{&} constraint modifier, GNU CC
-may allocate it in the same register as an unrelated input operand, on
-the assumption the inputs are consumed before the outputs are produced.
-This assumption may be false if the assembler code actually consists of
-more than one instruction. In such a case, use @samp{&} for each output
-operand that may not overlap an input. @xref{Modifiers}.
-
-If you want to test the condition code produced by an assembler
-instruction, you must include a branch and a label in the @code{asm}
-construct, as follows:
-
-@example
-asm ("clr %0;frob %1;beq 0f;mov #1,%0;0:"
- : "g" (result)
- : "g" (input));
-@end example
-
-@noindent
-This assumes your assembler supports local labels, as the GNU assembler
-and most Unix assemblers do.
-
-Speaking of labels, jumps from one @code{asm} to another are not
-supported. The compiler's optimizers do not know about these jumps, and
-therefore they cannot take account of them when deciding how to
-optimize.
-
-@cindex macros containing @code{asm}
-Usually the most convenient way to use these @code{asm} instructions is to
-encapsulate them in macros that look like functions. For example,
-
-@example
-#define sin(x) \
-(@{ double __value, __arg = (x); \
- asm ("fsinx %1,%0": "=f" (__value): "f" (__arg)); \
- __value; @})
-@end example
-
-@noindent
-Here the variable @code{__arg} is used to make sure that the instruction
-operates on a proper @code{double} value, and to accept only those
-arguments @code{x} which can convert automatically to a @code{double}.
-
-Another way to make sure the instruction operates on the correct data
-type is to use a cast in the @code{asm}. This is different from using a
-variable @code{__arg} in that it converts more different types. For
-example, if the desired type were @code{int}, casting the argument to
-@code{int} would accept a pointer with no complaint, while assigning the
-argument to an @code{int} variable named @code{__arg} would warn about
-using a pointer unless the caller explicitly casts it.
-
-If an @code{asm} has output operands, GNU CC assumes for optimization
-purposes the instruction has no side effects except to change the output
-operands. This does not mean instructions with a side effect cannot be
-used, but you must be careful, because the compiler may eliminate them
-if the output operands aren't used, or move them out of loops, or
-replace two with one if they constitute a common subexpression. Also,
-if your instruction does have a side effect on a variable that otherwise
-appears not to change, the old value of the variable may be reused later
-if it happens to be found in a register.
-
-You can prevent an @code{asm} instruction from being deleted, moved
-significantly, or combined, by writing the keyword @code{volatile} after
-the @code{asm}. For example:
-
-@example
-#define get_and_set_priority(new) \
-(@{ int __old; \
- asm volatile ("get_and_set_priority %0, %1": "=g" (__old) : "g" (new)); \
- __old; @})
-b@end example
-
-@noindent
-If you write an @code{asm} instruction with no outputs, GNU CC will know
-the instruction has side-effects and will not delete the instruction or
-move it outside of loops. If the side-effects of your instruction are
-not purely external, but will affect variables in your program in ways
-other than reading the inputs and clobbering the specified registers or
-memory, you should write the @code{volatile} keyword to prevent future
-versions of GNU CC from moving the instruction around within a core
-region.
-
-An @code{asm} instruction without any operands or clobbers (and ``old
-style'' @code{asm}) will not be deleted or moved significantly,
-regardless, unless it is unreachable, the same wasy as if you had
-written a @code{volatile} keyword.
-
-Note that even a volatile @code{asm} instruction can be moved in ways
-that appear insignificant to the compiler, such as across jump
-instructions. You can't expect a sequence of volatile @code{asm}
-instructions to remain perfectly consecutive. If you want consecutive
-output, use a single @code{asm}.
-
-It is a natural idea to look for a way to give access to the condition
-code left by the assembler instruction. However, when we attempted to
-implement this, we found no way to make it work reliably. The problem
-is that output operands might need reloading, which would result in
-additional following ``store'' instructions. On most machines, these
-instructions would alter the condition code before there was time to
-test it. This problem doesn't arise for ordinary ``test'' and
-``compare'' instructions because they don't have any output operands.
-
-If you are writing a header file that should be includable in ANSI C
-programs, write @code{__asm__} instead of @code{asm}. @xref{Alternate
-Keywords}.
-
-@ifclear INTERNALS
-@c Show the details on constraints if they do not appear elsewhere in
-@c the manual
-@include md.texi
-@end ifclear
-
-@node Asm Labels
-@section Controlling Names Used in Assembler Code
-@cindex assembler names for identifiers
-@cindex names used in assembler code
-@cindex identifiers, names in assembler code
-
-You can specify the name to be used in the assembler code for a C
-function or variable by writing the @code{asm} (or @code{__asm__})
-keyword after the declarator as follows:
-
-@example
-int foo asm ("myfoo") = 2;
-@end example
-
-@noindent
-This specifies that the name to be used for the variable @code{foo} in
-the assembler code should be @samp{myfoo} rather than the usual
-@samp{_foo}.
-
-On systems where an underscore is normally prepended to the name of a C
-function or variable, this feature allows you to define names for the
-linker that do not start with an underscore.
-
-You cannot use @code{asm} in this way in a function @emph{definition}; but
-you can get the same effect by writing a declaration for the function
-before its definition and putting @code{asm} there, like this:
-
-@example
-extern func () asm ("FUNC");
-
-func (x, y)
- int x, y;
-@dots{}
-@end example
-
-It is up to you to make sure that the assembler names you choose do not
-conflict with any other assembler symbols. Also, you must not use a
-register name; that would produce completely invalid assembler code. GNU
-CC does not as yet have the ability to store static variables in registers.
-Perhaps that will be added.
-
-@node Explicit Reg Vars
-@section Variables in Specified Registers
-@cindex explicit register variables
-@cindex variables in specified registers
-@cindex specified registers
-@cindex registers, global allocation
-
-GNU C allows you to put a few global variables into specified hardware
-registers. You can also specify the register in which an ordinary
-register variable should be allocated.
-
-@itemize @bullet
-@item
-Global register variables reserve registers throughout the program.
-This may be useful in programs such as programming language
-interpreters which have a couple of global variables that are accessed
-very often.
-
-@item
-Local register variables in specific registers do not reserve the
-registers. The compiler's data flow analysis is capable of determining
-where the specified registers contain live values, and where they are
-available for other uses. Stores into local register variables may be deleted
-when they appear to be dead according to dataflow analysis. References
-to local register variables may be deleted or moved or simplified.
-
-These local variables are sometimes convenient for use with the extended
-@code{asm} feature (@pxref{Extended Asm}), if you want to write one
-output of the assembler instruction directly into a particular register.
-(This will work provided the register you specify fits the constraints
-specified for that operand in the @code{asm}.)
-@end itemize
-
-@menu
-* Global Reg Vars::
-* Local Reg Vars::
-@end menu
-
-@node Global Reg Vars
-@subsection Defining Global Register Variables
-@cindex global register variables
-@cindex registers, global variables in
-
-You can define a global register variable in GNU C like this:
-
-@example
-register int *foo asm ("a5");
-@end example
-
-@noindent
-Here @code{a5} is the name of the register which should be used. Choose a
-register which is normally saved and restored by function calls on your
-machine, so that library routines will not clobber it.
-
-Naturally the register name is cpu-dependent, so you would need to
-conditionalize your program according to cpu type. The register
-@code{a5} would be a good choice on a 68000 for a variable of pointer
-type. On machines with register windows, be sure to choose a ``global''
-register that is not affected magically by the function call mechanism.
-
-In addition, operating systems on one type of cpu may differ in how they
-name the registers; then you would need additional conditionals. For
-example, some 68000 operating systems call this register @code{%a5}.
-
-Eventually there may be a way of asking the compiler to choose a register
-automatically, but first we need to figure out how it should choose and
-how to enable you to guide the choice. No solution is evident.
-
-Defining a global register variable in a certain register reserves that
-register entirely for this use, at least within the current compilation.
-The register will not be allocated for any other purpose in the functions
-in the current compilation. The register will not be saved and restored by
-these functions. Stores into this register are never deleted even if they
-would appear to be dead, but references may be deleted or moved or
-simplified.
-
-It is not safe to access the global register variables from signal
-handlers, or from more than one thread of control, because the system
-library routines may temporarily use the register for other things (unless
-you recompile them specially for the task at hand).
-
-@cindex @code{qsort}, and global register variables
-It is not safe for one function that uses a global register variable to
-call another such function @code{foo} by way of a third function
-@code{lose} that was compiled without knowledge of this variable (i.e. in a
-different source file in which the variable wasn't declared). This is
-because @code{lose} might save the register and put some other value there.
-For example, you can't expect a global register variable to be available in
-the comparison-function that you pass to @code{qsort}, since @code{qsort}
-might have put something else in that register. (If you are prepared to
-recompile @code{qsort} with the same global register variable, you can
-solve this problem.)
-
-If you want to recompile @code{qsort} or other source files which do not
-actually use your global register variable, so that they will not use that
-register for any other purpose, then it suffices to specify the compiler
-option @samp{-ffixed-@var{reg}}. You need not actually add a global
-register declaration to their source code.
-
-A function which can alter the value of a global register variable cannot
-safely be called from a function compiled without this variable, because it
-could clobber the value the caller expects to find there on return.
-Therefore, the function which is the entry point into the part of the
-program that uses the global register variable must explicitly save and
-restore the value which belongs to its caller.
-
-@cindex register variable after @code{longjmp}
-@cindex global register after @code{longjmp}
-@cindex value after @code{longjmp}
-@findex longjmp
-@findex setjmp
-On most machines, @code{longjmp} will restore to each global register
-variable the value it had at the time of the @code{setjmp}. On some
-machines, however, @code{longjmp} will not change the value of global
-register variables. To be portable, the function that called @code{setjmp}
-should make other arrangements to save the values of the global register
-variables, and to restore them in a @code{longjmp}. This way, the same
-thing will happen regardless of what @code{longjmp} does.
-
-All global register variable declarations must precede all function
-definitions. If such a declaration could appear after function
-definitions, the declaration would be too late to prevent the register from
-being used for other purposes in the preceding functions.
-
-Global register variables may not have initial values, because an
-executable file has no means to supply initial contents for a register.
-
-On the Sparc, there are reports that g3 @dots{} g7 are suitable
-registers, but certain library functions, such as @code{getwd}, as well
-as the subroutines for division and remainder, modify g3 and g4. g1 and
-g2 are local temporaries.
-
-On the 68000, a2 @dots{} a5 should be suitable, as should d2 @dots{} d7.
-Of course, it will not do to use more than a few of those.
-
-@node Local Reg Vars
-@subsection Specifying Registers for Local Variables
-@cindex local variables, specifying registers
-@cindex specifying registers for local variables
-@cindex registers for local variables
-
-You can define a local register variable with a specified register
-like this:
-
-@example
-register int *foo asm ("a5");
-@end example
-
-@noindent
-Here @code{a5} is the name of the register which should be used. Note
-that this is the same syntax used for defining global register
-variables, but for a local variable it would appear within a function.
-
-Naturally the register name is cpu-dependent, but this is not a
-problem, since specific registers are most often useful with explicit
-assembler instructions (@pxref{Extended Asm}). Both of these things
-generally require that you conditionalize your program according to
-cpu type.
-
-In addition, operating systems on one type of cpu may differ in how they
-name the registers; then you would need additional conditionals. For
-example, some 68000 operating systems call this register @code{%a5}.
-
-Defining such a register variable does not reserve the register; it
-remains available for other uses in places where flow control determines
-the variable's value is not live. However, these registers are made
-unavailable for use in the reload pass; excessive use of this feature
-leaves the compiler too few available registers to compile certain
-functions.
-
-This option does not guarantee that GNU CC will generate code that has
-this variable in the register you specify at all times. You may not
-code an explicit reference to this register in an @code{asm} statement
-and assume it will always refer to this variable.
-
-Stores into local register variables may be deleted when they appear to be dead
-according to dataflow analysis. References to local register variables may
-be deleted or moved or simplified.
-
-@node Alternate Keywords
-@section Alternate Keywords
-@cindex alternate keywords
-@cindex keywords, alternate
-
-The option @samp{-traditional} disables certain keywords; @samp{-ansi}
-disables certain others. This causes trouble when you want to use GNU C
-extensions, or ANSI C features, in a general-purpose header file that
-should be usable by all programs, including ANSI C programs and traditional
-ones. The keywords @code{asm}, @code{typeof} and @code{inline} cannot be
-used since they won't work in a program compiled with @samp{-ansi}, while
-the keywords @code{const}, @code{volatile}, @code{signed}, @code{typeof}
-and @code{inline} won't work in a program compiled with
-@samp{-traditional}.@refill
-
-The way to solve these problems is to put @samp{__} at the beginning and
-end of each problematical keyword. For example, use @code{__asm__}
-instead of @code{asm}, @code{__const__} instead of @code{const}, and
-@code{__inline__} instead of @code{inline}.
-
-Other C compilers won't accept these alternative keywords; if you want to
-compile with another compiler, you can define the alternate keywords as
-macros to replace them with the customary keywords. It looks like this:
-
-@example
-#ifndef __GNUC__
-#define __asm__ asm
-#endif
-@end example
-
-@samp{-pedantic} causes warnings for many GNU C extensions. You can
-prevent such warnings within one expression by writing
-@code{__extension__} before the expression. @code{__extension__} has no
-effect aside from this.
-
-@node Incomplete Enums
-@section Incomplete @code{enum} Types
-
-You can define an @code{enum} tag without specifying its possible values.
-This results in an incomplete type, much like what you get if you write
-@code{struct foo} without describing the elements. A later declaration
-which does specify the possible values completes the type.
-
-You can't allocate variables or storage using the type while it is
-incomplete. However, you can work with pointers to that type.
-
-This extension may not be very useful, but it makes the handling of
-@code{enum} more consistent with the way @code{struct} and @code{union}
-are handled.
-
-This extension is not supported by GNU C++.
-
-@node Function Names
-@section Function Names as Strings
-
-GNU CC predefines two string variables to be the name of the current function.
-The variable @code{__FUNCTION__} is the name of the function as it appears
-in the source. The variable @code{__PRETTY_FUNCTION__} is the name of
-the function pretty printed in a language specific fashion.
-
-These names are always the same in a C function, but in a C++ function
-they may be different. For example, this program:
-
-@smallexample
-extern "C" @{
-extern int printf (char *, ...);
-@}
-
-class a @{
- public:
- sub (int i)
- @{
- printf ("__FUNCTION__ = %s\n", __FUNCTION__);
- printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__);
- @}
-@};
-
-int
-main (void)
-@{
- a ax;
- ax.sub (0);
- return 0;
-@}
-@end smallexample
-
-@noindent
-gives this output:
-
-@smallexample
-__FUNCTION__ = sub
-__PRETTY_FUNCTION__ = int a::sub (int)
-@end smallexample
-
-These names are not macros: they are predefined string variables.
-For example, @samp{#ifdef __FUNCTION__} does not have any special
-meaning inside a function, since the preprocessor does not do anything
-special with the identifier @code{__FUNCTION__}.
-
-@node Return Address
-@section Getting the Return or Frame Address of a Function
-
-These functions may be used to get information about the callers of a
-function.
-
-@table @code
-@findex __builtin_return_address
-@item __builtin_return_address (@var{level})
-This function returns the return address of the current function, or of
-one of its callers. The @var{level} argument is number of frames to
-scan up the call stack. A value of @code{0} yields the return address
-of the current function, a value of @code{1} yields the return address
-of the caller of the current function, and so forth.
-
-The @var{level} argument must be a constant integer.
-
-On some machines it may be impossible to determine the return address of
-any function other than the current one; in such cases, or when the top
-of the stack has been reached, this function will return @code{0}.
-
-This function should only be used with a non-zero argument for debugging
-purposes.
-
-@findex __builtin_frame_address
-@item __builtin_frame_address (@var{level})
-This function is similar to @code{__builtin_return_address}, but it
-returns the address of the function frame rather than the return address
-of the function. Calling @code{__builtin_frame_address} with a value of
-@code{0} yields the frame address of the current function, a value of
-@code{1} yields the frame address of the caller of the current function,
-and so forth.
-
-The frame is the area on the stack which holds local variables and saved
-registers. The frame address is normally the address of the first word
-pushed on to the stack by the function. However, the exact definition
-depends upon the processor and the calling convention. If the processor
-has a dedicated frame pointer register, and the function has a frame,
-then @code{__builtin_frame_address} will return the value of the frame
-pointer register.
-
-The caveats that apply to @code{__builtin_return_address} apply to this
-function as well.
-@end table
-
-@node Other Builtins
-@section Other built-in functions provided by GNU CC
-
-GNU CC provides a large number of built-in functions other than the ones
-mentioned above. Some of these are for internal use in the processing
-of exceptions or variable-length argument lists and will not be
-documented here because they may change from time to time; we do not
-recommend general use of these functions.
-
-The remaining functions are provided for optimization purposes.
-
-GNU CC includes builtin versions of many of the functions in the
-standard C library. These will always be treated as having the same
-meaning as the C library function even if you specify the
-@samp{-fno-builtin} (@pxref{C Dialect Options}) option. These functions
-correspond to the C library functions @code{alloca}, @code{ffs},
-@code{abs}, @code{fabsf}, @code{fabs}, @code{fabsl}, @code{labs},
-@code{memcpy}, @code{memcmp}, @code{strcmp}, @code{strcpy},
-@code{strlen}, @code{sqrtf}, @code{sqrt}, @code{sqrtl}, @code{sinf},
-@code{sin}, @code{sinl}, @code{cosf}, @code{cos}, and @code{cosl}.
-
-@findex __builtin_constant_p
-You can use the builtin function @code{__builtin_constant_p} to
-determine if a value is known to be constant at compile-time and hence
-that GNU CC can perform constant-folding on expressions involving that
-value. The argument of the function is the value to test. The function
-returns the integer 1 if the argument is known to be a compile-time
-constant and 0 if it is not known to be a compile-time constant. A
-return of 0 does not indicate that the value is @emph{not} a constant,
-but merely that GNU CC cannot prove it is a constant with the specified
-value of the @samp{-O} option.
-
-You would typically use this function in an embedded application where
-memory was a critical resource. If you have some complex calculation,
-you may want it to be folded if it involves constants, but need to call
-a function if it does not. For example:
-
-@smallexample
-#define Scale_Value(X) \
- (__builtin_constant_p (X) ? ((X) * SCALE + OFFSET) : Scale (X))
-@end smallexample
-
-You may use this builtin function in either a macro or an inline
-function. However, if you use it in an inlined function and pass an
-argument of the function as the argument to the builtin, GNU CC will
-never return 1 when you call the inline function with a string constant
-or constructor expression (@pxref{Constructors}) and will not return 1
-when you pass a constant numeric value to the inline function unless you
-specify the @samp{-O} option.
-
-@node C++ Extensions
-@chapter Extensions to the C++ Language
-@cindex extensions, C++ language
-@cindex C++ language extensions
-
-The GNU compiler provides these extensions to the C++ language (and you
-can also use most of the C language extensions in your C++ programs). If you
-want to write code that checks whether these features are available, you can
-test for the GNU compiler the same way as for C programs: check for a
-predefined macro @code{__GNUC__}. You can also use @code{__GNUG__} to
-test specifically for GNU C++ (@pxref{Standard Predefined,,Standard
-Predefined Macros,cpp.info,The C Preprocessor}).
-
-@menu
-* Naming Results:: Giving a name to C++ function return values.
-* Min and Max:: C++ Minimum and maximum operators.
-* Destructors and Goto:: Goto is safe to use in C++ even when destructors
- are needed.
-* C++ Interface:: You can use a single C++ header file for both
- declarations and definitions.
-* Template Instantiation:: Methods for ensuring that exactly one copy of
- each needed template instantiation is emitted.
-* Bound member functions:: You can extract a function pointer to the
- method denoted by a @samp{->*} or @samp{.*} expression.
-* C++ Signatures:: You can specify abstract types to get subtype
- polymorphism independent from inheritance.
-
-@end menu
-
-@node Naming Results
-@section Named Return Values in C++
-
-@cindex @code{return}, in C++ function header
-@cindex return value, named, in C++
-@cindex named return value in C++
-@cindex C++ named return value
-GNU C++ extends the function-definition syntax to allow you to specify a
-name for the result of a function outside the body of the definition, in
-C++ programs:
-
-@example
-@group
-@var{type}
-@var{functionname} (@var{args}) return @var{resultname};
-@{
- @dots{}
- @var{body}
- @dots{}
-@}
-@end group
-@end example
-
-You can use this feature to avoid an extra constructor call when
-a function result has a class type. For example, consider a function
-@code{m}, declared as @w{@samp{X v = m ();}}, whose result is of class
-@code{X}:
-
-@example
-X
-m ()
-@{
- X b;
- b.a = 23;
- return b;
-@}
-@end example
-
-@cindex implicit argument: return value
-Although @code{m} appears to have no arguments, in fact it has one implicit
-argument: the address of the return value. At invocation, the address
-of enough space to hold @code{v} is sent in as the implicit argument.
-Then @code{b} is constructed and its @code{a} field is set to the value
-23. Finally, a copy constructor (a constructor of the form @samp{X(X&)})
-is applied to @code{b}, with the (implicit) return value location as the
-target, so that @code{v} is now bound to the return value.
-
-But this is wasteful. The local @code{b} is declared just to hold
-something that will be copied right out. While a compiler that
-combined an ``elision'' algorithm with interprocedural data flow
-analysis could conceivably eliminate all of this, it is much more
-practical to allow you to assist the compiler in generating
-efficient code by manipulating the return value explicitly,
-thus avoiding the local variable and copy constructor altogether.
-
-Using the extended GNU C++ function-definition syntax, you can avoid the
-temporary allocation and copying by naming @code{r} as your return value
-at the outset, and assigning to its @code{a} field directly:
-
-@example
-X
-m () return r;
-@{
- r.a = 23;
-@}
-@end example
-
-@noindent
-The declaration of @code{r} is a standard, proper declaration, whose effects
-are executed @strong{before} any of the body of @code{m}.
-
-Functions of this type impose no additional restrictions; in particular,
-you can execute @code{return} statements, or return implicitly by
-reaching the end of the function body (``falling off the edge'').
-Cases like
-
-@example
-X
-m () return r (23);
-@{
- return;
-@}
-@end example
-
-@noindent
-(or even @w{@samp{X m () return r (23); @{ @}}}) are unambiguous, since
-the return value @code{r} has been initialized in either case. The
-following code may be hard to read, but also works predictably:
-
-@example
-X
-m () return r;
-@{
- X b;
- return b;
-@}
-@end example
-
-The return value slot denoted by @code{r} is initialized at the outset,
-but the statement @samp{return b;} overrides this value. The compiler
-deals with this by destroying @code{r} (calling the destructor if there
-is one, or doing nothing if there is not), and then reinitializing
-@code{r} with @code{b}.
-
-This extension is provided primarily to help people who use overloaded
-operators, where there is a great need to control not just the
-arguments, but the return values of functions. For classes where the
-copy constructor incurs a heavy performance penalty (especially in the
-common case where there is a quick default constructor), this is a major
-savings. The disadvantage of this extension is that you do not control
-when the default constructor for the return value is called: it is
-always called at the beginning.
-
-@node Min and Max
-@section Minimum and Maximum Operators in C++
-
-It is very convenient to have operators which return the ``minimum'' or the
-``maximum'' of two arguments. In GNU C++ (but not in GNU C),
-
-@table @code
-@item @var{a} <? @var{b}
-@findex <?
-@cindex minimum operator
-is the @dfn{minimum}, returning the smaller of the numeric values
-@var{a} and @var{b};
-
-@item @var{a} >? @var{b}
-@findex >?
-@cindex maximum operator
-is the @dfn{maximum}, returning the larger of the numeric values @var{a}
-and @var{b}.
-@end table
-
-These operations are not primitive in ordinary C++, since you can
-use a macro to return the minimum of two things in C++, as in the
-following example.
-
-@example
-#define MIN(X,Y) ((X) < (Y) ? : (X) : (Y))
-@end example
-
-@noindent
-You might then use @w{@samp{int min = MIN (i, j);}} to set @var{min} to
-the minimum value of variables @var{i} and @var{j}.
-
-However, side effects in @code{X} or @code{Y} may cause unintended
-behavior. For example, @code{MIN (i++, j++)} will fail, incrementing
-the smaller counter twice. A GNU C extension allows you to write safe
-macros that avoid this kind of problem (@pxref{Naming Types,,Naming an
-Expression's Type}). However, writing @code{MIN} and @code{MAX} as
-macros also forces you to use function-call notation for a
-fundamental arithmetic operation. Using GNU C++ extensions, you can
-write @w{@samp{int min = i <? j;}} instead.
-
-Since @code{<?} and @code{>?} are built into the compiler, they properly
-handle expressions with side-effects; @w{@samp{int min = i++ <? j++;}}
-works correctly.
-
-@node Destructors and Goto
-@section @code{goto} and Destructors in GNU C++
-
-@cindex @code{goto} in C++
-@cindex destructors vs @code{goto}
-In C++ programs, you can safely use the @code{goto} statement. When you
-use it to exit a block which contains aggregates requiring destructors,
-the destructors will run before the @code{goto} transfers control.
-
-@cindex constructors vs @code{goto}
-The compiler still forbids using @code{goto} to @emph{enter} a scope
-that requires constructors.
-
-@node C++ Interface
-@section Declarations and Definitions in One Header
-
-@cindex interface and implementation headers, C++
-@cindex C++ interface and implementation headers
-C++ object definitions can be quite complex. In principle, your source
-code will need two kinds of things for each object that you use across
-more than one source file. First, you need an @dfn{interface}
-specification, describing its structure with type declarations and
-function prototypes. Second, you need the @dfn{implementation} itself.
-It can be tedious to maintain a separate interface description in a
-header file, in parallel to the actual implementation. It is also
-dangerous, since separate interface and implementation definitions may
-not remain parallel.
-
-@cindex pragmas, interface and implementation
-With GNU C++, you can use a single header file for both purposes.
-
-@quotation
-@emph{Warning:} The mechanism to specify this is in transition. For the
-nonce, you must use one of two @code{#pragma} commands; in a future
-release of GNU C++, an alternative mechanism will make these
-@code{#pragma} commands unnecessary.
-@end quotation
-
-The header file contains the full definitions, but is marked with
-@samp{#pragma interface} in the source code. This allows the compiler
-to use the header file only as an interface specification when ordinary
-source files incorporate it with @code{#include}. In the single source
-file where the full implementation belongs, you can use either a naming
-convention or @samp{#pragma implementation} to indicate this alternate
-use of the header file.
-
-@table @code
-@item #pragma interface
-@itemx #pragma interface "@var{subdir}/@var{objects}.h"
-@kindex #pragma interface
-Use this directive in @emph{header files} that define object classes, to save
-space in most of the object files that use those classes. Normally,
-local copies of certain information (backup copies of inline member
-functions, debugging information, and the internal tables that implement
-virtual functions) must be kept in each object file that includes class
-definitions. You can use this pragma to avoid such duplication. When a
-header file containing @samp{#pragma interface} is included in a
-compilation, this auxiliary information will not be generated (unless
-the main input source file itself uses @samp{#pragma implementation}).
-Instead, the object files will contain references to be resolved at link
-time.
-
-The second form of this directive is useful for the case where you have
-multiple headers with the same name in different directories. If you
-use this form, you must specify the same string to @samp{#pragma
-implementation}.
-
-@item #pragma implementation
-@itemx #pragma implementation "@var{objects}.h"
-@kindex #pragma implementation
-Use this pragma in a @emph{main input file}, when you want full output from
-included header files to be generated (and made globally visible). The
-included header file, in turn, should use @samp{#pragma interface}.
-Backup copies of inline member functions, debugging information, and the
-internal tables used to implement virtual functions are all generated in
-implementation files.
-
-@cindex implied @code{#pragma implementation}
-@cindex @code{#pragma implementation}, implied
-@cindex naming convention, implementation headers
-If you use @samp{#pragma implementation} with no argument, it applies to
-an include file with the same basename@footnote{A file's @dfn{basename}
-was the name stripped of all leading path information and of trailing
-suffixes, such as @samp{.h} or @samp{.C} or @samp{.cc}.} as your source
-file. For example, in @file{allclass.cc}, giving just
-@samp{#pragma implementation}
-by itself is equivalent to @samp{#pragma implementation "allclass.h"}.
-
-In versions of GNU C++ prior to 2.6.0 @file{allclass.h} was treated as
-an implementation file whenever you would include it from
-@file{allclass.cc} even if you never specified @samp{#pragma
-implementation}. This was deemed to be more trouble than it was worth,
-however, and disabled.
-
-If you use an explicit @samp{#pragma implementation}, it must appear in
-your source file @emph{before} you include the affected header files.
-
-Use the string argument if you want a single implementation file to
-include code from multiple header files. (You must also use
-@samp{#include} to include the header file; @samp{#pragma
-implementation} only specifies how to use the file---it doesn't actually
-include it.)
-
-There is no way to split up the contents of a single header file into
-multiple implementation files.
-@end table
-
-@cindex inlining and C++ pragmas
-@cindex C++ pragmas, effect on inlining
-@cindex pragmas in C++, effect on inlining
-@samp{#pragma implementation} and @samp{#pragma interface} also have an
-effect on function inlining.
-
-If you define a class in a header file marked with @samp{#pragma
-interface}, the effect on a function defined in that class is similar to
-an explicit @code{extern} declaration---the compiler emits no code at
-all to define an independent version of the function. Its definition
-is used only for inlining with its callers.
-
-Conversely, when you include the same header file in a main source file
-that declares it as @samp{#pragma implementation}, the compiler emits
-code for the function itself; this defines a version of the function
-that can be found via pointers (or by callers compiled without
-inlining). If all calls to the function can be inlined, you can avoid
-emitting the function by compiling with @samp{-fno-implement-inlines}.
-If any calls were not inlined, you will get linker errors.
-
-@node Template Instantiation
-@section Where's the Template?
-
-@cindex template instantiation
-
-C++ templates are the first language feature to require more
-intelligence from the environment than one usually finds on a UNIX
-system. Somehow the compiler and linker have to make sure that each
-template instance occurs exactly once in the executable if it is needed,
-and not at all otherwise. There are two basic approaches to this
-problem, which I will refer to as the Borland model and the Cfront model.
-
-@table @asis
-@item Borland model
-Borland C++ solved the template instantiation problem by adding the code
-equivalent of common blocks to their linker; the compiler emits template
-instances in each translation unit that uses them, and the linker
-collapses them together. The advantage of this model is that the linker
-only has to consider the object files themselves; there is no external
-complexity to worry about. This disadvantage is that compilation time
-is increased because the template code is being compiled repeatedly.
-Code written for this model tends to include definitions of all
-templates in the header file, since they must be seen to be
-instantiated.
-
-@item Cfront model
-The AT&T C++ translator, Cfront, solved the template instantiation
-problem by creating the notion of a template repository, an
-automatically maintained place where template instances are stored. A
-more modern version of the repository works as follows: As individual
-object files are built, the compiler places any template definitions and
-instantiations encountered in the repository. At link time, the link
-wrapper adds in the objects in the repository and compiles any needed
-instances that were not previously emitted. The advantages of this
-model are more optimal compilation speed and the ability to use the
-system linker; to implement the Borland model a compiler vendor also
-needs to replace the linker. The disadvantages are vastly increased
-complexity, and thus potential for error; for some code this can be
-just as transparent, but in practice it can been very difficult to build
-multiple programs in one directory and one program in multiple
-directories. Code written for this model tends to separate definitions
-of non-inline member templates into a separate file, which should be
-compiled separately.
-@end table
-
-When used with GNU ld version 2.8 or later on an ELF system such as
-Linux/GNU or Solaris 2, or on Microsoft Windows, g++ supports the
-Borland model. On other systems, g++ implements neither automatic
-model.
-
-A future version of g++ will support a hybrid model whereby the compiler
-will emit any instantiations for which the template definition is
-included in the compile, and store template definitions and
-instantiation context information into the object file for the rest.
-The link wrapper will extract that information as necessary and invoke
-the compiler to produce the remaining instantiations. The linker will
-then combine duplicate instantiations.
-
-In the mean time, you have the following options for dealing with
-template instantiations:
-
-@enumerate
-@item
-Compile your template-using code with @samp{-frepo}. The compiler will
-generate files with the extension @samp{.rpo} listing all of the
-template instantiations used in the corresponding object files which
-could be instantiated there; the link wrapper, @samp{collect2}, will
-then update the @samp{.rpo} files to tell the compiler where to place
-those instantiations and rebuild any affected object files. The
-link-time overhead is negligible after the first pass, as the compiler
-will continue to place the instantiations in the same files.
-
-This is your best option for application code written for the Borland
-model, as it will just work. Code written for the Cfront model will
-need to be modified so that the template definitions are available at
-one or more points of instantiation; usually this is as simple as adding
-@code{#include <tmethods.cc>} to the end of each template header.
-
-For library code, if you want the library to provide all of the template
-instantiations it needs, just try to link all of its object files
-together; the link will fail, but cause the instantiations to be
-generated as a side effect. Be warned, however, that this may cause
-conflicts if multiple libraries try to provide the same instantiations.
-For greater control, use explicit instantiation as described in the next
-option.
-
-@item
-Compile your code with @samp{-fno-implicit-templates} to disable the
-implicit generation of template instances, and explicitly instantiate
-all the ones you use. This approach requires more knowledge of exactly
-which instances you need than do the others, but it's less
-mysterious and allows greater control. You can scatter the explicit
-instantiations throughout your program, perhaps putting them in the
-translation units where the instances are used or the translation units
-that define the templates themselves; you can put all of the explicit
-instantiations you need into one big file; or you can create small files
-like
-
-@example
-#include "Foo.h"
-#include "Foo.cc"
-
-template class Foo<int>;
-template ostream& operator <<
- (ostream&, const Foo<int>&);
-@end example
-
-for each of the instances you need, and create a template instantiation
-library from those.
-
-If you are using Cfront-model code, you can probably get away with not
-using @samp{-fno-implicit-templates} when compiling files that don't
-@samp{#include} the member template definitions.
-
-If you use one big file to do the instantiations, you may want to
-compile it without @samp{-fno-implicit-templates} so you get all of the
-instances required by your explicit instantiations (but not by any
-other files) without having to specify them as well.
-
-g++ has extended the template instantiation syntax outlined in the
-Working Paper to allow forward declaration of explicit instantiations
-and instantiation of the compiler support data for a template class
-(i.e. the vtable) without instantiating any of its members:
-
-@example
-extern template int max (int, int);
-inline template class Foo<int>;
-@end example
-
-@item
-Do nothing. Pretend g++ does implement automatic instantiation
-management. Code written for the Borland model will work fine, but
-each translation unit will contain instances of each of the templates it
-uses. In a large program, this can lead to an unacceptable amount of code
-duplication.
-
-@item
-Add @samp{#pragma interface} to all files containing template
-definitions. For each of these files, add @samp{#pragma implementation
-"@var{filename}"} to the top of some @samp{.C} file which
-@samp{#include}s it. Then compile everything with
-@samp{-fexternal-templates}. The templates will then only be expanded
-in the translation unit which implements them (i.e. has a @samp{#pragma
-implementation} line for the file where they live); all other files will
-use external references. If you're lucky, everything should work
-properly. If you get undefined symbol errors, you need to make sure
-that each template instance which is used in the program is used in the
-file which implements that template. If you don't have any use for a
-particular instance in that file, you can just instantiate it
-explicitly, using the syntax from the latest C++ working paper:
-
-@example
-template class A<int>;
-template ostream& operator << (ostream&, const A<int>&);
-@end example
-
-This strategy will work with code written for either model. If you are
-using code written for the Cfront model, the file containing a class
-template and the file containing its member templates should be
-implemented in the same translation unit.
-
-A slight variation on this approach is to instead use the flag
-@samp{-falt-external-templates}; this flag causes template
-instances to be emitted in the translation unit that implements the
-header where they are first instantiated, rather than the one which
-implements the file where the templates are defined. This header must
-be the same in all translation units, or things are likely to break.
-
-@xref{C++ Interface,,Declarations and Definitions in One Header}, for
-more discussion of these pragmas.
-@end enumerate
-
-@node Bound member functions
-@section Extracting the function pointer from a bound pointer to member function
-
-@cindex pmf
-@cindex pointer to member function
-@cindex bound pointer to member function
-
-In C++, pointer to member functions (PMFs) are implemented using a wide
-pointer of sorts to handle all the possible call mechanisms; the PMF
-needs to store information about how to adjust the @samp{this} pointer,
-and if the function pointed to is virtual, where to find the vtable, and
-where in the vtable to look for the member function. If you are using
-PMFs in an inner loop, you should really reconsider that decision. If
-that is not an option, you can extract the pointer to the function that
-would be called for a given object/PMF pair and call it directly inside
-the inner loop, to save a bit of time.
-
-Note that you will still be paying the penalty for the call through a
-function pointer; on most modern architectures, such a call defeats the
-branch prediction features of the CPU. This is also true of normal
-virtual function calls.
-
-The syntax for this extension is
-
-@example
-extern A a;
-extern int (A::*fp)();
-typedef int (*fptr)(A *);
-
-fptr p = (fptr)(a.*fp);
-@end example
-
-You must specify @samp{-Wno-pmf-conversions} to use this extension.
-
-@node C++ Signatures
-@section Type Abstraction using Signatures
-
-@findex signature
-@cindex type abstraction, C++
-@cindex C++ type abstraction
-@cindex subtype polymorphism, C++
-@cindex C++ subtype polymorphism
-@cindex signatures, C++
-@cindex C++ signatures
-
-In GNU C++, you can use the keyword @code{signature} to define a
-completely abstract class interface as a datatype. You can connect this
-abstraction with actual classes using signature pointers. If you want
-to use signatures, run the GNU compiler with the
-@samp{-fhandle-signatures} command-line option. (With this option, the
-compiler reserves a second keyword @code{sigof} as well, for a future
-extension.)
-
-Roughly, signatures are type abstractions or interfaces of classes.
-Some other languages have similar facilities. C++ signatures are
-related to ML's signatures, Haskell's type classes, definition modules
-in Modula-2, interface modules in Modula-3, abstract types in Emerald,
-type modules in Trellis/Owl, categories in Scratchpad II, and types in
-POOL-I. For a more detailed discussion of signatures, see
-@cite{Signatures: A Language Extension for Improving Type Abstraction and
-Subtype Polymorphism in C++}
-by @w{Gerald} Baumgartner and Vincent F. Russo (Tech report
-CSD--TR--95--051, Dept. of Computer Sciences, Purdue University,
-August 1995, a slightly improved version appeared in
-@emph{Software---Practice & Experience}, @b{25}(8), pp. 863--889,
-August 1995). You can get the tech report by anonymous FTP from
-@code{ftp.cs.purdue.edu} in @file{pub/gb/Signature-design.ps.gz}.
-
-Syntactically, a signature declaration is a collection of
-member function declarations and nested type declarations.
-For example, this signature declaration defines a new abstract type
-@code{S} with member functions @samp{int foo ()} and @samp{int bar (int)}:
-
-@example
-signature S
-@{
- int foo ();
- int bar (int);
-@};
-@end example
-
-Since signature types do not include implementation definitions, you
-cannot write an instance of a signature directly. Instead, you can
-define a pointer to any class that contains the required interfaces as a
-@dfn{signature pointer}. Such a class @dfn{implements} the signature
-type.
-@c Eventually signature references should work too.
-
-To use a class as an implementation of @code{S}, you must ensure that
-the class has public member functions @samp{int foo ()} and @samp{int
-bar (int)}. The class can have other member functions as well, public
-or not; as long as it offers what's declared in the signature, it is
-suitable as an implementation of that signature type.
-
-For example, suppose that @code{C} is a class that meets the
-requirements of signature @code{S} (@code{C} @dfn{conforms to}
-@code{S}). Then
-
-@example
-C obj;
-S * p = &obj;
-@end example
-
-@noindent
-defines a signature pointer @code{p} and initializes it to point to an
-object of type @code{C}.
-The member function call @w{@samp{int i = p->foo ();}}
-executes @samp{obj.foo ()}.
-
-@cindex @code{signature} in C++, advantages
-Abstract virtual classes provide somewhat similar facilities in standard
-C++. There are two main advantages to using signatures instead:
-
-@enumerate
-@item
-Subtyping becomes independent from inheritance. A class or signature
-type @code{T} is a subtype of a signature type @code{S} independent of
-any inheritance hierarchy as long as all the member functions declared
-in @code{S} are also found in @code{T}. So you can define a subtype
-hierarchy that is completely independent from any inheritance
-(implementation) hierarchy, instead of being forced to use types that
-mirror the class inheritance hierarchy.
-
-@item
-Signatures allow you to work with existing class hierarchies as
-implementations of a signature type. If those class hierarchies are
-only available in compiled form, you're out of luck with abstract virtual
-classes, since an abstract virtual class cannot be retrofitted on top of
-existing class hierarchies. So you would be required to write interface
-classes as subtypes of the abstract virtual class.
-@end enumerate
-
-@cindex default implementation, signature member function
-@cindex signature member function default implementation
-There is one more detail about signatures. A signature declaration can
-contain member function @emph{definitions} as well as member function
-declarations. A signature member function with a full definition is
-called a @emph{default implementation}; classes need not contain that
-particular interface in order to conform. For example, a
-class @code{C} can conform to the signature
-
-@example
-signature T
-@{
- int f (int);
- int f0 () @{ return f (0); @};
-@};
-@end example
-
-@noindent
-whether or not @code{C} implements the member function @samp{int f0 ()}.
-If you define @code{C::f0}, that definition takes precedence;
-otherwise, the default implementation @code{S::f0} applies.
-
-@ignore
-There will be more support for signatures in the future.
-Add to this doc as the implementation grows.
-In particular, the following features are planned but not yet
-implemented:
-@itemize @bullet
-@item signature references,
-@item signature inheritance,
-@item the @code{sigof} construct for extracting the signature information
- of a class,
-@item views for renaming member functions when matching a class type
- with a signature type,
-@item specifying exceptions with signature member functions, and
-@item signature templates.
-@end itemize
-This list is roughly in the order in which we intend to implement
-them. Watch this space for updates.
-@end ignore
diff --git a/gcc/fixcpp b/gcc/fixcpp
deleted file mode 100755
index 044353f..0000000
--- a/gcc/fixcpp
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/bin/sh
-#
-# NAME:
-# fixcpp - fix CPP errors
-#
-# SYNOPSIS:
-# fixcpp [-c][-p patch_file][-b bak_dir][-n new_dir] files(s)
-#
-# DESCRIPTION:
-# For each named file, use sed(1) to fixup any descriptive
-# text after #else or #endif or that is not properly
-# commented as this causes ANSI compilers to generate
-# unnecessary warnings.
-#
-# Naturally this script is not guaranteed to be bullet
-# proof, use of -n or -b is advisable!
-#
-# -c causes fixcpp to make sure that only files that
-# needed changing are affected by returning the original
-# file to its original location if no changes were needed.
-#
-# -p causes fixcpp to append to a patch file the context
-# diffs of the changes wrought.
-#
-# SEE ALSO:
-# sed(1)
-#
-# AMENDED:
-# 90/08/08 22:46:32 (sjg)
-#
-# RELEASED:
-# 90/08/08 22:46:34 v1.4
-#
-# SCCSID:
-# @(#)fixcpp.sh 1.4 90/08/08 22:46:32 (sjg)
-#
-# @(#)Copyright (c) 1990 Simon J. Gerraty
-#
-# This is free software. It comes with NO WARRANTY.
-# Everyone is granted permission to copy, modify and
-# redistribute this source code provided that all
-# recipients are given similar rights, and that the above
-# copyright notice and this notice are preserved in all
-# copies.
-
-TMPF=/tmp/fixcpp.$$
-NEWDIR=
-BAKDIR=
-PATCHF=
-CHECK=
-
-set -- `getopt "cp:b:n:" $*`
-if [ $? != 0 ]; then
- echo "$0 [-c][-p patch_file][-b bakup_dir][-n new_dir] file [file ...]" >&2
- exit 1
-fi
-for i in $*
-do
- case $i in
- -c) CHECK=yes; shift;;
- -p) PATCHF=$2; shift 2;;
- -b) BAKDIR=$2; shift 2;;
- -n) NEWDIR=$2; shift 2;;
- --) shift; break;;
- esac
-done
-NEWDIR=${NEWDIR:-.}
-if [ $BAKDIR ]; then
- if [ ! -d $BAKDIR ]; then
- echo "$0: no such directory -- $BAKDIR" >&2
- exit 1
- fi
-fi
-
-
-
-for i in $*
-do
- if [ $BAKDIR ]; then
- mv $i $BAKDIR
- infile=$BAKDIR/$i
- else
- if [ "$NEWDIR" = "." ]; then
- mv $i ${TMPF}
- infile=${TMPF}
- else
- infile=$i
- fi
- fi
- sed -e 's;^#\([ ]*e[nl][^ ]*[ ][ ]*\)\([^/ ][^\*].*\);#\1/* \2 */;' -e 's;^#\([ ]*e[nl][^ ]*[ ][ ]*\)\([^/ ]\)$;#\1/* \2 */;' $infile >${NEWDIR}/$i
- if [ "${CHECK}" = "yes" -o ${PATCHF} ]; then
- if cmp -s $infile ${NEWDIR}/$i ; then
- if [ "${CHECK}" = "yes" ]; then
- if [ $BAKDIR ]; then
- mv $infile ${NEWDIR}/$i
- else
- rm ${NEWDIR}/$i
- fi
- fi
- else
- if [ $PATCHF ]; then
- diff -c $infile ${NEWDIR}/$i >> ${PATCHF}
- fi
- fi
- fi
-
-done
-
-rm -f ${TMPF}
diff --git a/gcc/flags.h b/gcc/flags.h
index 0ffa1ba..5872372 100755
--- a/gcc/flags.h
+++ b/gcc/flags.h
@@ -87,14 +87,6 @@ extern int warn_inline;
extern int warn_uninitialized;
-/* Zero if unknown pragmas are ignored
- One if the compiler should warn about an unknown pragma not in
- a system include file.
- Greater than one if the compiler should warn for all unknown
- pragmas. */
-
-extern int warn_unknown_pragmas;
-
/* Nonzero means warn about all declarations which shadow others. */
extern int warn_shadow;
@@ -154,10 +146,6 @@ extern int flag_print_asm_name;
/* Now the symbols that are set with `-f' switches. */
-/* Nonzero means `char' should be signed. */
-
-extern int flag_signed_char;
-
/* Nonzero means give an enum type only as many bytes as it needs. */
extern int flag_short_enums;
@@ -376,10 +364,6 @@ extern int flag_verbose_asm;
extern int flag_debug_asm;
-/* -fgnu-linker specifies use of the GNU linker for initializations.
- -fno-gnu-linker says that collect will be used. */
-extern int flag_gnu_linker;
-
/* CYGNUS LOCAL unaligned-struct-hack */
/* This is a hack. Disable the effect of SLOW_BYTE_ACCESS, so that references
to aligned fields inside of unaligned structures can work. That is, we
diff --git a/gcc/gcc.1 b/gcc/gcc.1
deleted file mode 100755
index 88ff6c4..0000000
--- a/gcc/gcc.1
+++ /dev/null
@@ -1,4191 +0,0 @@
-.\" Copyright (c) 1991, 1992, 1993, 1994 Free Software Foundation -*-Text-*-
-.\" See section COPYING for conditions for redistribution
-.\"
-.\" Set up \*(lq, \*(rq if -man hasn't already set it up.
-.if @@\*(lq@ \{\
-. ds lq "
-. if t .ds lq ``
-. if !@@\(lq@ .ds lq "\(lq
-.\}
-.if @@\*(rq@ \{\
-. ds rq "
-. if t .ds rq ''
-. if !@@\(rq@ .ds rq "\(rq
-.\}
-.de Id
-.ds Rv \\$3
-.ds Dt \\$4
-..
-.de Sp
-.if n .sp
-.if t .sp 0.4
-..
-.Id $Id: gcc.1,v 1.99 1998/11/11 05:48:47 law Exp $
-.TH GCC 1 "\*(Dt" "GNU Tools" "GNU Tools"
-.SH NAME
-gcc, g++ \- GNU project C and C++ Compiler (egcs-1.1)
-.SH SYNOPSIS
-.B gcc
-.RI "[ " option " | " filename " ].\|.\|."
-.br
-.B g++
-.RI "[ " option " | " filename " ].\|.\|."
-.SH WARNING
-The information in this man page is an extract from the full
-documentation of the GNU C compiler, and is limited to the meaning of
-the options.
-.PP
-This man page is not kept up to date except when volunteers want to
-maintain it. If you find a discrepancy between the man page and the
-software, please check the Info file, which is the authoritative
-documentation.
-.PP
-If we find that the things in this man page that are out of date cause
-significant confusion or complaints, we will stop distributing the man
-page. The alternative, updating the man page when we update the Info
-file, is impossible because the rest of the work of maintaining GNU CC
-leaves us no time for that. The GNU project regards man pages as
-obsolete and should not let them take time away from other things.
-.PP
-For complete and current documentation, refer to the Info file `\|\c
-.B gcc\c
-\&\|' or the manual
-.I
-Using and Porting GNU CC (for version 2.0)\c
-\&. Both are made from the Texinfo source file
-.BR gcc.texinfo .
-.SH DESCRIPTION
-The C and C++ compilers are integrated. Both process input files
-through one or more of four stages: preprocessing, compilation,
-assembly, and linking. Source filename suffixes identify the source
-language, but which name you use for the compiler governs default
-assumptions:
-.TP
-.B gcc
-assumes preprocessed (\c
-.B .i\c
-\&) files are C and assumes C style linking.
-.TP
-.B g++
-assumes preprocessed (\c
-.B .i\c
-\&) files are C++ and assumes C++ style linking.
-.PP
-Suffixes of source file names indicate the language and kind of
-processing to be done:
-.Sp
-.nf
-.ta \w'\fB.cxx\fP 'u
-\&\fB.c\fP C source; preprocess, compile, assemble
-\&\fB.C\fP C++ source; preprocess, compile, assemble
-\&\fB.cc\fP C++ source; preprocess, compile, assemble
-\&\fB.cxx\fP C++ source; preprocess, compile, assemble
-\&\fB.m\fP Objective-C source; preprocess, compile, assemble
-\&\fB.i\fP preprocessed C; compile, assemble
-\&\fB.ii\fP preprocessed C++; compile, assemble
-\&\fB.s\fP Assembler source; assemble
-\&\fB.S\fP Assembler source; preprocess, assemble
-\&\fB.h\fP Preprocessor file; not usually named on command line
-.Sp
-.fi
-Files with other suffixes are passed to the linker. Common cases include:
-.Sp
-.nf
-\&\fB.o\fP Object file
-\&\fB.a\fP Archive file
-.br
-.fi
-.Sp
-Linking is always the last stage unless you use one of the
-.BR \-c ,
-.BR \-S ,
-or
-.B \-E
-options to avoid it (or unless compilation errors stop the whole
-process). For the link stage, all
-.B .o
-files corresponding to source files,
-.B \-l
-libraries, unrecognized filenames (including named
-.B .o
-object files and
-.B .a
-archives)
-are passed to the linker in command-line order.
-.SH OPTIONS
-Options must be separate: `\|\c
-.B \-dr\c
-\&\|' is quite different from `\|\c
-.B \-d \-r
-\&\|'.
-.PP
-Most `\|\c
-.B \-f\c
-\&\|' and `\|\c
-.B \-W\c
-\&\|' options have two contrary forms:
-.BI \-f name
-and
-.BI \-fno\- name\c
-\& (or
-.BI \-W name
-and
-.BI \-Wno\- name\c
-\&). Only the non-default forms are shown here.
-.PP
-Here is a summary of all the options, grouped by type. Explanations are
-in the following sections.
-.hy 0
-.na
-.TP
-.B Overall Options
-.br
-\-c
-\-S
-\-E
-.RI "\-o " file
-\-pipe
-\-v
-.RI "\-x " language
-.TP
-.B Language Options
-\-ansi
-\-fall\-virtual
-\-fcond\-mismatch
-\-fdollars\-in\-identifiers
-\-fenum\-int\-equiv
-\-fexternal\-templates
-\-fno\-asm
-\-fno\-builtin
-\-fhosted
-\-fno\-hosted
-\-ffreestanding
-\-fno\-freestanding
-\-fno\-strict\-prototype
-\-fsigned\-bitfields
-\-fsigned\-char
-\-fthis\-is\-variable
-\-funsigned\-bitfields
-\-funsigned\-char
-\-fwritable\-strings
-\-traditional
-\-traditional\-cpp
-\-trigraphs
-.TP
-.B Warning Options
-\-fsyntax\-only
-\-pedantic
-\-pedantic\-errors
-\-w
-\-W
-\-Wall
-\-Waggregate\-return
-\-Wcast\-align
-\-Wcast\-qual
-\-Wchar\-subscript
-\-Wcomment
-\-Wconversion
-\-Wenum\-clash
-\-Werror
-\-Wformat
-.RI \-Wid\-clash\- len
-\-Wimplicit
-\-Wimplicit\-int
-\-Wimplicit\-function\-declaration
-\-Winline
-\-Wlong\-long
-\-Wmain
-\-Wmissing\-prototypes
-\-Wmissing\-declarations
-\-Wnested\-externs
-\-Wno\-import
-\-Wparentheses
-\-Wpointer\-arith
-\-Wredundant\-decls
-\-Wreturn\-type
-\-Wshadow
-\-Wstrict\-prototypes
-\-Wswitch
-\-Wtemplate\-debugging
-\-Wtraditional
-\-Wtrigraphs
-\-Wuninitialized
-\-Wunused
-\-Wwrite\-strings
-.TP
-.B Debugging Options
-\-a
-.RI \-d letters
-\-fpretend\-float
-\-g
-.RI \-g level
-\-gcoff
-\-gxcoff
-\-gxcoff+
-\-gdwarf
-\-gdwarf+
-\-gstabs
-\-gstabs+
-\-ggdb
-\-p
-\-pg
-\-save\-temps
-.RI \-print\-file\-name= library
-\-print\-libgcc\-file\-name
-.RI \-print\-prog\-name= program
-.TP
-.B Optimization Options
-\-fcaller\-saves
-\-fcse\-follow\-jumps
-\-fcse\-skip\-blocks
-\-fdelayed\-branch
-\-felide\-constructors
-\-fexpensive\-optimizations
-\-ffast\-math
-\-ffloat\-store
-\-fforce\-addr
-\-fforce\-mem
-\-finline\-functions
-\-fkeep\-inline\-functions
-\-fmemoize\-lookups
-\-fno\-default\-inline
-\-fno\-defer\-pop
-\-fno\-function\-cse
-\-fno\-inline
-\-fno\-peephole
-\-fomit\-frame\-pointer
-\-frerun\-cse\-after\-loop
-\-fschedule\-insns
-\-fschedule\-insns2
-\-fstrength\-reduce
-\-fthread\-jumps
-\-funroll\-all\-loops
-\-funroll\-loops
-\-O
-\-O2
-\-O3
-.TP
-.B Preprocessor Options
-.RI \-A assertion
-\-C
-\-dD
-\-dM
-\-dN
-.RI \-D macro [\|= defn \|]
-\-E
-\-H
-.RI "\-idirafter " dir
-.RI "\-include " file
-.RI "\-imacros " file
-.RI "\-iprefix " file
-.RI "\-iwithprefix " dir
-\-M
-\-MD
-\-MM
-\-MMD
-\-nostdinc
-\-P
-.RI \-U macro
-\-undef
-.TP
-.B Assembler Option
-.RI \-Wa, option
-.TP
-.B Linker Options
-.RI \-l library
-\-nostartfiles
-\-nostdlib
-\-static
-\-shared
-\-symbolic
-.RI "\-Xlinker\ " option
-.RI \-Wl, option
-.RI "\-u " symbol
-.TP
-.B Directory Options
-.RI \-B prefix
-.RI \-I dir
-\-I\-
-.RI \-L dir
-.TP
-.B Target Options
-.RI "\-b " machine
-.RI "\-V " version
-.TP
-.B Configuration Dependent Options
-.I M680x0\ Options
-.br
-\-m68000
-\-m68020
-\-m68020\-40
-\-m68030
-\-m68040
-\-m68881
-\-mbitfield
-\-mc68000
-\-mc68020
-\-mfpa
-\-mnobitfield
-\-mrtd
-\-mshort
-\-msoft\-float
-.Sp
-.I VAX Options
-.br
-\-mg
-\-mgnu
-\-munix
-.Sp
-.I SPARC Options
-.br
-\-mepilogue
-\-mfpu
-\-mhard\-float
-\-mno\-fpu
-\-mno\-epilogue
-\-msoft\-float
-\-msparclite
-\-mv8
-\-msupersparc
-\-mcypress
-.Sp
-.I Convex Options
-.br
-\-margcount
-\-mc1
-\-mc2
-\-mnoargcount
-.Sp
-.I AMD29K Options
-.br
-\-m29000
-\-m29050
-\-mbw
-\-mdw
-\-mkernel\-registers
-\-mlarge
-\-mnbw
-\-mnodw
-\-msmall
-\-mstack\-check
-\-muser\-registers
-.Sp
-.I M88K Options
-.br
-\-m88000
-\-m88100
-\-m88110
-\-mbig\-pic
-\-mcheck\-zero\-division
-\-mhandle\-large\-shift
-\-midentify\-revision
-\-mno\-check\-zero\-division
-\-mno\-ocs\-debug\-info
-\-mno\-ocs\-frame\-position
-\-mno\-optimize\-arg\-area
-\-mno\-serialize\-volatile
-\-mno\-underscores
-\-mocs\-debug\-info
-\-mocs\-frame\-position
-\-moptimize\-arg\-area
-\-mserialize\-volatile
-.RI \-mshort\-data\- num
-\-msvr3
-\-msvr4
-\-mtrap\-large\-shift
-\-muse\-div\-instruction
-\-mversion\-03.00
-\-mwarn\-passed\-structs
-.Sp
-.I RS6000 Options
-.br
-\-mfp\-in\-toc
-\-mno\-fop\-in\-toc
-.Sp
-.I RT Options
-.br
-\-mcall\-lib\-mul
-\-mfp\-arg\-in\-fpregs
-\-mfp\-arg\-in\-gregs
-\-mfull\-fp\-blocks
-\-mhc\-struct\-return
-\-min\-line\-mul
-\-mminimum\-fp\-blocks
-\-mnohc\-struct\-return
-.Sp
-.I MIPS Options
-.br
-\-mcpu=\fIcpu type\fP
-\-mips2
-\-mips3
-\-mint64
-\-mlong64
-\-mlonglong128
-\-mmips\-as
-\-mgas
-\-mrnames
-\-mno\-rnames
-\-mgpopt
-\-mno\-gpopt
-\-mstats
-\-mno\-stats
-\-mmemcpy
-\-mno\-memcpy
-\-mno\-mips\-tfile
-\-mmips\-tfile
-\-msoft\-float
-\-mhard\-float
-\-mabicalls
-\-mno\-abicalls
-\-mhalf\-pic
-\-mno\-half\-pic
-\-G \fInum\fP
-\-nocpp
-.Sp
-.I i386 Options
-.br
-\-m486
-\-mno\-486
-\-msoft\-float
-\-mno\-fp\-ret\-in\-387
-.Sp
-.I HPPA Options
-.br
-\-mpa\-risc\-1\-0
-\-mpa\-risc\-1\-1
-\-mkernel
-\-mshared\-libs
-\-mno\-shared\-libs
-\-mlong\-calls
-\-mdisable\-fpregs
-\-mdisable\-indexing
-\-mtrailing\-colon
-.Sp
-.I i960 Options
-.br
-\-m\fIcpu-type\fP
-\-mnumerics
-\-msoft\-float
-\-mleaf\-procedures
-\-mno\-leaf\-procedures
-\-mtail\-call
-\-mno\-tail\-call
-\-mcomplex\-addr
-\-mno\-complex\-addr
-\-mcode\-align
-\-mno\-code\-align
-\-mic\-compat
-\-mic2.0\-compat
-\-mic3.0\-compat
-\-masm\-compat
-\-mintel\-asm
-\-mstrict\-align
-\-mno\-strict\-align
-\-mold\-align
-\-mno\-old\-align
-.Sp
-.I DEC Alpha Options
-.br
-\-mfp\-regs
-\-mno\-fp\-regs
-\-mno\-soft\-float
-\-msoft\-float
-.Sp
-.I System V Options
-.br
-\-G
-\-Qy
-\-Qn
-.RI \-YP, paths
-.RI \-Ym, dir
-.TP
-.B Code Generation Options
-.RI \-fcall\-saved\- reg
-.RI \-fcall\-used\- reg
-.RI \-ffixed\- reg
-\-finhibit\-size\-directive
-\-fnonnull\-objects
-\-fno\-common
-\-fno\-ident
-\-fno\-gnu\-linker
-\-fpcc\-struct\-return
-\-fpic
-\-fPIC
-\-freg\-struct\-return
-\-fshared\-data
-\-fshort\-enums
-\-fshort\-double
-\-fvolatile
-\-fvolatile\-global
-\-fverbose\-asm
-.ad b
-.hy 1
-.SH OVERALL OPTIONS
-.TP
-.BI "\-x " "language"
-Specify explicitly the
-.I language\c
-\& for the following input files (rather than choosing a default based
-on the file name suffix) . This option applies to all following input
-files until the next `\|\c
-.B \-x\c
-\&\|' option. Possible values of \c
-.I language\c
-\& are
-`\|\c
-.B c\c
-\&\|', `\|\c
-.B objective\-c\c
-\&\|', `\|\c
-.B c\-header\c
-\&\|', `\|\c
-.B c++\c
-\&\|',
-`\|\c
-.B cpp\-output\c
-\&\|', `\|\c
-.B assembler\c
-\&\|', and `\|\c
-.B assembler\-with\-cpp\c
-\&\|'.
-.TP
-.B \-x none
-Turn off any specification of a language, so that subsequent files are
-handled according to their file name suffixes (as they are if `\|\c
-.B \-x\c
-\&\|'
-has not been used at all).
-.PP
-If you want only some of the four stages (preprocess, compile,
-assemble, link), you can use
-`\|\c
-.B \-x\c
-\&\|' (or filename suffixes) to tell \c
-.B gcc\c
-\& where to start, and
-one of the options `\|\c
-.B \-c\c
-\&\|', `\|\c
-.B \-S\c
-\&\|', or `\|\c
-.B \-E\c
-\&\|' to say where
-.B gcc\c
-\& is to stop. Note that some combinations (for example,
-`\|\c
-.B \-x cpp\-output \-E\c
-\&\|') instruct \c
-.B gcc\c
-\& to do nothing at all.
-.TP
-.B \-c
-Compile or assemble the source files, but do not link. The compiler
-output is an object file corresponding to each source file.
-.Sp
-By default, GCC makes the object file name for a source file by replacing
-the suffix `\|\c
-.B .c\c
-\&\|', `\|\c
-.B .i\c
-\&\|', `\|\c
-.B .s\c
-\&\|', etc., with `\|\c
-.B .o\c
-\&\|'. Use
-.B \-o\c
-\& to select another name.
-.Sp
-GCC ignores any unrecognized input files (those that do not require
-compilation or assembly) with the
-.B \-c
-option.
-.TP
-.B \-S
-Stop after the stage of compilation proper; do not assemble. The output
-is an assembler code file for each non-assembler input
-file specified.
-.Sp
-By default, GCC makes the assembler file name for a source file by
-replacing the suffix `\|\c
-.B .c\c
-\&\|', `\|\c
-.B .i\c
-\&\|', etc., with `\|\c
-.B .s\c
-\&\|'. Use
-.B \-o\c
-\& to select another name.
-.Sp
-GCC ignores any input files that don't require compilation.
-.TP
-.B \-E
-Stop after the preprocessing stage; do not run the compiler proper. The
-output is preprocessed source code, which is sent to the
-standard output.
-.Sp
-GCC ignores input files which don't require preprocessing.
-.TP
-.BI "\-o " file
-Place output in file \c
-.I file\c
-\&. This applies regardless to whatever
-sort of output GCC is producing, whether it be an executable file,
-an object file, an assembler file or preprocessed C code.
-.Sp
-Since only one output file can be specified, it does not make sense to
-use `\|\c
-.B \-o\c
-\&\|' when compiling more than one input file, unless you are
-producing an executable file as output.
-.Sp
-If you do not specify `\|\c
-.B \-o\c
-\&\|', the default is to put an executable file
-in `\|\c
-.B a.out\c
-\&\|', the object file for `\|\c
-.I source\c
-.B \&.\c
-.I suffix\c
-\&\c
-\&\|' in
-`\|\c
-.I source\c
-.B \&.o\c
-\&\|', its assembler file in `\|\c
-.I source\c
-.B \&.s\c
-\&\|', and
-all preprocessed C source on standard output.
-.TP
-.B \-v
-Print (on standard error output) the commands executed to run the stages
-of compilation. Also print the version number of the compiler driver
-program and of the preprocessor and the compiler proper.
-.TP
-.B \-pipe
-Use pipes rather than temporary files for communication between the
-various stages of compilation. This fails to work on some systems where
-the assembler cannot read from a pipe; but the GNU assembler has
-no trouble.
-.PP
-.SH LANGUAGE OPTIONS
-The following options control the dialect of C that the compiler
-accepts:
-.TP
-.B \-ansi
-Support all ANSI standard C programs.
-.Sp
-This turns off certain features of GNU C that are incompatible with
-ANSI C, such as the \c
-.B asm\c
-\&, \c
-.B inline\c
-\& and \c
-.B typeof
-keywords, and predefined macros such as \c
-.B unix\c
-\& and \c
-.B vax
-that identify the type of system you are using. It also enables the
-undesirable and rarely used ANSI trigraph feature, and disallows `\|\c
-.B $\c
-\&\|' as part of identifiers.
-.Sp
-The alternate keywords \c
-.B _\|_asm_\|_\c
-\&, \c
-.B _\|_extension_\|_\c
-\&,
-.B _\|_inline_\|_\c
-\& and \c
-.B _\|_typeof_\|_\c
-\& continue to work despite
-`\|\c
-.B \-ansi\c
-\&\|'. You would not want to use them in an ANSI C program, of
-course, but it is useful to put them in header files that might be included
-in compilations done with `\|\c
-.B \-ansi\c
-\&\|'. Alternate predefined macros
-such as \c
-.B _\|_unix_\|_\c
-\& and \c
-.B _\|_vax_\|_\c
-\& are also available, with or
-without `\|\c
-.B \-ansi\c
-\&\|'.
-.Sp
-The `\|\c
-.B \-ansi\c
-\&\|' option does not cause non-ANSI programs to be
-rejected gratuitously. For that, `\|\c
-.B \-pedantic\c
-\&\|' is required in
-addition to `\|\c
-.B \-ansi\c
-\&\|'.
-.Sp
-The preprocessor predefines a macro \c
-.B _\|_STRICT_ANSI_\|_\c
-\& when you use the `\|\c
-.B \-ansi\c
-\&\|'
-option. Some header files may notice this macro and refrain
-from declaring certain functions or defining certain macros that the
-ANSI standard doesn't call for; this is to avoid interfering with any
-programs that might use these names for other things.
-.TP
-.B \-fno\-asm
-Do not recognize \c
-.B asm\c
-\&, \c
-.B inline\c
-\& or \c
-.B typeof\c
-\& as a
-keyword. These words may then be used as identifiers. You can
-use \c
-.B _\|_asm_\|_\c
-\&, \c
-.B _\|_inline_\|_\c
-\& and \c
-.B _\|_typeof_\|_\c
-\& instead.
-`\|\c
-.B \-ansi\c
-\&\|' implies `\|\c
-.B \-fno\-asm\c
-\&\|'.
-.TP
-.B \-fno\-builtin
-Don't recognize built-in functions that do not begin with two leading
-underscores. Currently, the functions affected include \c
-.B _exit\c
-\&,
-.B abort\c
-\&, \c
-.B abs\c
-\&, \c
-.B alloca\c
-\&, \c
-.B cos\c
-\&, \c
-.B exit\c
-\&,
-.B fabs\c
-\&, \c
-.B labs\c
-\&, \c
-.B memcmp\c
-\&, \c
-.B memcpy\c
-\&, \c
-.B sin\c
-\&,
-.B sqrt\c
-\&, \c
-.B strcmp\c
-\&, \c
-.B strcpy\c
-\&, and \c
-.B strlen\c
-\&.
-.Sp
-The `\|\c
-.B \-ansi\c
-\&\|' option prevents \c
-.B alloca\c
-\& and \c
-.B _exit\c
-\& from
-being builtin functions.
-.TP
-.B \-fhosted
-Compile for a hosted environment; this implies the `\|\c
-.B \-fbuiltin\c
-\&\|' option, and implies that suspicious declarations of
-.B main\c
-\& should be warned about.
-.TP
-.B \-ffreestanding
-Compile for a freestanding environment; this implies the `\|\c
-.B \-fno-builtin\c
-\&\|' option, and implies that
-.B main\c
-\& has no special requirements.
-.TP
-.B \-fno\-strict\-prototype
-Treat a function declaration with no arguments, such as `\|\c
-.B int foo
-();\c
-\&\|', as C would treat it\(em\&as saying nothing about the number of
-arguments or their types (C++ only). Normally, such a declaration in
-C++ means that the function \c
-.B foo\c
-\& takes no arguments.
-.TP
-.B \-trigraphs
-Support ANSI C trigraphs. The `\|\c
-.B \-ansi\c
-\&\|' option implies `\|\c
-.B \-trigraphs\c
-\&\|'.
-.TP
-.B \-traditional
-Attempt to support some aspects of traditional C compilers.
-For details, see the GNU C Manual; the duplicate list here
-has been deleted so that we won't get complaints when it
-is out of date.
-.Sp
-But one note about C++ programs only (not C). `\|\c
-.B \-traditional\c
-\&\|' has one additional effect for C++: assignment to
-.B this
-is permitted. This is the same as the effect of `\|\c
-.B \-fthis\-is\-variable\c
-\&\|'.
-.TP
-.B \-traditional\-cpp
-Attempt to support some aspects of traditional C preprocessors.
-This includes the items that specifically mention the preprocessor above,
-but none of the other effects of `\|\c
-.B \-traditional\c
-\&\|'.
-.TP
-.B \-fdollars\-in\-identifiers
-Permit the use of `\|\c
-.B $\c
-\&\|' in identifiers (C++ only). You can also use
-`\|\c
-.B \-fno\-dollars\-in\-identifiers\c
-\&\|' to explicitly prohibit use of
-`\|\c
-.B $\c
-\&\|'. (GNU C++ allows `\|\c
-.B $\c
-\&\|' by default on some target systems
-but not others.)
-.TP
-.B \-fenum\-int\-equiv
-Permit implicit conversion of \c
-.B int\c
-\& to enumeration types (C++
-only). Normally GNU C++ allows conversion of \c
-.B enum\c
-\& to \c
-.B int\c
-\&,
-but not the other way around.
-.TP
-.B \-fexternal\-templates
-Produce smaller code for template declarations, by generating only a
-single copy of each template function where it is defined (C++ only).
-To use this option successfully, you must also mark all files that
-use templates with either `\|\c
-.B #pragma implementation\c
-\&\|' (the definition) or
-`\|\c
-.B #pragma interface\c
-\&\|' (declarations).
-
-When your code is compiled with `\|\c
-.B \-fexternal\-templates\c
-\&\|', all
-template instantiations are external. You must arrange for all
-necessary instantiations to appear in the implementation file; you can
-do this with a \c
-.B typedef\c
-\& that references each instantiation needed.
-Conversely, when you compile using the default option
-`\|\c
-.B \-fno\-external\-templates\c
-\&\|', all template instantiations are
-explicitly internal.
-.TP
-.B \-fall\-virtual
-Treat all possible member functions as virtual, implicitly. All
-member functions (except for constructor functions and
-.B new
-or
-.B delete
-member operators) are treated as virtual functions of the class where
-they appear.
-.Sp
-This does not mean that all calls to these member functions will be
-made through the internal table of virtual functions. Under some
-circumstances, the compiler can determine that a call to a given
-virtual function can be made directly; in these cases the calls are
-direct in any case.
-.TP
-.B \-fcond\-mismatch
-Allow conditional expressions with mismatched types in the second and
-third arguments. The value of such an expression is void.
-.TP
-.B \-fthis\-is\-variable
-Permit assignment to \c
-.B this\c
-\& (C++ only). The incorporation of
-user-defined free store management into C++ has made assignment to
-`\|\c
-.B this\c
-\&\|' an anachronism. Therefore, by default it is invalid to
-assign to \c
-.B this\c
-\& within a class member function. However, for
-backwards compatibility, you can make it valid with
-`\|\c
-.B \-fthis-is-variable\c
-\&\|'.
-.TP
-.B \-funsigned\-char
-Let the type \c
-.B char\c
-\& be unsigned, like \c
-.B unsigned char\c
-\&.
-.Sp
-Each kind of machine has a default for what \c
-.B char\c
-\& should
-be. It is either like \c
-.B unsigned char\c
-\& by default or like
-.B signed char\c
-\& by default.
-.Sp
-Ideally, a portable program should always use \c
-.B signed char\c
-\& or
-.B unsigned char\c
-\& when it depends on the signedness of an object.
-But many programs have been written to use plain \c
-.B char\c
-\& and
-expect it to be signed, or expect it to be unsigned, depending on the
-machines they were written for. This option, and its inverse, let you
-make such a program work with the opposite default.
-.Sp
-The type \c
-.B char\c
-\& is always a distinct type from each of
-.B signed char\c
-\& and \c
-.B unsigned char\c
-\&, even though its behavior
-is always just like one of those two.
-.TP
-.B \-fsigned\-char
-Let the type \c
-.B char\c
-\& be signed, like \c
-.B signed char\c
-\&.
-.Sp
-Note that this is equivalent to `\|\c
-.B \-fno\-unsigned\-char\c
-\&\|', which is
-the negative form of `\|\c
-.B \-funsigned\-char\c
-\&\|'. Likewise,
-`\|\c
-.B \-fno\-signed\-char\c
-\&\|' is equivalent to `\|\c
-.B \-funsigned\-char\c
-\&\|'.
-.TP
-.B \-fsigned\-bitfields
-.TP
-.B \-funsigned\-bitfields
-.TP
-.B \-fno\-signed\-bitfields
-.TP
-.B \-fno\-unsigned\-bitfields
-These options control whether a bitfield is
-signed or unsigned, when declared with no explicit `\|\c
-.B signed\c
-\&\|' or `\|\c
-.B unsigned\c
-\&\|' qualifier. By default, such a bitfield is
-signed, because this is consistent: the basic integer types such as
-.B int\c
-\& are signed types.
-.Sp
-However, when you specify `\|\c
-.B \-traditional\c
-\&\|', bitfields are all unsigned
-no matter what.
-.TP
-.B \-fwritable\-strings
-Store string constants in the writable data segment and don't uniquize
-them. This is for compatibility with old programs which assume they
-can write into string constants. `\|\c
-.B \-traditional\c
-\&\|' also has this
-effect.
-.Sp
-Writing into string constants is a very bad idea; \*(lqconstants\*(rq should
-be constant.
-.SH PREPROCESSOR OPTIONS
-These options control the C preprocessor, which is run on each C source
-file before actual compilation.
-.PP
-If you use the `\|\c
-.B \-E\c
-\&\|' option, GCC does nothing except preprocessing.
-Some of these options make sense only together with `\|\c
-.B \-E\c
-\&\|' because
-they cause the preprocessor output to be unsuitable for actual
-compilation.
-.TP
-.BI "\-include " "file"
-Process \c
-.I file\c
-\& as input before processing the regular input file.
-In effect, the contents of \c
-.I file\c
-\& are compiled first. Any `\|\c
-.B \-D\c
-\&\|'
-and `\|\c
-.B \-U\c
-\&\|' options on the command line are always processed before
-`\|\c
-.B \-include \c
-.I file\c
-\&\c
-\&\|', regardless of the order in which they are
-written. All the `\|\c
-.B \-include\c
-\&\|' and `\|\c
-.B \-imacros\c
-\&\|' options are
-processed in the order in which they are written.
-.TP
-.BI "\-imacros " file
-Process \c
-.I file\c
-\& as input, discarding the resulting output, before
-processing the regular input file. Because the output generated from
-.I file\c
-\& is discarded, the only effect of `\|\c
-.B \-imacros \c
-.I file\c
-\&\c
-\&\|' is to
-make the macros defined in \c
-.I file\c
-\& available for use in the main
-input. The preprocessor evaluates any `\|\c
-.B \-D\c
-\&\|' and `\|\c
-.B \-U\c
-\&\|' options
-on the command line before processing `\|\c
-.B \-imacros\c
-.I file\c
-\&\|', regardless of the order in
-which they are written. All the `\|\c
-.B \-include\c
-\&\|' and `\|\c
-.B \-imacros\c
-\&\|'
-options are processed in the order in which they are written.
-.TP
-.BI "\-idirafter " "dir"
-Add the directory \c
-.I dir\c
-\& to the second include path. The directories
-on the second include path are searched when a header file is not found
-in any of the directories in the main include path (the one that
-`\|\c
-.B \-I\c
-\&\|' adds to).
-.TP
-.BI "\-iprefix " "prefix"
-Specify \c
-.I prefix\c
-\& as the prefix for subsequent `\|\c
-.B \-iwithprefix\c
-\&\|'
-options.
-.TP
-.BI "\-iwithprefix " "dir"
-Add a directory to the second include path. The directory's name is
-made by concatenating \c
-.I prefix\c
-\& and \c
-.I dir\c
-\&, where \c
-.I prefix
-was specified previously with `\|\c
-.B \-iprefix\c
-\&\|'.
-.TP
-.B \-nostdinc
-Do not search the standard system directories for header files. Only
-the directories you have specified with `\|\c
-.B \-I\c
-\&\|' options (and the
-current directory, if appropriate) are searched.
-.Sp
-By using both `\|\c
-.B \-nostdinc\c
-\&\|' and `\|\c
-.B \-I\-\c
-\&\|', you can limit the include-file search file to only those
-directories you specify explicitly.
-.TP
-.B \-nostdinc++
-Do not search for header files in the C++\-specific standard directories,
-but do still search the other standard directories.
-(This option is used when building `\|\c
-.B libg++\c
-\&\|'.)
-.TP
-.B \-undef
-Do not predefine any nonstandard macros. (Including architecture flags).
-.TP
-.B \-E
-Run only the C preprocessor. Preprocess all the C source files
-specified and output the results to standard output or to the
-specified output file.
-.TP
-.B \-C
-Tell the preprocessor not to discard comments. Used with the
-`\|\c
-.B \-E\c
-\&\|' option.
-.TP
-.B \-P
-Tell the preprocessor not to generate `\|\c
-.B #line\c
-\&\|' commands.
-Used with the `\|\c
-.B \-E\c
-\&\|' option.
-.TP
-.B \-M\ [ \-MG ]
-Tell the preprocessor to output a rule suitable for \c
-.B make
-describing the dependencies of each object file. For each source file,
-the preprocessor outputs one \c
-.B make\c
-\&-rule whose target is the object
-file name for that source file and whose dependencies are all the files
-`\|\c
-.B #include\c
-\&\|'d in it. This rule may be a single line or may be
-continued with `\|\c
-.B \e\c
-\&\|'-newline if it is long. The list of rules is
-printed on standard output instead of the preprocessed C program.
-.Sp
-`\|\c
-.B \-M\c
-\&\|' implies `\|\c
-.B \-E\c
-\&\|'.
-.Sp
-`\|\c
-.B \-MG\c
-\&\|' says to treat missing header files as generated files and assume \c
-they live in the same directory as the source file. It must be specified \c
-in addition to `\|\c
-.B \-M\c
-\&\|'.
-.TP
-.B \-MM\ [ \-MG ]
-Like `\|\c
-.B \-M\c
-\&\|' but the output mentions only the user header files
-included with `\|\c
-.B #include "\c
-.I file\c
-\&"\c
-\&\|'. System header files
-included with `\|\c
-.B #include <\c
-.I file\c
-\&>\c
-\&\|' are omitted.
-.TP
-.B \-MD
-Like `\|\c
-.B \-M\c
-\&\|' but the dependency information is written to files with
-names made by replacing `\|\c
-.B .o\c
-\&\|' with `\|\c
-.B .d\c
-\&\|' at the end of the
-output file names. This is in addition to compiling the file as
-specified\(em\&`\|\c
-.B \-MD\c
-\&\|' does not inhibit ordinary compilation the way
-`\|\c
-.B \-M\c
-\&\|' does.
-.Sp
-The Mach utility `\|\c
-.B md\c
-\&\|' can be used to merge the `\|\c
-.B .d\c
-\&\|' files
-into a single dependency file suitable for using with the `\|\c
-.B make\c
-\&\|'
-command.
-.TP
-.B \-MMD
-Like `\|\c
-.B \-MD\c
-\&\|' except mention only user header files, not system
-header files.
-.TP
-.B \-H
-Print the name of each header file used, in addition to other normal
-activities.
-.TP
-.BI "\-A" "question" ( answer )
-Assert the answer
-.I answer
-for
-.I question\c
-\&, in case it is tested
-with a preprocessor conditional such as `\|\c
-.BI "#if #" question ( answer )\c
-\&\|'. `\|\c
-.B \-A\-\c
-\&\|' disables the standard
-assertions that normally describe the target machine.
-.TP
-.BI "\-A" "question"\c
-\&(\c
-.I answer\c
-\&)
-Assert the answer \c
-.I answer\c
-\& for \c
-.I question\c
-\&, in case it is tested
-with a preprocessor conditional such as `\|\c
-.B #if
-#\c
-.I question\c
-\&(\c
-.I answer\c
-\&)\c
-\&\|'. `\|\c
-.B \-A-\c
-\&\|' disables the standard
-assertions that normally describe the target machine.
-.TP
-.BI \-D macro
-Define macro \c
-.I macro\c
-\& with the string `\|\c
-.B 1\c
-\&\|' as its definition.
-.TP
-.BI \-D macro = defn
-Define macro \c
-.I macro\c
-\& as \c
-.I defn\c
-\&. All instances of `\|\c
-.B \-D\c
-\&\|' on
-the command line are processed before any `\|\c
-.B \-U\c
-\&\|' options.
-.TP
-.BI \-U macro
-Undefine macro \c
-.I macro\c
-\&. `\|\c
-.B \-U\c
-\&\|' options are evaluated after all `\|\c
-.B \-D\c
-\&\|' options, but before any `\|\c
-.B \-include\c
-\&\|' and `\|\c
-.B \-imacros\c
-\&\|' options.
-.TP
-.B \-dM
-Tell the preprocessor to output only a list of the macro definitions
-that are in effect at the end of preprocessing. Used with the `\|\c
-.B \-E\c
-\&\|'
-option.
-.TP
-.B \-dD
-Tell the preprocessor to pass all macro definitions into the output, in
-their proper sequence in the rest of the output.
-.TP
-.B \-dN
-Like `\|\c
-.B \-dD\c
-\&\|' except that the macro arguments and contents are omitted.
-Only `\|\c
-.B #define \c
-.I name\c
-\&\c
-\&\|' is included in the output.
-.SH ASSEMBLER OPTION
-.TP
-.BI "\-Wa," "option"
-Pass \c
-.I option\c
-\& as an option to the assembler. If \c
-.I option
-contains commas, it is split into multiple options at the commas.
-.SH LINKER OPTIONS
-These options come into play when the compiler links object files into
-an executable output file. They are meaningless if the compiler is
-not doing a link step.
-.TP
-.I object-file-name
-A file name that does not end in a special recognized suffix is
-considered to name an object file or library. (Object files are
-distinguished from libraries by the linker according to the file
-contents.) If GCC does a link step, these object files are used as input
-to the linker.
-.TP
-.BI \-l library
-Use the library named \c
-.I library\c
-\& when linking.
-.Sp
-The linker searches a standard list of directories for the library,
-which is actually a file named `\|\c
-.B lib\c
-.I library\c
-\&.a\c
-\&\|'. The linker
-then uses this file as if it had been specified precisely by name.
-.Sp
-The directories searched include several standard system directories
-plus any that you specify with `\|\c
-.B \-L\c
-\&\|'.
-.Sp
-Normally the files found this way are library files\(em\&archive files
-whose members are object files. The linker handles an archive file by
-scanning through it for members which define symbols that have so far
-been referenced but not defined. However, if the linker finds an
-ordinary object file rather than a library, the object file is linked
-in the usual fashion. The only difference between using an `\|\c
-.B \-l\c
-\&\|' option and specifying a file
-name is that `\|\c
-.B \-l\c
-\&\|' surrounds
-.I library
-with `\|\c
-.B lib\c
-\&\|' and `\|\c
-.B .a\c
-\&\|' and searches several directories.
-.TP
-.B \-lobjc
-You need this special case of the
-.B \-l
-option in order to link an Objective C program.
-.TP
-.B \-nostartfiles
-Do not use the standard system startup files when linking.
-The standard libraries are used normally.
-.TP
-.B \-nostdlib
-Don't use the standard system libraries and startup files when linking.
-Only the files you specify will be passed to the linker.
-.TP
-.B \-static
-On systems that support dynamic linking, this prevents linking with the shared
-libraries. On other systems, this option has no effect.
-.TP
-.B \-shared
-Produce a shared object which can then be linked with other objects to
-form an executable. Only a few systems support this option.
-.TP
-.B \-symbolic
-Bind references to global symbols when building a shared object. Warn
-about any unresolved references (unless overridden by the link editor
-option `\|\c
-.B
-\-Xlinker \-z \-Xlinker defs\c
-\&\|'). Only a few systems support
-this option.
-.TP
-.BI "\-Xlinker " "option"
-Pass \c
-.I option
-as an option to the linker. You can use this to
-supply system-specific linker options which GNU CC does not know how to
-recognize.
-.Sp
-If you want to pass an option that takes an argument, you must use
-`\|\c
-.B \-Xlinker\c
-\&\|' twice, once for the option and once for the argument.
-For example, to pass `\|\c
-.B
-\-assert definitions\c
-\&\|', you must write
-`\|\c
-.B
-\-Xlinker \-assert \-Xlinker definitions\c
-\&\|'. It does not work to write
-`\|\c
-.B
-\-Xlinker "\-assert definitions"\c
-\&\|', because this passes the entire
-string as a single argument, which is not what the linker expects.
-.TP
-.BI "\-Wl," "option"
-Pass \c
-.I option\c
-\& as an option to the linker. If \c
-.I option\c
-\& contains
-commas, it is split into multiple options at the commas.
-.TP
-.BI "\-u " "symbol"
-Pretend the symbol
-.I symbol
-is undefined, to force linking of
-library modules to define it. You can use `\|\c
-.B \-u\c
-\&\|' multiple times with
-different symbols to force loading of additional library modules.
-.SH DIRECTORY OPTIONS
-These options specify directories to search for header files, for
-libraries and for parts of the compiler:
-.TP
-.BI "\-I" "dir"
-Append directory \c
-.I dir\c
-\& to the list of directories searched for include files.
-.TP
-.B \-I\-
-Any directories you specify with `\|\c
-.B \-I\c
-\&\|' options before the `\|\c
-.B \-I\-\c
-\&\|'
-option are searched only for the case of `\|\c
-.B
-#include "\c
-.I file\c
-.B
-\&"\c
-\&\|';
-they are not searched for `\|\c
-.B #include <\c
-.I file\c
-\&>\c
-\&\|'.
-.Sp
-If additional directories are specified with `\|\c
-.B \-I\c
-\&\|' options after
-the `\|\c
-.B \-I\-\c
-\&\|', these directories are searched for all `\|\c
-.B #include\c
-\&\|'
-directives. (Ordinarily \c
-.I all\c
-\& `\|\c
-.B \-I\c
-\&\|' directories are used
-this way.)
-.Sp
-In addition, the `\|\c
-.B \-I\-\c
-\&\|' option inhibits the use of the current
-directory (where the current input file came from) as the first search
-directory for `\|\c
-.B
-#include "\c
-.I file\c
-.B
-\&"\c
-\&\|'. There is no way to
-override this effect of `\|\c
-.B \-I\-\c
-\&\|'. With `\|\c
-.B \-I.\c
-\&\|' you can specify
-searching the directory which was current when the compiler was
-invoked. That is not exactly the same as what the preprocessor does
-by default, but it is often satisfactory.
-.Sp
-`\|\c
-.B \-I\-\c
-\&\|' does not inhibit the use of the standard system directories
-for header files. Thus, `\|\c
-.B \-I\-\c
-\&\|' and `\|\c
-.B \-nostdinc\c
-\&\|' are
-independent.
-.TP
-.BI "\-L" "dir"
-Add directory \c
-.I dir\c
-\& to the list of directories to be searched
-for `\|\c
-.B \-l\c
-\&\|'.
-.TP
-.BI "\-B" "prefix"
-This option specifies where to find the executables, libraries and
-data files of the compiler itself.
-.Sp
-The compiler driver program runs one or more of the subprograms
-`\|\c
-.B cpp\c
-\&\|', `\|\c
-.B cc1\c
-\&\|' (or, for C++, `\|\c
-.B cc1plus\c
-\&\|'), `\|\c
-.B as\c
-\&\|' and `\|\c
-.B ld\c
-\&\|'. It tries
-.I prefix\c
-\& as a prefix for each program it tries to run, both with and
-without `\|\c
-.I machine\c
-.B /\c
-.I version\c
-.B /\c
-\&\|'.
-.Sp
-For each subprogram to be run, the compiler driver first tries the
-`\|\c
-.B \-B\c
-\&\|' prefix, if any. If that name is not found, or if `\|\c
-.B \-B\c
-\&\|'
-was not specified, the driver tries two standard prefixes, which are
-`\|\c
-.B /usr/lib/gcc/\c
-\&\|' and `\|\c
-.B /usr/local/lib/gcc-lib/\c
-\&\|'. If neither of
-those results in a file name that is found, the compiler driver
-searches for the unmodified program
-name, using the directories specified in your
-`\|\c
-.B PATH\c
-\&\|' environment variable.
-.Sp
-The run-time support file `\|\c
-.B libgcc.a\c
-\&\|' is also searched for using the
-`\|\c
-.B \-B\c
-\&\|' prefix, if needed. If it is not found there, the two
-standard prefixes above are tried, and that is all. The file is left
-out of the link if it is not found by those means. Most of the time,
-on most machines, `\|\c
-.B libgcc.a\c
-\&\|' is not actually necessary.
-.Sp
-You can get a similar result from the environment variable
-.B GCC_EXEC_PREFIX\c
-\&; if it is defined, its value is used as a prefix
-in the same way. If both the `\|\c
-.B \-B\c
-\&\|' option and the
-.B GCC_EXEC_PREFIX\c
-\& variable are present, the `\|\c
-.B \-B\c
-\&\|' option is
-used first and the environment variable value second.
-.SH WARNING OPTIONS
-Warnings are diagnostic messages that report constructions which
-are not inherently erroneous but which are risky or suggest there
-may have been an error.
-.Sp
-These options control the amount and kinds of warnings produced by GNU
-CC:
-.TP
-.B \-fsyntax\-only
-Check the code for syntax errors, but don't emit any output.
-.TP
-.B \-w
-Inhibit all warning messages.
-.TP
-.B \-Wno\-import
-Inhibit warning messages about the use of
-.BR #import .
-.TP
-.B \-pedantic
-Issue all the warnings demanded by strict ANSI standard C; reject
-all programs that use forbidden extensions.
-.Sp
-Valid ANSI standard C programs should compile properly with or without
-this option (though a rare few will require `\|\c
-.B \-ansi\c
-\&\|'). However,
-without this option, certain GNU extensions and traditional C features
-are supported as well. With this option, they are rejected. There is
-no reason to \c
-.I use\c
-\& this option; it exists only to satisfy pedants.
-.Sp
-`\|\c
-.B \-pedantic\c
-\&\|' does not cause warning messages for use of the
-alternate keywords whose names begin and end with `\|\c
-.B _\|_\c
-\&\|'. Pedantic
-warnings are also disabled in the expression that follows
-.B _\|_extension_\|_\c
-\&. However, only system header files should use
-these escape routes; application programs should avoid them.
-.TP
-.B \-pedantic\-errors
-Like `\|\c
-.B \-pedantic\c
-\&\|', except that errors are produced rather than
-warnings.
-.TP
-.B \-W
-Print extra warning messages for these events:
-.TP
-\ \ \ \(bu
-A nonvolatile automatic variable might be changed by a call to
-.B longjmp\c
-\&. These warnings are possible only in
-optimizing compilation.
-.Sp
-The compiler sees only the calls to \c
-.B setjmp\c
-\&. It cannot know
-where \c
-.B longjmp\c
-\& will be called; in fact, a signal handler could
-call it at any point in the code. As a result, you may get a warning
-even when there is in fact no problem because \c
-.B longjmp\c
-\& cannot
-in fact be called at the place which would cause a problem.
-.TP
-\ \ \ \(bu
-A function can return either with or without a value. (Falling
-off the end of the function body is considered returning without
-a value.) For example, this function would evoke such a
-warning:
-.Sp
-.nf
-foo (a)
-{
- if (a > 0)
- return a;
-}
-.Sp
-.fi
-Spurious warnings can occur because GNU CC does not realize that
-certain functions (including \c
-.B abort\c
-\& and \c
-.B longjmp\c
-\&)
-will never return.
-.TP
-\ \ \ \(bu
-An expression-statement or the left-hand side of a comma expression
-contains no side effects.
-To suppress the warning, cast the unused expression to void.
-For example, an expression such as `\|\c
-.B x[i,j]\c
-\&\|' will cause a warning,
-but `\|\c
-.B x[(void)i,j]\c
-\&\|' will not.
-.TP
-\ \ \ \(bu
-An unsigned value is compared against zero with `\|\c
-.B >\c
-\&\|' or `\|\c
-.B <=\c
-\&\|'.
-.PP
-.TP
-.B \-Wimplicit-int
-Warn whenever a declaration does not specify a type.
-.TP
-.B \-Wimplicit-function-declaration
-Warn whenever a function is used before being declared.
-.TP
-.B \-Wimplicit
-Same as -Wimplicit-int and -Wimplicit-function-declaration.
-.TP
-.B \-Wmain
-Warn if the
-.B main
-function is declared or defined with a suspicious type.
-Typically, it is a function with external linkage, returning
-.B int\c
-\&, and
-taking zero or two arguments.
-
-.TP
-.B \-Wreturn\-type
-Warn whenever a function is defined with a return-type that defaults
-to \c
-.B int\c
-\&. Also warn about any \c
-.B return\c
-\& statement with no
-return-value in a function whose return-type is not \c
-.B void\c
-\&.
-.TP
-.B \-Wunused
-Warn whenever a local variable is unused aside from its declaration,
-whenever a function is declared static but never defined, and whenever
-a statement computes a result that is explicitly not used.
-.TP
-.B \-Wswitch
-Warn whenever a \c
-.B switch\c
-\& statement has an index of enumeral type
-and lacks a \c
-.B case\c
-\& for one or more of the named codes of that
-enumeration. (The presence of a \c
-.B default\c
-\& label prevents this
-warning.) \c
-.B case\c
-\& labels outside the enumeration range also
-provoke warnings when this option is used.
-.TP
-.B \-Wcomment
-Warn whenever a comment-start sequence `\|\c
-.B /\(**\c
-\&\|' appears in a comment.
-.TP
-.B \-Wtrigraphs
-Warn if any trigraphs are encountered (assuming they are enabled).
-.TP
-.B \-Wformat
-Check calls to \c
-.B printf\c
-\& and \c
-.B scanf\c
-\&, etc., to make sure that
-the arguments supplied have types appropriate to the format string
-specified.
-.TP
-.B \-Wchar\-subscripts
-Warn if an array subscript has type
-.BR char .
-This is a common cause of error, as programmers often forget that this
-type is signed on some machines.
-.TP
-.B \-Wuninitialized
-An automatic variable is used without first being initialized.
-.Sp
-These warnings are possible only in optimizing compilation,
-because they require data flow information that is computed only
-when optimizing. If you don't specify `\|\c
-.B \-O\c
-\&\|', you simply won't
-get these warnings.
-.Sp
-These warnings occur only for variables that are candidates for
-register allocation. Therefore, they do not occur for a variable that
-is declared \c
-.B volatile\c
-\&, or whose address is taken, or whose size
-is other than 1, 2, 4 or 8 bytes. Also, they do not occur for
-structures, unions or arrays, even when they are in registers.
-.Sp
-Note that there may be no warning about a variable that is used only
-to compute a value that itself is never used, because such
-computations may be deleted by data flow analysis before the warnings
-are printed.
-.Sp
-These warnings are made optional because GNU CC is not smart
-enough to see all the reasons why the code might be correct
-despite appearing to have an error. Here is one example of how
-this can happen:
-.Sp
-.nf
-{
- int x;
- switch (y)
- {
- case 1: x = 1;
- break;
- case 2: x = 4;
- break;
- case 3: x = 5;
- }
- foo (x);
-}
-.Sp
-.fi
-If the value of \c
-.B y\c
-\& is always 1, 2 or 3, then \c
-.B x\c
-\& is
-always initialized, but GNU CC doesn't know this. Here is
-another common case:
-.Sp
-.nf
-{
- int save_y;
- if (change_y) save_y = y, y = new_y;
- .\|.\|.
- if (change_y) y = save_y;
-}
-.Sp
-.fi
-This has no bug because \c
-.B save_y\c
-\& is used only if it is set.
-.Sp
-Some spurious warnings can be avoided if you declare as
-.B volatile\c
-\& all the functions you use that never return.
-.TP
-.B \-Wparentheses
-Warn if parentheses are omitted in certain contexts.
-.TP
-.B \-Wtemplate\-debugging
-When using templates in a C++ program, warn if debugging is not yet
-fully available (C++ only).
-.TP
-.B \-Wall
-All of the above `\|\c
-.B \-W\c
-\&\|' options combined. These are all the
-options which pertain to usage that we recommend avoiding and that we
-believe is easy to avoid, even in conjunction with macros.
-.PP
-The remaining `\|\c
-.B \-W.\|.\|.\c
-\&\|' options are not implied by `\|\c
-.B \-Wall\c
-\&\|'
-because they warn about constructions that we consider reasonable to
-use, on occasion, in clean programs.
-.TP
-.B \-Wtraditional
-Warn about certain constructs that behave differently in traditional and
-ANSI C.
-.TP
-\ \ \ \(bu
-Macro arguments occurring within string constants in the macro body.
-These would substitute the argument in traditional C, but are part of
-the constant in ANSI C.
-.TP
-\ \ \ \(bu
-A function declared external in one block and then used after the end of
-the block.
-.TP
-\ \ \ \(bu
-A \c
-.B switch\c
-\& statement has an operand of type \c
-.B long\c
-\&.
-.PP
-.TP
-.B \-Wshadow
-Warn whenever a local variable shadows another local variable.
-.TP
-.BI "\-Wid\-clash\-" "len"
-Warn whenever two distinct identifiers match in the first \c
-.I len
-characters. This may help you prepare a program that will compile
-with certain obsolete, brain-damaged compilers.
-.TP
-.B \-Wpointer\-arith
-Warn about anything that depends on the \*(lqsize of\*(rq a function type or
-of \c
-.B void\c
-\&. GNU C assigns these types a size of 1, for
-convenience in calculations with \c
-.B void \(**\c
-\& pointers and pointers
-to functions.
-.TP
-.B \-Wcast\-qual
-Warn whenever a pointer is cast so as to remove a type qualifier from
-the target type. For example, warn if a \c
-.B const char \(**\c
-\& is cast
-to an ordinary \c
-.B char \(**\c
-\&.
-.TP
-.B \-Wcast\-align
-Warn whenever a pointer is cast such that the required alignment of the
-target is increased. For example, warn if a \c
-.B char \(**\c
-\& is cast to
-an \c
-.B int \(**\c
-\& on machines where integers can only be accessed at
-two- or four-byte boundaries.
-.TP
-.B \-Wwrite\-strings
-Give string constants the type \c
-.B const char[\c
-.I length\c
-.B ]\c
-\& so that
-copying the address of one into a non-\c
-.B const\c
-\& \c
-.B char \(**
-pointer will get a warning. These warnings will help you find at
-compile time code that can try to write into a string constant, but
-only if you have been very careful about using \c
-.B const\c
-\& in
-declarations and prototypes. Otherwise, it will just be a nuisance;
-this is why we did not make `\|\c
-.B \-Wall\c
-\&\|' request these warnings.
-.TP
-.B \-Wconversion
-Warn if a prototype causes a type conversion that is different from what
-would happen to the same argument in the absence of a prototype. This
-includes conversions of fixed point to floating and vice versa, and
-conversions changing the width or signedness of a fixed point argument
-except when the same as the default promotion.
-.TP
-.B \-Waggregate\-return
-Warn if any functions that return structures or unions are defined or
-called. (In languages where you can return an array, this also elicits
-a warning.)
-.TP
-.B \-Wstrict\-prototypes
-Warn if a function is declared or defined without specifying the
-argument types. (An old-style function definition is permitted without
-a warning if preceded by a declaration which specifies the argument
-types.)
-.TP
-.B \-Wmissing\-prototypes
-Warn if a global function is defined without a previous prototype
-declaration. This warning is issued even if the definition itself
-provides a prototype. The aim is to detect global functions that fail
-to be declared in header files.
-.TP
-.B \-Wmissing\-declarations
-Warn if a global function is defined without a previous declaration.
-Do so even if the definition itself provides a prototype.
-Use this option to detect global functions that are not declared in
-header files.
-.TP
-.B \-Wredundant-decls
-Warn if anything is declared more than once in the same scope, even in
-cases where multiple declaration is valid and changes nothing.
-.TP
-.B \-Wnested-externs
-Warn if an \c
-.B extern\c
-\& declaration is encountered within an function.
-.TP
-.B \-Wenum\-clash
-Warn about conversion between different enumeration types (C++ only).
-.TP
-.B \-Wlong-long
-Warn if
-.B long long \c
-type is used. This is default. To inhibit
-the warning messages, use flag `\|\c
-.B \-Wno\-long\-long\c
-\&\|'. Flags `\|\c
-.B \-W\-long\-long\c
-\&\|' and `\|\c
-.B \-Wno\-long\-long\c
-\&\|' are taken into account only when flag `\|\c
-.B \-pedantic\c
-\&\|' is used.
-.TP
-.B \-Woverloaded\-virtual
-(C++ only.)
-In a derived class, the definitions of virtual functions must match
-the type signature of a virtual function declared in the base class.
-Use this option to request warnings when a derived class declares a
-function that may be an erroneous attempt to define a virtual
-function: that is, warn when a function with the same name as a
-virtual function in the base class, but with a type signature that
-doesn't match any virtual functions from the base class.
-.TP
-.B \-Winline
-Warn if a function can not be inlined, and either it was declared as inline,
-or else the
-.B \-finline\-functions
-option was given.
-.TP
-.B \-Werror
-Treat warnings as errors; abort compilation after any warning.
-.SH DEBUGGING OPTIONS
-GNU CC has various special options that are used for debugging
-either your program or GCC:
-.TP
-.B \-g
-Produce debugging information in the operating system's native format
-(stabs, COFF, XCOFF, or DWARF). GDB can work with this debugging
-information.
-.Sp
-On most systems that use stabs format, `\|\c
-.B \-g\c
-\&\|' enables use of extra
-debugging information that only GDB can use; this extra information
-makes debugging work better in GDB but will probably make other debuggers
-crash or
-refuse to read the program. If you want to control for certain whether
-to generate the extra information, use `\|\c
-.B \-gstabs+\c
-\&\|', `\|\c
-.B \-gstabs\c
-\&\|',
-`\|\c
-.B \-gxcoff+\c
-\&\|', `\|\c
-.B \-gxcoff\c
-\&\|', `\|\c
-.B \-gdwarf+\c
-\&\|', or `\|\c
-.B \-gdwarf\c
-\&\|'
-(see below).
-.Sp
-Unlike most other C compilers, GNU CC allows you to use `\|\c
-.B \-g\c
-\&\|' with
-`\|\c
-.B \-O\c
-\&\|'. The shortcuts taken by optimized code may occasionally
-produce surprising results: some variables you declared may not exist
-at all; flow of control may briefly move where you did not expect it;
-some statements may not be executed because they compute constant
-results or their values were already at hand; some statements may
-execute in different places because they were moved out of loops.
-.Sp
-Nevertheless it proves possible to debug optimized output. This makes
-it reasonable to use the optimizer for programs that might have bugs.
-.PP
-The following options are useful when GNU CC is generated with the
-capability for more than one debugging format.
-.TP
-.B \-ggdb
-Produce debugging information in the native format (if that is supported),
-including GDB extensions if at all possible.
-.TP
-.B \-gstabs
-Produce debugging information in stabs format (if that is supported),
-without GDB extensions. This is the format used by DBX on most BSD
-systems.
-.TP
-.B \-gstabs+
-Produce debugging information in stabs format (if that is supported),
-using GNU extensions understood only by the GNU debugger (GDB). The
-use of these extensions is likely to make other debuggers crash or
-refuse to read the program.
-.TP
-.B \-gcoff
-Produce debugging information in COFF format (if that is supported).
-This is the format used by SDB on most System V systems prior to
-System V Release 4.
-.TP
-.B \-gxcoff
-Produce debugging information in XCOFF format (if that is supported).
-This is the format used by the DBX debugger on IBM RS/6000 systems.
-.TP
-.B \-gxcoff+
-Produce debugging information in XCOFF format (if that is supported),
-using GNU extensions understood only by the GNU debugger (GDB). The
-use of these extensions is likely to make other debuggers crash or
-refuse to read the program.
-.TP
-.B \-gdwarf
-Produce debugging information in DWARF format (if that is supported).
-This is the format used by SDB on most System V Release 4 systems.
-.TP
-.B \-gdwarf+
-Produce debugging information in DWARF format (if that is supported),
-using GNU extensions understood only by the GNU debugger (GDB). The
-use of these extensions is likely to make other debuggers crash or
-refuse to read the program.
-.PP
-.BI "\-g" "level"
-.br
-.BI "\-ggdb" "level"
-.br
-.BI "\-gstabs" "level"
-.br
-.BI "\-gcoff" "level"
-.BI "\-gxcoff" "level"
-.TP
-.BI "\-gdwarf" "level"
-Request debugging information and also use \c
-.I level\c
-\& to specify how
-much information. The default level is 2.
-.Sp
-Level 1 produces minimal information, enough for making backtraces in
-parts of the program that you don't plan to debug. This includes
-descriptions of functions and external variables, but no information
-about local variables and no line numbers.
-.Sp
-Level 3 includes extra information, such as all the macro definitions
-present in the program. Some debuggers support macro expansion when
-you use `\|\c
-.B \-g3\c
-\&\|'.
-.TP
-.B \-p
-Generate extra code to write profile information suitable for the
-analysis program \c
-.B prof\c
-\&.
-.TP
-.B \-pg
-Generate extra code to write profile information suitable for the
-analysis program \c
-.B gprof\c
-\&.
-.TP
-.B \-a
-Generate extra code to write profile information for basic blocks,
-which will record the number of times each basic block is executed.
-This data could be analyzed by a program like \c
-.B tcov\c
-\&. Note,
-however, that the format of the data is not what \c
-.B tcov\c
-\& expects.
-Eventually GNU \c
-.B gprof\c
-\& should be extended to process this data.
-.TP
-.B \-ax
-Generate extra code to read basic block profiling parameters from
-file `bb.in' and write profiling results to file `bb.out'.
-`bb.in' contains a list of functions. Whenever a function on the list
-is entered, profiling is turned on. When the outmost function is left,
-profiling is turned off. If a function name is prefixed with `-'
-the function is excluded from profiling. If a function name is not
-unique it can be disambiguated by writing
-`/path/filename.d:functionname'. `bb.out' will list some available
-filenames.
-Four function names have a special meaning:
-`__bb_jumps__' will cause jump frequencies to be written to `bb.out'.
-`__bb_trace__' will cause the sequence of basic blocks to be piped
-into `gzip' and written to file `bbtrace.gz'.
-`__bb_hidecall__' will cause call instructions to be excluded from
-the trace.
-`__bb_showret__' will cause return instructions to be included in
-the trace.
-.TP
-.BI "\-d" "letters"
-Says to make debugging dumps during compilation at times specified by
-.I letters\c
-\&. This is used for debugging the compiler. The file names
-for most of the dumps are made by appending a word to the source file
-name (e.g. `\|\c
-.B foo.c.rtl\c
-\&\|' or `\|\c
-.B foo.c.jump\c
-\&\|').
-.TP
-.B \-dM
-Dump all macro definitions, at the end of preprocessing, and write no
-output.
-.TP
-.B \-dN
-Dump all macro names, at the end of preprocessing.
-.TP
-.B \-dD
-Dump all macro definitions, at the end of preprocessing, in addition to
-normal output.
-.TP
-.B \-dy
-Dump debugging information during parsing, to standard error.
-.TP
-.B \-dr
-Dump after RTL generation, to `\|\c
-.I file\c
-.B \&.rtl\c
-\&\|'.
-.TP
-.B \-dx
-Just generate RTL for a function instead of compiling it. Usually used
-with `\|\c
-.B r\c
-\&\|'.
-.TP
-.B \-dj
-Dump after first jump optimization, to `\|\c
-.I file\c
-.B \&.jump\c
-\&\|'.
-.TP
-.B \-ds
-Dump after CSE (including the jump optimization that sometimes
-follows CSE), to `\|\c
-.I file\c
-.B \&.cse\c
-\&\|'.
-.TP
-.B \-dL
-Dump after loop optimization, to `\|\c
-.I file\c
-.B \&.loop\c
-\&\|'.
-.TP
-.B \-dt
-Dump after the second CSE pass (including the jump optimization that
-sometimes follows CSE), to `\|\c
-.I file\c
-.B \&.cse2\c
-\&\|'.
-.TP
-.B \-df
-Dump after flow analysis, to `\|\c
-.I file\c
-.B \&.flow\c
-\&\|'.
-.TP
-.B \-dc
-Dump after instruction combination, to `\|\c
-.I file\c
-.B \&.combine\c
-\&\|'.
-.TP
-.B \-dS
-Dump after the first instruction scheduling pass, to
-`\|\c
-.I file\c
-.B \&.sched\c
-\&\|'.
-.TP
-.B \-dl
-Dump after local register allocation, to `\|\c
-.I file\c
-.B \&.lreg\c
-\&\|'.
-.TP
-.B \-dg
-Dump after global register allocation, to `\|\c
-.I file\c
-.B \&.greg\c
-\&\|'.
-.TP
-.B \-dR
-Dump after the second instruction scheduling pass, to
-`\|\c
-.I file\c
-.B \&.sched2\c
-\&\|'.
-.TP
-.B \-dJ
-Dump after last jump optimization, to `\|\c
-.I file\c
-.B \&.jump2\c
-\&\|'.
-.TP
-.B \-dd
-Dump after delayed branch scheduling, to `\|\c
-.I file\c
-.B \&.dbr\c
-\&\|'.
-.TP
-.B \-dk
-Dump after conversion from registers to stack, to `\|\c
-.I file\c
-.B \&.stack\c
-\&\|'.
-.TP
-.B \-da
-Produce all the dumps listed above.
-.TP
-.B \-dm
-Print statistics on memory usage, at the end of the run, to
-standard error.
-.TP
-.B \-dp
-Annotate the assembler output with a comment indicating which
-pattern and alternative was used.
-.TP
-.B \-fpretend\-float
-When running a cross-compiler, pretend that the target machine uses the
-same floating point format as the host machine. This causes incorrect
-output of the actual floating constants, but the actual instruction
-sequence will probably be the same as GNU CC would make when running on
-the target machine.
-.TP
-.B \-save\-temps
-Store the usual \*(lqtemporary\*(rq intermediate files permanently; place them
-in the current directory and name them based on the source file. Thus,
-compiling `\|\c
-.B foo.c\c
-\&\|' with `\|\c
-.B \-c \-save\-temps\c
-\&\|' would produce files
-`\|\c
-.B foo.cpp\c
-\&\|' and `\|\c
-.B foo.s\c
-\&\|', as well as `\|\c
-.B foo.o\c
-\&\|'.
-.TP
-.BI "\-print\-file\-name=" "library"
-Print the full absolute name of the library file \|\c
-.nh
-.I library
-.hy
-\&\| that
-would be used when linking\(em\&and do not do anything else. With this
-option, GNU CC does not compile or link anything; it just prints the
-file name.
-.TP
-.B \-print\-libgcc\-file\-name
-Same as `\|\c
-.B \-print\-file\-name=libgcc.a\c
-\&\|'.
-.TP
-.BI "\-print\-prog\-name=" "program"
-Like `\|\c
-.B \-print\-file\-name\c
-\&\|', but searches for a program such as `\|\c
-cpp\c
-\&\|'.
-.SH OPTIMIZATION OPTIONS
-These options control various sorts of optimizations:
-.TP
-.B \-O
-.TP
-.B \-O1
-Optimize. Optimizing compilation takes somewhat more time, and a lot
-more memory for a large function.
-.Sp
-Without `\|\c
-.B \-O\c
-\&\|', the compiler's goal is to reduce the cost of
-compilation and to make debugging produce the expected results.
-Statements are independent: if you stop the program with a breakpoint
-between statements, you can then assign a new value to any variable or
-change the program counter to any other statement in the function and
-get exactly the results you would expect from the source code.
-.Sp
-Without `\|\c
-.B \-O\c
-\&\|', only variables declared \c
-.B register\c
-\& are
-allocated in registers. The resulting compiled code is a little worse
-than produced by PCC without `\|\c
-.B \-O\c
-\&\|'.
-.Sp
-With `\|\c
-.B \-O\c
-\&\|', the compiler tries to reduce code size and execution
-time.
-.Sp
-When you specify `\|\c
-.B \-O\c
-\&\|', the two options `\|\c
-.B \-fthread\-jumps\c
-\&\|' and `\|\c
-.B \-fdefer\-pop\c
-\&\|' are turned on. On machines that have delay slots, the `\|\c
-.B \-fdelayed\-branch\c
-\&\|' option is turned on. For those machines that can support debugging even
-without a frame pointer, the `\|\c
-.B \-fomit\-frame\-pointer\c
-\&\|' option is turned on. On some machines other flags may also be turned on.
-.TP
-.B \-O2
-Optimize even more. Nearly all supported optimizations that do not
-involve a space-speed tradeoff are performed. Loop unrolling and function
-inlining are not done, for example. As compared to
-.B \-O\c
-\&,
-this option increases both compilation time and the performance of the
-generated code.
-.TP
-.B \-O3
-Optimize yet more. This turns on everything
-.B \-O2
-does, along with also turning on
-.B \-finline\-functions.
-.TP
-.B \-O0
-Do not optimize.
-.Sp
-If you use multiple
-.B \-O
-options, with or without level numbers, the last such option is the
-one that is effective.
-.PP
-Options of the form `\|\c
-.B \-f\c
-.I flag\c
-\&\c
-\&\|' specify machine-independent
-flags. Most flags have both positive and negative forms; the negative
-form of `\|\c
-.B \-ffoo\c
-\&\|' would be `\|\c
-.B \-fno\-foo\c
-\&\|'. The following list shows
-only one form\(em\&the one which is not the default.
-You can figure out the other form by either removing `\|\c
-.B no\-\c
-\&\|' or
-adding it.
-.TP
-.B \-ffloat\-store
-Do not store floating point variables in registers. This
-prevents undesirable excess precision on machines such as the
-68000 where the floating registers (of the 68881) keep more
-precision than a \c
-.B double\c
-\& is supposed to have.
-.Sp
-For most programs, the excess precision does only good, but a few
-programs rely on the precise definition of IEEE floating point.
-Use `\|\c
-.B \-ffloat\-store\c
-\&\|' for such programs.
-.TP
-.B \-fmemoize\-lookups
-.TP
-.B \-fsave\-memoized
-Use heuristics to compile faster (C++ only). These heuristics are not
-enabled by default, since they are only effective for certain input
-files. Other input files compile more slowly.
-.Sp
-The first time the compiler must build a call to a member function (or
-reference to a data member), it must (1) determine whether the class
-implements member functions of that name; (2) resolve which member
-function to call (which involves figuring out what sorts of type
-conversions need to be made); and (3) check the visibility of the member
-function to the caller. All of this adds up to slower compilation.
-Normally, the second time a call is made to that member function (or
-reference to that data member), it must go through the same lengthy
-process again. This means that code like this
-.Sp
-\& cout << "This " << p << " has " << n << " legs.\en";
-.Sp
-makes six passes through all three steps. By using a software cache,
-a \*(lqhit\*(rq significantly reduces this cost. Unfortunately, using the
-cache introduces another layer of mechanisms which must be implemented,
-and so incurs its own overhead. `\|\c
-.B \-fmemoize\-lookups\c
-\&\|' enables
-the software cache.
-.Sp
-Because access privileges (visibility) to members and member functions
-may differ from one function context to the next,
-.B g++
-may need to flush the cache. With the `\|\c
-.B \-fmemoize\-lookups\c
-\&\|' flag, the cache is flushed after every
-function that is compiled. The `\|\c
-\-fsave\-memoized\c
-\&\|' flag enables the same software cache, but when the compiler
-determines that the context of the last function compiled would yield
-the same access privileges of the next function to compile, it
-preserves the cache.
-This is most helpful when defining many member functions for the same
-class: with the exception of member functions which are friends of
-other classes, each member function has exactly the same access
-privileges as every other, and the cache need not be flushed.
-.TP
-.B \-fno\-default\-inline
-Don't make member functions inline by default merely because they are
-defined inside the class scope (C++ only).
-.TP
-.B \-fno\-defer\-pop
-Always pop the arguments to each function call as soon as that
-function returns. For machines which must pop arguments after a
-function call, the compiler normally lets arguments accumulate on the
-stack for several function calls and pops them all at once.
-.TP
-.B \-fforce\-mem
-Force memory operands to be copied into registers before doing
-arithmetic on them. This may produce better code by making all
-memory references potential common subexpressions. When they are
-not common subexpressions, instruction combination should
-eliminate the separate register-load. I am interested in hearing
-about the difference this makes.
-.TP
-.B \-fforce\-addr
-Force memory address constants to be copied into registers before
-doing arithmetic on them. This may produce better code just as
-`\|\c
-.B \-fforce\-mem\c
-\&\|' may. I am interested in hearing about the
-difference this makes.
-.TP
-.B \-fomit\-frame\-pointer
-Don't keep the frame pointer in a register for functions that
-don't need one. This avoids the instructions to save, set up and
-restore frame pointers; it also makes an extra register available
-in many functions. \c
-.I It also makes debugging impossible on most machines\c
-\&.
-.Sp
-On some machines, such as the Vax, this flag has no effect, because
-the standard calling sequence automatically handles the frame pointer
-and nothing is saved by pretending it doesn't exist. The
-machine-description macro \c
-.B FRAME_POINTER_REQUIRED\c
-\& controls
-whether a target machine supports this flag.
-.TP
-.B \-finline\-functions
-Integrate all simple functions into their callers. The compiler
-heuristically decides which functions are simple enough to be worth
-integrating in this way.
-.Sp
-If all calls to a given function are integrated, and the function is
-declared \c
-.B static\c
-\&, then GCC normally does not output the function as
-assembler code in its own right.
-.TP
-.B \-fcaller\-saves
-Enable values to be allocated in registers that will be clobbered by
-function calls, by emitting extra instructions to save and restore the
-registers around such calls. Such allocation is done only when it
-seems to result in better code than would otherwise be produced.
-.Sp
-This option is enabled by default on certain machines, usually those
-which have no call-preserved registers to use instead.
-.TP
-.B \-fkeep\-inline\-functions
-Even if all calls to a given function are integrated, and the function
-is declared \c
-.B static\c
-\&, nevertheless output a separate run-time
-callable version of the function.
-.TP
-.B \-fno\-function\-cse
-Do not put function addresses in registers; make each instruction that
-calls a constant function contain the function's address explicitly.
-.Sp
-This option results in less efficient code, but some strange hacks
-that alter the assembler output may be confused by the optimizations
-performed when this option is not used.
-.TP
-.B \-fno\-peephole
-Disable any machine-specific peephole optimizations.
-.TP
-.B \-ffast-math
-This option allows GCC to violate some ANSI or IEEE rules/specifications
-in the interest of optimizing code for speed. For example, it allows
-the compiler to assume arguments to the \c
-.B sqrt\c
-\& function are
-non-negative numbers.
-.Sp
-This option should never be turned on by any `\|\c
-.B \-O\c
-\&\|' option since
-it can result in incorrect output for programs which depend on
-an exact implementation of IEEE or ANSI rules/specifications for
-math functions.
-.PP
-The following options control specific optimizations. The `\|\c
-.B \-O2\c
-\&\|'
-option turns on all of these optimizations except `\|\c
-.B \-funroll\-loops\c
-\&\|'
-and `\|\c
-.B \-funroll\-all\-loops\c
-\&\|'.
-.PP
-The `\|\c
-.B \-O\c
-\&\|' option usually turns on
-the `\|\c
-.B \-fthread\-jumps\c
-\&\|' and `\|\c
-.B \-fdelayed\-branch\c
-\&\|' options, but
-specific machines may change the default optimizations.
-.PP
-You can use the following flags in the rare cases when \*(lqfine-tuning\*(rq
-of optimizations to be performed is desired.
-.TP
-.B \-fstrength\-reduce
-Perform the optimizations of loop strength reduction and
-elimination of iteration variables.
-.TP
-.B \-fthread\-jumps
-Perform optimizations where we check to see if a jump branches to a
-location where another comparison subsumed by the first is found. If
-so, the first branch is redirected to either the destination of the
-second branch or a point immediately following it, depending on whether
-the condition is known to be true or false.
-.TP
-.B \-funroll\-loops
-Perform the optimization of loop unrolling. This is only done for loops
-whose number of iterations can be determined at compile time or run time.
-.TP
-.B \-funroll\-all\-loops
-Perform the optimization of loop unrolling. This is done for all loops.
-This usually makes programs run more slowly.
-.TP
-.B \-fcse\-follow\-jumps
-In common subexpression elimination, scan through jump instructions
-when the target of the jump is not reached by any other path. For
-example, when CSE encounters an \c
-.B if\c
-\& statement with an
-.B else\c
-\& clause, CSE will follow the jump when the condition
-tested is false.
-.TP
-.B \-fcse\-skip\-blocks
-This is similar to `\|\c
-.B \-fcse\-follow\-jumps\c
-\&\|', but causes CSE to
-follow jumps which conditionally skip over blocks. When CSE
-encounters a simple \c
-.B if\c
-\& statement with no else clause,
-`\|\c
-.B \-fcse\-skip\-blocks\c
-\&\|' causes CSE to follow the jump around the
-body of the \c
-.B if\c
-\&.
-.TP
-.B \-frerun\-cse\-after\-loop
-Re-run common subexpression elimination after loop optimizations has been
-performed.
-.TP
-.B \-felide\-constructors
-Elide constructors when this seems plausible (C++ only). With this
-flag, GNU C++ initializes \c
-.B y\c
-\& directly from the call to \c
-.B foo
-without going through a temporary in the following code:
-.Sp
-A foo ();
-A y = foo ();
-.Sp
-Without this option, GNU C++ first initializes \c
-.B y\c
-\& by calling the
-appropriate constructor for type \c
-.B A\c
-\&; then assigns the result of
-.B foo\c
-\& to a temporary; and, finally, replaces the initial value of
-`\|\c
-.B y\c
-\&\|' with the temporary.
-.Sp
-The default behavior (`\|\c
-.B \-fno\-elide\-constructors\c
-\&\|') is specified by
-the draft ANSI C++ standard. If your program's constructors have side
-effects, using `\|\c
-.B \-felide-constructors\c
-\&\|' can make your program act
-differently, since some constructor calls may be omitted.
-.TP
-.B \-fexpensive\-optimizations
-Perform a number of minor optimizations that are relatively expensive.
-.TP
-.B \-fdelayed\-branch
-If supported for the target machine, attempt to reorder instructions
-to exploit instruction slots available after delayed branch
-instructions.
-.TP
-.B \-fschedule\-insns
-If supported for the target machine, attempt to reorder instructions to
-eliminate execution stalls due to required data being unavailable. This
-helps machines that have slow floating point or memory load instructions
-by allowing other instructions to be issued until the result of the load
-or floating point instruction is required.
-.TP
-.B \-fschedule\-insns2
-Similar to `\|\c
-.B \-fschedule\-insns\c
-\&\|', but requests an additional pass of
-instruction scheduling after register allocation has been done. This is
-especially useful on machines with a relatively small number of
-registers and where memory load instructions take more than one cycle.
-.SH TARGET OPTIONS
-By default, GNU CC compiles code for the same type of machine that you
-are using. However, it can also be installed as a cross-compiler, to
-compile for some other type of machine. In fact, several different
-configurations of GNU CC, for different target machines, can be
-installed side by side. Then you specify which one to use with the
-`\|\c
-.B \-b\c
-\&\|' option.
-.PP
-In addition, older and newer versions of GNU CC can be installed side
-by side. One of them (probably the newest) will be the default, but
-you may sometimes wish to use another.
-.TP
-.BI "\-b " "machine"
-The argument \c
-.I machine\c
-\& specifies the target machine for compilation.
-This is useful when you have installed GNU CC as a cross-compiler.
-.Sp
-The value to use for \c
-.I machine\c
-\& is the same as was specified as the
-machine type when configuring GNU CC as a cross-compiler. For
-example, if a cross-compiler was configured with `\|\c
-.B configure
-i386v\c
-\&\|', meaning to compile for an 80386 running System V, then you
-would specify `\|\c
-.B \-b i386v\c
-\&\|' to run that cross compiler.
-.Sp
-When you do not specify `\|\c
-.B \-b\c
-\&\|', it normally means to compile for
-the same type of machine that you are using.
-.TP
-.BI "\-V " "version"
-The argument \c
-.I version\c
-\& specifies which version of GNU CC to run.
-This is useful when multiple versions are installed. For example,
-.I version\c
-\& might be `\|\c
-.B 2.0\c
-\&\|', meaning to run GNU CC version 2.0.
-.Sp
-The default version, when you do not specify `\|\c
-.B \-V\c
-\&\|', is controlled
-by the way GNU CC is installed. Normally, it will be a version that
-is recommended for general use.
-.SH MACHINE DEPENDENT OPTIONS
-Each of the target machine types can have its own special options,
-starting with `\|\c
-.B \-m\c
-\&\|', to choose among various hardware models or
-configurations\(em\&for example, 68010 vs 68020, floating coprocessor or
-none. A single installed version of the compiler can compile for any
-model or configuration, according to the options specified.
-.PP
-Some configurations of the compiler also support additional special
-options, usually for command-line compatibility with other compilers on
-the same platform.
-.PP
-These are the `\|\c
-.B \-m\c
-\&\|' options defined for the 68000 series:
-.TP
-.B \-m68000
-.TP
-.B \-mc68000
-Generate output for a 68000. This is the default when the compiler is
-configured for 68000-based systems.
-.TP
-.B \-m68020
-.TP
-.B \-mc68020
-Generate output for a 68020 (rather than a 68000). This is the
-default when the compiler is configured for 68020-based systems.
-.TP
-.B \-m68881
-Generate output containing 68881 instructions for floating point.
-This is the default for most 68020-based systems unless
-.B \-nfp
-was specified when the compiler was configured.
-.TP
-.B \-m68030
-Generate output for a 68030. This is the default when the compiler is
-configured for 68030-based systems.
-.TP
-.B \-m68040
-Generate output for a 68040. This is the default when the compiler is
-configured for 68040-based systems.
-.TP
-.B \-m68020\-40
-Generate output for a 68040, without using any of the new instructions.
-This results in code which can run relatively efficiently on either a
-68020/68881 or a 68030 or a 68040.
-.TP
-.B \-mfpa
-Generate output containing Sun FPA instructions for floating point.
-.TP
-.B \-msoft\-float
-Generate output containing library calls for floating point.
-.I
-WARNING:
-the requisite libraries are not part of GNU CC. Normally the
-facilities of the machine's usual C compiler are used, but this can't
-be done directly in cross-compilation. You must make your own
-arrangements to provide suitable library functions for cross-compilation.
-.TP
-.B \-mshort
-Consider type \c
-.B int\c
-\& to be 16 bits wide, like \c
-.B short int\c
-\&.
-.TP
-.B \-mnobitfield
-Do not use the bit-field instructions. `\|\c
-.B \-m68000\c
-\&\|' implies
-`\|\c
-.B \-mnobitfield\c
-\&\|'.
-.TP
-.B \-mbitfield
-Do use the bit-field instructions. `\|\c
-.B \-m68020\c
-\&\|' implies
-`\|\c
-.B \-mbitfield\c
-\&\|'. This is the default if you use the unmodified
-sources.
-.TP
-.B \-mrtd
-Use a different function-calling convention, in which functions
-that take a fixed number of arguments return with the \c
-.B rtd
-instruction, which pops their arguments while returning. This
-saves one instruction in the caller since there is no need to pop
-the arguments there.
-.Sp
-This calling convention is incompatible with the one normally
-used on Unix, so you cannot use it if you need to call libraries
-compiled with the Unix compiler.
-.Sp
-Also, you must provide function prototypes for all functions that
-take variable numbers of arguments (including \c
-.B printf\c
-\&);
-otherwise incorrect code will be generated for calls to those
-functions.
-.Sp
-In addition, seriously incorrect code will result if you call a
-function with too many arguments. (Normally, extra arguments are
-harmlessly ignored.)
-.Sp
-The \c
-.B rtd\c
-\& instruction is supported by the 68010 and 68020
-processors, but not by the 68000.
-.PP
-These `\|\c
-.B \-m\c
-\&\|' options are defined for the Vax:
-.TP
-.B \-munix
-Do not output certain jump instructions (\c
-.B aobleq\c
-\& and so on)
-that the Unix assembler for the Vax cannot handle across long
-ranges.
-.TP
-.B \-mgnu
-Do output those jump instructions, on the assumption that you
-will assemble with the GNU assembler.
-.TP
-.B \-mg
-Output code for g-format floating point numbers instead of d-format.
-.PP
-These `\|\c
-.B \-m\c
-\&\|' switches are supported on the SPARC:
-.PP
-.B \-mfpu
-.TP
-.B \-mhard\-float
-Generate output containing floating point instructions. This is the
-default.
-.PP
-.B \-mno\-fpu
-.TP
-.B \-msoft\-float
-Generate output containing library calls for floating point.
-.I Warning:
-there is no GNU floating-point library for SPARC.
-Normally the facilities of the machine's usual C compiler are used, but
-this cannot be done directly in cross-compilation. You must make your
-own arrangements to provide suitable library functions for
-cross-compilation.
-.Sp
-.B \-msoft\-float
-changes the calling convention in the output file;
-therefore, it is only useful if you compile
-.I all
-of a program with this option.
-.PP
-.B \-mno\-epilogue
-.TP
-.B \-mepilogue
-With
-.B \-mepilogue
-(the default), the compiler always emits code for
-function exit at the end of each function. Any function exit in
-the middle of the function (such as a return statement in C) will
-generate a jump to the exit code at the end of the function.
-.Sp
-With
-.BR \-mno\-epilogue ,
-the compiler tries to emit exit code inline at every function exit.
-.PP
-.B \-mno\-v8
-.TP
-.B \-mv8
-.TP
-.B \-msparclite
-These three options select variations on the SPARC architecture.
-.Sp
-By default (unless specifically configured for the Fujitsu SPARClite),
-GCC generates code for the v7 variant of the SPARC architecture.
-.Sp
-.B \-mv8
-will give you SPARC v8 code. The only difference from v7
-code is that the compiler emits the integer multiply and integer
-divide instructions which exist in SPARC v8 but not in SPARC v7.
-.Sp
-.B \-msparclite
-will give you SPARClite code. This adds the integer
-multiply, integer divide step and scan (ffs) instructions which
-exist in SPARClite but not in SPARC v7.
-.PP
-.B \-mcypress
-.TP
-.B \-msupersparc
-These two options select the processor for which the code is optimised.
-.Sp
-With
-.B \-mcypress
-(the default), the compiler optimises code for the Cypress CY7C602 chip, as
-used in the SparcStation/SparcServer 3xx series. This is also appropriate for
-the older SparcStation 1, 2, IPX etc.
-.Sp
-With
-.B \-msupersparc
-the compiler optimises code for the SuperSparc cpu, as used in the SparcStation
-10, 1000 and 2000 series. This flag also enables use of the full SPARC v8
-instruction set.
-.PP
-These `\|\c
-.B \-m\c
-\&\|' options are defined for the Convex:
-.TP
-.B \-mc1
-Generate output for a C1. This is the default when the compiler is
-configured for a C1.
-.TP
-.B \-mc2
-Generate output for a C2. This is the default when the compiler is
-configured for a C2.
-.TP
-.B \-margcount
-Generate code which puts an argument count in the word preceding each
-argument list. Some nonportable Convex and Vax programs need this word.
-(Debuggers don't, except for functions with variable-length argument
-lists; this info is in the symbol table.)
-.TP
-.B \-mnoargcount
-Omit the argument count word. This is the default if you use the
-unmodified sources.
-.PP
-These `\|\c
-.B \-m\c
-\&\|' options are defined for the AMD Am29000:
-.TP
-.B \-mdw
-Generate code that assumes the DW bit is set, i.e., that byte and
-halfword operations are directly supported by the hardware. This is the
-default.
-.TP
-.B \-mnodw
-Generate code that assumes the DW bit is not set.
-.TP
-.B \-mbw
-Generate code that assumes the system supports byte and halfword write
-operations. This is the default.
-.TP
-.B \-mnbw
-Generate code that assumes the systems does not support byte and
-halfword write operations. This implies `\|\c
-.B \-mnodw\c
-\&\|'.
-.TP
-.B \-msmall
-Use a small memory model that assumes that all function addresses are
-either within a single 256 KB segment or at an absolute address of less
-than 256K. This allows the \c
-.B call\c
-\& instruction to be used instead
-of a \c
-.B const\c
-\&, \c
-.B consth\c
-\&, \c
-.B calli\c
-\& sequence.
-.TP
-.B \-mlarge
-Do not assume that the \c
-.B call\c
-\& instruction can be used; this is the
-default.
-.TP
-.B \-m29050
-Generate code for the Am29050.
-.TP
-.B \-m29000
-Generate code for the Am29000. This is the default.
-.TP
-.B \-mkernel\-registers
-Generate references to registers \c
-.B gr64-gr95\c
-\& instead of
-.B gr96-gr127\c
-\&. This option can be used when compiling kernel code
-that wants a set of global registers disjoint from that used by
-user-mode code.
-.Sp
-Note that when this option is used, register names in `\|\c
-.B \-f\c
-\&\|' flags
-must use the normal, user-mode, names.
-.TP
-.B \-muser\-registers
-Use the normal set of global registers, \c
-.B gr96-gr127\c
-\&. This is the
-default.
-.TP
-.B \-mstack\-check
-Insert a call to \c
-.B _\|_msp_check\c
-\& after each stack adjustment. This
-is often used for kernel code.
-.PP
-These `\|\c
-.B \-m\c
-\&\|' options are defined for Motorola 88K architectures:
-.TP
-.B \-m88000
-Generate code that works well on both the m88100 and the
-m88110.
-.TP
-.B \-m88100
-Generate code that works best for the m88100, but that also
-runs on the m88110.
-.TP
-.B \-m88110
-Generate code that works best for the m88110, and may not run
-on the m88100.
-.TP
-.B \-midentify\-revision
-Include an \c
-.B ident\c
-\& directive in the assembler output recording the
-source file name, compiler name and version, timestamp, and compilation
-flags used.
-.TP
-.B \-mno\-underscores
-In assembler output, emit symbol names without adding an underscore
-character at the beginning of each name. The default is to use an
-underscore as prefix on each name.
-.TP
-.B \-mno\-check\-zero\-division
-.TP
-.B \-mcheck\-zero\-division
-Early models of the 88K architecture had problems with division by zero;
-in particular, many of them didn't trap. Use these options to avoid
-including (or to include explicitly) additional code to detect division
-by zero and signal an exception. All GCC configurations for the 88K use
-`\|\c
-.B \-mcheck\-zero\-division\c
-\&\|' by default.
-.TP
-.B \-mocs\-debug\-info
-.TP
-.B \-mno\-ocs\-debug\-info
-Include (or omit) additional debugging information (about
-registers used in each stack frame) as specified in the 88Open Object
-Compatibility Standard, \*(lqOCS\*(rq. This extra information is not needed
-by GDB. The default for DG/UX, SVr4, and Delta 88 SVr3.2 is to
-include this information; other 88k configurations omit this information
-by default.
-.TP
-.B \-mocs\-frame\-position
-.TP
-.B \-mno\-ocs\-frame\-position
-Force (or do not require) register values to be stored in a particular
-place in stack frames, as specified in OCS. The DG/UX, Delta88 SVr3.2,
-and BCS configurations use `\|\c
-.B \-mocs\-frame\-position\c
-\&\|'; other 88k
-configurations have the default `\|\c
-.B \-mno\-ocs\-frame\-position\c
-\&\|'.
-.TP
-.B \-moptimize\-arg\-area
-.TP
-.B \-mno\-optimize\-arg\-area
-Control how to store function arguments in stack frames.
-`\|\c
-.B \-moptimize\-arg\-area\c
-\&\|' saves space, but may break some
-debuggers (not GDB). `\|\c
-.B \-mno\-optimize\-arg\-area\c
-\&\|' conforms better to
-standards. By default GCC does not optimize the argument area.
-.TP
-.BI "\-mshort\-data\-" "num"
-.I num
-Generate smaller data references by making them relative to \c
-.B r0\c
-\&,
-which allows loading a value using a single instruction (rather than the
-usual two). You control which data references are affected by
-specifying \c
-.I num\c
-\& with this option. For example, if you specify
-`\|\c
-.B \-mshort\-data\-512\c
-\&\|', then the data references affected are those
-involving displacements of less than 512 bytes.
-`\|\c
-.B \-mshort\-data\-\c
-.I num\c
-\&\c
-\&\|' is not effective for \c
-.I num\c
-\& greater
-than 64K.
-.PP
-.B \-mserialize-volatile
-.TP
-.B \-mno-serialize-volatile
-Do, or do not, generate code to guarantee sequential consistency of
-volatile memory references.
-.Sp
-GNU CC always guarantees consistency by default, for the preferred
-processor submodel. How this is done depends on the submodel.
-.Sp
-The m88100 processor does not reorder memory references and so always
-provides sequential consistency. If you use `\|\c
-.B \-m88100\c
-\&\|', GNU CC does
-not generate any special instructions for sequential consistency.
-.Sp
-The order of memory references made by the m88110 processor does not
-always match the order of the instructions requesting those references.
-In particular, a load instruction may execute before a preceding store
-instruction. Such reordering violates sequential consistency of
-volatile memory references, when there are multiple processors. When
-you use `\|\c
-.B \-m88000\c
-\&\|' or `\|\c
-.B \-m88110\c
-\&\|', GNU CC generates special
-instructions when appropriate, to force execution in the proper order.
-.Sp
-The extra code generated to guarantee consistency may affect the
-performance of your application. If you know that you can safely forgo
-this guarantee, you may use the option `\|\c
-.B \-mno-serialize-volatile\c
-\&\|'.
-.Sp
-If you use the `\|\c
-.B \-m88100\c
-\&\|' option but require sequential consistency
-when running on the m88110 processor, you should use
-`\|\c
-.B \-mserialize-volatile\c
-\&\|'.
-.PP
-.B \-msvr4
-.TP
-.B \-msvr3
-Turn on (`\|\c
-.B \-msvr4\c
-\&\|') or off (`\|\c
-.B \-msvr3\c
-\&\|') compiler extensions
-related to System V release 4 (SVr4). This controls the following:
-.TP
-\ \ \ \(bu
-Which variant of the assembler syntax to emit (which you can select
-independently using `\|\c
-.B \-mversion\-03.00\c
-\&\|').
-.TP
-\ \ \ \(bu
-`\|\c
-.B \-msvr4\c
-\&\|' makes the C preprocessor recognize `\|\c
-.B #pragma weak\c
-\&\|'
-.TP
-\ \ \ \(bu
-`\|\c
-.B \-msvr4\c
-\&\|' makes GCC issue additional declaration directives used in
-SVr4.
-.PP
-`\|\c
-.B \-msvr3\c
-\&\|' is the default for all m88K configurations except
-the SVr4 configuration.
-.TP
-.B \-mtrap\-large\-shift
-.TP
-.B \-mhandle\-large\-shift
-Include code to detect bit-shifts of more than 31 bits; respectively,
-trap such shifts or emit code to handle them properly. By default GCC
-makes no special provision for large bit shifts.
-.TP
-.B \-muse\-div\-instruction
-Very early models of the 88K architecture didn't have a divide
-instruction, so GCC avoids that instruction by default. Use this option
-to specify that it's safe to use the divide instruction.
-.TP
-.B \-mversion\-03.00
-In the DG/UX configuration, there are two flavors of SVr4. This option
-modifies
-.B \-msvr4
-to select whether the hybrid-COFF or real-ELF
-flavor is used. All other configurations ignore this option.
-.TP
-.B \-mwarn\-passed\-structs
-Warn when a function passes a struct as an argument or result.
-Structure-passing conventions have changed during the evolution of the C
-language, and are often the source of portability problems. By default,
-GCC issues no such warning.
-.PP
-These options are defined for the IBM RS6000:
-.PP
-.B \-mfp\-in\-toc
-.TP
-.B \-mno\-fp\-in\-toc
-Control whether or not floating-point constants go in the Table of
-Contents (TOC), a table of all global variable and function addresses. By
-default GCC puts floating-point constants there; if the TOC overflows,
-`\|\c
-.B \-mno\-fp\-in\-toc\c
-\&\|' will reduce the size of the TOC, which may avoid
-the overflow.
-.PP
-These `\|\c
-.B \-m\c
-\&\|' options are defined for the IBM RT PC:
-.TP
-.B \-min\-line\-mul
-Use an in-line code sequence for integer multiplies. This is the
-default.
-.TP
-.B \-mcall\-lib\-mul
-Call \c
-.B lmul$$\c
-\& for integer multiples.
-.TP
-.B \-mfull\-fp\-blocks
-Generate full-size floating point data blocks, including the minimum
-amount of scratch space recommended by IBM. This is the default.
-.TP
-.B \-mminimum\-fp\-blocks
-Do not include extra scratch space in floating point data blocks. This
-results in smaller code, but slower execution, since scratch space must
-be allocated dynamically.
-.TP
-.B \-mfp\-arg\-in\-fpregs
-Use a calling sequence incompatible with the IBM calling convention in
-which floating point arguments are passed in floating point registers.
-Note that \c
-.B varargs.h\c
-\& and \c
-.B stdargs.h\c
-\& will not work with
-floating point operands if this option is specified.
-.TP
-.B \-mfp\-arg\-in\-gregs
-Use the normal calling convention for floating point arguments. This is
-the default.
-.TP
-.B \-mhc\-struct\-return
-Return structures of more than one word in memory, rather than in a
-register. This provides compatibility with the MetaWare HighC (hc)
-compiler. Use `\|\c
-.B \-fpcc\-struct\-return\c
-\&\|' for compatibility with the
-Portable C Compiler (pcc).
-.TP
-.B \-mnohc\-struct\-return
-Return some structures of more than one word in registers, when
-convenient. This is the default. For compatibility with the
-IBM-supplied compilers, use either `\|\c
-.B \-fpcc\-struct\-return\c
-\&\|' or
-`\|\c
-.B \-mhc\-struct\-return\c
-\&\|'.
-.PP
-These `\|\c
-.B \-m\c
-\&\|' options are defined for the MIPS family of computers:
-.TP
-.BI "\-mcpu=" "cpu-type"
-Assume the defaults for the machine type
-.I cpu-type
-when
-scheduling instructions. The default
-.I cpu-type
-is
-.BR default ,
-which picks the longest cycles times for any of the machines, in order
-that the code run at reasonable rates on all MIPS cpu's. Other
-choices for
-.I cpu-type
-are
-.BR r2000 ,
-.BR r3000 ,
-.BR r4000 ,
-and
-.BR r6000 .
-While picking a specific
-.I cpu-type
-will schedule things appropriately for that particular chip, the
-compiler will not generate any code that does not meet level 1 of the
-MIPS ISA (instruction set architecture) without the
-.B \-mips2
-or
-.B \-mips3
-switches being used.
-.TP
-.B \-mips2
-Issue instructions from level 2 of the MIPS ISA (branch likely, square
-root instructions). The
-.B \-mcpu=r4000
-or
-.B \-mcpu=r6000
-switch must be used in conjunction with
-.BR \-mips2 .
-.TP
-.B \-mips3
-Issue instructions from level 3 of the MIPS ISA (64 bit instructions).
-The
-.B \-mcpu=r4000
-switch must be used in conjunction with
-.BR \-mips2 .
-.TP
-.B \-mint64
-.TP
-.B \-mlong64
-.TP
-.B \-mlonglong128
-These options don't work at present.
-.TP
-.B \-mmips\-as
-Generate code for the MIPS assembler, and invoke
-.B mips\-tfile
-to add normal debug information. This is the default for all
-platforms except for the OSF/1 reference platform, using the OSF/rose
-object format. If any of the
-.BR \-ggdb ,
-.BR \-gstabs ,
-or
-.B \-gstabs+
-switches are used, the
-.B mips\-tfile
-program will encapsulate the stabs within MIPS ECOFF.
-.TP
-.B \-mgas
-Generate code for the GNU assembler. This is the default on the OSF/1
-reference platform, using the OSF/rose object format.
-.TP
-.B \-mrnames
-.TP
-.B \-mno\-rnames
-The
-.B \-mrnames
-switch says to output code using the MIPS software names for the
-registers, instead of the hardware names (ie,
-.B a0
-instead of
-.BR $4 ).
-The GNU assembler does not support the
-.B \-mrnames
-switch, and the MIPS assembler will be instructed to run the MIPS C
-preprocessor over the source file. The
-.B \-mno\-rnames
-switch is default.
-.TP
-.B \-mgpopt
-.TP
-.B \-mno\-gpopt
-The
-.B \-mgpopt
-switch says to write all of the data declarations before the
-instructions in the text section, to all the MIPS assembler to
-generate one word memory references instead of using two words for
-short global or static data items. This is on by default if
-optimization is selected.
-.TP
-.B \-mstats
-.TP
-.B \-mno\-stats
-For each non-inline function processed, the
-.B \-mstats
-switch causes the compiler to emit one line to the standard error file
-to print statistics about the program (number of registers saved,
-stack size, etc.).
-.TP
-.B \-mmemcpy
-.TP
-.B \-mno\-memcpy
-The
-.B \-mmemcpy
-switch makes all block moves call the appropriate string function
-.RB ( memcpy
-or
-.BR bcopy )
-instead of possibly generating inline code.
-.TP
-.B \-mmips\-tfile
-.TP
-.B \-mno\-mips\-tfile
-The
-.B \-mno\-mips\-tfile
-switch causes the compiler not postprocess the object file with the
-.B mips\-tfile
-program, after the MIPS assembler has generated it to add debug
-support. If
-.B mips\-tfile
-is not run, then no local variables will be available to the debugger.
-In addition,
-.B stage2
-and
-.B stage3
-objects will have the temporary file names passed to the assembler
-embedded in the object file, which means the objects will not compare
-the same.
-.TP
-.B \-msoft\-float
-Generate output containing library calls for floating point.
-.I
-WARNING:
-the requisite libraries are not part of GNU CC. Normally the
-facilities of the machine's usual C compiler are used, but this can't
-be done directly in cross-compilation. You must make your own
-arrangements to provide suitable library functions for cross-compilation.
-.TP
-.B \-mhard\-float
-Generate output containing floating point instructions. This is the
-default if you use the unmodified sources.
-.TP
-.B \-mfp64
-Assume that the
-.B FR
-bit in the status word is on, and that there are 32 64-bit floating
-point registers, instead of 32 32-bit floating point registers. You
-must also specify the
-.B \-mcpu=r4000
-and
-.B \-mips3
-switches.
-.TP
-.B \-mfp32
-Assume that there are 32 32-bit floating point registers. This is the
-default.
-.PP
-.B \-mabicalls
-.TP
-.B \-mno\-abicalls
-Emit (or do not emit) the
-.BR \&.abicalls ,
-.BR \&.cpload ,
-and
-.B \&.cprestore
-pseudo operations that some System V.4 ports use for position
-independent code.
-.TP
-.B \-mhalf\-pic
-.TP
-.B \-mno\-half\-pic
-The
-.B \-mhalf\-pic
-switch says to put pointers to extern references into the data section
-and load them up, rather than put the references in the text section.
-This option does not work at present.
-.B
-.BI \-G num
-Put global and static items less than or equal to
-.I num
-bytes into the small data or bss sections instead of the normal data
-or bss section. This allows the assembler to emit one word memory
-reference instructions based on the global pointer
-.RB ( gp
-or
-.BR $28 ),
-instead of the normal two words used. By default,
-.I num
-is 8 when the MIPS assembler is used, and 0 when the GNU
-assembler is used. The
-.BI \-G num
-switch is also passed to the assembler and linker. All modules should
-be compiled with the same
-.BI \-G num
-value.
-.TP
-.B \-nocpp
-Tell the MIPS assembler to not run its preprocessor over user
-assembler files (with a `\|\c
-.B .s\c
-\&\|' suffix) when assembling them.
-.PP
-These `\|\c
-.B \-m\c
-\&\|' options are defined for the Intel 80386 family of computers:
-.B \-m486
-.TP
-.B \-mno\-486
-Control whether or not code is optimized for a 486 instead of an
-386. Code generated for a 486 will run on a 386 and vice versa.
-.TP
-.B \-msoft\-float
-Generate output containing library calls for floating point.
-.I Warning:
-the requisite libraries are not part of GNU CC.
-Normally the facilities of the machine's usual C compiler are used, but
-this can't be done directly in cross-compilation. You must make your
-own arrangements to provide suitable library functions for
-cross-compilation.
-.Sp
-On machines where a function returns floating point results in the 80387
-register stack, some floating point opcodes may be emitted even if
-`\|\c
-.B \-msoft-float\c
-\&\|' is used.
-.TP
-.B \-mno-fp-ret-in-387
-Do not use the FPU registers for return values of functions.
-.Sp
-The usual calling convention has functions return values of types
-.B float\c
-\& and \c
-.B double\c
-\& in an FPU register, even if there
-is no FPU. The idea is that the operating system should emulate
-an FPU.
-.Sp
-The option `\|\c
-.B \-mno-fp-ret-in-387\c
-\&\|' causes such values to be returned
-in ordinary CPU registers instead.
-.PP
-These `\|\c
-.B \-m\c
-\&\|' options are defined for the HPPA family of computers:
-.TP
-.B \-mpa-risc-1-0
-Generate code for a PA 1.0 processor.
-.TP
-.B \-mpa-risc-1-1
-Generate code for a PA 1.1 processor.
-.TP
-.B \-mkernel
-Generate code which is suitable for use in kernels. Specifically, avoid
-.B add\c
-\& instructions in which one of the arguments is the DP register;
-generate \c
-.B addil\c
-\& instructions instead. This avoids a rather serious
-bug in the HP-UX linker.
-.TP
-.B \-mshared-libs
-Generate code that can be linked against HP-UX shared libraries. This option
-is not fully function yet, and is not on by default for any PA target. Using
-this option can cause incorrect code to be generated by the compiler.
-.TP
-.B \-mno-shared-libs
-Don't generate code that will be linked against shared libraries. This is
-the default for all PA targets.
-.TP
-.B \-mlong-calls
-Generate code which allows calls to functions greater than 256K away from
-the caller when the caller and callee are in the same source file. Do
-not turn this option on unless code refuses to link with \*(lqbranch out of
-range errors\*('' from the linker.
-.TP
-.B \-mdisable-fpregs
-Prevent floating point registers from being used in any manner. This is
-necessary for compiling kernels which perform lazy context switching of
-floating point registers. If you use this option and attempt to perform
-floating point operations, the compiler will abort.
-.TP
-.B \-mdisable-indexing
-Prevent the compiler from using indexing address modes. This avoids some
-rather obscure problems when compiling MIG generated code under MACH.
-.TP
-.B \-mtrailing-colon
-Add a colon to the end of label definitions (for ELF assemblers).
-.PP
-These `\|\c
-.B \-m\c
-\&\|' options are defined for the Intel 80960 family of computers:
-.TP
-.BI "\-m" "cpu-type"
-Assume the defaults for the machine type
-.I cpu-type
-for instruction and addressing-mode availability and alignment.
-The default
-.I cpu-type
-is
-.BR kb ;
-other choices are
-.BR ka ,
-.BR mc ,
-.BR ca ,
-.BR cf ,
-.BR sa ,
-and
-.BR sb .
-.TP
-.B \-mnumerics
-.TP
-.B \-msoft\-float
-The
-.B \-mnumerics
-option indicates that the processor does support
-floating-point instructions. The
-.B \-msoft\-float
-option indicates
-that floating-point support should not be assumed.
-.TP
-.B \-mleaf\-procedures
-.TP
-.B \-mno\-leaf\-procedures
-Do (or do not) attempt to alter leaf procedures to be callable with the
-.I bal
-instruction as well as
-.IR call .
-This will result in more
-efficient code for explicit calls when the
-.I bal
-instruction can be
-substituted by the assembler or linker, but less efficient code in other
-cases, such as calls via function pointers, or using a linker that doesn't
-support this optimization.
-.TP
-.B \-mtail\-call
-.TP
-.B \-mno\-tail\-call
-Do (or do not) make additional attempts (beyond those of the
-machine-independent portions of the compiler) to optimize tail-recursive
-calls into branches. You may not want to do this because the detection of
-cases where this is not valid is not totally complete. The default is
-.BR \-mno\-tail\-call .
-.TP
-.B \-mcomplex\-addr
-.TP
-.B \-mno\-complex\-addr
-Assume (or do not assume) that the use of a complex addressing mode is a
-win on this implementation of the i960. Complex addressing modes may not
-be worthwhile on the K-series, but they definitely are on the C-series.
-The default is currently
-.B \-mcomplex\-addr
-for all processors except
-the CB and CC.
-.TP
-.B \-mcode\-align
-.TP
-.B \-mno\-code\-align
-Align code to 8-byte boundaries for faster fetching (or don't bother).
-Currently turned on by default for C-series implementations only.
-.TP
-.B \-mic\-compat
-.TP
-.B \-mic2.0\-compat
-.TP
-.B \-mic3.0\-compat
-Enable compatibility with iC960 v2.0 or v3.0.
-.TP
-.B \-masm\-compat
-.TP
-.B \-mintel\-asm
-Enable compatibility with the iC960 assembler.
-.TP
-.B \-mstrict\-align
-.TP
-.B \-mno\-strict\-align
-Do not permit (do permit) unaligned accesses.
-.TP
-.B \-mold\-align
-Enable structure-alignment compatibility with Intel's gcc release version
-1.3 (based on gcc 1.37). Currently this is buggy in that
-.B #pragma align 1
-is always assumed as well, and cannot be turned off.
-.PP
-These `\|\c
-.B \-m\c
-\&\|' options are defined for the DEC Alpha implementations:
-.TP
-.B \-mno-soft-float
-.TP
-.B \-msoft-float
-Use (do not use) the hardware floating-point instructions for
-floating-point operations. When \c
-.B \-msoft-float\c
-\& is specified,
-functions in `\|\c
-.B libgcc1.c\c
-\&\|' will be used to perform floating-point
-operations. Unless they are replaced by routines that emulate the
-floating-point operations, or compiled in such a way as to call such
-emulations routines, these routines will issue floating-point
-operations. If you are compiling for an Alpha without floating-point
-operations, you must ensure that the library is built so as not to call
-them.
-.Sp
-Note that Alpha implementations without floating-point operations are
-required to have floating-point registers.
-.TP
-.B \-mfp-reg
-.TP
-.B \-mno-fp-regs
-Generate code that uses (does not use) the floating-point register set.
-.B \-mno-fp-regs\c
-\& implies \c
-.B \-msoft-float\c
-\&. If the floating-point
-register set is not used, floating point operands are passed in integer
-registers as if they were integers and floating-point results are passed
-in $0 instead of $f0. This is a non-standard calling sequence, so any
-function with a floating-point argument or return value called by code
-compiled with \c
-.B \-mno-fp-regs\c
-\& must also be compiled with that
-option.
-.Sp
-A typical use of this option is building a kernel that does not use,
-and hence need not save and restore, any floating-point registers.
-.PP
-These additional options are available on System V Release 4 for
-compatibility with other compilers on those systems:
-.TP
-.B \-G
-On SVr4 systems, \c
-.B gcc\c
-\& accepts the option `\|\c
-.B \-G\c
-\&\|' (and passes
-it to the system linker), for compatibility with other compilers.
-However, we suggest you use `\|\c
-.B \-symbolic\c
-\&\|' or `\|\c
-.B \-shared\c
-\&\|' as
-appropriate, instead of supplying linker options on the \c
-.B gcc
-command line.
-.TP
-.B \-Qy
-Identify the versions of each tool used by the compiler, in a
-.B .ident\c
-\& assembler directive in the output.
-.TP
-.B \-Qn
-Refrain from adding \c
-.B .ident\c
-\& directives to the output file (this is
-the default).
-.TP
-.BI "\-YP," "dirs"
-Search the directories \c
-.I dirs\c
-\&, and no others, for libraries
-specified with `\|\c
-.B \-l\c
-\&\|'. You can separate directory entries in
-.I dirs\c
-\& from one another with colons.
-.TP
-.BI "\-Ym," "dir"
-Look in the directory \c
-.I dir\c
-\& to find the M4 preprocessor.
-The assembler uses this option.
-.SH CODE GENERATION OPTIONS
-These machine-independent options control the interface conventions
-used in code generation.
-.PP
-Most of them begin with `\|\c
-\-f\c
-\&\|'. These options have both positive and negative forms; the negative form
-of `\|\c
-.B \-ffoo\c
-\&\|' would be `\|\c
-.B \-fno\-foo\c
-\&\|'. In the table below, only
-one of the forms is listed\(em\&the one which is not the default. You
-can figure out the other form by either removing `\|\c
-.B no\-\c
-\&\|' or adding
-it.
-.TP
-.B \-fnonnull\-objects
-Assume that objects reached through references are not null
-(C++ only).
-.Sp
-Normally, GNU C++ makes conservative assumptions about objects reached
-through references. For example, the compiler must check that \c
-.B a
-is not null in code like the following:
-.Sp
-obj &a = g ();
-a.f (2);
-.Sp
-Checking that references of this sort have non-null values requires
-extra code, however, and it is unnecessary for many programs. You can
-use `\|\c
-.B \-fnonnull-objects\c
-\&\|' to omit the checks for null, if your
-program doesn't require checking.
-.TP
-.B \-fpcc\-struct\-return
-Use the same convention for returning \c
-.B struct\c
-\& and \c
-.B union
-values that is used by the usual C compiler on your system. This
-convention is less efficient for small structures, and on many
-machines it fails to be reentrant; but it has the advantage of
-allowing intercallability between GCC-compiled code and PCC-compiled
-code.
-.TP
-.B \-freg\-struct\-return
-Use the convention that
-.B struct
-and
-.B union
-values are returned in registers when possible. This is more
-efficient for small structures than
-.BR \-fpcc\-struct\-return .
-.Sp
-If you specify neither
-.B \-fpcc\-struct\-return
-nor
-.BR \-freg\-struct\-return ,
-GNU CC defaults to whichever convention is standard for the target.
-If there is no standard convention, GNU CC defaults to
-.BR \-fpcc\-struct\-return .
-.TP
-.B \-fshort\-enums
-Allocate to an \c
-.B enum\c
-\& type only as many bytes as it needs for the
-declared range of possible values. Specifically, the \c
-.B enum\c
-\& type
-will be equivalent to the smallest integer type which has enough room.
-.TP
-.B \-fshort\-double
-Use the same size for
-.B double
-as for
-.B float
-\&.
-.TP
-.B \-fshared\-data
-Requests that the data and non-\c
-.B const\c
-\& variables of this
-compilation be shared data rather than private data. The distinction
-makes sense only on certain operating systems, where shared data is
-shared between processes running the same program, while private data
-exists in one copy per process.
-.TP
-.B \-fno\-common
-Allocate even uninitialized global variables in the bss section of the
-object file, rather than generating them as common blocks. This has the
-effect that if the same variable is declared (without \c
-.B extern\c
-\&) in
-two different compilations, you will get an error when you link them.
-The only reason this might be useful is if you wish to verify that the
-program will work on other systems which always work this way.
-.TP
-.B \-fno\-ident
-Ignore the `\|\c
-.B #ident\c
-\&\|' directive.
-.TP
-.B \-fno\-gnu\-linker
-Do not output global initializations (such as C++ constructors and
-destructors) in the form used by the GNU linker (on systems where the GNU
-linker is the standard method of handling them). Use this option when
-you want to use a non-GNU linker, which also requires using the
-.B collect2\c
-\& program to make sure the system linker includes
-constructors and destructors. (\c
-.B collect2\c
-\& is included in the GNU CC
-distribution.) For systems which \c
-.I must\c
-\& use \c
-.B collect2\c
-\&, the
-compiler driver \c
-.B gcc\c
-\& is configured to do this automatically.
-.TP
-.B \-finhibit-size-directive
-Don't output a \c
-.B .size\c
-\& assembler directive, or anything else that
-would cause trouble if the function is split in the middle, and the
-two halves are placed at locations far apart in memory. This option is
-used when compiling `\|\c
-.B crtstuff.c\c
-\&\|'; you should not need to use it
-for anything else.
-.TP
-.B \-fverbose-asm
-Put extra commentary information in the generated assembly code to
-make it more readable. This option is generally only of use to those
-who actually need to read the generated assembly code (perhaps while
-debugging the compiler itself).
-.TP
-.B \-fvolatile
-Consider all memory references through pointers to be volatile.
-.TP
-.B \-fvolatile\-global
-Consider all memory references to extern and global data items to
-be volatile.
-.TP
-.B \-fpic
-If supported for the target machines, generate position-independent code,
-suitable for use in a shared library.
-.TP
-.B \-fPIC
-If supported for the target machine, emit position-independent code,
-suitable for dynamic linking, even if branches need large displacements.
-.TP
-.BI "\-ffixed\-" "reg"
-Treat the register named \c
-.I reg\c
-\& as a fixed register; generated code
-should never refer to it (except perhaps as a stack pointer, frame
-pointer or in some other fixed role).
-.Sp
-.I reg\c
-\& must be the name of a register. The register names accepted
-are machine-specific and are defined in the \c
-.B REGISTER_NAMES
-macro in the machine description macro file.
-.Sp
-This flag does not have a negative form, because it specifies a
-three-way choice.
-.TP
-.BI "\-fcall\-used\-" "reg"
-Treat the register named \c
-.I reg\c
-\& as an allocable register that is
-clobbered by function calls. It may be allocated for temporaries or
-variables that do not live across a call. Functions compiled this way
-will not save and restore the register \c
-.I reg\c
-\&.
-.Sp
-Use of this flag for a register that has a fixed pervasive role in the
-machine's execution model, such as the stack pointer or frame pointer,
-will produce disastrous results.
-.Sp
-This flag does not have a negative form, because it specifies a
-three-way choice.
-.TP
-.BI "\-fcall\-saved\-" "reg"
-Treat the register named \c
-.I reg\c
-\& as an allocable register saved by
-functions. It may be allocated even for temporaries or variables that
-live across a call. Functions compiled this way will save and restore
-the register \c
-.I reg\c
-\& if they use it.
-.Sp
-Use of this flag for a register that has a fixed pervasive role in the
-machine's execution model, such as the stack pointer or frame pointer,
-will produce disastrous results.
-.Sp
-A different sort of disaster will result from the use of this flag for
-a register in which function values may be returned.
-.Sp
-This flag does not have a negative form, because it specifies a
-three-way choice.
-.SH PRAGMAS
-Two `\|\c
-.B #pragma\c
-\&\|' directives are supported for GNU C++, to permit using the same
-header file for two purposes: as a definition of interfaces to a given
-object class, and as the full definition of the contents of that object class.
-.TP
-.B #pragma interface
-(C++ only.)
-Use this directive in header files that define object classes, to save
-space in most of the object files that use those classes. Normally,
-local copies of certain information (backup copies of inline member
-functions, debugging information, and the internal tables that
-implement virtual functions) must be kept in each object file that
-includes class definitions. You can use this pragma to avoid such
-duplication. When a header file containing `\|\c
-.B #pragma interface\c
-\&\|' is included in a compilation, this auxiliary information
-will not be generated (unless the main input source file itself uses
-`\|\c
-.B #pragma implementation\c
-\&\|'). Instead, the object files will contain references to be
-resolved at link time.
-.TP
-.B #pragma implementation
-.TP
-\fB#pragma implementation "\fP\fIobjects\fP\fB.h"\fP
-(C++ only.)
-Use this pragma in a main input file, when you want full output from
-included header files to be generated (and made globally visible).
-The included header file, in turn, should use `\|\c
-.B #pragma interface\c
-\&\|'.
-Backup copies of inline member functions, debugging information, and
-the internal tables used to implement virtual functions are all
-generated in implementation files.
-.Sp
-If you use `\|\c
-.B #pragma implementation\c
-\&\|' with no argument, it applies to an include file with the same
-basename as your source file; for example, in `\|\c
-.B allclass.cc\c
-\&\|', `\|\c
-.B #pragma implementation\c
-\&\|' by itself is equivalent to `\|\c
-.B
-#pragma implementation "allclass.h"\c
-\&\|'. Use the string argument if you want a single implementation
-file to include code from multiple header files.
-.Sp
-There is no way to split up the contents of a single header file into
-multiple implementation files.
-.SH FILES
-.nf
-.ta \w'LIBDIR/g++\-include 'u
-file.c C source file
-file.h C header (preprocessor) file
-file.i preprocessed C source file
-file.C C++ source file
-file.cc C++ source file
-file.cxx C++ source file
-file.m Objective-C source file
-file.s assembly language file
-file.o object file
-a.out link edited output
-\fITMPDIR\fR/cc\(** temporary files
-\fILIBDIR\fR/cpp preprocessor
-\fILIBDIR\fR/cc1 compiler for C
-\fILIBDIR\fR/cc1plus compiler for C++
-\fILIBDIR\fR/collect linker front end needed on some machines
-\fILIBDIR\fR/libgcc.a GCC subroutine library
-/lib/crt[01n].o start-up routine
-\fILIBDIR\fR/ccrt0 additional start-up routine for C++
-/lib/libc.a standard C library, see
-.IR intro (3)
-/usr/include standard directory for \fB#include\fP files
-\fILIBDIR\fR/include standard gcc directory for \fB#include\fP files
-\fILIBDIR\fR/g++\-include additional g++ directory for \fB#include\fP
-.Sp
-.fi
-.I LIBDIR
-is usually
-.B /usr/local/lib/\c
-.IR machine / version .
-.br
-.I TMPDIR
-comes from the environment variable
-.B TMPDIR
-(default
-.B /usr/tmp
-if available, else
-.B /tmp\c
-\&).
-.SH "SEE ALSO"
-cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1).
-.br
-.RB "`\|" gcc "\|', `\|" cpp \|',
-.RB "`\|" as "\|', `\|" ld \|',
-and
-.RB `\| gdb \|'
-entries in
-.B info\c
-\&.
-.br
-.I
-Using and Porting GNU CC (for version 2.0)\c
-, Richard M. Stallman;
-.I
-The C Preprocessor\c
-, Richard M. Stallman;
-.I
-Debugging with GDB: the GNU Source-Level Debugger\c
-, Richard M. Stallman and Roland H. Pesch;
-.I
-Using as: the GNU Assembler\c
-, Dean Elsner, Jay Fenlason & friends;
-.I
-ld: the GNU linker\c
-, Steve Chamberlain and Roland Pesch.
-.SH BUGS
-For instructions on reporting bugs, see the GCC manual.
-.SH COPYING
-Copyright
-.if t \(co
-1991, 1992, 1993 Free Software Foundation, Inc.
-.PP
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
-.SH AUTHORS
-See the GNU CC Manual for the contributors to GNU CC.
diff --git a/gcc/gcc.c b/gcc/gcc.c
deleted file mode 100755
index f5c98a4..0000000
--- a/gcc/gcc.c
+++ /dev/null
@@ -1,5093 +0,0 @@
-/* Compiler driver program that can handle many languages.
- Copyright (C) 1987, 89, 92-98, 1999 Free Software Foundation, Inc.
-
- This file is part of GNU CC.
-
- GNU CC is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- GNU CC is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNU CC; see the file COPYING. If not, write to
- the Free Software Foundation, 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* This program is the user interface to the C compiler and possibly to
- other compilers. It is used because compilation is a complicated procedure
- which involves running several programs and passing temporary files between
- them, forwarding the users switches to those programs selectively,
- and deleting the temporary files at the end.
-
- CC recognizes how to compile each input file by suffixes in the file names.
- Once it knows which kind of compilation to perform, the procedure for
- compilation is specified by a string called a "spec". */
-
-#include "config.h"
-#include "system.h"
-#include <signal.h>
-
-#include "obstack.h"
-#include "prefix.h"
-
-
-/* By default there is no special suffix for executables. */
-#define EXECUTABLE_SUFFIX ""
-
-/* By default, the suffix for object files is ".o". */
-#define OBJECT_SUFFIX ".o"
-
-/* By default, colon separates directories in a path. */
-#ifndef PATH_SEPARATOR
-#define PATH_SEPARATOR ':'
-#endif
-
-#ifndef DIR_SEPARATOR
-#define DIR_SEPARATOR '/'
-#endif
-
-/* CYGNUS LOCAL -- meissner/relative pathnames */
-#ifndef DIR_UP
-#define DIR_UP ".."
-#endif
-/* END CYGNUS LOCAL -- meissner/relative pathnames */
-
-static char dir_separator_str[] = {DIR_SEPARATOR, 0};
-
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free free
-
-#ifndef HAVE_KILL
-#define kill(p,s) raise(s)
-#endif
-
-/* If a stage of compilation returns an exit status >= 1,
- compilation of that file ceases. */
-
-#define MIN_FATAL_STATUS 1
-
-/* Flag saying to print the directories gcc will search through looking for
- programs, libraries, etc. */
-
-static int print_search_dirs;
-
-/* Flag saying to print the full filename of this file
- as found through our usual search mechanism. */
-
-static char *print_file_name = NULL;
-
-/* As print_file_name, but search for executable file. */
-
-static char *print_prog_name = NULL;
-
-/* Flag saying to print the relative path we'd use to
- find libgcc.a given the current compiler flags. */
-
-static int print_multi_directory;
-
-/* Flag saying to print the list of subdirectories and
- compiler flags used to select them in a standard form. */
-
-static int print_multi_lib;
-
-/* Flag saying to print the command line options understood by gcc and its
- sub-processes. */
-
-static int print_help_list;
-
-/* Flag indicating whether we should print the command and arguments */
-
-static int verbose_flag;
-
-/* Nonzero means write "temp" files in source directory
- and use the source file's name in them, and don't delete them. */
-
-static int save_temps_flag;
-
-/* The compiler version. */
-
-static char *compiler_version;
-
-/* The target version specified with -V */
-
-static char *spec_version = DEFAULT_TARGET_VERSION;
-
-/* The target machine specified with -b. */
-
-static char *spec_machine = DEFAULT_TARGET_MACHINE;
-
-/* Nonzero if cross-compiling.
- When -b is used, the value comes from the `specs' file. */
-
-#ifdef CROSS_COMPILE
-static char *cross_compile = "1";
-#else
-static char *cross_compile = "0";
-#endif
-
-/* The number of errors that have occurred; the link phase will not be
- run if this is non-zero. */
-static int error_count = 0;
-
-/* This is the obstack which we use to allocate many strings. */
-
-static struct obstack obstack;
-
-/* This is the obstack to build an environment variable to pass to
- collect2 that describes all of the relevant switches of what to
- pass the compiler in building the list of pointers to constructors
- and destructors. */
-
-static struct obstack collect_obstack;
-
-extern char *version_string;
-
-/* Forward declaration for prototypes. */
-struct path_prefix;
-
-static void init_spec (void);
-static void read_specs (char *, int);
-static void set_spec (char *, char *);
-static struct compiler *lookup_compiler (char *, size_t, char *);
-static char *build_search_list (struct path_prefix *, char *, int);
-static void putenv_from_prefixes (struct path_prefix *, char *);
-static char *find_a_file (struct path_prefix *, char *, int);
-static void add_prefix (struct path_prefix *, const char *,
- const char *, int, int, int *);
-static char *skip_whitespace (char *);
-static void record_temp_file (char *, int, int);
-static void delete_if_ordinary (char *);
-static void delete_temp_files (void);
-static void delete_failure_queue (void);
-static void clear_failure_queue (void);
-static int check_live_switch (int, int);
-static char *handle_braces (char *);
-static char *save_string (const char *, int);
-extern int do_spec (char *);
-static int do_spec_1 (char *, int, char *);
-static char *find_file (char *);
-static int is_directory (char *, char *, int);
-static void validate_switches (char *);
-static void validate_all_switches (void);
-static void give_switch (int, int, int);
-static int used_arg (char *, int);
-static int default_arg (char *, int);
-static void set_multilib_dir (void);
-static void print_multilib_info (void);
-static void pfatal_with_name (char *) ATTRIBUTE_NORETURN;
-static void perror_with_name (char *);
-static void pfatal_pexecute (char *, char *) ATTRIBUTE_NORETURN;
-static void fatal (char *, ...)
-ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF_1;
-static void error (char *, ...) ATTRIBUTE_PRINTF_1;
-static void display_help (void);
-
-void fancy_abort (void) ATTRIBUTE_NORETURN;
-
-
-/* Specs are strings containing lines, each of which (if not blank)
- is made up of a program name, and arguments separated by spaces.
- The program name must be exact and start from root, since no path
- is searched and it is unreliable to depend on the current working directory.
- Redirection of input or output is not supported; the subprograms must
- accept filenames saying what files to read and write.
-
- In addition, the specs can contain %-sequences to substitute variable text
- or for conditional text. Here is a table of all defined %-sequences.
- Note that spaces are not generated automatically around the results of
- expanding these sequences; therefore, you can concatenate them together
- or with constant text in a single argument.
-
- %% substitute one % into the program name or argument.
- %i substitute the name of the input file being processed.
- %b substitute the basename of the input file being processed.
- This is the substring up to (and not including) the last period
- and not including the directory.
- %gSUFFIX
- substitute a file name that has suffix SUFFIX and is chosen
- once per compilation, and mark the argument a la %d. To reduce
- exposure to denial-of-service attacks, the file name is now
- chosen in a way that is hard to predict even when previously
- chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
- might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
- the regexp "[.A-Za-z]*" or the special string "%O", which is
- treated exactly as if %O had been pre-processed. Previously, %g
- was simply substituted with a file name chosen once per compilation,
- without regard to any appended suffix (which was therefore treated
- just like ordinary text), making such attacks more likely to succeed.
- %uSUFFIX
- like %g, but generates a new temporary file name even if %uSUFFIX
- was already seen.
- %USUFFIX
- substitutes the last file name generated with %uSUFFIX, generating a
- new one if there is no such last file name. In the absence of any
- %uSUFFIX, this is just like %gSUFFIX, except they don't share
- the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
- would involve the generation of two distinct file names, one
- for each `%g.s' and another for each `%U.s'. Previously, %U was
- simply substituted with a file name chosen for the previous %u,
- without regard to any appended suffix.
- %d marks the argument containing or following the %d as a
- temporary file name, so that that file will be deleted if CC exits
- successfully. Unlike %g, this contributes no text to the argument.
- %w marks the argument containing or following the %w as the
- "output file" of this compilation. This puts the argument
- into the sequence of arguments that %o will substitute later.
- %W{...}
- like %{...} but mark last argument supplied within
- as a file to be deleted on failure.
- %o substitutes the names of all the output files, with spaces
- automatically placed around them. You should write spaces
- around the %o as well or the results are undefined.
- %o is for use in the specs for running the linker.
- Input files whose names have no recognized suffix are not compiled
- at all, but they are included among the output files, so they will
- be linked.
- %O substitutes the suffix for object files. Note that this is
- handled specially when it immediately follows %g, %u, or %U,
- because of the need for those to form complete file names. The
- handling is such that %O is treated exactly as if it had already
- been substituted, except that %g, %u, and %U do not currently
- support additional SUFFIX characters following %O as they would
- following, for example, `.o'.
- %p substitutes the standard macro predefinitions for the
- current target machine. Use this when running cpp.
- %P like %p, but puts `__' before and after the name of each macro.
- (Except macros that already have __.)
- This is for ANSI C.
- %I Substitute a -iprefix option made from GCC_EXEC_PREFIX.
- %s current argument is the name of a library or startup file of some sort.
- Search for that file in a standard list of directories
- and substitute the full name found.
- %eSTR Print STR as an error message. STR is terminated by a newline.
- Use this when inconsistent options are detected.
- %x{OPTION} Accumulate an option for %X.
- %X Output the accumulated linker options specified by compilations.
- %Y Output the accumulated assembler options specified by compilations.
- %Z Output the accumulated preprocessor options specified by compilations.
- %v1 Substitute the major version number of GCC.
- (For version 2.5.n, this is 2.)
- %v2 Substitute the minor version number of GCC.
- (For version 2.5.n, this is 5.)
- %a process ASM_SPEC as a spec.
- This allows config.h to specify part of the spec for running as.
- %A process ASM_FINAL_SPEC as a spec. A capital A is actually
- used here. This can be used to run a post-processor after the
- assembler has done its job.
- %D Dump out a -L option for each directory in startfile_prefixes.
- If multilib_dir is set, extra entries are generated with it affixed.
- %l process LINK_SPEC as a spec.
- %L process LIB_SPEC as a spec.
- %G process LIBGCC_SPEC as a spec.
- %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
- %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
- %c process SIGNED_CHAR_SPEC as a spec.
- %C process CPP_SPEC as a spec. A capital C is actually used here.
- %1 process CC1_SPEC as a spec.
- %| output "-" if the input for the current command is coming from a pipe.
- %* substitute the variable part of a matched option. (See below.)
- Note that each comma in the substituted string is replaced by
- a single space.
- %{S} substitutes the -S switch, if that switch was given to CC.
- If that switch was not specified, this substitutes nothing.
- Here S is a metasyntactic variable.
- %{S*} substitutes all the switches specified to CC whose names start
- with -S. This is used for -o, -D, -I, etc; switches that take
- arguments. CC considers `-o foo' as being one switch whose
- name starts with `o'. %{o*} would substitute this text,
- including the space; thus, two arguments would be generated.
- %{^S*} likewise, but don't put a blank between a switch and any args.
- %{S*:X} substitutes X if one or more switches whose names start with -S are
- specified to CC. Note that the tail part of the -S option
- (i.e. the part matched by the `*') will be substituted for each
- occurrence of %* within X.
- %{S:X} substitutes X, but only if the -S switch was given to CC.
- %{!S:X} substitutes X, but only if the -S switch was NOT given to CC.
- %{|S:X} like %{S:X}, but if no S switch, substitute `-'.
- %{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'.
- %{.S:X} substitutes X, but only if processing a file with suffix S.
- %{!.S:X} substitutes X, but only if NOT processing a file with suffix S.
- %{S|P:X} substitutes X if either -S or -P was given to CC. This may be
- combined with ! and . as above binding stronger than the OR.
- %(Spec) processes a specification defined in a specs file as *Spec:
- %[Spec] as above, but put __ around -D arguments
-
- The conditional text X in a %{S:X} or %{!S:X} construct may contain
- other nested % constructs or spaces, or even newlines. They are
- processed as usual, as described above.
-
- The -O, -f, -m, and -W switches are handled specifically in these
- constructs. If another value of -O or the negated form of a -f, -m, or
- -W switch is found later in the command line, the earlier switch
- value is ignored, except with {S*} where S is just one letter; this
- passes all matching options.
-
- The character | at the beginning of the predicate text is used to indicate
- that a command should be piped to the following command, but only if -pipe
- is specified.
-
- Note that it is built into CC which switches take arguments and which
- do not. You might think it would be useful to generalize this to
- allow each compiler's spec to say which switches take arguments. But
- this cannot be done in a consistent fashion. CC cannot even decide
- which input files have been specified without knowing which switches
- take arguments, and it must know which input files to compile in order
- to tell which compilers to run.
-
- CC also knows implicitly that arguments starting in `-l' are to be
- treated as compiler output files, and passed to the linker in their
- proper position among the other output files. */
-
-/* Define the macros used for specs %a, %l, %L, %S, %c, %C, %1. */
-
-/* config.h can define ASM_SPEC to provide extra args to the assembler
- or extra switch-translations. */
-#ifndef ASM_SPEC
-#define ASM_SPEC ""
-#endif
-
-/* config.h can define ASM_FINAL_SPEC to run a post processor after
- the assembler has run. */
-#ifndef ASM_FINAL_SPEC
-#define ASM_FINAL_SPEC ""
-#endif
-
-/* config.h can define CPP_SPEC to provide extra args to the C preprocessor
- or extra switch-translations. */
-#ifndef CPP_SPEC
-#define CPP_SPEC ""
-#endif
-
-/* config.h can define CC1_SPEC to provide extra args to cc1
- or extra switch-translations. */
-#ifndef CC1_SPEC
-#define CC1_SPEC ""
-#endif
-
-/* config.h can define LINK_SPEC to provide extra args to the linker
- or extra switch-translations. */
-#ifndef LINK_SPEC
-#define LINK_SPEC ""
-#endif
-
-/* config.h can define LIB_SPEC to override the default libraries. */
-#ifndef LIB_SPEC
-#define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
-#endif
-
-#define LIBGCC_SPEC "-lgcc"
-
-/* config.h can define STARTFILE_SPEC to override the default crt0 files. */
-#ifndef STARTFILE_SPEC
-#define STARTFILE_SPEC \
- "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
-#endif
-
-/* config.h can define SWITCHES_NEED_SPACES to control which options
- require spaces between the option and the argument. */
-#ifndef SWITCHES_NEED_SPACES
-#define SWITCHES_NEED_SPACES ""
-#endif
-
-/* config.h can define ENDFILE_SPEC to override the default crtn files. */
-#ifndef ENDFILE_SPEC
-#define ENDFILE_SPEC ""
-#endif
-
-/* This spec is used for telling cpp whether char is signed or not. */
-#ifndef SIGNED_CHAR_SPEC
-/* Use #if rather than ?:
- because MIPS C compiler rejects like ?: in initializers. */
-#if DEFAULT_SIGNED_CHAR
-#define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
-#else
-#define SIGNED_CHAR_SPEC "%{!fsigned-char:-D__CHAR_UNSIGNED__}"
-#endif
-#endif
-
-#ifndef LINKER_NAME
-#define LINKER_NAME "ld"
-#endif
-
-#ifndef CPP_PREDEFINES
-#define CPP_PREDEFINES ""
-#endif
-
-static char *cpp_spec = CPP_SPEC;
-static char *cpp_predefines = CPP_PREDEFINES;
-static char *cc1_spec = CC1_SPEC;
-static char *signed_char_spec = SIGNED_CHAR_SPEC;
-static char *asm_spec = ASM_SPEC;
-static char *asm_final_spec = ASM_FINAL_SPEC;
-static char *link_spec = LINK_SPEC;
-static char *lib_spec = LIB_SPEC;
-static char *libgcc_spec = LIBGCC_SPEC;
-static char *endfile_spec = ENDFILE_SPEC;
-static char *startfile_spec = STARTFILE_SPEC;
-static char *switches_need_spaces = SWITCHES_NEED_SPACES;
-static char *linker_name_spec = LINKER_NAME;
-
-/* Some compilers have limits on line lengths, and the multilib_select
- and/or multilib_matches strings can be very long, so we build them at
- run time. */
-static struct obstack multilib_obstack;
-static char *multilib_select;
-static char *multilib_matches;
-static char *multilib_defaults;
-#include "multilib.h"
-
-/* Check whether a particular argument is a default argument. */
-
-#ifndef MULTILIB_DEFAULTS
-#define MULTILIB_DEFAULTS { "" }
-#endif
-
-static char *multilib_defaults_raw[] = MULTILIB_DEFAULTS;
-
-struct user_specs {
- struct user_specs *next;
- char *filename;
-};
-
-static struct user_specs *user_specs_head, *user_specs_tail;
-
-/* This defines which switch letters take arguments. */
-
-#define DEFAULT_SWITCH_TAKES_ARG(CHAR) \
- ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
- || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
- || (CHAR) == 'I' || (CHAR) == 'm' || (CHAR) == 'x' \
- || (CHAR) == 'L' || (CHAR) == 'A' || (CHAR) == 'V' \
- || (CHAR) == 'B' || (CHAR) == 'b')
-
-#ifndef SWITCH_TAKES_ARG
-#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
-#endif
-
-/* This defines which multi-letter switches take arguments. */
-
-#define DEFAULT_WORD_SWITCH_TAKES_ARG(STR) \
- (!strcmp(STR, "Tdata") || !strcmp(STR, "Ttext") \
- || !strcmp(STR, "Tbss") || !strcmp(STR, "include") \
- || !strcmp(STR, "imacros") || !strcmp(STR, "aux-info") \
- || !strcmp(STR, "idirafter") || !strcmp(STR, "iprefix") \
- || !strcmp(STR, "iwithprefix") || !strcmp(STR, "iwithprefixbefore") \
- || !strcmp(STR, "isystem") || !strcmp(STR, "specs"))
-
-#ifndef WORD_SWITCH_TAKES_ARG
-#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG(STR)
-#endif
-
-/* Record the mapping from file suffixes for compilation specs. */
-
-struct compiler
-{
- char *suffix; /* Use this compiler for input files
- whose names end in this suffix. */
-
- char *spec[4]; /* To use this compiler, concatenate these
- specs and pass to do_spec. */
-};
-
-/* Pointer to a vector of `struct compiler' that gives the spec for
- compiling a file, based on its suffix.
- A file that does not end in any of these suffixes will be passed
- unchanged to the loader and nothing else will be done to it.
-
- An entry containing two 0s is used to terminate the vector.
-
- If multiple entries match a file, the last matching one is used. */
-
-static struct compiler *compilers;
-
-/* Number of entries in `compilers', not counting the null terminator. */
-
-static int n_compilers;
-
-/* The default list of file name suffixes and their compilation specs. */
-
-static struct compiler default_compilers[] =
-{
- {".c", {"@c"}},
- {"@c",
- {
- "%{E|M|MM:cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\
- %{C} %{v} %{A*} %{I*} %{P} %I\
- %{C:%{!E:%eGNU C does not support -C without using -E}}\
- %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
- -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
- %{ansi|std=*:%{!std=gnu*:-trigraphs -D__STRICT_ANSI__}}\
- %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\
- %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
- %{traditional} %{ftraditional:-traditional}\
- %{traditional-cpp:-traditional}\
- %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
- %i %{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}}\n}" ,
- "%{!E:%{!M:%{!MM:cc1 %i %1 \
- -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*} %{A*} %{I*} %I\
- %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\
- %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
- -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
- %{ansi:-trigraphs -D__STRICT_ANSI__}\
- %{!undef:%{!ansi:%p} %P} %{trigraphs} \
- %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
- %{H} %C %{D*} %{U*} %{i*} %Z\
- %{ftraditional:-traditional}\
- %{traditional-cpp:-traditional}\
- %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
- %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
- %{aux-info*}\
- %{--help:--help} \
- %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
- %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
- %{!S:as %a %Y\
- %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
- %{!pipe:%g.s} %A\n }}}}"
- }},
- {"-",
- {"%{E:cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\
- %{C} %{v} %{A*} %{I*} %{P} %I\
- %{C:%{!E:%eGNU C does not support -C without using -E}}\
- %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
- -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
- %{ansi|std=*:%{!std=gnu*:-trigraphs -D__STRICT_ANSI__}}\
- %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\
- %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
- %{traditional} %{ftraditional:-traditional}\
- %{traditional-cpp:-traditional}\
- %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
- %i %W{o*}}\
- %{!E:%e-E required when input is from standard input}"}},
- {".h", {"@c-header"}},
- {"@c-header",
- {"%{!E:%eCompilation of header file requested} \
- cpp %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
- %{C:%{!E:%eGNU C does not support -C without using -E}}\
- %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
- -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
- %{std=*:%{!std=gnu*:-trigraphs -D__STRICT_ANSI__}}\
- %{!undef:%{!std=*:%p}%{std=gnu*:%p} %P} %{trigraphs}\
- %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
- %{traditional} %{ftraditional:-traditional}\
- %{traditional-cpp:-traditional}\
- %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
- %i %W{o*}"}},
- {".i", {"@cpp-output"}},
- {"@cpp-output",
- "%{!M:%{!MM:%{!E:cc1 %i %1 %{!Q:-quiet} %{d*} %{m*} %{a*}\
- %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi}\
- %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
- %{aux-info*}\
- %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
- %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
- %{!S:as %a %Y\
- %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
- %{!pipe:%g.s} %A\n }}}}" },
- {".s", {"@assembler"}},
- {"@assembler",
- {"%{!M:%{!MM:%{!E:%{!S:as %a %Y\
- %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
- %i %A\n }}}}"}},
- {".S", {"@assembler-with-cpp"}},
- {"@assembler-with-cpp",
- {"cpp -lang-asm %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
- %{C:%{!E:%eGNU C does not support -C without using -E}}\
- %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG} %{trigraphs}\
- -undef -$ %{!undef:%p %P} -D__ASSEMBLER__ \
- %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
- %{traditional} %{ftraditional:-traditional}\
- %{traditional-cpp:-traditional}\
- %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
- %i %{!M:%{!MM:%{!E:%{!pipe:%g.s}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
- "%{!M:%{!MM:%{!E:%{!S:as %a %Y\
- %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
- %{!pipe:%g.s} %A\n }}}}"}},
- /* Mark end of table */
- {0, {0}}
-};
-
-/* Number of elements in default_compilers, not counting the terminator. */
-
-static int n_default_compilers
- = (sizeof default_compilers / sizeof (struct compiler)) - 1;
-
-/* Here is the spec for running the linker, after compiling all files. */
-
-/* -u* was put back because both BSD and SysV seem to support it. */
-/* %{static:} simply prevents an error message if the target machine
- doesn't handle -static. */
-/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
- scripts which exist in user specified directories, or in standard
- directories. */
-static char *link_command_spec = "\
-%{!fsyntax-only: \
- %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
- %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
- %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
- %{static:} %{L*} %D %o\
- %{!nostdlib:%{!nodefaultlibs:%G %L %G}}\
- %{!A:%{!nostdlib:%{!nostartfiles:%E}}}\
- %{T*}\
- \n }}}}}}";
-
-/* A vector of options to give to the linker.
- These options are accumulated by %x,
- and substituted into the linker command with %X. */
-static int n_linker_options;
-static char **linker_options;
-
-/* A vector of options to give to the assembler.
- These options are accumulated by -Wa,
- and substituted into the assembler command with %Y. */
-static int n_assembler_options;
-static char **assembler_options;
-
-/* A vector of options to give to the preprocessor.
- These options are accumulated by -Wp,
- and substituted into the preprocessor command with %Z. */
-static int n_preprocessor_options;
-static char **preprocessor_options;
-
-/* Define how to map long options into short ones. */
-
-/* This structure describes one mapping. */
-struct option_map
-{
- /* The long option's name. */
- char *name;
- /* The equivalent short option. */
- char *equivalent;
- /* Argument info. A string of flag chars; NULL equals no options.
- a => argument required.
- o => argument optional.
- j => join argument to equivalent, making one word.
- * => require other text after NAME as an argument. */
- char *arg_info;
-};
-
-/* This is the table of mappings. Mappings are tried sequentially
- for each option encountered; the first one that matches, wins. */
-
-struct option_map option_map[] =
-{
- {"--all-warnings", "-Wall", 0},
- {"--ansi", "-ansi", 0},
- {"--assemble", "-S", 0},
- {"--assert", "-A", "a"},
- {"--classpath", "-fclasspath=", "aj"},
- {"--CLASSPATH", "-fCLASSPATH=", "aj"},
- {"--comments", "-C", 0},
- {"--compile", "-c", 0},
- {"--debug", "-g", "oj"},
- {"--define-macro", "-D", "aj"},
- {"--dependencies", "-M", 0},
- {"--dump", "-d", "a"},
- {"--dumpbase", "-dumpbase", "a"},
- {"--entry", "-e", 0},
- {"--extra-warnings", "-W", 0},
- {"--for-assembler", "-Wa", "a"},
- {"--for-linker", "-Xlinker", "a"},
- {"--force-link", "-u", "a"},
- {"--imacros", "-imacros", "a"},
- {"--include", "-include", "a"},
- {"--include-barrier", "-I-", 0},
- {"--include-directory", "-I", "aj"},
- {"--include-directory-after", "-idirafter", "a"},
- {"--include-prefix", "-iprefix", "a"},
- {"--include-with-prefix", "-iwithprefix", "a"},
- {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
- {"--include-with-prefix-after", "-iwithprefix", "a"},
- {"--language", "-x", "a"},
- {"--library-directory", "-L", "a"},
- {"--machine", "-m", "aj"},
- {"--machine-", "-m", "*j"},
- {"--no-line-commands", "-P", 0},
- {"--no-precompiled-includes", "-noprecomp", 0},
- {"--no-standard-includes", "-nostdinc", 0},
- {"--no-standard-libraries", "-nostdlib", 0},
- {"--no-warnings", "-w", 0},
- {"--optimize", "-O", "oj"},
- {"--output", "-o", "a"},
- {"--output-class-directory", "-foutput-class-dir=", "ja"},
- {"--pedantic", "-pedantic", 0},
- {"--pedantic-errors", "-pedantic-errors", 0},
- {"--pipe", "-pipe", 0},
- {"--prefix", "-B", "a"},
- {"--preprocess", "-E", 0},
- {"--print-search-dirs", "-print-search-dirs", 0},
- {"--print-file-name", "-print-file-name=", "aj"},
- {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
- {"--print-missing-file-dependencies", "-MG", 0},
- {"--print-multi-lib", "-print-multi-lib", 0},
- {"--print-multi-directory", "-print-multi-directory", 0},
- {"--print-prog-name", "-print-prog-name=", "aj"},
- {"--profile", "-p", 0},
- {"--profile-blocks", "-a", 0},
- {"--quiet", "-q", 0},
- {"--save-temps", "-save-temps", 0},
- {"--shared", "-shared", 0},
- {"--silent", "-q", 0},
- {"--specs", "-specs=", "aj"},
- {"--static", "-static", 0},
- {"--std", "-std=", "aj"},
- {"--symbolic", "-symbolic", 0},
- {"--target", "-b", "a"},
- {"--trace-includes", "-H", 0},
- {"--traditional", "-traditional", 0},
- {"--traditional-cpp", "-traditional-cpp", 0},
- {"--trigraphs", "-trigraphs", 0},
- {"--undefine-macro", "-U", "aj"},
- {"--use-version", "-V", "a"},
- {"--user-dependencies", "-MM", 0},
- {"--verbose", "-v", 0},
- {"--version", "-dumpversion", 0},
- {"--warn-", "-W", "*j"},
- {"--write-dependencies", "-MD", 0},
- {"--write-user-dependencies", "-MMD", 0},
- {"--", "-f", "*j"}
-};
-
-/* Translate the options described by *ARGCP and *ARGVP.
- Make a new vector and store it back in *ARGVP,
- and store its length in *ARGVC. */
-
-static void
-translate_options(int *argcp, char ***argvp)
-{
- int i;
- int argc = *argcp;
- char **argv = *argvp;
- char **newv = (char **) xmalloc((argc + 2) * 2 * sizeof (char *));
- int newindex = 0;
-
- i = 0;
- newv[newindex++] = argv[i++];
-
- while (i < argc)
- {
- /* Translate -- options. */
- if (argv[i][0] == '-' && argv[i][1] == '-')
- {
- size_t j;
- /* Find a mapping that applies to this option. */
- for (j = 0; j < sizeof (option_map) / sizeof (option_map[0]); j++)
- {
- size_t optlen = strlen(option_map[j].name);
- size_t arglen = strlen(argv[i]);
- size_t complen = arglen > optlen ? optlen : arglen;
- char *arginfo = option_map[j].arg_info;
-
- if (arginfo == 0)
- arginfo = "";
-
- if (!strncmp(argv[i], option_map[j].name, complen))
- {
- char *arg = 0;
-
- if (arglen < optlen)
- {
- size_t k;
- for (k = j + 1;
- k < sizeof (option_map) / sizeof (option_map[0]);
- k++)
- if (strlen(option_map[k].name) >= arglen
- && !strncmp(argv[i], option_map[k].name, arglen))
- {
- error("Ambiguous abbreviation %s", argv[i]);
- break;
- }
-
- if (k != sizeof (option_map) / sizeof (option_map[0]))
- break;
- }
-
- if (arglen > optlen)
- {
- /* If the option has an argument, accept that. */
- if (argv[i][optlen] == '=')
- arg = argv[i] + optlen + 1;
-
- /* If this mapping requires extra text at end of name,
- accept that as "argument". */
- else if (strchr(arginfo, '*') != 0)
- arg = argv[i] + optlen;
-
- /* Otherwise, extra text at end means mismatch.
- Try other mappings. */
- else
- continue;
- }
-
- else if (strchr(arginfo, '*') != 0)
- {
- error("Incomplete `%s' option", option_map[j].name);
- break;
- }
-
- /* Handle arguments. */
- if (strchr(arginfo, 'a') != 0)
- {
- if (arg == 0)
- {
- if (i + 1 == argc)
- {
- error("Missing argument to `%s' option",
- option_map[j].name);
- break;
- }
-
- arg = argv[++i];
- }
- }
- else if (strchr(arginfo, '*') != 0)
- ;
- else if (strchr(arginfo, 'o') == 0)
- {
- if (arg != 0)
- error("Extraneous argument to `%s' option",
- option_map[j].name);
- arg = 0;
- }
-
- /* Store the translation as one argv elt or as two. */
- if (arg != 0 && strchr(arginfo, 'j') != 0)
- newv[newindex++] = concat(option_map[j].equivalent, arg,
- NULL);
- else if (arg != 0)
- {
- newv[newindex++] = option_map[j].equivalent;
- newv[newindex++] = arg;
- }
- else
- newv[newindex++] = option_map[j].equivalent;
-
- break;
- }
- }
- i++;
- }
-
- /* Handle old-fashioned options--just copy them through,
- with their arguments. */
- else if (argv[i][0] == '-')
- {
- char *p = argv[i] + 1;
- int c = *p;
- int nskip = 1;
-
- if (SWITCH_TAKES_ARG(c) > (p[1] != 0))
- nskip += SWITCH_TAKES_ARG(c) - (p[1] != 0);
- else if (WORD_SWITCH_TAKES_ARG(p))
- nskip += WORD_SWITCH_TAKES_ARG(p);
- else if ((c == 'B' || c == 'b' || c == 'V' || c == 'x')
- && p[1] == 0)
- nskip += 1;
- else if (!strcmp(p, "Xlinker"))
- nskip += 1;
-
- /* Watch out for an option at the end of the command line that
- is missing arguments, and avoid skipping past the end of the
- command line. */
- if (nskip + i > argc)
- nskip = argc - i;
-
- while (nskip > 0)
- {
- newv[newindex++] = argv[i++];
- nskip--;
- }
- }
- else
- /* Ordinary operands, or +e options. */
- newv[newindex++] = argv[i++];
- }
-
- newv[newindex] = 0;
-
- *argvp = newv;
- *argcp = newindex;
-}
-
-char *
-xstrerror(int e)
-{
- return strerror(e);
-}
-
-static char *
-skip_whitespace(char *p)
-{
- while (1)
- {
- /* A fully-blank line is a delimiter in the SPEC file and shouldn't
- be considered whitespace. */
- if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
- return p + 1;
- else if (*p == '\n' || *p == ' ' || *p == '\t')
- p++;
- else if (*p == '#')
- {
- while (*p != '\n') p++;
- p++;
- }
- else
- break;
- }
-
- return p;
-}
-
-/* Structure to keep track of the specs that have been defined so far.
- These are accessed using %(specname) or %[specname] in a compiler
- or link spec. */
-
-struct spec_list
-{
- /* The following 2 fields must be first */
- /* to allow EXTRA_SPECS to be initialized */
- char *name; /* name of the spec. */
- char *ptr; /* available ptr if no static pointer */
-
- /* The following fields are not initialized */
- /* by EXTRA_SPECS */
- char **ptr_spec; /* pointer to the spec itself. */
- struct spec_list *next; /* Next spec in linked list. */
- int name_len; /* length of the name */
- int alloc_p; /* whether string was allocated */
-};
-
-#define INIT_STATIC_SPEC(NAME,PTR) \
- { NAME, NULL, PTR, (struct spec_list *)0, sizeof (NAME)-1, 0 }
-
-/* List of statically defined specs */
-static struct spec_list static_specs[] = {
- INIT_STATIC_SPEC("asm", &asm_spec),
- INIT_STATIC_SPEC("asm_final", &asm_final_spec),
- INIT_STATIC_SPEC("cpp", &cpp_spec),
- INIT_STATIC_SPEC("cc1", &cc1_spec),
- INIT_STATIC_SPEC("endfile", &endfile_spec),
- INIT_STATIC_SPEC("link", &link_spec),
- INIT_STATIC_SPEC("lib", &lib_spec),
- INIT_STATIC_SPEC("libgcc", &libgcc_spec),
- INIT_STATIC_SPEC("startfile", &startfile_spec),
- INIT_STATIC_SPEC("switches_need_spaces", &switches_need_spaces),
- INIT_STATIC_SPEC("signed_char", &signed_char_spec),
- INIT_STATIC_SPEC("predefines", &cpp_predefines),
- INIT_STATIC_SPEC("cross_compile", &cross_compile),
- INIT_STATIC_SPEC("version", &compiler_version),
- INIT_STATIC_SPEC("multilib", &multilib_select),
- INIT_STATIC_SPEC("multilib_defaults", &multilib_defaults),
- INIT_STATIC_SPEC("multilib_extra", &multilib_extra),
- INIT_STATIC_SPEC("multilib_matches", &multilib_matches),
- INIT_STATIC_SPEC("linker", &linker_name_spec),
-};
-
-
-/* List of dynamically allocates specs that have been defined so far. */
-
-static struct spec_list *specs = (struct spec_list *)0;
-
-
-/* Initialize the specs lookup routines. */
-
-static void
-init_spec()
-{
- struct spec_list *next = (struct spec_list *)0;
- struct spec_list *sl = (struct spec_list *)0;
- int i;
-
- if (specs)
- return; /* already initialized */
-
- if (verbose_flag)
- fprintf(stderr, "Using builtin specs.\n");
-
- for (i = (sizeof (static_specs) / sizeof (static_specs[0])) - 1; i >= 0; i--)
- {
- sl = &static_specs[i];
- sl->next = next;
- next = sl;
- }
-
- specs = sl;
-}
-
-
-/* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
- removed; If the spec starts with a + then SPEC is added to the end of the
- current spec. */
-
-static void
-set_spec(char *name, char *spec)
-{
- struct spec_list *sl;
- char *old_spec;
- int name_len = strlen(name);
- int i;
-
- /* If this is the first call, initialize the statically allocated specs */
- if (!specs)
- {
- struct spec_list *next = (struct spec_list *)0;
- for (i = (sizeof (static_specs) / sizeof (static_specs[0])) - 1;
- i >= 0; i--)
- {
- sl = &static_specs[i];
- sl->next = next;
- next = sl;
- }
- specs = sl;
- }
-
- /* See if the spec already exists */
- for (sl = specs; sl; sl = sl->next)
- if (name_len == sl->name_len && !strcmp(sl->name, name))
- break;
-
- if (!sl)
- {
- /* Not found - make it */
- sl = (struct spec_list *) xmalloc(sizeof (struct spec_list));
- sl->name = save_string(name, strlen(name));
- sl->name_len = name_len;
- sl->ptr_spec = &sl->ptr;
- sl->alloc_p = 0;
- *(sl->ptr_spec) = "";
- sl->next = specs;
- specs = sl;
- }
-
- old_spec = *(sl->ptr_spec);
- *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE((unsigned char)spec[1]))
- ? concat(old_spec, spec + 1, NULL)
- : save_string(spec, strlen(spec)));
-
-#ifdef DEBUG_SPECS
- if (verbose_flag)
- fprintf(stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
-#endif
-
- /* Free the old spec */
- if (old_spec && sl->alloc_p)
- free(old_spec);
-
- sl->alloc_p = 1;
-}
-
-/* Accumulate a command (program name and args), and run it. */
-
-/* Vector of pointers to arguments in the current line of specifications. */
-
-static char **argbuf;
-
-/* Number of elements allocated in argbuf. */
-
-static int argbuf_length;
-
-/* Number of elements in argbuf currently in use (containing args). */
-
-static int argbuf_index;
-
-/* We want this on by default all the time now. */
-#define MKTEMP_EACH_FILE
-
-
-extern char *make_temp_file (char *);
-
-/* This is the list of suffixes and codes (%g/%u/%U) and the associated
- temp file. */
-
-static struct temp_name {
- char *suffix; /* suffix associated with the code. */
- int length; /* strlen (suffix). */
- int unique; /* Indicates whether %g or %u/%U was used. */
- char *filename; /* associated filename. */
- int filename_length; /* strlen (filename). */
- struct temp_name *next;
-} *temp_names;
-
-
-/* Number of commands executed so far. */
-
-static int execution_count;
-
-/* Number of commands that exited with a signal. */
-
-static int signal_count;
-
-/* Name with which this program was invoked. */
-
-static char *programname;
-
-/* Structures to keep track of prefixes to try when looking for files. */
-
-struct prefix_list
-{
- char *prefix; /* String to prepend to the path. */
- struct prefix_list *next; /* Next in linked list. */
- int require_machine_suffix; /* Don't use without machine_suffix. */
- /* 2 means try both machine_suffix and just_machine_suffix. */
- int *used_flag_ptr; /* 1 if a file was found with this prefix. */
-};
-
-struct path_prefix
-{
- struct prefix_list *plist; /* List of prefixes to try */
- int max_len; /* Max length of a prefix in PLIST */
- char *name; /* Name of this list (used in config stuff) */
-};
-
-/* List of prefixes to try when looking for executables. */
-
-static struct path_prefix exec_prefixes = { 0, 0, "exec" };
-
-/* List of prefixes to try when looking for startup (crt0) files. */
-
-static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
-
-/* List of prefixes to try when looking for include files. */
-
-static struct path_prefix include_prefixes = { 0, 0, "include" };
-
-/* Suffix to attach to directories searched for commands.
- This looks like `MACHINE/VERSION/'. */
-
-static char *machine_suffix = 0;
-
-/* Suffix to attach to directories searched for commands.
- This is just `MACHINE/'. */
-
-static char *just_machine_suffix = 0;
-
-/* Default prefixes to attach to command names. */
-
-#ifndef STANDARD_EXEC_PREFIX
-#define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-lib/"
-#endif /* !defined STANDARD_EXEC_PREFIX */
-
-static char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
-static char *standard_exec_prefix_1 = "/usr/lib/gcc/";
-
-#ifndef STANDARD_STARTFILE_PREFIX
-#define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
-#endif /* !defined STANDARD_STARTFILE_PREFIX */
-
-static char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
-static char *standard_startfile_prefix_1 = "/lib/";
-static char *standard_startfile_prefix_2 = "/usr/lib/";
-
-#ifndef TOOLDIR_BASE_PREFIX
-#define TOOLDIR_BASE_PREFIX "/usr/local/"
-#endif
-static char *tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
-static char *tooldir_prefix;
-
-/* CYGNUS LOCAL -- meissner/relative pathnames */
-#ifdef STANDARD_BINDIR_PREFIX
-static char *standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
-#endif
-/* END CYGNUS LOCAL -- meissner/relative pathnames */
-
-/* Subdirectory to use for locating libraries. Set by
- set_multilib_dir based on the compilation options. */
-
-static char *multilib_dir;
-
-/* Clear out the vector of arguments (after a command is executed). */
-
-static void
-clear_args()
-{
- argbuf_index = 0;
-}
-
-/* Add one argument to the vector at the end.
- This is done when a space is seen or at the end of the line.
- If DELETE_ALWAYS is nonzero, the arg is a filename
- and the file should be deleted eventually.
- If DELETE_FAILURE is nonzero, the arg is a filename
- and the file should be deleted if this compilation fails. */
-
-static void
-store_arg(char *arg, int delete_always, int delete_failure)
-{
- if (argbuf_index + 1 == argbuf_length)
- argbuf
- = (char **) xrealloc(argbuf, (argbuf_length *= 2) * sizeof (char *));
-
- argbuf[argbuf_index++] = arg;
- argbuf[argbuf_index] = 0;
-
- if (delete_always || delete_failure)
- record_temp_file(arg, delete_always, delete_failure);
-}
-
-/* Read compilation specs from a file named FILENAME,
- replacing the default ones.
-
- A suffix which starts with `*' is a definition for
- one of the machine-specific sub-specs. The "suffix" should be
- * asm, *cc1, *cpp, *link, *startfile, *signed_char, etc.
- The corresponding spec is stored in asm_spec, etc.,
- rather than in the `compilers' vector.
-
- Anything invalid in the file is a fatal error. */
-
-static void
-read_specs(char *filename, int main_p)
-{
- int desc;
- int readlen;
- struct stat statbuf;
- char *buffer;
- register char *p;
-
- if (verbose_flag)
- fprintf(stderr, "Reading specs from %s\n", filename);
-
- /* Open and stat the file. */
- desc = open(filename, O_RDONLY, 0);
- if (desc < 0)
- pfatal_with_name(filename);
- if (stat(filename, &statbuf) < 0)
- pfatal_with_name(filename);
-
- /* Read contents of file into BUFFER. */
- buffer = xmalloc((unsigned) statbuf.st_size + 1);
- readlen = read(desc, buffer, (unsigned) statbuf.st_size);
- if (readlen < 0)
- pfatal_with_name(filename);
- buffer[readlen] = 0;
- close(desc);
-
- /* Scan BUFFER for specs, putting them in the vector. */
- p = buffer;
- while (1)
- {
- char *suffix;
- char *spec;
- char *in, *out, *p1, *p2, *p3;
-
- /* Advance P in BUFFER to the next nonblank nocomment line. */
- p = skip_whitespace(p);
- if (*p == 0)
- break;
-
- /* Is this a special command that starts with '%'? */
- /* Don't allow this for the main specs file, since it would
- encourage people to overwrite it. */
- if (*p == '%' && !main_p)
- {
- p1 = p;
- while (*p && *p != '\n')
- p++;
-
- p++; /* Skip '\n' */
-
- if (!strncmp(p1, "%include", sizeof ("%include")-1)
- && (p1[sizeof "%include" - 1] == ' '
- || p1[sizeof "%include" - 1] == '\t'))
- {
- char *new_filename;
-
- p1 += sizeof ("%include");
- while (*p1 == ' ' || *p1 == '\t')
- p1++;
-
- if (*p1++ != '<' || p[-2] != '>')
- fatal("specs %%include syntax malformed after %ld characters",
- (long) (p1 - buffer + 1));
-
- p[-2] = '\0';
- new_filename = find_a_file(&startfile_prefixes, p1, R_OK);
- read_specs(new_filename ? new_filename : p1, FALSE);
- continue;
- }
- else if (!strncmp(p1, "%include_noerr", sizeof "%include_noerr" - 1)
- && (p1[sizeof "%include_noerr" - 1] == ' '
- || p1[sizeof "%include_noerr" - 1] == '\t'))
- {
- char *new_filename;
-
- p1 += sizeof "%include_noerr";
- while (*p1 == ' ' || *p1 == '\t') p1++;
-
- if (*p1++ != '<' || p[-2] != '>')
- fatal("specs %%include syntax malformed after %ld characters",
- (long) (p1 - buffer + 1));
-
- p[-2] = '\0';
- new_filename = find_a_file(&startfile_prefixes, p1, R_OK);
- if (new_filename)
- read_specs(new_filename, FALSE);
- else if (verbose_flag)
- fprintf(stderr, "Could not find specs file %s\n", p1);
- continue;
- }
- else if (!strncmp(p1, "%rename", sizeof "%rename" - 1)
- && (p1[sizeof "%rename" - 1] == ' '
- || p1[sizeof "%rename" - 1] == '\t'))
- {
- int name_len;
- struct spec_list *sl;
-
- /* Get original name */
- p1 += sizeof "%rename";
- while (*p1 == ' ' || *p1 == '\t')
- p1++;
-
- if (!ISALPHA((unsigned char)*p1))
- fatal("specs %%rename syntax malformed after %ld characters",
- (long) (p1 - buffer));
-
- p2 = p1;
- while (*p2 && !ISSPACE((unsigned char)*p2))
- p2++;
-
- if (*p2 != ' ' && *p2 != '\t')
- fatal("specs %%rename syntax malformed after %ld characters",
- (long) (p2 - buffer));
-
- name_len = p2 - p1;
- *p2++ = '\0';
- while (*p2 == ' ' || *p2 == '\t')
- p2++;
-
- if (!ISALPHA((unsigned char)*p2))
- fatal("specs %%rename syntax malformed after %ld characters",
- (long) (p2 - buffer));
-
- /* Get new spec name */
- p3 = p2;
- while (*p3 && !ISSPACE((unsigned char)*p3))
- p3++;
-
- if (p3 != p-1)
- fatal("specs %%rename syntax malformed after %ld characters",
- (long) (p3 - buffer));
- *p3 = '\0';
-
- for (sl = specs; sl; sl = sl->next)
- if (name_len == sl->name_len && !strcmp(sl->name, p1))
- break;
-
- if (!sl)
- fatal("specs %s spec was not found to be renamed", p1);
-
- if (strcmp(p1, p2) == 0)
- continue;
-
- if (verbose_flag)
- {
- fprintf(stderr, "rename spec %s to %s\n", p1, p2);
-#ifdef DEBUG_SPECS
- fprintf(stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
-#endif
- }
-
- set_spec(p2, *(sl->ptr_spec));
- if (sl->alloc_p)
- free(*(sl->ptr_spec));
-
- *(sl->ptr_spec) = "";
- sl->alloc_p = 0;
- continue;
- }
- else
- fatal("specs unknown %% command after %ld characters",
- (long) (p1 - buffer));
- }
-
- /* Find the colon that should end the suffix. */
- p1 = p;
- while (*p1 && *p1 != ':' && *p1 != '\n')
- p1++;
-
- /* The colon shouldn't be missing. */
- if (*p1 != ':')
- fatal("specs file malformed after %ld characters",
- (long) (p1 - buffer));
-
- /* Skip back over trailing whitespace. */
- p2 = p1;
- while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
- p2--;
-
- /* Copy the suffix to a string. */
- suffix = save_string(p, p2 - p);
- /* Find the next line. */
- p = skip_whitespace(p1 + 1);
- if (p[1] == 0)
- fatal("specs file malformed after %ld characters",
- (long) (p - buffer));
-
- p1 = p;
- /* Find next blank line or end of string. */
- while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
- p1++;
-
- /* Specs end at the blank line and do not include the newline. */
- spec = save_string(p, p1 - p);
- p = p1;
-
- /* Delete backslash-newline sequences from the spec. */
- in = spec;
- out = spec;
- while (*in != 0)
- {
- if (in[0] == '\\' && in[1] == '\n')
- in += 2;
- else if (in[0] == '#')
- while (*in && *in != '\n')
- in++;
-
- else
- *out++ = *in++;
- }
- *out = 0;
-
- if (suffix[0] == '*')
- {
- if (!strcmp(suffix, "*link_command"))
- link_command_spec = spec;
- else
- set_spec(suffix + 1, spec);
- }
- else
- {
- /* Add this pair to the vector. */
- compilers
- = ((struct compiler *)
- xrealloc(compilers,
- (n_compilers + 2) * sizeof (struct compiler)));
-
- compilers[n_compilers].suffix = suffix;
- zero_memory((char *) compilers[n_compilers].spec,
- sizeof compilers[n_compilers].spec);
- compilers[n_compilers].spec[0] = spec;
- n_compilers++;
- zero_memory((char *) &compilers[n_compilers],
- sizeof compilers[n_compilers]);
- }
-
- if (*suffix == 0)
- link_command_spec = spec;
- }
-
- if (link_command_spec == 0)
- fatal("spec file has no spec for linking");
-}
-
-/* Record the names of temporary files we tell compilers to write,
- and delete them at the end of the run. */
-
-/* This is the common prefix we use to make temp file names.
- It is chosen once for each run of this program.
- It is substituted into a spec by %g.
- Thus, all temp file names contain this prefix.
- In practice, all temp file names start with this prefix.
-
- This prefix comes from the envvar TMPDIR if it is defined;
- otherwise, from the P_tmpdir macro if that is defined;
- otherwise, in /usr/tmp or /tmp;
- or finally the current directory if all else fails. */
-
-static char *temp_filename;
-
-/* Length of the prefix. */
-
-static int temp_filename_length;
-
-/* Define the list of temporary files to delete. */
-
-struct temp_file
-{
- char *name;
- struct temp_file *next;
-};
-
-/* Queue of files to delete on success or failure of compilation. */
-static struct temp_file *always_delete_queue;
-/* Queue of files to delete on failure of compilation. */
-static struct temp_file *failure_delete_queue;
-
-/* Record FILENAME as a file to be deleted automatically.
- ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
- otherwise delete it in any case.
- FAIL_DELETE nonzero means delete it if a compilation step fails;
- otherwise delete it in any case. */
-
-static void
-record_temp_file(char *filename, int always_delete, int fail_delete)
-{
- register char *name;
- name = xmalloc(strlen(filename) + 1);
- strcpy(name, filename);
-
- if (always_delete)
- {
- register struct temp_file *temp;
- for (temp = always_delete_queue; temp; temp = temp->next)
- if (!strcmp(name, temp->name))
- goto already1;
-
- temp = (struct temp_file *) xmalloc(sizeof (struct temp_file));
- temp->next = always_delete_queue;
- temp->name = name;
- always_delete_queue = temp;
-
-already1:;
- }
-
- if (fail_delete)
- {
- register struct temp_file *temp;
- for (temp = failure_delete_queue; temp; temp = temp->next)
- if (!strcmp(name, temp->name))
- goto already2;
-
- temp = (struct temp_file *) xmalloc(sizeof (struct temp_file));
- temp->next = failure_delete_queue;
- temp->name = name;
- failure_delete_queue = temp;
-
-already2:;
- }
-}
-
-/* Delete all the temporary files whose names we previously recorded. */
-
-static void
-delete_if_ordinary(char *name)
-{
- struct stat st;
-#ifdef DEBUG
- int i, c;
-
- printf("Delete %s? (y or n) ", name);
- fflush(stdout);
- i = getchar();
- if (i != '\n')
- while ((c = getchar()) != '\n' && c != EOF)
- ;
-
- if (i == 'y' || i == 'Y')
-#endif /* DEBUG */
- if (stat(name, &st) >= 0 && S_ISREG(st.st_mode))
- if (unlink(name) < 0)
- if (verbose_flag)
- perror_with_name(name);
-}
-
-static void
-delete_temp_files()
-{
- register struct temp_file *temp;
-
- for (temp = always_delete_queue; temp; temp = temp->next)
- delete_if_ordinary(temp->name);
- always_delete_queue = 0;
-}
-
-/* Delete all the files to be deleted on error. */
-
-static void
-delete_failure_queue()
-{
- register struct temp_file *temp;
-
- for (temp = failure_delete_queue; temp; temp = temp->next)
- delete_if_ordinary(temp->name);
-}
-
-static void
-clear_failure_queue()
-{
- failure_delete_queue = 0;
-}
-
-/* Build a list of search directories from PATHS.
- PREFIX is a string to prepend to the list.
- If CHECK_DIR_P is non-zero we ensure the directory exists.
- This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
- It is also used by the --print-search-dirs flag. */
-
-static char *
-build_search_list(struct path_prefix *paths, char *prefix, int check_dir_p)
-{
- int suffix_len = (machine_suffix) ? strlen(machine_suffix) : 0;
- int just_suffix_len
- = (just_machine_suffix) ? strlen(just_machine_suffix) : 0;
- int first_time = TRUE;
- struct prefix_list *pprefix;
-
- obstack_grow(&collect_obstack, prefix, strlen(prefix));
-
- for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
- {
- int len = strlen(pprefix->prefix);
-
- if (machine_suffix
- && (!check_dir_p
- || is_directory(pprefix->prefix, machine_suffix, 0)))
- {
- if (!first_time)
- obstack_1grow(&collect_obstack, PATH_SEPARATOR);
-
- first_time = FALSE;
- obstack_grow(&collect_obstack, pprefix->prefix, len);
- obstack_grow(&collect_obstack, machine_suffix, suffix_len);
- }
-
- if (just_machine_suffix
- && pprefix->require_machine_suffix == 2
- && (!check_dir_p
- || is_directory(pprefix->prefix, just_machine_suffix, 0)))
- {
- if (!first_time)
- obstack_1grow(&collect_obstack, PATH_SEPARATOR);
-
- first_time = FALSE;
- obstack_grow(&collect_obstack, pprefix->prefix, len);
- obstack_grow(&collect_obstack, just_machine_suffix,
- just_suffix_len);
- }
-
- if (!pprefix->require_machine_suffix)
- {
- if (!first_time)
- obstack_1grow(&collect_obstack, PATH_SEPARATOR);
-
- first_time = FALSE;
- obstack_grow(&collect_obstack, pprefix->prefix, len);
- }
- }
-
- obstack_1grow(&collect_obstack, '\0');
- return obstack_finish(&collect_obstack);
-}
-
-/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
- for collect. */
-
-static void
-putenv_from_prefixes(struct path_prefix *paths, char *env_var)
-{
- putenv(build_search_list(paths, env_var, 1));
-}
-
-/* Search for NAME using the prefix list PREFIXES. MODE is passed to
- access to check permissions.
- Return 0 if not found, otherwise return its name, allocated with malloc. */
-
-static char *
-find_a_file(struct path_prefix *pprefix, char *name, int mode)
-{
- char *temp;
- char *file_suffix = ((mode & X_OK) != 0 ? EXECUTABLE_SUFFIX : "");
- struct prefix_list *pl;
- int len = pprefix->max_len + strlen(name) + strlen(file_suffix) + 1;
-
-#ifdef DEFAULT_ASSEMBLER
- if (!strcmp(name, "as") && access(DEFAULT_ASSEMBLER, mode) == 0) {
- name = DEFAULT_ASSEMBLER;
- len = strlen(name)+1;
- temp = xmalloc(len);
- strcpy(temp, name);
- return temp;
- }
-#endif
-
-#ifdef DEFAULT_LINKER
- if (!strcmp(name, "ld") && access(DEFAULT_LINKER, mode) == 0) {
- name = DEFAULT_LINKER;
- len = strlen(name)+1;
- temp = xmalloc(len);
- strcpy(temp, name);
- return temp;
- }
-#endif
-
- if (machine_suffix)
- len += strlen(machine_suffix);
-
- temp = xmalloc(len);
-
- /* Determine the filename to execute (special case for absolute paths). */
-
- if (*name == '/' || *name == DIR_SEPARATOR
- /* Check for disk name on MS-DOS-based systems. */
- || (DIR_SEPARATOR == '\\' && name[1] == ':'
- && (name[2] == DIR_SEPARATOR || name[2] == '/')))
- {
- if (access(name, mode) == 0)
- {
- strcpy(temp, name);
- return temp;
- }
- }
- else
- for (pl = pprefix->plist; pl; pl = pl->next)
- {
- if (machine_suffix)
- {
- /* Some systems have a suffix for executable files.
- So try appending that first. */
- if (file_suffix[0] != 0)
- {
- strcpy(temp, pl->prefix);
- strcat(temp, machine_suffix);
- strcat(temp, name);
- strcat(temp, file_suffix);
- if (access(temp, mode) == 0)
- {
- if (pl->used_flag_ptr != 0)
- *pl->used_flag_ptr = 1;
- return temp;
- }
- }
-
- /* Now try just the name. */
- strcpy(temp, pl->prefix);
- strcat(temp, machine_suffix);
- strcat(temp, name);
- if (access(temp, mode) == 0)
- {
- if (pl->used_flag_ptr != 0)
- *pl->used_flag_ptr = 1;
- return temp;
- }
- }
-
- /* Certain prefixes are tried with just the machine type,
- not the version. This is used for finding as, ld, etc. */
- if (just_machine_suffix && pl->require_machine_suffix == 2)
- {
- /* Some systems have a suffix for executable files.
- So try appending that first. */
- if (file_suffix[0] != 0)
- {
- strcpy(temp, pl->prefix);
- strcat(temp, just_machine_suffix);
- strcat(temp, name);
- strcat(temp, file_suffix);
- if (access(temp, mode) == 0)
- {
- if (pl->used_flag_ptr != 0)
- *pl->used_flag_ptr = 1;
- return temp;
- }
- }
-
- strcpy(temp, pl->prefix);
- strcat(temp, just_machine_suffix);
- strcat(temp, name);
- if (access(temp, mode) == 0)
- {
- if (pl->used_flag_ptr != 0)
- *pl->used_flag_ptr = 1;
- return temp;
- }
- }
-
- /* Certain prefixes can't be used without the machine suffix
- when the machine or version is explicitly specified. */
- if (!pl->require_machine_suffix)
- {
- /* Some systems have a suffix for executable files.
- So try appending that first. */
- if (file_suffix[0] != 0)
- {
- strcpy(temp, pl->prefix);
- strcat(temp, name);
- strcat(temp, file_suffix);
- if (access(temp, mode) == 0)
- {
- if (pl->used_flag_ptr != 0)
- *pl->used_flag_ptr = 1;
- return temp;
- }
- }
-
- strcpy(temp, pl->prefix);
- strcat(temp, name);
- if (access(temp, mode) == 0)
- {
- if (pl->used_flag_ptr != 0)
- *pl->used_flag_ptr = 1;
- return temp;
- }
- }
- }
-
- free(temp);
- return 0;
-}
-
-/* Add an entry for PREFIX in PLIST. If FIRST is set, it goes
- at the start of the list, otherwise it goes at the end.
-
- If WARN is nonzero, we will warn if no file is found
- through this prefix. WARN should point to an int
- which will be set to 1 if this entry is used.
-
- COMPONENT is the value to be passed to update_path.
-
- REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
- the complete value of machine_suffix.
- 2 means try both machine_suffix and just_machine_suffix. */
-
-static void
-add_prefix(struct path_prefix *pprefix, const char *prefix, const char *component, int first, int require_machine_suffix, int *warn)
-{
- struct prefix_list *pl, **prev;
- int len;
-
- if (!first && pprefix->plist)
- {
- for (pl = pprefix->plist; pl->next; pl = pl->next)
- ;
- prev = &pl->next;
- }
- else
- prev = &pprefix->plist;
-
- /* Keep track of the longest prefix */
-
- prefix = update_path(prefix, component);
- len = strlen(prefix);
- if (len > pprefix->max_len)
- pprefix->max_len = len;
-
- pl = (struct prefix_list *) xmalloc(sizeof (struct prefix_list));
- pl->prefix = save_string(prefix, len);
- pl->require_machine_suffix = require_machine_suffix;
- pl->used_flag_ptr = warn;
- if (warn)
- *warn = 0;
-
- if (*prev)
- pl->next = *prev;
- else
- pl->next = (struct prefix_list *) 0;
- *prev = pl;
-}
-
-/* Print warnings for any prefixes in the list PPREFIX that were not used. */
-
-static void
-unused_prefix_warnings(struct path_prefix *pprefix)
-{
- struct prefix_list *pl = pprefix->plist;
-
- while (pl)
- {
- if (pl->used_flag_ptr != 0 && !*pl->used_flag_ptr)
- {
- if (pl->require_machine_suffix && machine_suffix)
- error("file path prefix `%s%s' never used", pl->prefix,
- machine_suffix);
- else
- error("file path prefix `%s' never used", pl->prefix);
-
- /* Prevent duplicate warnings. */
- *pl->used_flag_ptr = 1;
- }
-
- pl = pl->next;
- }
-}
-
-
-/* Execute the command specified by the arguments on the current line of spec.
- When using pipes, this includes several piped-together commands
- with `|' between them.
-
- Return 0 if successful, -1 if failed. */
-
-static int
-execute()
-{
- int i;
- int n_commands; /* # of command. */
- char *string;
- struct command
- {
- char *prog; /* program name. */
- char **argv; /* vector of args. */
- int pid; /* pid of process for this command. */
- };
-
- struct command *commands; /* each command buffer with above info. */
-
- /* Count # of piped commands. */
- for (n_commands = 1, i = 0; i < argbuf_index; i++)
- if (strcmp(argbuf[i], "|") == 0)
- n_commands++;
-
- /* Get storage for each command. */
- commands
- = (struct command *) alloca(n_commands * sizeof (struct command));
-
- /* Split argbuf into its separate piped processes,
- and record info about each one.
- Also search for the programs that are to be run. */
-
- commands[0].prog = argbuf[0]; /* first command. */
- commands[0].argv = &argbuf[0];
- string = find_a_file(&exec_prefixes, commands[0].prog, X_OK);
-
- if (string)
- commands[0].argv[0] = string;
-
- for (n_commands = 1, i = 0; i < argbuf_index; i++)
- if (strcmp(argbuf[i], "|") == 0)
- { /* each command. */
- argbuf[i] = 0; /* termination of command args. */
- commands[n_commands].prog = argbuf[i + 1];
- commands[n_commands].argv = &argbuf[i + 1];
- string = find_a_file(&exec_prefixes, commands[n_commands].prog, X_OK);
- if (string)
- commands[n_commands].argv[0] = string;
- n_commands++;
- }
-
- argbuf[argbuf_index] = 0;
-
- /* If -v, print what we are about to do, and maybe query. */
-
- if (verbose_flag)
- {
- /* For help listings, put a blank line between sub-processes. */
- if (print_help_list)
- fputc('\n', stderr);
-
- /* Print each piped command as a separate line. */
- for (i = 0; i < n_commands; i++)
- {
- char **j;
-
- for (j = commands[i].argv; *j; j++)
- fprintf(stderr, " %s", *j);
-
- /* Print a pipe symbol after all but the last command. */
- if (i + 1 != n_commands)
- fprintf(stderr, " |");
- fprintf(stderr, "\n");
- }
- fflush(stderr);
-#ifdef DEBUG
- fprintf(stderr, "\nGo ahead? (y or n) ");
- fflush(stderr);
- i = getchar();
- if (i != '\n')
- while (getchar() != '\n')
- ;
-
- if (i != 'y' && i != 'Y')
- return 0;
-#endif /* DEBUG */
- }
-
- /* Run each piped subprocess. */
-
- for (i = 0; i < n_commands; i++)
- {
- char *errmsg_fmt, *errmsg_arg;
- char *string = commands[i].argv[0];
-
- commands[i].pid = pexecute(string, commands[i].argv,
- programname, temp_filename,
- &errmsg_fmt, &errmsg_arg,
- ((i == 0 ? PEXECUTE_FIRST : 0)
- | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
- | (string == commands[i].prog
- ? PEXECUTE_SEARCH : 0)
- | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
-
- if (commands[i].pid == -1)
- pfatal_pexecute(errmsg_fmt, errmsg_arg);
-
- if (string != commands[i].prog)
- free(string);
- }
-
- execution_count++;
-
- /* Wait for all the subprocesses to finish.
- We don't care what order they finish in;
- we know that N_COMMANDS waits will get them all.
- Ignore subprocesses that we don't know about,
- since they can be spawned by the process that exec'ed us. */
-
- {
- int ret_code = 0;
-
- for (i = 0; i < n_commands; )
- {
- int j;
- int status;
- int pid;
-
- pid = pwait(commands[i].pid, &status, 0);
- if (pid < 0)
- abort();
-
- for (j = 0; j < n_commands; j++)
- if (commands[j].pid == pid)
- {
- i++;
- if (status != 0)
- {
- if (WIFSIGNALED(status))
- {
- fatal("Internal compiler error: program %s got fatal signal %d",
- commands[j].prog, WTERMSIG(status));
- signal_count++;
- ret_code = -1;
- }
- else if (WIFEXITED(status)
- && WEXITSTATUS(status) >= MIN_FATAL_STATUS)
- ret_code = -1;
- }
- break;
- }
- }
- return ret_code;
- }
-}
-
-/* Find all the switches given to us
- and make a vector describing them.
- The elements of the vector are strings, one per switch given.
- If a switch uses following arguments, then the `part1' field
- is the switch itself and the `args' field
- is a null-terminated vector containing the following arguments.
- The `live_cond' field is 1 if the switch is true in a conditional spec,
- -1 if false (overridden by a later switch), and is initialized to zero.
- The `valid' field is nonzero if any spec has looked at this switch;
- if it remains zero at the end of the run, it must be meaningless. */
-
-struct switchstr
-{
- char *part1;
- char **args;
- int live_cond;
- int valid;
-};
-
-static struct switchstr *switches;
-
-static int n_switches;
-
-struct infile
-{
- char *name;
- char *language;
-};
-
-/* Also a vector of input files specified. */
-
-static struct infile *infiles;
-
-static int n_infiles;
-
-/* This counts the number of libraries added by LANG_SPECIFIC_DRIVER, so that
- we can tell if there were any user supplied any files or libraries. */
-
-static int added_libraries;
-
-/* And a vector of corresponding output files is made up later. */
-
-static char **outfiles;
-
-/* Used to track if none of the -B paths are used. */
-static int warn_B;
-
-/* Used to track if standard path isn't used and -b or -V is specified. */
-static int warn_std;
-
-/* Gives value to pass as "warn" to add_prefix for standard prefixes. */
-static int *warn_std_ptr = 0;
-
-/* Display the command line switches accepted by gcc. */
-static void
-display_help()
-{
- printf("Usage: %s [options] file...\n", programname);
- printf("Options:\n");
-
- printf(" --help Display this information\n");
- if (!verbose_flag)
- printf(" (Use '-v --help' to display command line options of sub-processes)\n");
- printf(" -dumpspecs Display all of the built in spec strings\n");
- printf(" -dumpversion Display the version of the compiler\n");
- printf(" -dumpmachine Display the compiler's target processor\n");
- printf(" -print-search-dirs Display the directories in the compiler's search path\n");
- printf(" -print-libgcc-file-name Display the name of the compiler's companion library\n");
- printf(" -print-file-name=<lib> Display the full path to library <lib>\n");
- printf(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n");
- printf(" -print-multi-directory Display the root directory for versions of libgcc\n");
- printf(" -print-multi-lib Display the mapping between command line options and\n");
- printf(" multiple library search directories\n");
- printf(" -Wa,<options> Pass comma-separated <options> on to the assembler\n");
- printf(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n");
- printf(" -Wl,<options> Pass comma-separated <options> on to the linker\n");
- printf(" -Xlinker <arg> Pass <arg> on to the linker\n");
- printf(" -save-temps Do not delete intermediate files\n");
- printf(" -pipe Use pipes rather than intermediate files\n");
- printf(" -specs=<file> Override builtin specs with the contents of <file>\n");
- printf(" -std=<standard> Assume that the input sources are for <standard>\n");
- printf(" -B <directory> Add <directory> to the compiler's search paths\n");
- printf(" -b <machine> Run gcc for target <machine>, if installed\n");
- printf(" -V <version> Run gcc version number <version>, if installed\n");
- printf(" -v Display the programs invoked by the compiler\n");
- printf(" -E Preprocess only; do not compile, assemble or link\n");
- printf(" -S Compile only; do not assemble or link\n");
- printf(" -c Compile and assemble, but do not link\n");
- printf(" -o <file> Place the output into <file>\n");
- printf(" -x <language> Specify the language of the following input files\n");
- printf(" Permissable languages include: c c++ assembler none\n");
- printf(" 'none' means revert to the default behaviour of\n");
- printf(" guessing the language based on the file's extension\n");
-
- printf("\nOptions starting with -g, -f, -m, -O or -W are automatically passed on to\n");
- printf("the various sub-processes invoked by %s. In order to pass other options\n",
- programname);
- printf("on to these processes the -W<letter> options must be used.\n");
-
- /* The rest of the options are displayed by invocations of the various
- sub-processes. */
-}
-
-static void
-add_preprocessor_option(char *option, int len)
-{
- n_preprocessor_options++;
-
- if (!preprocessor_options)
- preprocessor_options
- = (char **) xmalloc(n_preprocessor_options * sizeof (char *));
- else
- preprocessor_options
- = (char **) xrealloc(preprocessor_options,
- n_preprocessor_options * sizeof (char *));
-
- preprocessor_options [n_preprocessor_options - 1] = save_string(option, len);
-}
-
-static void
-add_assembler_option(char *option, int len)
-{
- n_assembler_options++;
-
- if (!assembler_options)
- assembler_options
- = (char **) xmalloc(n_assembler_options * sizeof (char *));
- else
- assembler_options
- = (char **) xrealloc(assembler_options,
- n_assembler_options * sizeof (char *));
-
- assembler_options [n_assembler_options - 1] = save_string(option, len);
-}
-
-static void
-add_linker_option(char *option, int len)
-{
- n_linker_options++;
-
- if (!linker_options)
- linker_options
- = (char **) xmalloc(n_linker_options * sizeof (char *));
- else
- linker_options
- = (char **) xrealloc(linker_options,
- n_linker_options * sizeof (char *));
-
- linker_options [n_linker_options - 1] = save_string(option, len);
-}
-
-/* Create the vector `switches' and its contents.
- Store its length in `n_switches'. */
-
-static void
-process_command(int argc, char **argv)
-{
- register int i;
- char *temp;
- char *spec_lang = 0;
- int last_language_n_infiles;
- int have_c = 0;
- int have_o = 0;
- int lang_n_infiles = 0;
-
- n_switches = 0;
- n_infiles = 0;
- added_libraries = 0;
-
- /* Figure compiler version from version string. */
-
- compiler_version = save_string(version_string, strlen(version_string));
- for (temp = compiler_version; *temp; ++temp)
- {
- if (*temp == ' ')
- {
- *temp = '\0';
- break;
- }
- }
-
- /* Convert new-style -- options to old-style. */
- translate_options(&argc, &argv);
-
-
- /* Scan argv twice. Here, the first time, just count how many switches
- there will be in their vector, and how many input files in theirs.
- Here we also parse the switches that cc itself uses (e.g. -v). */
-
- for (i = 1; i < argc; i++)
- {
- if (!strcmp(argv[i], "-dumpspecs"))
- {
- struct spec_list *sl;
- init_spec();
- for (sl = specs; sl; sl = sl->next)
- printf("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
- exit(0);
- }
- else if (!strcmp(argv[i], "-dumpversion"))
- {
- printf("%s\n", spec_version);
- exit(0);
- }
- else if (!strcmp(argv[i], "-dumpmachine"))
- {
- printf("%s\n", spec_machine);
- exit(0);
- }
- else if (strcmp(argv[i], "-fhelp") == 0)
- {
- /* translate_options () has turned --help into -fhelp. */
- print_help_list = 1;
-
- /* We will be passing a dummy file on to the sub-processes. */
- n_infiles++;
- n_switches++;
-
- add_preprocessor_option("--help", 6);
- add_assembler_option("--help", 6);
- add_linker_option("--help", 6);
- }
- else if (!strcmp(argv[i], "-print-search-dirs"))
- print_search_dirs = 1;
- else if (!strcmp(argv[i], "-print-libgcc-file-name"))
- print_file_name = "libgcc.a";
- else if (!strncmp(argv[i], "-print-file-name=", 17))
- print_file_name = argv[i] + 17;
- else if (!strncmp(argv[i], "-print-prog-name=", 17))
- print_prog_name = argv[i] + 17;
- else if (!strcmp(argv[i], "-print-multi-lib"))
- print_multi_lib = 1;
- else if (!strcmp(argv[i], "-print-multi-directory"))
- print_multi_directory = 1;
- else if (!strncmp(argv[i], "-Wa,", 4))
- {
- int prev, j;
- /* Pass the rest of this option to the assembler. */
-
- /* Split the argument at commas. */
- prev = 4;
- for (j = 4; argv[i][j]; j++)
- {
- if (argv[i][j] == ',')
- {
- add_assembler_option(argv[i] + prev, j - prev);
- prev = j + 1;
- }
- }
-
- /* Record the part after the last comma. */
- add_assembler_option(argv[i] + prev, j - prev);
- }
- else if (!strncmp(argv[i], "-Wp,", 4))
- {
- int prev, j;
- /* Pass the rest of this option to the preprocessor. */
-
- /* Split the argument at commas. */
- prev = 4;
- for (j = 4; argv[i][j]; j++)
- {
- if (argv[i][j] == ',')
- {
- add_preprocessor_option(argv[i] + prev, j - prev);
- prev = j + 1;
- }
- }
-
- /* Record the part after the last comma. */
- add_preprocessor_option(argv[i] + prev, j - prev);
- }
- else if (strncmp(argv[i], "-Wl,", 4) == 0)
- {
- int j;
- /* Split the argument at commas. */
- for (j = 3; argv[i][j]; j++)
- n_infiles += (argv[i][j] == ',');
- }
- else if (strcmp(argv[i], "-Xlinker") == 0)
- {
- if (i + 1 == argc)
- fatal("argument to `-Xlinker' is missing");
-
- n_infiles++;
- i++;
- }
- else if (strncmp(argv[i], "-l", 2) == 0)
- n_infiles++;
- else if (strcmp(argv[i], "-save-temps") == 0)
- {
- save_temps_flag = 1;
- n_switches++;
- }
- else if (strcmp(argv[i], "-specs") == 0)
- {
- struct user_specs *user = (struct user_specs *)
- xmalloc(sizeof (struct user_specs));
- if (++i >= argc)
- fatal("argument to `-specs' is missing");
-
- user->next = (struct user_specs *)0;
- user->filename = argv[i];
- if (user_specs_tail)
- user_specs_tail->next = user;
- else
- user_specs_head = user;
- user_specs_tail = user;
- }
- else if (strncmp(argv[i], "-specs=", 7) == 0)
- {
- struct user_specs *user = (struct user_specs *)
- xmalloc(sizeof (struct user_specs));
- if (strlen(argv[i]) == 7)
- fatal("argument to `-specs=' is missing");
-
- user->next = (struct user_specs *)0;
- user->filename = argv[i]+7;
- if (user_specs_tail)
- user_specs_tail->next = user;
- else
- user_specs_head = user;
- user_specs_tail = user;
- }
- else if (argv[i][0] == '-' && argv[i][1] != 0)
- {
- register char *p = &argv[i][1];
- register int c = *p;
-
- switch (c)
- {
- case 'b':
- n_switches++;
- if (p[1] == 0 && i + 1 == argc)
- fatal("argument to `-b' is missing");
- if (p[1] == 0)
- spec_machine = argv[++i];
- else
- spec_machine = p + 1;
-
- warn_std_ptr = &warn_std;
- break;
-
- case 'B':
- {
- char *value;
- if (p[1] == 0 && i + 1 == argc)
- fatal("argument to `-B' is missing");
- if (p[1] == 0)
- value = argv[++i];
- else
- value = p + 1;
- add_prefix(&exec_prefixes, value, NULL, 1, 0, &warn_B);
- add_prefix(&startfile_prefixes, value, NULL,
- 1, 0, &warn_B);
- add_prefix(&include_prefixes, concat(value, "include",
- NULL),
- NULL, 1, 0, NULL);
-
- /* As a kludge, if the arg is "[foo/]stageN/", just add
- "[foo/]include" to the include prefix. */
- {
- int len = strlen(value);
- if ((len == 7
- || (len > 7
- && (value[len - 8] == '/'
- || value[len - 8] == DIR_SEPARATOR)))
- && strncmp(value + len - 7, "stage", 5) == 0
- && ISDIGIT(value[len - 2])
- && (value[len - 1] == '/'
- || value[len - 1] == DIR_SEPARATOR))
- {
- if (len == 7)
- add_prefix(&include_prefixes, "include", NULL,
- 1, 0, NULL);
- else
- {
- char *string = xmalloc(len + 1);
- strncpy(string, value, len-7);
- strcpy(string+len-7, "include");
- add_prefix(&include_prefixes, string, NULL,
- 1, 0, NULL);
- }
- }
- }
- n_switches++;
- }
- break;
-
- case 'v': /* Print our subcommands and print versions. */
- n_switches++;
- /* If they do anything other than exactly `-v', don't set
- verbose_flag; rather, continue on to give the error. */
- if (p[1] != 0)
- break;
- verbose_flag++;
- break;
-
- case 'V':
- n_switches++;
- if (p[1] == 0 && i + 1 == argc)
- fatal("argument to `-V' is missing");
- if (p[1] == 0)
- spec_version = argv[++i];
- else
- spec_version = p + 1;
- compiler_version = spec_version;
- warn_std_ptr = &warn_std;
-
- /* Validate the version number. Use the same checks
- done when inserting it into a spec.
-
- The format of the version string is
- ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)? */
- {
- char *v = compiler_version;
-
- /* Ignore leading non-digits. i.e. "foo-" in "foo-2.7.2". */
- while (!ISDIGIT(*v))
- v++;
-
- if (v > compiler_version && v[-1] != '-')
- fatal("invalid version number format");
-
- /* Set V after the first period. */
- while (ISDIGIT(*v))
- v++;
-
- if (*v != '.')
- fatal("invalid version number format");
-
- v++;
- while (ISDIGIT(*v))
- v++;
-
- if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
- fatal("invalid version number format");
- }
- break;
-
- case 'S':
- case 'c':
- if (p[1] == 0)
- {
- have_c = 1;
- n_switches++;
- break;
- }
- goto normal_switch;
-
- case 'o':
- have_o = 1;
- goto normal_switch;
-
- default:
-normal_switch:
- n_switches++;
-
- if (SWITCH_TAKES_ARG(c) > (p[1] != 0))
- i += SWITCH_TAKES_ARG(c) - (p[1] != 0);
- else if (WORD_SWITCH_TAKES_ARG(p))
- i += WORD_SWITCH_TAKES_ARG(p);
- }
- }
- else
- {
- n_infiles++;
- lang_n_infiles++;
- }
- }
-
- if (have_c && have_o && lang_n_infiles > 1)
- fatal("cannot specify -o with -c or -S and multiple compilations");
-
- /* Set up the search paths before we go looking for config files. */
-
- /* These come before the md prefixes so that we will find gcc's subcommands
- (such as cpp) rather than those of the host system. */
- /* Use 2 as fourth arg meaning try just the machine as a suffix,
- as well as trying the machine and the version. */
- add_prefix(&exec_prefixes, standard_exec_prefix, "BINUTILS",
- 0, 2, warn_std_ptr);
- add_prefix(&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
- 0, 2, warn_std_ptr);
-
- add_prefix(&startfile_prefixes, standard_exec_prefix, "BINUTILS",
- 0, 1, warn_std_ptr);
- add_prefix(&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
- 0, 1, warn_std_ptr);
-
- tooldir_prefix = concat(tooldir_base_prefix, spec_machine,
- dir_separator_str, NULL);
-
- /* If tooldir is relative, base it on exec_prefixes. A relative
- tooldir lets us move the installed tree as a unit. */
-
- if (*tooldir_prefix != '/' && *tooldir_prefix != DIR_SEPARATOR)
- {
- tooldir_prefix = concat(standard_exec_prefix, spec_machine,
- dir_separator_str, spec_version,
- dir_separator_str, tooldir_prefix, NULL);
- }
-
- add_prefix(&exec_prefixes,
- concat(tooldir_prefix, "bin", dir_separator_str, NULL),
- "BINUTILS", 0, 0, NULL);
- add_prefix(&startfile_prefixes,
- concat(tooldir_prefix, "lib", dir_separator_str, NULL),
- "BINUTILS", 0, 0, NULL);
-
- /* More prefixes are enabled in main, after we read the specs file
- and determine whether this is cross-compilation or not. */
-
-
- /* Then create the space for the vectors and scan again. */
-
- switches = ((struct switchstr *)
- xmalloc((n_switches + 1) * sizeof (struct switchstr)));
- infiles = (struct infile *) xmalloc((n_infiles + 1) * sizeof (struct infile));
- n_switches = 0;
- n_infiles = 0;
- last_language_n_infiles = -1;
-
- /* This, time, copy the text of each switch and store a pointer
- to the copy in the vector of switches.
- Store all the infiles in their vector. */
-
- for (i = 1; i < argc; i++)
- {
- /* Just skip the switches that were handled by the preceding loop. */
- if (!strncmp(argv[i], "-Wa,", 4))
- ;
- else if (!strncmp(argv[i], "-Wp,", 4))
- ;
- else if (!strcmp(argv[i], "-print-search-dirs"))
- ;
- else if (!strcmp(argv[i], "-print-libgcc-file-name"))
- ;
- else if (!strncmp(argv[i], "-print-file-name=", 17))
- ;
- else if (!strncmp(argv[i], "-print-prog-name=", 17))
- ;
- else if (!strcmp(argv[i], "-print-multi-lib"))
- ;
- else if (!strcmp(argv[i], "-print-multi-directory"))
- ;
- else if (strcmp(argv[i], "-fhelp") == 0)
- {
- if (verbose_flag)
- {
- /* Create a dummy input file, so that we can pass --help on to
- the various sub-processes. */
- infiles[n_infiles].language = "c";
- infiles[n_infiles++].name = "help-dummy";
-
- /* Preserve the --help switch so that it can be caught by the
- cc1 spec string. */
- switches[n_switches].part1 = "--help";
- switches[n_switches].args = 0;
- switches[n_switches].live_cond = 0;
- switches[n_switches].valid = 0;
-
- n_switches++;
- }
- }
- else if (argv[i][0] == '+' && argv[i][1] == 'e')
- {
- /* Compensate for the +e options to the C++ front-end;
- they're there simply for cfront call-compatibility. We do
- some magic in default_compilers to pass them down properly.
- Note we deliberately start at the `+' here, to avoid passing
- -e0 or -e1 down into the linker. */
- switches[n_switches].part1 = &argv[i][0];
- switches[n_switches].args = 0;
- switches[n_switches].live_cond = 0;
- switches[n_switches].valid = 0;
- n_switches++;
- }
- else if (strncmp(argv[i], "-Wl,", 4) == 0)
- {
- int prev, j;
- /* Split the argument at commas. */
- prev = 4;
- for (j = 4; argv[i][j]; j++)
- if (argv[i][j] == ',')
- {
- infiles[n_infiles].language = "*";
- infiles[n_infiles++].name
- = save_string(argv[i] + prev, j - prev);
- prev = j + 1;
- }
- /* Record the part after the last comma. */
- infiles[n_infiles].language = "*";
- infiles[n_infiles++].name = argv[i] + prev;
- }
- else if (strcmp(argv[i], "-Xlinker") == 0)
- {
- infiles[n_infiles].language = "*";
- infiles[n_infiles++].name = argv[++i];
- }
- else if (strncmp(argv[i], "-l", 2) == 0)
- {
- infiles[n_infiles].language = "*";
- infiles[n_infiles++].name = argv[i];
- }
- else if (strcmp(argv[i], "-specs") == 0)
- i++;
- else if (strncmp(argv[i], "-specs=", 7) == 0)
- ;
- /* -save-temps overrides -pipe, so that temp files are produced */
- else if (save_temps_flag && strcmp(argv[i], "-pipe") == 0)
- error("Warning: -pipe ignored since -save-temps specified");
- else if (argv[i][0] == '-' && argv[i][1] != 0)
- {
- register char *p = &argv[i][1];
- register int c = *p;
-
- if (c == 'x')
- {
- if (p[1] == 0 && i + 1 == argc)
- fatal("argument to `-x' is missing");
- if (p[1] == 0)
- spec_lang = argv[++i];
- else
- spec_lang = p + 1;
- if (!strcmp(spec_lang, "none"))
- /* Suppress the warning if -xnone comes after the last input
- file, because alternate command interfaces like g++ might
- find it useful to place -xnone after each input file. */
- spec_lang = 0;
- else
- last_language_n_infiles = n_infiles;
- continue;
- }
- switches[n_switches].part1 = p;
- /* Deal with option arguments in separate argv elements. */
- if ((SWITCH_TAKES_ARG(c) > (p[1] != 0))
- || WORD_SWITCH_TAKES_ARG(p))
- {
- int j = 0;
- int n_args = WORD_SWITCH_TAKES_ARG(p);
-
- if (n_args == 0)
- {
- /* Count only the option arguments in separate argv elements. */
- n_args = SWITCH_TAKES_ARG(c) - (p[1] != 0);
- }
- if (i + n_args >= argc)
- fatal("argument to `-%s' is missing", p);
- switches[n_switches].args
- = (char **) xmalloc((n_args + 1) * sizeof (char *));
- while (j < n_args)
- switches[n_switches].args[j++] = argv[++i];
- /* Null-terminate the vector. */
- switches[n_switches].args[j] = 0;
- }
- else if (strchr(switches_need_spaces, c))
- {
- /* On some systems, ld cannot handle some options without
- a space. So split the option from its argument. */
- char *part1 = (char *) xmalloc(2);
- part1[0] = c;
- part1[1] = '\0';
-
- switches[n_switches].part1 = part1;
- switches[n_switches].args = (char **) xmalloc(2 * sizeof (char *));
- switches[n_switches].args[0] = xmalloc(strlen(p));
- strcpy(switches[n_switches].args[0], &p[1]);
- switches[n_switches].args[1] = 0;
- }
- else
- switches[n_switches].args = 0;
-
- switches[n_switches].live_cond = 0;
- switches[n_switches].valid = 0;
- /* This is always valid, since gcc.c itself understands it. */
- if (!strcmp(p, "save-temps"))
- switches[n_switches].valid = 1;
- else
- {
- char ch = switches[n_switches].part1[0];
- if (ch == 'V' || ch == 'b' || ch == 'B')
- switches[n_switches].valid = 1;
- }
- n_switches++;
- }
- else
- {
- if (strcmp(argv[i], "-") != 0 && access(argv[i], R_OK) < 0)
- {
- perror_with_name(argv[i]);
- error_count++;
- }
- else
- {
- infiles[n_infiles].language = spec_lang;
- infiles[n_infiles++].name = argv[i];
- }
- }
- }
-
- if (n_infiles == last_language_n_infiles && spec_lang != 0)
- error("Warning: `-x %s' after last input file has no effect", spec_lang);
-
- switches[n_switches].part1 = 0;
- infiles[n_infiles].name = 0;
-}
-
-/* Process a spec string, accumulating and running commands. */
-
-/* These variables describe the input file name.
- input_file_number is the index on outfiles of this file,
- so that the output file name can be stored for later use by %o.
- input_basename is the start of the part of the input file
- sans all directory names, and basename_length is the number
- of characters starting there excluding the suffix .c or whatever. */
-
-char *input_filename;
-static int input_file_number;
-size_t input_filename_length;
-static int basename_length;
-static char *input_basename;
-static char *input_suffix;
-
-/* These are variables used within do_spec and do_spec_1. */
-
-/* Nonzero if an arg has been started and not yet terminated
- (with space, tab or newline). */
-static int arg_going;
-
-/* Nonzero means %d or %g has been seen; the next arg to be terminated
- is a temporary file name. */
-static int delete_this_arg;
-
-/* Nonzero means %w has been seen; the next arg to be terminated
- is the output file name of this compilation. */
-static int this_is_output_file;
-
-/* Nonzero means %s has been seen; the next arg to be terminated
- is the name of a library file and we should try the standard
- search dirs for it. */
-static int this_is_library_file;
-
-/* Nonzero means that the input of this command is coming from a pipe. */
-static int input_from_pipe;
-
-/* Process the spec SPEC and run the commands specified therein.
- Returns 0 if the spec is successfully processed; -1 if failed. */
-
-int
-do_spec(char *spec)
-{
- int value;
-
- clear_args();
- arg_going = 0;
- delete_this_arg = 0;
- this_is_output_file = 0;
- this_is_library_file = 0;
- input_from_pipe = 0;
-
- value = do_spec_1(spec, 0, NULL);
-
- /* Force out any unfinished command.
- If -pipe, this forces out the last command if it ended in `|'. */
- if (value == 0)
- {
- if (argbuf_index > 0 && !strcmp(argbuf[argbuf_index - 1], "|"))
- argbuf_index--;
-
- if (argbuf_index > 0)
- value = execute();
- }
-
- return value;
-}
-
-/* Process the sub-spec SPEC as a portion of a larger spec.
- This is like processing a whole spec except that we do
- not initialize at the beginning and we do not supply a
- newline by default at the end.
- INSWITCH nonzero means don't process %-sequences in SPEC;
- in this case, % is treated as an ordinary character.
- This is used while substituting switches.
- INSWITCH nonzero also causes SPC not to terminate an argument.
-
- Value is zero unless a line was finished
- and the command on that line reported an error. */
-
-static int
-do_spec_1(char *spec, int inswitch, char *soft_matched_part)
-{
- register char *p = spec;
- register int c;
- int i;
- char *string;
- int value;
-
- while ((c = *p++))
- /* If substituting a switch, treat all chars like letters.
- Otherwise, NL, SPC, TAB and % are special. */
- switch (inswitch ? 'a' : c)
- {
- case '\n':
- /* End of line: finish any pending argument,
- then run the pending command if one has been started. */
- if (arg_going)
- {
- obstack_1grow(&obstack, 0);
- string = obstack_finish(&obstack);
- if (this_is_library_file)
- string = find_file(string);
- store_arg(string, delete_this_arg, this_is_output_file);
- if (this_is_output_file)
- outfiles[input_file_number] = string;
- }
- arg_going = 0;
-
- if (argbuf_index > 0 && !strcmp(argbuf[argbuf_index - 1], "|"))
- {
- for (i = 0; i < n_switches; i++)
- if (!strcmp(switches[i].part1, "pipe"))
- break;
-
- /* A `|' before the newline means use a pipe here,
- but only if -pipe was specified.
- Otherwise, execute now and don't pass the `|' as an arg. */
- if (i < n_switches)
- {
- input_from_pipe = 1;
- switches[i].valid = 1;
- break;
- }
- else
- argbuf_index--;
- }
-
- if (argbuf_index > 0)
- {
- value = execute();
- if (value)
- return value;
- }
- /* Reinitialize for a new command, and for a new argument. */
- clear_args();
- arg_going = 0;
- delete_this_arg = 0;
- this_is_output_file = 0;
- this_is_library_file = 0;
- input_from_pipe = 0;
- break;
-
- case '|':
- /* End any pending argument. */
- if (arg_going)
- {
- obstack_1grow(&obstack, 0);
- string = obstack_finish(&obstack);
- if (this_is_library_file)
- string = find_file(string);
- store_arg(string, delete_this_arg, this_is_output_file);
- if (this_is_output_file)
- outfiles[input_file_number] = string;
- }
-
- /* Use pipe */
- obstack_1grow(&obstack, c);
- arg_going = 1;
- break;
-
- case '\t':
- case ' ':
- /* Space or tab ends an argument if one is pending. */
- if (arg_going)
- {
- obstack_1grow(&obstack, 0);
- string = obstack_finish(&obstack);
- if (this_is_library_file)
- string = find_file(string);
- store_arg(string, delete_this_arg, this_is_output_file);
- if (this_is_output_file)
- outfiles[input_file_number] = string;
- }
- /* Reinitialize for a new argument. */
- arg_going = 0;
- delete_this_arg = 0;
- this_is_output_file = 0;
- this_is_library_file = 0;
- break;
-
- case '%':
- switch (c = *p++)
- {
- case 0:
- fatal("Invalid specification! Bug in cc.");
-
- case 'b':
- obstack_grow(&obstack, input_basename, basename_length);
- arg_going = 1;
- break;
-
- case 'd':
- delete_this_arg = 2;
- break;
-
- /* Dump out the directories specified with LIBRARY_PATH,
- followed by the absolute directories
- that we search for startfiles. */
- case 'D':
- {
- struct prefix_list *pl = startfile_prefixes.plist;
- size_t bufsize = 100;
- char *buffer = (char *) xmalloc(bufsize);
- int idx;
-
- for (; pl; pl = pl->next)
- {
-#ifdef RELATIVE_PREFIX_NOT_LINKDIR
- /* Used on systems which record the specified -L dirs
- and use them to search for dynamic linking. */
- /* Relative directories always come from -B,
- and it is better not to use them for searching
- at run time. In particular, stage1 loses */
- if (pl->prefix[0] != '/' && pl->prefix[0] != DIR_SEPARATOR)
- continue;
-#endif
- /* Try subdirectory if there is one. */
- if (multilib_dir != NULL)
- {
- if (machine_suffix)
- {
- if (strlen(pl->prefix) + strlen(machine_suffix)
- >= bufsize)
- bufsize = (strlen(pl->prefix)
- + strlen(machine_suffix)) * 2 + 1;
- buffer = (char *) xrealloc(buffer, bufsize);
- strcpy(buffer, pl->prefix);
- strcat(buffer, machine_suffix);
- if (is_directory(buffer, multilib_dir, 1))
- {
- do_spec_1("-L", 0, NULL);
-#ifdef SPACE_AFTER_L_OPTION
- do_spec_1(" ", 0, NULL);
-#endif
- do_spec_1(buffer, 1, NULL);
- do_spec_1(multilib_dir, 1, NULL);
- /* Make this a separate argument. */
- do_spec_1(" ", 0, NULL);
- }
- }
- if (!pl->require_machine_suffix)
- {
- if (is_directory(pl->prefix, multilib_dir, 1))
- {
- do_spec_1("-L", 0, NULL);
-#ifdef SPACE_AFTER_L_OPTION
- do_spec_1(" ", 0, NULL);
-#endif
- do_spec_1(pl->prefix, 1, NULL);
- do_spec_1(multilib_dir, 1, NULL);
- /* Make this a separate argument. */
- do_spec_1(" ", 0, NULL);
- }
- }
- }
- if (machine_suffix)
- {
- if (is_directory(pl->prefix, machine_suffix, 1))
- {
- do_spec_1("-L", 0, NULL);
-#ifdef SPACE_AFTER_L_OPTION
- do_spec_1(" ", 0, NULL);
-#endif
- do_spec_1(pl->prefix, 1, NULL);
- /* Remove slash from machine_suffix. */
- if (strlen(machine_suffix) >= bufsize)
- bufsize = strlen(machine_suffix) * 2 + 1;
- buffer = (char *) xrealloc(buffer, bufsize);
- strcpy(buffer, machine_suffix);
- idx = strlen(buffer);
- if (buffer[idx - 1] == '/'
- || buffer[idx - 1] == DIR_SEPARATOR)
- buffer[idx - 1] = 0;
- do_spec_1(buffer, 1, NULL);
- /* Make this a separate argument. */
- do_spec_1(" ", 0, NULL);
- }
- }
- if (!pl->require_machine_suffix)
- {
- if (is_directory(pl->prefix, "", 1))
- {
- do_spec_1("-L", 0, NULL);
-#ifdef SPACE_AFTER_L_OPTION
- do_spec_1(" ", 0, NULL);
-#endif
- /* Remove slash from pl->prefix. */
- if (strlen(pl->prefix) >= bufsize)
- bufsize = strlen(pl->prefix) * 2 + 1;
- buffer = (char *) xrealloc(buffer, bufsize);
- strcpy(buffer, pl->prefix);
- idx = strlen(buffer);
- if (buffer[idx - 1] == '/'
- || buffer[idx - 1] == DIR_SEPARATOR)
- buffer[idx - 1] = 0;
- do_spec_1(buffer, 1, NULL);
- /* Make this a separate argument. */
- do_spec_1(" ", 0, NULL);
- }
- }
- }
- free(buffer);
- }
- break;
-
- case 'e':
- /* {...:%efoo} means report an error with `foo' as error message
- and don't execute any more commands for this file. */
- {
- char *q = p;
- char *buf;
- while (*p != 0 && *p != '\n') p++;
- buf = (char *) alloca(p - q + 1);
- strncpy(buf, q, p - q);
- buf[p - q] = 0;
- error("%s", buf);
- return -1;
- }
- break;
-
- case 'g':
- case 'u':
- case 'U':
- if (save_temps_flag)
- {
- obstack_grow(&obstack, input_basename, basename_length);
- delete_this_arg = 0;
- }
- else
- {
- /* ??? This has a problem: the total number of
- values mktemp can return is limited.
- That matters for the names of object files.
- In 2.4, do something about that. */
- struct temp_name *t;
- int suffix_length;
- char *suffix = p;
-
- if (p[0] == '%' && p[1] == 'O')
- {
- /* We don't support extra suffix characters after %O. */
- if (*p == '.' || ISALPHA((unsigned char)*p))
- abort();
- suffix = OBJECT_SUFFIX;
- suffix_length = strlen(OBJECT_SUFFIX);
- p += 2;
- }
- else
- {
- while (*p == '.' || ISALPHA((unsigned char)*p))
- p++;
- suffix_length = p - suffix;
- }
-
- /* See if we already have an association of %g/%u/%U and
- suffix. */
- for (t = temp_names; t; t = t->next)
- if (t->length == suffix_length
- && strncmp(t->suffix, suffix, suffix_length) == 0
- && t->unique == (c != 'g'))
- break;
-
- /* Make a new association if needed. %u requires one. */
- if (t == 0 || c == 'u')
- {
- if (t == 0)
- {
- t = (struct temp_name *) xmalloc(sizeof (struct temp_name));
- t->next = temp_names;
- temp_names = t;
- }
- t->length = suffix_length;
- t->suffix = save_string(suffix, suffix_length);
- t->unique = (c != 'g');
- temp_filename = make_temp_file(t->suffix);
- temp_filename_length = strlen(temp_filename);
- t->filename = temp_filename;
- t->filename_length = temp_filename_length;
- }
-
- obstack_grow(&obstack, t->filename, t->filename_length);
- delete_this_arg = 1;
- delete_this_arg = 1;
- }
- arg_going = 1;
- break;
-
- case 'i':
- obstack_grow(&obstack, input_filename, input_filename_length);
- arg_going = 1;
- break;
-
- case 'I':
- {
- struct prefix_list *pl = include_prefixes.plist;
-
- for (; pl; pl = pl->next)
- {
- do_spec_1("-isystem", 1, NULL);
- /* Make this a separate argument. */
- do_spec_1(" ", 0, NULL);
- do_spec_1(pl->prefix, 1, NULL);
- do_spec_1(" ", 0, NULL);
- }
- }
- break;
-
- case 'o':
- {
- int max = n_infiles;
- for (i = 0; i < max; i++)
- if (outfiles[i])
- store_arg(outfiles[i], 0, 0);
- break;
- }
-
- case 'O':
- obstack_grow(&obstack, OBJECT_SUFFIX, strlen(OBJECT_SUFFIX));
- arg_going = 1;
- break;
-
- case 's':
- this_is_library_file = 1;
- break;
-
- case 'w':
- this_is_output_file = 1;
- break;
-
- case 'W':
- {
- int cur_index = argbuf_index;
- /* Handle the {...} following the %W. */
- if (*p != '{')
- abort();
- p = handle_braces(p + 1);
- if (p == 0)
- return -1;
- /* If any args were output, mark the last one for deletion
- on failure. */
- if (argbuf_index != cur_index)
- record_temp_file(argbuf[argbuf_index - 1], 0, 1);
- break;
- }
-
- /* %x{OPTION} records OPTION for %X to output. */
- case 'x':
- {
- char *p1 = p;
- char *string;
-
- /* Skip past the option value and make a copy. */
- if (*p != '{')
- abort();
- while (*p++ != '}')
- ;
- string = save_string(p1 + 1, p - p1 - 2);
-
- /* See if we already recorded this option. */
- for (i = 0; i < n_linker_options; i++)
- if (!strcmp(string, linker_options[i]))
- {
- free(string);
- return 0;
- }
-
- /* This option is new; add it. */
- add_linker_option(string, strlen(string));
- }
- break;
-
- /* Dump out the options accumulated previously using %x. */
- case 'X':
- for (i = 0; i < n_linker_options; i++)
- {
- do_spec_1(linker_options[i], 1, NULL);
- /* Make each accumulated option a separate argument. */
- do_spec_1(" ", 0, NULL);
- }
- break;
-
- /* Dump out the options accumulated previously using -Wa,. */
- case 'Y':
- for (i = 0; i < n_assembler_options; i++)
- {
- do_spec_1(assembler_options[i], 1, NULL);
- /* Make each accumulated option a separate argument. */
- do_spec_1(" ", 0, NULL);
- }
- break;
-
- /* Dump out the options accumulated previously using -Wp,. */
- case 'Z':
- for (i = 0; i < n_preprocessor_options; i++)
- {
- do_spec_1(preprocessor_options[i], 1, NULL);
- /* Make each accumulated option a separate argument. */
- do_spec_1(" ", 0, NULL);
- }
- break;
-
- /* Here are digits and numbers that just process
- a certain constant string as a spec. */
-
- case '1':
- value = do_spec_1(cc1_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- case 'a':
- value = do_spec_1(asm_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- case 'A':
- value = do_spec_1(asm_final_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- case 'c':
- value = do_spec_1(signed_char_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- case 'C':
- value = do_spec_1(cpp_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- case 'E':
- value = do_spec_1(endfile_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- case 'l':
- value = do_spec_1(link_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- case 'L':
- value = do_spec_1(lib_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- case 'G':
- value = do_spec_1(libgcc_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- case 'p':
- {
- char *x = (char *) alloca(strlen(cpp_predefines) + 1);
- char *buf = x;
- char *y;
-
- /* Copy all of the -D options in CPP_PREDEFINES into BUF. */
- y = cpp_predefines;
- while (*y != 0)
- {
- if (!strncmp(y, "-D", 2))
- /* Copy the whole option. */
- while (*y && *y != ' ' && *y != '\t')
- *x++ = *y++;
- else if (*y == ' ' || *y == '\t')
- /* Copy whitespace to the result. */
- *x++ = *y++;
- /* Don't copy other options. */
- else
- y++;
- }
-
- *x = 0;
-
- value = do_spec_1(buf, 0, NULL);
- if (value != 0)
- return value;
- }
- break;
-
- case 'P':
- {
- char *x = (char *) alloca(strlen(cpp_predefines) * 4 + 1);
- char *buf = x;
- char *y;
-
- /* Copy all of CPP_PREDEFINES into BUF,
- but put __ after every -D and at the end of each arg. */
- y = cpp_predefines;
- while (*y != 0)
- {
- if (!strncmp(y, "-D", 2))
- {
- int flag = 0;
-
- *x++ = *y++;
- *x++ = *y++;
-
- if (*y != '_'
- || (*(y+1) != '_'
- && !ISUPPER((unsigned char)*(y+1))))
- {
- /* Stick __ at front of macro name. */
- *x++ = '_';
- *x++ = '_';
- /* Arrange to stick __ at the end as well. */
- flag = 1;
- }
-
- /* Copy the macro name. */
- while (*y && *y != '=' && *y != ' ' && *y != '\t')
- *x++ = *y++;
-
- if (flag)
- {
- *x++ = '_';
- *x++ = '_';
- }
-
- /* Copy the value given, if any. */
- while (*y && *y != ' ' && *y != '\t')
- *x++ = *y++;
- }
- else if (*y == ' ' || *y == '\t')
- /* Copy whitespace to the result. */
- *x++ = *y++;
- /* Don't copy -A options */
- else
- y++;
- }
- *x++ = ' ';
-
- /* Copy all of CPP_PREDEFINES into BUF,
- but put __ after every -D. */
- y = cpp_predefines;
- while (*y != 0)
- {
- if (!strncmp(y, "-D", 2))
- {
- y += 2;
-
- if (*y != '_'
- || (*(y+1) != '_'
- && !ISUPPER((unsigned char)*(y+1))))
- {
- /* Stick -D__ at front of macro name. */
- *x++ = '-';
- *x++ = 'D';
- *x++ = '_';
- *x++ = '_';
-
- /* Copy the macro name. */
- while (*y && *y != '=' && *y != ' ' && *y != '\t')
- *x++ = *y++;
-
- /* Copy the value given, if any. */
- while (*y && *y != ' ' && *y != '\t')
- *x++ = *y++;
- }
- else
- {
- /* Do not copy this macro - we have just done it before */
- while (*y && *y != ' ' && *y != '\t')
- y++;
- }
- }
- else if (*y == ' ' || *y == '\t')
- /* Copy whitespace to the result. */
- *x++ = *y++;
- /* Don't copy -A options */
- else
- y++;
- }
- *x++ = ' ';
-
- /* Copy all of the -A options in CPP_PREDEFINES into BUF. */
- y = cpp_predefines;
- while (*y != 0)
- {
- if (!strncmp(y, "-A", 2))
- /* Copy the whole option. */
- while (*y && *y != ' ' && *y != '\t')
- *x++ = *y++;
- else if (*y == ' ' || *y == '\t')
- /* Copy whitespace to the result. */
- *x++ = *y++;
- /* Don't copy other options. */
- else
- y++;
- }
-
- *x = 0;
-
- value = do_spec_1(buf, 0, NULL);
- if (value != 0)
- return value;
- }
- break;
-
- case 'S':
- value = do_spec_1(startfile_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- /* Here we define characters other than letters and digits. */
-
- case '{':
- p = handle_braces(p);
- if (p == 0)
- return -1;
- break;
-
- case '%':
- obstack_1grow(&obstack, '%');
- break;
-
- case '*':
- do_spec_1(soft_matched_part, 1, NULL);
- do_spec_1(" ", 0, NULL);
- break;
-
- /* Process a string found as the value of a spec given by name.
- This feature allows individual machine descriptions
- to add and use their own specs.
- %[...] modifies -D options the way %P does;
- %(...) uses the spec unmodified. */
- case '[':
- error("Warning: use of obsolete %%[ operator in specs");
- case '(':
- {
- char *name = p;
- struct spec_list *sl;
- int len;
-
- /* The string after the S/P is the name of a spec that is to be
- processed. */
- while (*p && *p != ')' && *p != ']')
- p++;
-
- /* See if it's in the list */
- for (len = p - name, sl = specs; sl; sl = sl->next)
- if (sl->name_len == len && !strncmp(sl->name, name, len))
- {
- name = *(sl->ptr_spec);
-#ifdef DEBUG_SPECS
- fprintf(stderr, "Processing spec %c%s%c, which is '%s'\n",
- c, sl->name, (c == '(') ? ')' : ']', name);
-#endif
- break;
- }
-
- if (sl)
- {
- if (c == '(')
- {
- value = do_spec_1(name, 0, NULL);
- if (value != 0)
- return value;
- }
- else
- {
- char *x = (char *) alloca(strlen(name) * 2 + 1);
- char *buf = x;
- char *y = name;
- int flag = 0;
-
- /* Copy all of NAME into BUF, but put __ after
- every -D and at the end of each arg, */
- while (1)
- {
- if (!strncmp(y, "-D", 2))
- {
- *x++ = '-';
- *x++ = 'D';
- *x++ = '_';
- *x++ = '_';
- y += 2;
- flag = 1;
- continue;
- }
- else if (flag && (*y == ' ' || *y == '\t' || *y == '='
- || *y == '}' || *y == 0))
- {
- *x++ = '_';
- *x++ = '_';
- flag = 0;
- }
- if (*y == 0)
- break;
- else
- *x++ = *y++;
- }
- *x = 0;
-
- value = do_spec_1(buf, 0, NULL);
- if (value != 0)
- return value;
- }
- }
-
- /* Discard the closing paren or bracket. */
- if (*p)
- p++;
- }
- break;
-
- case 'v':
- {
- int c1 = *p++; /* Select first or second version number. */
- char *v = compiler_version;
- char *q;
-
- /* The format of the version string is
- ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)? */
-
- /* Ignore leading non-digits. i.e. "foo-" in "foo-2.7.2". */
- while (!ISDIGIT(*v))
- v++;
- if (v > compiler_version && v[-1] != '-')
- abort();
-
- /* If desired, advance to second version number. */
- if (c1 == '2')
- {
- /* Set V after the first period. */
- while (ISDIGIT(*v))
- v++;
- if (*v != '.')
- abort();
- v++;
- }
-
- /* Set Q at the next period or at the end. */
- q = v;
- while (ISDIGIT(*q))
- q++;
- if (*q != 0 && *q != ' ' && *q != '.' && *q != '-')
- abort();
-
- /* Put that part into the command. */
- obstack_grow(&obstack, v, q - v);
- arg_going = 1;
- }
- break;
-
- case '|':
- if (input_from_pipe)
- do_spec_1("-", 0, NULL);
- break;
-
- default:
- abort();
- }
- break;
-
- case '\\':
- /* Backslash: treat next character as ordinary. */
- c = *p++;
-
- /* fall through */
- default:
- /* Ordinary character: put it into the current argument. */
- obstack_1grow(&obstack, c);
- arg_going = 1;
- }
-
- return 0; /* End of string */
-}
-
-/* Return 0 if we call do_spec_1 and that returns -1. */
-
-static char *
-handle_braces(register char *p)
-{
- char *filter, *body = NULL, *endbody;
- int pipe_p = 0;
- int negate;
- int suffix;
- int include_blanks = 1;
-
- if (*p == '^')
- /* A '^' after the open-brace means to not give blanks before args. */
- include_blanks = 0, ++p;
-
- if (*p == '|')
- /* A `|' after the open-brace means,
- if the test fails, output a single minus sign rather than nothing.
- This is used in %{|!pipe:...}. */
- pipe_p = 1, ++p;
-
-next_member:
- negate = suffix = 0;
-
- if (*p == '!')
- /* A `!' after the open-brace negates the condition:
- succeed if the specified switch is not present. */
- negate = 1, ++p;
-
- if (*p == '.')
- /* A `.' after the open-brace means test against the current suffix. */
- {
- if (pipe_p)
- abort();
-
- suffix = 1;
- ++p;
- }
-
- filter = p;
- while (*p != ':' && *p != '}' && *p != '|') p++;
-
- if (*p == '|' && pipe_p)
- abort();
-
- if (!body)
- {
- if (*p != '}')
- {
- register int count = 1;
- register char *q = p;
-
- while (*q++ != ':') continue;
- body = q;
-
- while (count > 0)
- {
- if (*q == '{')
- count++;
- else if (*q == '}')
- count--;
- else if (*q == 0)
- abort();
- q++;
- }
- endbody = q;
- }
- else
- body = p, endbody = p+1;
- }
-
- if (suffix)
- {
- int found = (input_suffix != 0
- && (long) strlen(input_suffix) == (long)(p - filter)
- && strncmp(input_suffix, filter, p - filter) == 0);
-
- if (body[0] == '}')
- abort();
-
- if (negate != found
- && do_spec_1(save_string(body, endbody-body-1), 0, NULL) < 0)
- return 0;
- }
- else if (p[-1] == '*' && p[0] == '}')
- {
- /* Substitute all matching switches as separate args. */
- register int i;
- --p;
- for (i = 0; i < n_switches; i++)
- if (!strncmp(switches[i].part1, filter, p - filter)
- && check_live_switch(i, p - filter))
- give_switch(i, 0, include_blanks);
- }
- else
- {
- /* Test for presence of the specified switch. */
- register int i;
- int present = 0;
-
- /* If name specified ends in *, as in {x*:...},
- check for %* and handle that case. */
- if (p[-1] == '*' && !negate)
- {
- int substitution;
- char *r = body;
-
- /* First see whether we have %*. */
- substitution = 0;
- while (r < endbody)
- {
- if (*r == '%' && r[1] == '*')
- substitution = 1;
- r++;
- }
- /* If we do, handle that case. */
- if (substitution)
- {
- /* Substitute all matching switches as separate args.
- But do this by substituting for %*
- in the text that follows the colon. */
-
- unsigned hard_match_len = p - filter - 1;
- char *string = save_string(body, endbody - body - 1);
-
- for (i = 0; i < n_switches; i++)
- if (!strncmp(switches[i].part1, filter, hard_match_len)
- && check_live_switch(i, -1))
- {
- do_spec_1(string, 0, &switches[i].part1[hard_match_len]);
- /* Pass any arguments this switch has. */
- give_switch(i, 1, 1);
- }
-
- /* We didn't match. Try again. */
- if (*p++ == '|')
- goto next_member;
- return endbody;
- }
- }
-
- /* If name specified ends in *, as in {x*:...},
- check for presence of any switch name starting with x. */
- if (p[-1] == '*')
- {
- for (i = 0; i < n_switches; i++)
- {
- unsigned hard_match_len = p - filter - 1;
-
- if (!strncmp(switches[i].part1, filter, hard_match_len)
- && check_live_switch(i, hard_match_len))
- {
- present = 1;
- }
- }
- }
- /* Otherwise, check for presence of exact name specified. */
- else
- {
- for (i = 0; i < n_switches; i++)
- {
- if (!strncmp(switches[i].part1, filter, p - filter)
- && switches[i].part1[p - filter] == 0
- && check_live_switch(i, -1))
- {
- present = 1;
- break;
- }
- }
- }
-
- /* If it is as desired (present for %{s...}, absent for %{!s...})
- then substitute either the switch or the specified
- conditional text. */
- if (present != negate)
- {
- if (*p == '}')
- {
- give_switch(i, 0, include_blanks);
- }
- else
- {
- if (do_spec_1(save_string(body, endbody - body - 1),
- 0, NULL) < 0)
- return 0;
- }
- }
- else if (pipe_p)
- {
- /* Here if a %{|...} conditional fails: output a minus sign,
- which means "standard output" or "standard input". */
- do_spec_1("-", 0, NULL);
- return endbody;
- }
- }
-
- /* We didn't match; try again. */
- if (*p++ == '|')
- goto next_member;
-
- return endbody;
-}
-
-/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
- on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
- spec, or -1 if either exact match or %* is used.
-
- A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
- whose value does not begin with "no-" is obsoleted by the same value
- with the "no-", similarly for a switch with the "no-" prefix. */
-
-static int
-check_live_switch(int switchnum, int prefix_length)
-{
- char *name = switches[switchnum].part1;
- int i;
-
- /* In the common case of {<at-most-one-letter>*}, a negating
- switch would always match, so ignore that case. We will just
- send the conflicting switches to the compiler phase. */
- if (prefix_length >= 0 && prefix_length <= 1)
- return 1;
-
- /* If we already processed this switch and determined if it was
- live or not, return our past determination. */
- if (switches[switchnum].live_cond != 0)
- return switches[switchnum].live_cond > 0;
-
- /* Now search for duplicate in a manner that depends on the name. */
- switch (*name)
- {
- case 'O':
- for (i = switchnum + 1; i < n_switches; i++)
- if (switches[i].part1[0] == 'O')
- {
- switches[switchnum].valid = 1;
- switches[switchnum].live_cond = -1;
- return 0;
- }
- break;
-
- case 'W': case 'f': case 'm':
- if (!strncmp(name + 1, "no-", 3))
- {
- /* We have Xno-YYY, search for XYYY. */
- for (i = switchnum + 1; i < n_switches; i++)
- if (switches[i].part1[0] == name[0]
- && !strcmp(&switches[i].part1[1], &name[4]))
- {
- switches[switchnum].valid = 1;
- switches[switchnum].live_cond = -1;
- return 0;
- }
- }
- else
- {
- /* We have XYYY, search for Xno-YYY. */
- for (i = switchnum + 1; i < n_switches; i++)
- if (switches[i].part1[0] == name[0]
- && switches[i].part1[1] == 'n'
- && switches[i].part1[2] == 'o'
- && switches[i].part1[3] == '-'
- && !strcmp(&switches[i].part1[4], &name[1]))
- {
- switches[switchnum].valid = 1;
- switches[switchnum].live_cond = -1;
- return 0;
- }
- }
- break;
- }
-
- /* Otherwise the switch is live. */
- switches[switchnum].live_cond = 1;
- return 1;
-}
-
-/* Pass a switch to the current accumulating command
- in the same form that we received it.
- SWITCHNUM identifies the switch; it is an index into
- the vector of switches gcc received, which is `switches'.
- This cannot fail since it never finishes a command line.
-
- If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
-
- If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
- of the switch. */
-
-static void
-give_switch(int switchnum, int omit_first_word, int include_blanks)
-{
- if (!omit_first_word)
- {
- do_spec_1("-", 0, NULL);
- do_spec_1(switches[switchnum].part1, 1, NULL);
- }
-
- if (switches[switchnum].args != 0)
- {
- char **p;
- for (p = switches[switchnum].args; *p; p++)
- {
- if (include_blanks)
- do_spec_1(" ", 0, NULL);
- do_spec_1(*p, 1, NULL);
- }
- }
-
- do_spec_1(" ", 0, NULL);
- switches[switchnum].valid = 1;
-}
-
-/* Search for a file named NAME trying various prefixes including the
- user's -B prefix and some standard ones.
- Return the absolute file name found. If nothing is found, return NAME. */
-
-static char *
-find_file(char *name)
-{
- char *newname;
-
- /* Try multilib_dir if it is defined. */
- if (multilib_dir != NULL)
- {
- char *try;
-
- try = (char *) alloca(strlen(multilib_dir) + strlen(name) + 2);
- strcpy(try, multilib_dir);
- strcat(try, dir_separator_str);
- strcat(try, name);
-
- newname = find_a_file(&startfile_prefixes, try, R_OK);
-
- /* If we don't find it in the multi library dir, then fall
- through and look for it in the normal places. */
- if (newname != NULL)
- return newname;
- }
-
- newname = find_a_file(&startfile_prefixes, name, R_OK);
- return newname ? newname : name;
-}
-
-/* Determine whether a directory exists. If LINKER, return 0 for
- certain fixed names not needed by the linker. If not LINKER, it is
- only important to return 0 if the host machine has a small ARG_MAX
- limit. */
-
-static int
-is_directory(char *path1, char *path2, int linker)
-{
- int len1 = strlen(path1);
- int len2 = strlen(path2);
- char *path = (char *) alloca(3 + len1 + len2);
- char *cp;
- struct stat st;
-
-#ifndef SMALL_ARG_MAX
- if (!linker)
- return 1;
-#endif
-
- /* Construct the path from the two parts. Ensure the string ends with "/.".
- The resulting path will be a directory even if the given path is a
- symbolic link. */
- memcpy(path, path1, len1);
- memcpy(path + len1, path2, len2);
- cp = path + len1 + len2;
- if (cp[-1] != '/' && cp[-1] != DIR_SEPARATOR)
- *cp++ = DIR_SEPARATOR;
- *cp++ = '.';
- *cp = '\0';
-
- /* Exclude directories that the linker is known to search. */
- if (linker
- && ((cp - path == 6
- && strcmp(path, concat(dir_separator_str, "lib",
- dir_separator_str, ".", NULL)) == 0)
- || (cp - path == 10
- && strcmp(path, concat(dir_separator_str, "usr",
- dir_separator_str, "lib",
- dir_separator_str, ".", NULL)) == 0)))
- return 0;
-
- return (stat(path, &st) >= 0 && S_ISDIR(st.st_mode));
-}
-
-/* On fatal signals, delete all the temporary files. */
-
-static void
-fatal_error(int signum)
-{
- signal(signum, SIG_DFL);
- delete_failure_queue();
- delete_temp_files();
- /* Get the same signal again, this time not handled,
- so its normal effect occurs. */
- kill(getpid(), signum);
-}
-
-int
-main(int argc, char **argv)
-{
- register size_t i;
- size_t j;
- int value;
- int linker_was_run = 0;
- char *explicit_link_files;
- char *specs_file;
- char *p;
- struct user_specs *uptr;
-
- p = argv[0] + strlen(argv[0]);
- while (p != argv[0] && p[-1] != '/' && p[-1] != DIR_SEPARATOR) --p;
- programname = p;
-
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- signal(SIGINT, fatal_error);
-#ifdef SIGHUP
- if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
- signal(SIGHUP, fatal_error);
-#endif
- if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
- signal(SIGTERM, fatal_error);
-#ifdef SIGPIPE
- if (signal(SIGPIPE, SIG_IGN) != SIG_IGN)
- signal(SIGPIPE, fatal_error);
-#endif
-
- argbuf_length = 10;
- argbuf = (char **) xmalloc(argbuf_length * sizeof (char *));
-
- obstack_init(&obstack);
-
- /* Build multilib_select, et. al from the separate lines that make up each
- multilib selection. */
- {
- char **q = multilib_raw;
- int need_space;
-
- obstack_init(&multilib_obstack);
- while ((p = *q++) != (char *) 0)
- obstack_grow(&multilib_obstack, p, strlen(p));
-
- obstack_1grow(&multilib_obstack, 0);
- multilib_select = obstack_finish(&multilib_obstack);
-
- q = multilib_matches_raw;
- while ((p = *q++) != (char *) 0)
- obstack_grow(&multilib_obstack, p, strlen(p));
-
- obstack_1grow(&multilib_obstack, 0);
- multilib_matches = obstack_finish(&multilib_obstack);
-
- need_space = FALSE;
- for (i = 0;
- i < sizeof (multilib_defaults_raw) / sizeof (multilib_defaults_raw[0]);
- i++)
- {
- if (need_space)
- obstack_1grow(&multilib_obstack, ' ');
- obstack_grow(&multilib_obstack,
- multilib_defaults_raw[i],
- strlen(multilib_defaults_raw[i]));
- need_space = TRUE;
- }
-
- obstack_1grow(&multilib_obstack, 0);
- multilib_defaults = obstack_finish(&multilib_obstack);
- }
-
- /* Set up to remember the pathname of gcc and any options
- needed for collect. We use argv[0] instead of programname because
- we need the complete pathname. */
- obstack_init(&collect_obstack);
- obstack_grow(&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
- obstack_grow(&collect_obstack, argv[0], strlen(argv[0])+1);
- putenv(obstack_finish(&collect_obstack));
-
-#ifdef INIT_ENVIRONMENT
- /* Set up any other necessary machine specific environment variables. */
- putenv(INIT_ENVIRONMENT);
-#endif
-
- /* Choose directory for temp files. */
-
-
- /* Make a table of what switches there are (switches, n_switches).
- Make a table of specified input files (infiles, n_infiles).
- Decode switches that are handled locally. */
-
- process_command(argc, argv);
-
- {
- int first_time;
-
- /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
- the compiler. */
- obstack_grow(&collect_obstack, "COLLECT_GCC_OPTIONS=",
- sizeof ("COLLECT_GCC_OPTIONS=")-1);
-
- first_time = TRUE;
- for (i = 0; (int)i < n_switches; i++)
- {
- char **args;
- char *p, *q;
- if (!first_time)
- obstack_grow(&collect_obstack, " ", 1);
-
- first_time = FALSE;
- obstack_grow(&collect_obstack, "'-", 2);
- q = switches[i].part1;
- while ((p = strchr(q,'\'')))
- {
- obstack_grow(&collect_obstack, q, p-q);
- obstack_grow(&collect_obstack, "'\\''", 4);
- q = ++p;
- }
- obstack_grow(&collect_obstack, q, strlen(q));
- obstack_grow(&collect_obstack, "'", 1);
-
- for (args = switches[i].args; args && *args; args++)
- {
- obstack_grow(&collect_obstack, " '", 2);
- q = *args;
- while ((p = strchr(q,'\'')))
- {
- obstack_grow(&collect_obstack, q, p-q);
- obstack_grow(&collect_obstack, "'\\''", 4);
- q = ++p;
- }
- obstack_grow(&collect_obstack, q, strlen(q));
- obstack_grow(&collect_obstack, "'", 1);
- }
- }
- obstack_grow(&collect_obstack, "\0", 1);
- putenv(obstack_finish(&collect_obstack));
- }
-
- /* Initialize the vector of specs to just the default.
- This means one element containing 0s, as a terminator. */
-
- compilers = (struct compiler *) xmalloc(sizeof default_compilers);
- copy_memory((char *) default_compilers, (char *) compilers,
- sizeof default_compilers);
- n_compilers = n_default_compilers;
-
- /* Read specs from a file if there is one. */
-
- machine_suffix = concat(spec_machine, dir_separator_str,
- spec_version, dir_separator_str, NULL);
- just_machine_suffix = concat(spec_machine, dir_separator_str, NULL);
-
- specs_file = find_a_file(&startfile_prefixes, "specs", R_OK);
- /* Read the specs file unless it is a default one. */
- if (specs_file != 0 && strcmp(specs_file, "specs"))
- read_specs(specs_file, TRUE);
- else
- init_spec();
-
- /* We need to check standard_exec_prefix/just_machine_suffix/specs
- for any override of as, ld and libraries. */
- specs_file = (char *) alloca(strlen(standard_exec_prefix)
- + strlen(just_machine_suffix)
- + sizeof ("specs"));
-
- strcpy(specs_file, standard_exec_prefix);
- strcat(specs_file, just_machine_suffix);
- strcat(specs_file, "specs");
- if (access(specs_file, R_OK) == 0)
- read_specs(specs_file, TRUE);
-
- /* Process any user specified specs in the order given on the command
- line. */
- for (uptr = user_specs_head; uptr; uptr = uptr->next)
- {
- char *filename = find_a_file(&startfile_prefixes, uptr->filename, R_OK);
- read_specs(filename ? filename : uptr->filename, FALSE);
- }
-
- /* Now we have the specs.
- Set the `valid' bits for switches that match anything in any spec. */
-
- validate_all_switches();
-
- /* Now that we have the switches and the specs, set
- the subdirectory based on the options. */
- set_multilib_dir();
-
- /* Warn about any switches that no pass was interested in. */
-
- for (i = 0; (int)i < n_switches; i++)
- if (!switches[i].valid)
- error("unrecognized option `-%s'", switches[i].part1);
-
- /* Obey some of the options. */
-
- if (print_search_dirs)
- {
- printf("install: %s%s\n", standard_exec_prefix, machine_suffix);
- printf("programs: %s\n", build_search_list(&exec_prefixes, "", 0));
- printf("libraries: %s\n", build_search_list(&startfile_prefixes, "", 0));
- exit(0);
- }
-
- if (print_file_name)
- {
- printf("%s\n", find_file(print_file_name));
- exit(0);
- }
-
- if (print_prog_name)
- {
- char *newname = find_a_file(&exec_prefixes, print_prog_name, X_OK);
- printf("%s\n", (newname ? newname : print_prog_name));
- exit(0);
- }
-
- if (print_multi_lib)
- {
- print_multilib_info();
- exit(0);
- }
-
- if (print_multi_directory)
- {
- if (multilib_dir == NULL)
- printf(".\n");
- else
- printf("%s\n", multilib_dir);
- exit(0);
- }
-
- if (print_help_list)
- {
- display_help();
-
- if (!verbose_flag)
- {
- printf("\nReport bugs to egcs-bugs@cygnus.com.\n");
- printf("Please see the file BUGS (included with the sources) first.\n");
-
- exit(0);
- }
-
- /* We do not exit here. Instead we have created a fake input file
- called 'help-dummy' which needs to be compiled, and we pass this
- on the the various sub-processes, along with the --help switch. */
- }
-
- if (verbose_flag)
- {
- int n;
-
- /* compiler_version is truncated at the first space when initialized
- from version string, so truncate version_string at the first space
- before comparing. */
- for (n = 0; version_string[n]; n++)
- if (version_string[n] == ' ')
- break;
-
- if (!strncmp(version_string, compiler_version, n)
- && compiler_version[n] == 0)
- fprintf(stderr, "gcc version %s\n", version_string);
- else
- fprintf(stderr, "gcc driver version %s executing gcc version %s\n",
- version_string, compiler_version);
- /* CYGNUS LOCAL default-options */
- {
- /* We can't do this in translate_options, where we handle the environment
- variable, because the -v flag won't have been seen yet, so we handle
- it here instead. */
- char *opts = getenv("GCC_DEFAULT_OPTIONS");
- if (opts)
- fprintf(stderr, "GCC_DEFAULT_OPTIONS=%s\n", opts);
- }
- /* END CYGNUS LOCAL */
-
- if (n_infiles == 0)
- exit(0);
- }
-
- if (n_infiles == added_libraries)
- fatal("No input files");
-
- /* Make a place to record the compiler output file names
- that correspond to the input files. */
-
- i = n_infiles;
- outfiles = (char **) xmalloc(i * sizeof (char *));
- zero_memory((char *) outfiles, i * sizeof (char *));
-
- /* Record which files were specified explicitly as link input. */
-
- explicit_link_files = xmalloc(n_infiles);
- zero_memory(explicit_link_files, n_infiles);
-
- for (i = 0; (int)i < n_infiles; i++)
- {
- register struct compiler *cp = 0;
- int this_file_error = 0;
-
- /* Tell do_spec what to substitute for %i. */
-
- input_filename = infiles[i].name;
- input_filename_length = strlen(input_filename);
- input_file_number = i;
-
- /* Use the same thing in %o, unless cp->spec says otherwise. */
-
- outfiles[i] = input_filename;
-
- /* Figure out which compiler from the file's suffix. */
-
- cp = lookup_compiler(infiles[i].name, input_filename_length,
- infiles[i].language);
-
- if (cp)
- {
- /* Ok, we found an applicable compiler. Run its spec. */
- /* First say how much of input_filename to substitute for %b */
- register char *p;
- int len;
-
- if (cp->spec[0][0] == '#')
- error("%s: %s compiler not installed on this system",
- input_filename, &cp->spec[0][1]);
-
- input_basename = input_filename;
- for (p = input_filename; *p; p++)
- if (*p == '/' || *p == DIR_SEPARATOR)
- input_basename = p + 1;
-
- /* Find a suffix starting with the last period,
- and set basename_length to exclude that suffix. */
- basename_length = strlen(input_basename);
- p = input_basename + basename_length;
- while (p != input_basename && *p != '.') --p;
- if (*p == '.' && p != input_basename)
- {
- basename_length = p - input_basename;
- input_suffix = p + 1;
- }
- else
- input_suffix = "";
-
- len = 0;
- for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
- if (cp->spec[j])
- len += strlen(cp->spec[j]);
-
- p = (char *) xmalloc(len + 1);
-
- len = 0;
- for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
- if (cp->spec[j])
- {
- strcpy(p + len, cp->spec[j]);
- len += strlen(cp->spec[j]);
- }
-
- value = do_spec(p);
- free(p);
- if (value < 0)
- this_file_error = 1;
- }
-
- /* If this file's name does not contain a recognized suffix,
- record it as explicit linker input. */
-
- else
- explicit_link_files[i] = 1;
-
- /* Clear the delete-on-failure queue, deleting the files in it
- if this compilation failed. */
-
- if (this_file_error)
- {
- delete_failure_queue();
- error_count++;
- }
- /* If this compilation succeeded, don't delete those files later. */
- clear_failure_queue();
- }
-
-
- /* Run ld to link all the compiler output files. */
-
- if (error_count == 0)
- {
- int tmp = execution_count;
-
- /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
- for collect. */
- putenv_from_prefixes(&exec_prefixes, "COMPILER_PATH=");
- putenv_from_prefixes(&startfile_prefixes, "LIBRARY_PATH=");
-
- value = do_spec(link_command_spec);
- if (value < 0)
- error_count = 1;
- linker_was_run = (tmp != execution_count);
- }
-
- /* Warn if a -B option was specified but the prefix was never used. */
- unused_prefix_warnings(&exec_prefixes);
- unused_prefix_warnings(&startfile_prefixes);
-
- /* If options said don't run linker,
- complain about input files to be given to the linker. */
-
- if (!linker_was_run && error_count == 0)
- for (i = 0; (int)i < n_infiles; i++)
- if (explicit_link_files[i])
- error("%s: linker input file unused since linking not done",
- outfiles[i]);
-
- /* Delete some or all of the temporary files we made. */
-
- if (error_count)
- delete_failure_queue();
- delete_temp_files();
-
- if (print_help_list)
- {
- printf("\nReport bugs to egcs-bugs@cygnus.com.\n");
- printf("Please see the file BUGS (included with the sources) first.\n");
- }
-
- exit(error_count > 0 ? (signal_count ? 2 : 1) : 0);
- /* NOTREACHED */
- return 0;
-}
-
-/* Find the proper compilation spec for the file name NAME,
- whose length is LENGTH. LANGUAGE is the specified language,
- or 0 if this file is to be passed to the linker. */
-
-static struct compiler *
-lookup_compiler(char *name, size_t length, char *language)
-{
- struct compiler *cp;
-
- /* If this was specified by the user to be a linker input, indicate that. */
- if (language != 0 && language[0] == '*')
- return 0;
-
- /* Otherwise, look for the language, if one is spec'd. */
- if (language != 0)
- {
- for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
- if (cp->suffix[0] == '@' && !strcmp(cp->suffix + 1, language))
- return cp;
-
- error("language %s not recognized", language);
- return 0;
- }
-
- /* Look for a suffix. */
- for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
- {
- if ( /* The suffix `-' matches only the file name `-'. */
- (!strcmp(cp->suffix, "-") && !strcmp(name, "-"))
- || (strlen(cp->suffix) < length
- /* See if the suffix matches the end of NAME. */
- && !strcmp(cp->suffix, name + length - strlen(cp->suffix))
- ))
- {
- if (cp->spec[0][0] == '@')
- {
- struct compiler *new;
-
- /* An alias entry maps a suffix to a language.
- Search for the language; pass 0 for NAME and LENGTH
- to avoid infinite recursion if language not found.
- Construct the new compiler spec. */
- language = cp->spec[0] + 1;
- new = (struct compiler *) xmalloc(sizeof (struct compiler));
- new->suffix = cp->suffix;
- copy_memory((char *) lookup_compiler(NULL, 0, language)->spec,
- (char *) new->spec, sizeof new->spec);
- return new;
- }
-
- /* A non-alias entry: return it. */
- return cp;
- }
- }
-
- return 0;
-}
-
-void *
-xmalloc(size_t size)
-{
- register void *value = malloc(size);
- if (value == 0)
- fatal("virtual memory exhausted");
- return value;
-}
-
-void *
-xrealloc(void *old, size_t size)
-{
- register void *ptr;
- if (old)
- ptr = realloc(old, size);
- else
- ptr = malloc(size);
- if (ptr == 0)
- fatal("virtual memory exhausted");
- return ptr;
-}
-
-static char *
-save_string(const char *s, int len)
-{
- register char *result = xmalloc(len + 1);
-
- copy_memory(s, result, len);
- result[len] = 0;
- return result;
-}
-
-static void
-pfatal_with_name(char *name)
-{
- fatal("%s: %s", name, xstrerror(errno));
-}
-
-static void
-perror_with_name(char *name)
-{
- error("%s: %s", name, xstrerror(errno));
-}
-
-static void
-pfatal_pexecute(char *errmsg_fmt, char *errmsg_arg)
-{
- int save_errno = errno;
-
- if (errmsg_arg)
- {
- /* Space for trailing '\0' is in %s. */
- char *msg = xmalloc(strlen(errmsg_fmt) + strlen(errmsg_arg));
- sprintf(msg, errmsg_fmt, errmsg_arg);
- errmsg_fmt = msg;
- }
-
- fatal("%s: %s", errmsg_fmt, xstrerror(save_errno));
-}
-
-/* More 'friendly' abort that prints the line and file.
- config.h can #define abort fancy_abort if you like that sort of thing. */
-
-void
-fancy_abort()
-{
- fatal("Internal gcc abort.");
-}
-
-/* Output an error message and exit */
-
-static void
-fatal(char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
-
-
- fprintf(stderr, "%s: ", programname);
- vfprintf(stderr, format, ap);
- va_end(ap);
- fprintf(stderr, "\n");
- delete_temp_files();
- exit(1);
-}
-
-static void
-error(char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
-
-
- fprintf(stderr, "%s: ", programname);
- vfprintf(stderr, format, ap);
- va_end(ap);
-
- fprintf(stderr, "\n");
-}
-
-static void
-validate_all_switches()
-{
- struct compiler *comp;
- register char *p;
- register char c;
- struct spec_list *spec;
-
- for (comp = compilers; comp->spec[0]; comp++)
- {
- size_t i;
- for (i = 0; i < sizeof comp->spec / sizeof comp->spec[0] && comp->spec[i]; i++)
- {
- p = comp->spec[i];
- while ((c = *p++))
- if (c == '%' && *p == '{')
- /* We have a switch spec. */
- validate_switches(p + 1);
- }
- }
-
- /* look through the linked list of specs read from the specs file */
- for (spec = specs; spec; spec = spec->next)
- {
- p = *(spec->ptr_spec);
- while ((c = *p++))
- if (c == '%' && *p == '{')
- /* We have a switch spec. */
- validate_switches(p + 1);
- }
-
- p = link_command_spec;
- while ((c = *p++))
- if (c == '%' && *p == '{')
- /* We have a switch spec. */
- validate_switches(p + 1);
-}
-
-/* Look at the switch-name that comes after START
- and mark as valid all supplied switches that match it. */
-
-static void
-validate_switches(char *start)
-{
- register char *p = start;
- char *filter;
- register int i;
- int suffix = 0;
-
- if (*p == '|')
- ++p;
-
- if (*p == '!')
- ++p;
-
- if (*p == '.')
- suffix = 1, ++p;
-
- filter = p;
- while (*p != ':' && *p != '}') p++;
-
- if (suffix)
- ;
- else if (p[-1] == '*')
- {
- /* Mark all matching switches as valid. */
- --p;
- for (i = 0; i < n_switches; i++)
- if (!strncmp(switches[i].part1, filter, p - filter))
- switches[i].valid = 1;
- }
- else
- {
- /* Mark an exact matching switch as valid. */
- for (i = 0; i < n_switches; i++)
- {
- if (!strncmp(switches[i].part1, filter, p - filter)
- && switches[i].part1[p - filter] == 0)
- switches[i].valid = 1;
- }
- }
-}
-
-/* Check whether a particular argument was used. The first time we
- canonicalize the switches to keep only the ones we care about. */
-
-static int
-used_arg(char *p, int len)
-{
- struct mswitchstr {
- char *str;
- char *replace;
- int len;
- int rep_len;
- };
-
- static struct mswitchstr *mswitches;
- static int n_mswitches;
- int i, j;
-
- if (!mswitches)
- {
- struct mswitchstr *matches;
- char *q;
- int cnt = 0;
-
- /* Break multilib_matches into the component strings of string and replacement
- string */
- for (q = multilib_matches; *q != '\0'; q++)
- if (*q == ';')
- cnt++;
-
- matches = (struct mswitchstr *) alloca((sizeof (struct mswitchstr)) * cnt);
- i = 0;
- q = multilib_matches;
- while (*q != '\0')
- {
- matches[i].str = q;
- while (*q != ' ')
- {
- if (*q == '\0')
- abort();
- q++;
- }
- *q = '\0';
- matches[i].len = q - matches[i].str;
-
- matches[i].replace = ++q;
- while (*q != ';' && *q != '\0')
- {
- if (*q == ' ')
- abort();
- q++;
- }
- matches[i].rep_len = q - matches[i].replace;
- i++;
- if (*q == ';')
- *q++ = '\0';
- else
- break;
- }
-
- /* Now build a list of the replacement string for switches that we care
- about. Make sure we allocate at least one entry. This prevents
- xmalloc from calling fatal, and prevents us from re-executing this
- block of code. */
- mswitches
- = (struct mswitchstr *) xmalloc((sizeof (struct mswitchstr))
- * (n_switches ? n_switches : 1));
- for (i = 0; i < n_switches; i++)
- {
- int xlen = strlen(switches[i].part1);
- for (j = 0; j < cnt; j++)
- if (xlen == matches[j].len && !strcmp(switches[i].part1, matches[j].str))
- {
- mswitches[n_mswitches].str = matches[j].replace;
- mswitches[n_mswitches].len = matches[j].rep_len;
- mswitches[n_mswitches].replace = (char *)0;
- mswitches[n_mswitches].rep_len = 0;
- n_mswitches++;
- break;
- }
- }
- }
-
- for (i = 0; i < n_mswitches; i++)
- if (len == mswitches[i].len && !strncmp(p, mswitches[i].str, len))
- return 1;
-
- return 0;
-}
-
-static int
-default_arg(char *p, int len)
-{
- char *start, *end;
-
- for (start = multilib_defaults; *start != '\0'; start = end+1)
- {
- while (*start == ' ' || *start == '\t')
- start++;
-
- if (*start == '\0')
- break;
-
- for (end = start+1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
- ;
-
- if ((end - start) == len && strncmp(p, start, len) == 0)
- return 1;
-
- if (*end == '\0')
- break;
- }
-
- return 0;
-}
-
-/* Work out the subdirectory to use based on the
- options. The format of multilib_select is a list of elements.
- Each element is a subdirectory name followed by a list of options
- followed by a semicolon. gcc will consider each line in turn. If
- none of the options beginning with an exclamation point are
- present, and all of the other options are present, that
- subdirectory will be used. */
-
-static void
-set_multilib_dir()
-{
- char *p = multilib_select;
- int this_path_len;
- char *this_path, *this_arg;
- int not_arg;
- int ok;
-
- while (*p != '\0')
- {
- /* Ignore newlines. */
- if (*p == '\n')
- {
- ++p;
- continue;
- }
-
- /* Get the initial path. */
- this_path = p;
- while (*p != ' ')
- {
- if (*p == '\0')
- abort();
- ++p;
- }
- this_path_len = p - this_path;
-
- /* Check the arguments. */
- ok = 1;
- ++p;
- while (*p != ';')
- {
- if (*p == '\0')
- abort();
-
- if (!ok)
- {
- ++p;
- continue;
- }
-
- this_arg = p;
- while (*p != ' ' && *p != ';')
- {
- if (*p == '\0')
- abort();
- ++p;
- }
-
- if (*this_arg != '!')
- not_arg = 0;
- else
- {
- not_arg = 1;
- ++this_arg;
- }
-
- /* If this is a default argument, we can just ignore it.
- This is true even if this_arg begins with '!'. Beginning
- with '!' does not mean that this argument is necessarily
- inappropriate for this library: it merely means that
- there is a more specific library which uses this
- argument. If this argument is a default, we need not
- consider that more specific library. */
- if (!default_arg(this_arg, p - this_arg))
- {
- ok = used_arg(this_arg, p - this_arg);
- if (not_arg)
- ok = !ok;
- }
-
- if (*p == ' ')
- ++p;
- }
-
- if (ok)
- {
- if (this_path_len != 1
- || this_path[0] != '.')
- {
- multilib_dir = xmalloc(this_path_len + 1);
- strncpy(multilib_dir, this_path, this_path_len);
- multilib_dir[this_path_len] = '\0';
- }
- break;
- }
-
- ++p;
- }
-}
-
-/* Print out the multiple library subdirectory selection
- information. This prints out a series of lines. Each line looks
- like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
- required. Only the desired options are printed out, the negative
- matches. The options are print without a leading dash. There are
- no spaces to make it easy to use the information in the shell.
- Each subdirectory is printed only once. This assumes the ordering
- generated by the genmultilib script. */
-
-static void
-print_multilib_info()
-{
- char *p = multilib_select;
- char *last_path = 0, *this_path;
- int skip;
- int last_path_len = 0;
-
- while (*p != '\0')
- {
- /* Ignore newlines. */
- if (*p == '\n')
- {
- ++p;
- continue;
- }
-
- /* Get the initial path. */
- this_path = p;
- while (*p != ' ')
- {
- if (*p == '\0')
- abort();
- ++p;
- }
-
- /* If this is a duplicate, skip it. */
- skip = (last_path != 0 && p - this_path == last_path_len
- && !strncmp(last_path, this_path, last_path_len));
-
- last_path = this_path;
- last_path_len = p - this_path;
-
- /* If this directory requires any default arguments, we can skip
- it. We will already have printed a directory identical to
- this one which does not require that default argument. */
- if (!skip)
- {
- char *q;
-
- q = p + 1;
- while (*q != ';')
- {
- char *arg;
-
- if (*q == '\0')
- abort();
-
- if (*q == '!')
- arg = NULL;
- else
- arg = q;
-
- while (*q != ' ' && *q != ';')
- {
- if (*q == '\0')
- abort();
- ++q;
- }
-
- if (arg != NULL
- && default_arg(arg, q - arg))
- {
- skip = 1;
- break;
- }
-
- if (*q == ' ')
- ++q;
- }
- }
-
- if (!skip)
- {
- char *p1;
-
- for (p1 = last_path; p1 < p; p1++)
- putchar(*p1);
- putchar(';');
- }
-
- ++p;
- while (*p != ';')
- {
- int use_arg;
-
- if (*p == '\0')
- abort();
-
- if (skip)
- {
- ++p;
- continue;
- }
-
- use_arg = *p != '!';
-
- if (use_arg)
- putchar('@');
-
- while (*p != ' ' && *p != ';')
- {
- if (*p == '\0')
- abort();
- if (use_arg)
- putchar(*p);
- ++p;
- }
-
- if (*p == ' ')
- ++p;
- }
-
- if (!skip)
- {
- /* If there are extra options, print them now */
- if (multilib_extra && *multilib_extra)
- {
- int print_at = TRUE;
- char *q;
-
- for (q = multilib_extra; *q != '\0'; q++)
- {
- if (*q == ' ')
- print_at = TRUE;
- else
- {
- if (print_at)
- putchar('@');
- putchar(*q);
- print_at = FALSE;
- }
- }
- }
- putchar('\n');
- }
-
- ++p;
- }
-}
diff --git a/gcc/gcc.cps b/gcc/gcc.cps
deleted file mode 100755
index f0d186f..0000000
--- a/gcc/gcc.cps
+++ /dev/null
@@ -1,1964 +0,0 @@
-, 156}
-\initial {!}
-\entry {\samp {!} in constraint}{306}
-\initial {#}
-\entry {\samp {#} in constraint}{307}
-\entry {\code {#} in template}{299}
-\entry {\code {#pragma}}{466}
-\entry {\code {#pragma implementation}, implied}{182}
-\entry {\code {#pragma}, reason for not using}{157}
-\initial {$}
-\entry {$}{158}
-\initial {%}
-\entry {\samp {%} in constraint}{307}
-\entry {\samp {%} in template}{298}
-\initial {&}
-\entry {\samp {&} in constraint}{307}
-\initial {'}
-\entry {'}{203}
-\initial {(}
-\entry {(nil)}{248}
-\initial {*}
-\entry {\samp {*} in constraint}{308}
-\entry {\code {*} in template}{299}
-\initial {-}
-\entry {\code {-lgcc}, use with \code {-nodefaultlibs}}{49}
-\entry {\code {-lgcc}, use with \code {-nostdlib}}{49}
-\entry {\code {-nodefaultlibs} and unresolved references}{49}
-\entry {\code {-nostdlib} and unresolved references}{49}
-\initial {.}
-\entry {.sdata/.sdata2 references (PowerPC)}{74}
-\initial {/}
-\entry {//}{158}
-\entry {\samp {/i} in RTL dump}{251}
-\entry {\samp {/s} in RTL dump}{250, 252}
-\entry {\samp {/u} in RTL dump}{251}
-\entry {\samp {/v} in RTL dump}{250}
-\initial {=}
-\entry {\samp {=} in constraint}{307}
-\initial {?}
-\entry {\samp {?} in constraint}{306}
-\entry {\code {?:} extensions}{142, 143}
-\entry {?: side effect}{143}
-\initial {{\_}}
-\entry {\samp {{\_}} in variables in macros}{141}
-\entry {\code {{\_}{\_}bb}}{407}
-\entry {\code {{\_}{\_}bb{\_}init{\_}func}}{406}
-\entry {\code {{\_}{\_}bb{\_}init{\_}trace{\_}func}}{407, 408}
-\entry {\code {{\_}{\_}bb{\_}trace{\_}func}}{407, 408}
-\entry {\code {{\_}{\_}bb{\_}trace{\_}ret}}{408}
-\entry {\code {{\_}{\_}builtin{\_}apply}}{140}
-\entry {\code {{\_}{\_}builtin{\_}apply{\_}args}}{140}
-\entry {\code {{\_}{\_}builtin{\_}args{\_}info}}{409}
-\entry {\code {{\_}{\_}builtin{\_}classify{\_}type}}{410}
-\entry {\code {{\_}{\_}builtin{\_}next{\_}arg}}{410}
-\entry {\code {{\_}{\_}builtin{\_}return}}{140}
-\entry {\code {{\_}{\_}builtin{\_}saveregs}}{409}
-\entry {\code {{\_}{\_}CTOR{\_}LIST{\_}{\_}}}{442}
-\entry {\code {{\_}{\_}DTOR{\_}LIST{\_}{\_}}}{442}
-\entry {\code {{\_}{\_}main}}{132}
-\initial {{\tt\char43}}
-\entry {\samp {{\tt\char43}} in constraint}{307}
-\initial {{\tt\gtr}}
-\entry {\samp {{\tt\gtr}} in constraint}{301}
-\entry {\code {{\tt\gtr}?}}{181}
-\initial {{\tt\indexbackslash }}
-\entry {{\tt\indexbackslash }}{298}
-\initial {{\tt\less}}
-\entry {\samp {{\tt\less}} in constraint}{301}
-\entry {\code {{\tt\less}?}}{181}
-\initial {0}
-\entry {\samp {0} in constraint}{303}
-\initial {A}
-\entry {\code {abort}}{18, 235}
-\entry {\code {abs}}{18, 267}
-\entry {\code {abs} and attributes}{342}
-\entry {\code {abs\var {m}2} instruction pattern}{318}
-\entry {absolute value}{267}
-\entry {access to operands}{248}
-\entry {accessors}{248}
-\entry {\code {ACCUMULATE{\_}OUTGOING{\_}ARGS}}{392}
-\entry {\code {ACCUMULATE{\_}OUTGOING{\_}ARGS} and stack frames}{403}
-\entry {\code {ADDITIONAL{\_}REGISTER{\_}NAMES}}{446}
-\entry {\code {add\var {m}3} instruction pattern}{317}
-\entry {\code {addr{\_}diff{\_}vec}}{277}
-\entry {\code {addr{\_}diff{\_}vec}, length of}{347}
-\entry {\code {addr{\_}vec}}{277}
-\entry {\code {addr{\_}vec}, length of}{347}
-\entry {\code {address}}{297}
-\entry {address constraints}{303}
-\entry {address of a label}{137}
-\entry {\code {ADDRESS{\_}COST}}{424}
-\entry {\code {address{\_}operand}}{303}
-\entry {addressing modes}{418}
-\entry {\code {ADJUST{\_}COST}}{427}
-\entry {\code {ADJUST{\_}FIELD{\_}ALIGN}}{365}
-\entry {\code {ADJUST{\_}INSN{\_}LENGTH}}{348}
-\entry {\code {ADJUST{\_}PRIORITY}}{427}
-\entry {aggregates as return values}{399}
-\entry {\code {alias} attribute}{155}
-\entry {\code {aligned} attribute}{159, 163}
-\entry {alignment}{159}
-\entry {\code {ALL{\_}REGS}}{379}
-\entry {Alliant}{199}
-\entry {\code {alloca}}{18}
-\entry {\code {alloca} and SunOS}{104}
-\entry {\code {alloca} vs variable-length arrays}{145}
-\entry {\code {alloca}, for SunOS}{127}
-\entry {\code {alloca}, for Unos}{113}
-\entry {\code {allocate{\_}stack} instruction pattern}{326}
-\entry {\code {ALLOCATE{\_}TRAMPOLINE}}{413}
-\entry {alternate keywords}{174}
-\entry {AMD29K options}{60}
-\entry {analysis, data flow}{242}
-\entry {\code {and}}{267}
-\entry {\code {and} and attributes}{342}
-\entry {\code {and}, canonicalization of}{331}
-\entry {\code {and\var {m}3} instruction pattern}{317}
-\entry {ANSI support}{17}
-\entry {apostrophes}{203}
-\entry {\code {APPLY{\_}RESULT{\_}SIZE}}{399}
-\entry {\code {ARG{\_}POINTER{\_}REGNUM}}{388}
-\entry {\code {ARG{\_}POINTER{\_}REGNUM} and virtual registers}{261}
-\entry {\code {arg{\_}pointer{\_}rtx}}{389}
-\entry {\code {ARGS{\_}GROW{\_}DOWNWARD}}{386}
-\entry {argument passing}{237}
-\entry {arguments in frame (88k)}{64}
-\entry {arguments in registers}{394}
-\entry {arguments on stack}{391}
-\entry {arithmetic libraries}{238}
-\entry {arithmetic shift}{267}
-\entry {arithmetic simplifications}{239}
-\entry {arithmetic, in RTL}{265}
-\entry {ARM options}{61}
-\entry {arrays of length zero}{145}
-\entry {arrays of variable length}{145}
-\entry {arrays, non-lvalue}{147}
-\entry {\code {ashift}}{267}
-\entry {\code {ashift} and attributes}{342}
-\entry {\code {ashiftrt}}{267}
-\entry {\code {ashiftrt} and attributes}{342}
-\entry {\code {ashl\var {m}3} instruction pattern}{317}
-\entry {\code {ashr\var {m}3} instruction pattern}{318}
-\entry {\code {asm} expressions}{167}
-\entry {\code {ASM{\_}APP{\_}OFF}}{432}
-\entry {\code {ASM{\_}APP{\_}ON}}{432}
-\entry {\code {ASM{\_}BYTE{\_}OP}}{434}
-\entry {\code {ASM{\_}CLOSE{\_}PAREN}}{435}
-\entry {\code {ASM{\_}COMMENT{\_}START}}{432}
-\entry {\code {ASM{\_}DECLARE{\_}FUNCTION{\_}NAME}}{438}
-\entry {\code {ASM{\_}DECLARE{\_}FUNCTION{\_}SIZE}}{438}
-\entry {\code {ASM{\_}DECLARE{\_}OBJECT{\_}NAME}}{438}
-\entry {\code {ASM{\_}FILE{\_}END}}{432}
-\entry {\code {ASM{\_}FILE{\_}START}}{431}
-\entry {\code {ASM{\_}FINAL{\_}SPEC}}{354}
-\entry {\code {ASM{\_}FINISH{\_}DECLARE{\_}OBJECT}}{438}
-\entry {\code {ASM{\_}FORMAT{\_}PRIVATE{\_}NAME}}{440}
-\entry {\code {asm{\_}fprintf}}{448}
-\entry {\code {ASM{\_}GENERATE{\_}INTERNAL{\_}LABEL}}{440}
-\entry {\code {ASM{\_}GLOBALIZE{\_}LABEL}}{439}
-\entry {\code {ASM{\_}IDENTIFY{\_}GCC}}{432}
-\entry {\code {asm{\_}input}}{276}
-\entry {\code {ASM{\_}NO{\_}SKIP{\_}IN{\_}TEXT}}{451}
-\entry {\code {asm{\_}noperands}}{283}
-\entry {\code {ASM{\_}OPEN{\_}PAREN}}{435}
-\entry {\code {asm{\_}operands}, RTL sharing}{289}
-\entry {\code {asm{\_}operands}, usage}{278}
-\entry {\code {ASM{\_}OUTPUT{\_}ADDR{\_}DIFF{\_}ELT}}{449}
-\entry {\code {ASM{\_}OUTPUT{\_}ADDR{\_}VEC{\_}ELT}}{449}
-\entry {\code {ASM{\_}OUTPUT{\_}ALIGN}}{451}
-\entry {\code {ASM{\_}OUTPUT{\_}ALIGN{\_}CODE}}{450}
-\entry {\code {ASM{\_}OUTPUT{\_}ALIGNED{\_}BSS}}{437}
-\entry {\code {ASM{\_}OUTPUT{\_}ALIGNED{\_}COMMON}}{436}
-\entry {\code {ASM{\_}OUTPUT{\_}ALIGNED{\_}LOCAL}}{437}
-\entry {\code {ASM{\_}OUTPUT{\_}ASCII}}{434}
-\entry {\code {ASM{\_}OUTPUT{\_}BSS}}{436}
-\entry {\code {ASM{\_}OUTPUT{\_}BYTE}}{434}
-\entry {\code {ASM{\_}OUTPUT{\_}CASE{\_}END}}{450}
-\entry {\code {ASM{\_}OUTPUT{\_}CASE{\_}LABEL}}{450}
-\entry {\code {ASM{\_}OUTPUT{\_}CHAR}}{434}
-\entry {\code {ASM{\_}OUTPUT{\_}COMMON}}{436}
-\entry {\code {ASM{\_}OUTPUT{\_}CONSTRUCTOR}}{444}
-\entry {\code {ASM{\_}OUTPUT{\_}DEF}}{441}
-\entry {\code {ASM{\_}OUTPUT{\_}DESTRUCTOR}}{445}
-\entry {\code {ASM{\_}OUTPUT{\_}DOUBLE}}{433}
-\entry {\code {ASM{\_}OUTPUT{\_}DOUBLE{\_}INT}}{434}
-\entry {\code {ASM{\_}OUTPUT{\_}EXTERNAL}}{439}
-\entry {\code {ASM{\_}OUTPUT{\_}EXTERNAL{\_}LIBCALL}}{439}
-\entry {\code {ASM{\_}OUTPUT{\_}FLOAT}}{433}
-\entry {\code {ASM{\_}OUTPUT{\_}IDENT}}{433}
-\entry {\code {ASM{\_}OUTPUT{\_}INT}}{434}
-\entry {\code {ASM{\_}OUTPUT{\_}INTERNAL{\_}LABEL}}{440}
-\entry {\code {ASM{\_}OUTPUT{\_}LABEL}}{438}
-\entry {\code {ASM{\_}OUTPUT{\_}LABELREF}}{440}
-\entry {\code {ASM{\_}OUTPUT{\_}LOCAL}}{437}
-\entry {\code {ASM{\_}OUTPUT{\_}LONG{\_}DOUBLE}}{433}
-\entry {\code {ASM{\_}OUTPUT{\_}LOOP{\_}ALIGN}}{450}
-\entry {\code {ASM{\_}OUTPUT{\_}MI{\_}THUNK}}{405}
-\entry {\code {ASM{\_}OUTPUT{\_}OPCODE}}{446}
-\entry {\code {ASM{\_}OUTPUT{\_}POOL{\_}PROLOGUE}}{434}
-\entry {\code {ASM{\_}OUTPUT{\_}QUADRUPLE{\_}INT}}{434}
-\entry {\code {ASM{\_}OUTPUT{\_}REG{\_}POP}}{449}
-\entry {\code {ASM{\_}OUTPUT{\_}REG{\_}PUSH}}{449}
-\entry {\code {ASM{\_}OUTPUT{\_}SECTION{\_}NAME}}{433}
-\entry {\code {ASM{\_}OUTPUT{\_}SHARED{\_}BSS}}{437}
-\entry {\code {ASM{\_}OUTPUT{\_}SHARED{\_}COMMON}}{436}
-\entry {\code {ASM{\_}OUTPUT{\_}SHARED{\_}LOCAL}}{438}
-\entry {\code {ASM{\_}OUTPUT{\_}SHORT}}{434}
-\entry {\code {ASM{\_}OUTPUT{\_}SKIP}}{451}
-\entry {\code {ASM{\_}OUTPUT{\_}SOURCE{\_}FILENAME}}{432}
-\entry {\code {ASM{\_}OUTPUT{\_}SOURCE{\_}LINE}}{433}
-\entry {\code {ASM{\_}OUTPUT{\_}SPECIAL{\_}POOL{\_}ENTRY}}{435}
-\entry {\code {ASM{\_}SPEC}}{354}
-\entry {\code {ASM{\_}STABD{\_}OP}}{453}
-\entry {\code {ASM{\_}STABN{\_}OP}}{453}
-\entry {\code {ASM{\_}STABS{\_}OP}}{452}
-\entry {\code {ASM{\_}WEAKEN{\_}LABEL}}{439}
-\entry {\code {assemble{\_}name}}{438}
-\entry {assembler format}{431}
-\entry {assembler instructions}{167}
-\entry {assembler instructions in RTL}{278}
-\entry {assembler names for identifiers}{171}
-\entry {assembler syntax, 88k}{65}
-\entry {\code {ASSEMBLER{\_}DIALECT}}{448}
-\entry {assembly code, invalid}{215}
-\entry {assigning attribute values to insns}{344}
-\entry {asterisk in template}{299}
-\entry {\code {atof}}{458}
-\entry {\code {attr}}{345}
-\entry {\code {attr{\_}flag}}{343}
-\entry {attribute expressions}{341}
-\entry {attribute of types}{162}
-\entry {attribute of variables}{159}
-\entry {attribute specifications}{346}
-\entry {attribute specifications example}{346}
-\entry {attributes, defining}{341}
-\entry {autoincrement addressing, availability}{235}
-\entry {autoincrement/decrement addressing}{301}
-\entry {autoincrement/decrement analysis}{242}
-\entry {automatic \code {inline} for C{\tt\char43}{\tt\char43} member fns}{166}
-\initial {B}
-\entry {backslash}{298}
-\entry {backtrace for bug reports}{219}
-\entry {\code {barrier}}{281}
-\entry {\code {BASE{\_}REG{\_}CLASS}}{380}
-\entry {basic blocks}{242}
-\entry {\code {bcmp}}{472}
-\entry {\code {b\var {cond}} instruction pattern}{321}
-\entry {\code {bcopy}, implicit usage}{416}
-\entry {\code {BIGGEST{\_}ALIGNMENT}}{364}
-\entry {\code {BIGGEST{\_}FIELD{\_}ALIGNMENT}}{364}
-\entry {Bison parser generator}{101}
-\entry {bit fields}{270}
-\entry {bit shift overflow (88k)}{66}
-\entry {\code {BITFIELD{\_}NBYTES{\_}LIMITED}}{367}
-\entry {\code {BITS{\_}BIG{\_}ENDIAN}}{362}
-\entry {\code {BITS{\_}BIG{\_}ENDIAN}, effect on \code {sign{\_}extract}}{270}
-\entry {\code {BITS{\_}PER{\_}UNIT}}{363}
-\entry {\code {BITS{\_}PER{\_}WORD}}{363}
-\entry {bitwise complement}{267}
-\entry {bitwise exclusive-or}{267}
-\entry {bitwise inclusive-or}{267}
-\entry {bitwise logical-and}{267}
-\entry {\code {BLKmode}}{255}
-\entry {\code {BLKmode}, and function return values}{288}
-\entry {\code {BLOCK{\_}PROFILER}}{407}
-\entry {\code {BLOCK{\_}PROFILER{\_}CODE}}{409}
-\entry {\code {BRANCH{\_}COST}}{426}
-\entry {\code {break{\_}out{\_}memory{\_}refs}}{420}
-\entry {\code {BSS{\_}SECTION{\_}ASM{\_}OP}}{428}
-\entry {bug criteria}{215}
-\entry {bug report mailing lists}{216}
-\entry {bugs}{215}
-\entry {bugs, known}{189}
-\entry {builtin functions}{18}
-\entry {byte writes (29k)}{60}
-\entry {\code {byte{\_}mode}}{258}
-\entry {\code {BYTES{\_}BIG{\_}ENDIAN}}{362}
-\entry {\code {bzero}}{472}
-\entry {\code {bzero}, implicit usage}{416}
-\initial {C}
-\entry {C compilation options}{9}
-\entry {C intermediate output, nonexistent}{7}
-\entry {C language extensions}{135}
-\entry {C language, traditional}{18}
-\entry {C statements for assembler output}{299}
-\entry {\code {C{\_}INCLUDE{\_}PATH}}{93}
-\entry {\code {c{\tt\char43}{\tt\char43}}}{16}
-\entry {C{\tt\char43}{\tt\char43}}{7}
-\entry {C{\tt\char43}{\tt\char43} comments}{158}
-\entry {C{\tt\char43}{\tt\char43} compilation options}{9}
-\entry {C{\tt\char43}{\tt\char43} interface and implementation headers}{181}
-\entry {C{\tt\char43}{\tt\char43} language extensions}{179}
-\entry {C{\tt\char43}{\tt\char43} member fns, automatically \code {inline}}{166}
-\entry {C{\tt\char43}{\tt\char43} misunderstandings}{208}
-\entry {C{\tt\char43}{\tt\char43} named return value}{179}
-\entry {C{\tt\char43}{\tt\char43} options, command line}{21}
-\entry {C{\tt\char43}{\tt\char43} pragmas, effect on inlining}{183}
-\entry {C{\tt\char43}{\tt\char43} signatures}{186}
-\entry {C{\tt\char43}{\tt\char43} source file suffixes}{16}
-\entry {C{\tt\char43}{\tt\char43} static data, declaring and defining}{208}
-\entry {C{\tt\char43}{\tt\char43} subtype polymorphism}{186}
-\entry {C{\tt\char43}{\tt\char43} type abstraction}{186}
-\entry {\code {call}}{273}
-\entry {\code {call} instruction pattern}{322}
-\entry {\code {call} usage}{287}
-\entry {call-clobbered register}{372}
-\entry {call-saved register}{372}
-\entry {call-used register}{372}
-\entry {\code {call{\_}insn}}{280}
-\entry {\code {call{\_}insn} and \samp {/u}}{252}
-\entry {\code {CALL{\_}INSN{\_}FUNCTION{\_}USAGE}}{280}
-\entry {\code {call{\_}pop} instruction pattern}{322}
-\entry {\code {CALL{\_}USED{\_}REGISTERS}}{372}
-\entry {\code {call{\_}used{\_}regs}}{373}
-\entry {\code {call{\_}value} instruction pattern}{322}
-\entry {\code {call{\_}value{\_}pop} instruction pattern}{322}
-\entry {\code {CALLER{\_}SAVE{\_}PROFITABLE}}{401}
-\entry {calling conventions}{386}
-\entry {calling functions in RTL}{287}
-\entry {calling functions through the function vector on the H8/300 processors}{156}
-\entry {\code {CAN{\_}DEBUG{\_}WITHOUT{\_}FP}}{361}
-\entry {\code {CAN{\_}ELIMINATE}}{391}
-\entry {canonicalization of instructions}{330}
-\entry {\code {CANONICALIZE{\_}COMPARISON}}{423}
-\entry {\code {canonicalize{\_}funcptr{\_}for{\_}compare} instruction pattern}{325}
-\entry {case labels in initializers}{149}
-\entry {case ranges}{150}
-\entry {case sensitivity and VMS}{232}
-\entry {\code {CASE{\_}DROPS{\_}THROUGH}}{461}
-\entry {\code {CASE{\_}VALUES{\_}THRESHOLD}}{461}
-\entry {\code {CASE{\_}VECTOR{\_}MODE}}{461}
-\entry {\code {CASE{\_}VECTOR{\_}PC{\_}RELATIVE}}{461}
-\entry {\code {casesi} instruction pattern}{324}
-\entry {cast to a union}{151}
-\entry {casts as lvalues}{142}
-\entry {\code {CC}}{475}
-\entry {\code {cc{\_}status}}{421}
-\entry {\code {CC{\_}STATUS{\_}MDEP}}{421}
-\entry {\code {CC{\_}STATUS{\_}MDEP{\_}INIT}}{422}
-\entry {\code {cc0}}{263}
-\entry {\code {cc0}, RTL sharing}{289}
-\entry {\code {cc0{\_}rtx}}{264}
-\entry {\code {CC1{\_}SPEC}}{354}
-\entry {\code {CC1PLUS{\_}SPEC}}{354}
-\entry {\code {CCmode}}{255}
-\entry {\code {CDImode}}{256}
-\entry {\code {change{\_}address}}{315}
-\entry {\code {CHAR{\_}TYPE{\_}SIZE}}{369}
-\entry {\code {CHECK{\_}FLOAT{\_}VALUE}}{368}
-\entry {\code {CHImode}}{256}
-\entry {class definitions, register}{378}
-\entry {class preference constraints}{306}
-\entry {\code {CLASS{\_}LIKELY{\_}SPILLED{\_}P}}{384}
-\entry {\code {CLASS{\_}MAX{\_}NREGS}}{385}
-\entry {classes of RTX codes}{249}
-\entry {\code {CLEAR{\_}INSN{\_}CACHE}}{414}
-\entry {\code {CLIB}}{475}
-\entry {\code {clobber}}{273}
-\entry {\code {clrstr\var {m}} instruction pattern}{319}
-\entry {\code {cmp\var {m}} instruction pattern}{318}
-\entry {\code {cmpstr\var {m}} instruction pattern}{319}
-\entry {code generation conventions}{88}
-\entry {code generation RTL sequences}{335}
-\entry {code motion}{241}
-\entry {\code {code{\_}label}}{281}
-\entry {\code {code{\_}label} and \samp {/i}}{252}
-\entry {\code {CODE{\_}LABEL{\_}NUMBER}}{281}
-\entry {codes, RTL expression}{247}
-\entry {\code {COImode}}{256}
-\entry {\code {COLLECT{\_}EXPORT{\_}LIST}}{472}
-\entry {combiner pass}{263}
-\entry {command options}{9}
-\entry {comments, C{\tt\char43}{\tt\char43} style}{158}
-\entry {common subexpression elimination}{241}
-\entry {\code {COMP{\_}TYPE{\_}ATTRIBUTES}}{466}
-\entry {\code {compare}}{265}
-\entry {\code {compare}, canonicalization of}{331}
-\entry {comparison of signed and unsigned values, warning}{29}
-\entry {compilation in a separate directory}{121}
-\entry {compiler bugs, reporting}{217}
-\entry {compiler compared to C{\tt\char43}{\tt\char43} preprocessor}{7}
-\entry {compiler options, C{\tt\char43}{\tt\char43}}{21}
-\entry {compiler passes and files}{239}
-\entry {compiler version, specifying}{51}
-\entry {\code {COMPILER{\_}PATH}}{93}
-\entry {complement, bitwise}{267}
-\entry {complex numbers}{144}
-\entry {compound expressions as lvalues}{142}
-\entry {computed gotos}{137}
-\entry {computing the length of an insn}{347}
-\entry {\code {cond}}{269}
-\entry {\code {cond} and attributes}{342}
-\entry {condition code register}{263}
-\entry {condition code status}{421}
-\entry {condition codes}{268}
-\entry {conditional expressions as lvalues}{142}
-\entry {conditional expressions, extensions}{143}
-\entry {\code {CONDITIONAL{\_}REGISTER{\_}USAGE}}{373}
-\entry {conditions, in patterns}{291}
-\entry {configuration file}{469}
-\entry {configurations supported by GNU CC}{104}
-\entry {conflicting types}{206}
-\entry {\code {const} applied to function}{151}
-\entry {\code {const} function attribute}{152}
-\entry {\code {CONST{\_}CALL{\_}P}}{252}
-\entry {\code {CONST{\_}COSTS}}{424}
-\entry {\code {const{\_}double}}{258}
-\entry {\code {const{\_}double}, RTL sharing}{289}
-\entry {\code {CONST{\_}DOUBLE{\_}CHAIN}}{259}
-\entry {\code {CONST{\_}DOUBLE{\_}LOW}}{259}
-\entry {\code {CONST{\_}DOUBLE{\_}MEM}}{259}
-\entry {\code {CONST{\_}DOUBLE{\_}OK{\_}FOR{\_}LETTER{\_}P}}{385}
-\entry {\code {const{\_}int}}{258}
-\entry {\code {const{\_}int} and attribute tests}{342}
-\entry {\code {const{\_}int} and attributes}{341}
-\entry {\code {const{\_}int}, RTL sharing}{289}
-\entry {\code {CONST{\_}OK{\_}FOR{\_}LETTER{\_}P}}{385}
-\entry {\code {const{\_}string}}{259}
-\entry {\code {const{\_}string} and attributes}{342}
-\entry {\code {const{\_}true{\_}rtx}}{258}
-\entry {\code {const0{\_}rtx}}{258}
-\entry {\code {CONST0{\_}RTX}}{259}
-\entry {\code {const1{\_}rtx}}{258}
-\entry {\code {CONST1{\_}RTX}}{259}
-\entry {\code {const2{\_}rtx}}{258}
-\entry {\code {CONST2{\_}RTX}}{259}
-\entry {constant attributes}{348}
-\entry {constant folding}{239}
-\entry {constant folding and floating point}{460}
-\entry {constant propagation}{241}
-\entry {\code {CONSTANT{\_}ADDRESS{\_}P}}{418}
-\entry {\code {CONSTANT{\_}ALIGNMENT}}{365}
-\entry {\code {CONSTANT{\_}P}}{418}
-\entry {\code {CONSTANT{\_}POOL{\_}ADDRESS{\_}P}}{252}
-\entry {constants in constraints}{302}
-\entry {\code {constm1{\_}rtx}}{258}
-\entry {constraint modifier characters}{307}
-\entry {constraint, matching}{303}
-\entry {constraints}{301}
-\entry {constraints, machine specific}{308}
-\entry {constructing calls}{140}
-\entry {constructor expressions}{148}
-\entry {\code {constructor} function attribute}{154}
-\entry {constructors vs \code {goto}}{181}
-\entry {constructors, automatic calls}{132}
-\entry {constructors, output of}{442}
-\entry {contributors}{485}
-\entry {controlling register usage}{373}
-\entry {controlling the compilation driver}{353}
-\entry {conventions, run-time}{237}
-\entry {conversions}{270}
-\entry {Convex options}{59}
-\entry {\code {copy{\_}rtx{\_}if{\_}shared}}{289}
-\entry {core dump}{215}
-\entry {\code {cos}}{18}
-\entry {costs of instructions}{424}
-\entry {\code {COSTS{\_}N{\_}INSNS}}{424}
-\entry {\code {CPLUS{\_}INCLUDE{\_}PATH}}{93}
-\entry {\code {CPP{\_}PREDEFINES}}{359}
-\entry {\code {CPP{\_}SPEC}}{353}
-\entry {\code {CQImode}}{256}
-\entry {cross compilation and floating point}{458}
-\entry {cross compiling}{51}
-\entry {cross-compiler, installation}{122}
-\entry {cross-jumping}{243}
-\entry {\code {CROSS{\_}LIBGCC1}}{473}
-\entry {\code {CRTSTUFF{\_}T{\_}CFLAGS}}{473}
-\entry {\code {CRTSTUFF{\_}T{\_}CFLAGS{\_}S}}{473}
-\entry {\code {CSImode}}{256}
-\entry {\code {CTImode}}{256}
-\entry {\code {CUMULATIVE{\_}ARGS}}{396}
-\entry {\code {current{\_}function{\_}epilogue{\_}delay{\_}list}}{404}
-\entry {\code {current{\_}function{\_}outgoing{\_}args{\_}size}}{392}
-\entry {\code {current{\_}function{\_}pops{\_}args}}{404}
-\entry {\code {current{\_}function{\_}pretend{\_}args{\_}size}}{402}
-\initial {D}
-\entry {\samp {d} in constraint}{301}
-\entry {data flow analysis}{242}
-\entry {\code {DATA{\_}ALIGNMENT}}{365}
-\entry {\code {data{\_}section}}{429}
-\entry {\code {DATA{\_}SECTION{\_}ASM{\_}OP}}{428}
-\entry {\code {DBR{\_}OUTPUT{\_}SEQEND}}{448}
-\entry {\code {dbr{\_}sequence{\_}length}}{448}
-\entry {DBX}{196}
-\entry {\code {DBX{\_}BLOCKS{\_}FUNCTION{\_}RELATIVE}}{454}
-\entry {\code {DBX{\_}CONTIN{\_}CHAR}}{453}
-\entry {\code {DBX{\_}CONTIN{\_}LENGTH}}{453}
-\entry {\code {DBX{\_}DEBUGGING{\_}INFO}}{452}
-\entry {\code {DBX{\_}FUNCTION{\_}FIRST}}{454}
-\entry {\code {DBX{\_}LBRAC{\_}FIRST}}{454}
-\entry {\code {DBX{\_}MEMPARM{\_}STABS{\_}LETTER}}{454}
-\entry {\code {DBX{\_}NO{\_}XREFS}}{453}
-\entry {\code {DBX{\_}OUTPUT{\_}ENUM}}{455}
-\entry {\code {DBX{\_}OUTPUT{\_}FUNCTION{\_}END}}{455}
-\entry {\code {DBX{\_}OUTPUT{\_}LBRAC}}{455}
-\entry {\code {DBX{\_}OUTPUT{\_}MAIN{\_}SOURCE{\_}DIRECTORY}}{456}
-\entry {\code {DBX{\_}OUTPUT{\_}MAIN{\_}SOURCE{\_}FILE{\_}END}}{457}
-\entry {\code {DBX{\_}OUTPUT{\_}MAIN{\_}SOURCE{\_}FILENAME}}{456}
-\entry {\code {DBX{\_}OUTPUT{\_}RBRAC}}{455}
-\entry {\code {DBX{\_}OUTPUT{\_}SOURCE{\_}FILENAME}}{457}
-\entry {\code {DBX{\_}OUTPUT{\_}STANDARD{\_}TYPES}}{455}
-\entry {\code {DBX{\_}REGISTER{\_}NUMBER}}{451}
-\entry {\code {DBX{\_}REGPARM{\_}STABS{\_}CODE}}{454}
-\entry {\code {DBX{\_}REGPARM{\_}STABS{\_}LETTER}}{454}
-\entry {\code {DBX{\_}STATIC{\_}CONST{\_}VAR{\_}CODE}}{454}
-\entry {\code {DBX{\_}STATIC{\_}STAB{\_}DATA{\_}SECTION}}{453}
-\entry {\code {DBX{\_}TYPE{\_}DECL{\_}STABS{\_}CODE}}{453}
-\entry {\code {DBX{\_}USE{\_}BINCL}}{454}
-\entry {\code {DBX{\_}WORKING{\_}DIRECTORY}}{456}
-\entry {\code {DCmode}}{256}
-\entry {De Morgan's law}{331}
-\entry {dead code}{241}
-\entry {\code {dead{\_}or{\_}set{\_}p}}{333}
-\entry {deallocating variable length arrays}{145}
-\entry {death notes}{378}
-\entry {\code {debug{\_}rtx}}{220}
-\entry {\code {DEBUG{\_}SYMS{\_}TEXT}}{452}
-\entry {\code {DEBUGGER{\_}ARG{\_}OFFSET}}{452}
-\entry {\code {DEBUGGER{\_}AUTO{\_}OFFSET}}{451}
-\entry {debugging information generation}{244}
-\entry {debugging information options}{33}
-\entry {debugging, 88k OCS}{63}
-\entry {declaration scope}{203}
-\entry {declarations inside expressions}{135}
-\entry {declarations, RTL}{272}
-\entry {declaring attributes of functions}{151}
-\entry {declaring static data in C{\tt\char43}{\tt\char43}}{208}
-\entry {default implementation, signature member function}{187}
-\entry {\code {DEFAULT{\_}CALLER{\_}SAVES}}{401}
-\entry {\code {DEFAULT{\_}GDB{\_}EXTENSIONS}}{452}
-\entry {\code {DEFAULT{\_}MAIN{\_}RETURN}}{467}
-\entry {\code {DEFAULT{\_}PCC{\_}STRUCT{\_}RETURN}}{400}
-\entry {\code {DEFAULT{\_}SHORT{\_}ENUMS}}{370}
-\entry {\code {DEFAULT{\_}SIGNED{\_}CHAR}}{370}
-\entry {\code {define{\_}asm{\_}attributes}}{346}
-\entry {\code {define{\_}attr}}{341}
-\entry {\code {define{\_}delay}}{349}
-\entry {\code {define{\_}expand}}{335}
-\entry {\code {define{\_}function{\_}unit}}{351}
-\entry {\code {define{\_}insn}}{291}
-\entry {\code {define{\_}insn} example}{292}
-\entry {\code {define{\_}peephole}}{335}
-\entry {define{\_}split}{338}
-\entry {defining attributes and their values}{341}
-\entry {defining jump instruction patterns}{328}
-\entry {defining peephole optimizers}{332}
-\entry {defining RTL sequences for code generation}{335}
-\entry {defining static data in C{\tt\char43}{\tt\char43}}{208}
-\entry {delay slots, defining}{349}
-\entry {\code {DELAY{\_}SLOTS{\_}FOR{\_}EPILOGUE}}{404}
-\entry {delayed branch scheduling}{243}
-\entry {dependencies for make as output}{94}
-\entry {dependencies, make}{46}
-\entry {\code {DEPENDENCIES{\_}OUTPUT}}{94}
-\entry {Dependent Patterns}{327}
-\entry {\code {destructor} function attribute}{154}
-\entry {destructors vs \code {goto}}{181}
-\entry {destructors, output of}{442}
-\entry {detecting \w {\samp {-traditional}}}{19}
-\entry {\code {DFmode}}{255}
-\entry {dialect options}{17}
-\entry {digits in constraint}{303}
-\entry {\code {DImode}}{255}
-\entry {\code {DIR{\_}SEPARATOR}}{472}
-\entry {directory options}{50}
-\entry {disabling certain registers}{373}
-\entry {dispatch table}{449}
-\entry {\code {div}}{266}
-\entry {\code {div} and attributes}{342}
-\entry {\code {DIVDI3{\_}LIBCALL}}{415}
-\entry {divide instruction, 88k}{65}
-\entry {division}{266}
-\entry {\code {div\var {m}3} instruction pattern}{317}
-\entry {\code {divmod\var {m}4} instruction pattern}{317}
-\entry {\code {DIVSI3{\_}LIBCALL}}{415}
-\entry {dollar signs in identifier names}{158}
-\entry {\code {DOLLARS{\_}IN{\_}IDENTIFIERS}}{466}
-\entry {\code {DONE}}{336}
-\entry {\code {DONT{\_}DECLARE{\_}SYS{\_}SIGLIST}}{471}
-\entry {\code {DONT{\_}REDUCE{\_}ADDR}}{427}
-\entry {double-word arithmetic}{144}
-\entry {\code {DOUBLE{\_}TYPE{\_}SIZE}}{369}
-\entry {downward funargs}{137}
-\entry {driver}{353}
-\entry {DW bit (29k)}{60}
-\entry {\code {DWARF{\_}DEBUGGING{\_}INFO}}{457}
-\entry {\code {DYNAMIC{\_}CHAIN{\_}ADDRESS}}{387}
-\initial {E}
-\entry {\samp {E} in constraint}{302}
-\entry {earlyclobber operand}{307}
-\entry {\code {EASY{\_}DIV{\_}EXPR}}{462}
-\entry {\code {EDOM}, implicit usage}{416}
-\entry {\code {ELIGIBLE{\_}FOR{\_}EPILOGUE{\_}DELAY}}{404}
-\entry {\code {ELIMINABLE{\_}REGS}}{390}
-\entry {empty constraints}{314}
-\entry {\code {EMPTY{\_}FIELD{\_}BOUNDARY}}{365}
-\entry {\code {ENCODE{\_}SECTION{\_}INFO}}{429}
-\entry {\code {ENCODE{\_}SECTION{\_}INFO} and address validation}{419}
-\entry {\code {ENCODE{\_}SECTION{\_}INFO} usage}{448}
-\entry {\code {ENDFILE{\_}SPEC}}{355}
-\entry {endianness}{235}
-\entry {\code {enum machine{\_}mode}}{254}
-\entry {\code {enum reg{\_}class}}{379}
-\entry {environment variables}{92}
-\entry {epilogue}{401}
-\entry {\code {eq}}{269}
-\entry {\code {eq} and attributes}{342}
-\entry {\code {eq{\_}attr}}{343}
-\entry {equal}{269}
-\entry {\code {errno}, implicit usage}{416}
-\entry {error messages}{214}
-\entry {escape sequences, traditional}{19}
-\entry {exclamation point}{306}
-\entry {exclusive-or, bitwise}{267}
-\entry {\code {EXECUTABLE{\_}SUFFIX}}{472}
-\entry {\code {exit}}{18}
-\entry {exit status and VMS}{232}
-\entry {\code {EXIT{\_}BODY}}{467}
-\entry {\code {EXIT{\_}IGNORE{\_}STACK}}{403}
-\entry {\code {EXPAND{\_}BUILTIN{\_}SAVEREGS}}{410}
-\entry {expander definitions}{335}
-\entry {explicit register variables}{172}
-\entry {\code {expr{\_}list}}{287}
-\entry {expression codes}{247}
-\entry {expressions containing statements}{135}
-\entry {expressions, compound, as lvalues}{142}
-\entry {expressions, conditional, as lvalues}{142}
-\entry {expressions, constructor}{148}
-\entry {extended \code {asm}}{167}
-\entry {\code {extend\var {mn}} instruction pattern}{320}
-\entry {extensible constraints}{303}
-\entry {extensions, \code {?:}}{142, 143}
-\entry {extensions, C language}{135}
-\entry {extensions, C{\tt\char43}{\tt\char43} language}{179}
-\entry {\code {extern int target{\_}flags}}{359}
-\entry {external declaration scope}{203}
-\entry {\code {EXTRA{\_}CC{\_}MODES}}{422}
-\entry {\code {EXTRA{\_}CC{\_}NAMES}}{423}
-\entry {\code {EXTRA{\_}CONSTRAINT}}{386}
-\entry {\code {EXTRA{\_}SECTION{\_}FUNCTIONS}}{429}
-\entry {\code {EXTRA{\_}SECTIONS}}{428}
-\entry {\code {EXTRA{\_}SPECS}}{355}
-\entry {\code {extv} instruction pattern}{320}
-\entry {\code {extzv} instruction pattern}{320}
-\initial {F}
-\entry {\samp {F} in constraint}{302}
-\entry {\code {fabs}}{18}
-\entry {\code {FAIL}}{336}
-\entry {fatal signal}{215}
-\entry {\code {FATAL{\_}EXIT{\_}CODE}}{469}
-\entry {features, optional, in system conventions}{360}
-\entry {\code {ffs}}{18, 268}
-\entry {\code {ffs\var {m}2} instruction pattern}{318}
-\entry {file name suffix}{14}
-\entry {file names}{47}
-\entry {files and passes of the compiler}{239}
-\entry {final pass}{244}
-\entry {\code {FINAL{\_}PRESCAN{\_}INSN}}{446}
-\entry {\code {FINAL{\_}PRESCAN{\_}LABEL}}{447}
-\entry {\code {FINAL{\_}REG{\_}PARM{\_}STACK{\_}SPACE}}{392}
-\entry {\code {final{\_}scan{\_}insn}}{404}
-\entry {\code {final{\_}sequence}}{448}
-\entry {\code {FINALIZE{\_}PIC}}{431}
-\entry {\code {FIRST{\_}INSN{\_}ADDRESS}}{347}
-\entry {\code {FIRST{\_}PARM{\_}OFFSET}}{387}
-\entry {\code {FIRST{\_}PARM{\_}OFFSET} and virtual registers}{261}
-\entry {\code {FIRST{\_}PSEUDO{\_}REGISTER}}{372}
-\entry {\code {FIRST{\_}STACK{\_}REG}}{377}
-\entry {\code {FIRST{\_}VIRTUAL{\_}REGISTER}}{261}
-\entry {\code {fix}}{271}
-\entry {\code {fix{\_}trunc\var {mn}2} instruction pattern}{320}
-\entry {fixed register}{372}
-\entry {\code {FIXED{\_}REGISTERS}}{372}
-\entry {\code {fixed{\_}regs}}{373}
-\entry {\code {fix\var {mn}2} instruction pattern}{319}
-\entry {\code {FIXUNS{\_}TRUNC{\_}LIKE{\_}FIX{\_}TRUNC}}{462}
-\entry {\code {fixuns{\_}trunc\var {mn}2} instruction pattern}{320}
-\entry {\code {fixuns\var {mn}2} instruction pattern}{319}
-\entry {flags in RTL expression}{250}
-\entry {\code {float}}{271}
-\entry {\code {float} as function value type}{204}
-\entry {\code {FLOAT{\_}ARG{\_}TYPE}}{416}
-\entry {\code {float{\_}extend}}{271}
-\entry {\code {FLOAT{\_}STORE{\_}FLAG{\_}VALUE}}{465}
-\entry {\code {float{\_}truncate}}{271}
-\entry {\code {FLOAT{\_}TYPE{\_}SIZE}}{369}
-\entry {\code {FLOAT{\_}VALUE{\_}TYPE}}{417}
-\entry {\code {FLOAT{\_}WORDS{\_}BIG{\_}ENDIAN}}{362}
-\entry {\code {FLOATIFY}}{417}
-\entry {floating point and cross compilation}{458}
-\entry {floating point precision}{40, 207}
-\entry {\code {float\var {mn}2} instruction pattern}{319}
-\entry {\code {floatuns\var {mn}2} instruction pattern}{319}
-\entry {\code {force{\_}reg}}{314}
-\entry {\code {format} function attribute}{153}
-\entry {\code {format{\_}arg} function attribute}{153}
-\entry {forwarding calls}{140}
-\entry {frame layout}{386}
-\entry {\code {FRAME{\_}GROWS{\_}DOWNWARD}}{386}
-\entry {\code {FRAME{\_}GROWS{\_}DOWNWARD} and virtual registers}{261}
-\entry {\code {frame{\_}pointer{\_}needed}}{402}
-\entry {\code {FRAME{\_}POINTER{\_}REGNUM}}{388}
-\entry {\code {FRAME{\_}POINTER{\_}REGNUM} and virtual registers}{261}
-\entry {\code {FRAME{\_}POINTER{\_}REQUIRED}}{390}
-\entry {\code {frame{\_}pointer{\_}rtx}}{389}
-\entry {\code {fscanf}, and constant strings}{201}
-\entry {\code {ftrunc\var {m}2} instruction pattern}{319}
-\entry {function attributes}{151}
-\entry {function call conventions}{237}
-\entry {function entry and exit}{401}
-\entry {function pointers, arithmetic}{148}
-\entry {function prototype declarations}{157}
-\entry {function units, for scheduling}{350}
-\entry {function, size of pointer to}{148}
-\entry {function-call insns}{287}
-\entry {\code {FUNCTION{\_}ARG}}{394}
-\entry {\code {FUNCTION{\_}ARG{\_}ADVANCE}}{397}
-\entry {\code {FUNCTION{\_}ARG{\_}BOUNDARY}}{397}
-\entry {\code {FUNCTION{\_}ARG{\_}CALLEE{\_}COPIES}}{396}
-\entry {\code {FUNCTION{\_}ARG{\_}PADDING}}{397}
-\entry {\code {FUNCTION{\_}ARG{\_}PARTIAL{\_}NREGS}}{395}
-\entry {\code {FUNCTION{\_}ARG{\_}PASS{\_}BY{\_}REFERENCE}}{395}
-\entry {\code {FUNCTION{\_}ARG{\_}REGNO{\_}P}}{397}
-\entry {\code {FUNCTION{\_}BLOCK{\_}PROFILER}}{406}
-\entry {\code {FUNCTION{\_}BLOCK{\_}PROFILER{\_}EXIT}}{408}
-\entry {\code {FUNCTION{\_}BOUNDARY}}{364}
-\entry {\code {FUNCTION{\_}CONVERSION{\_}BUG}}{470}
-\entry {\code {FUNCTION{\_}EPILOGUE}}{403}
-\entry {\code {FUNCTION{\_}EPILOGUE} and trampolines}{413}
-\entry {\code {FUNCTION{\_}INCOMING{\_}ARG}}{395}
-\entry {\code {FUNCTION{\_}MODE}}{465}
-\entry {\code {FUNCTION{\_}OUTGOING{\_}VALUE}}{398}
-\entry {\code {FUNCTION{\_}PROFILER}}{405}
-\entry {\code {FUNCTION{\_}PROLOGUE}}{401}
-\entry {\code {FUNCTION{\_}PROLOGUE} and trampolines}{413}
-\entry {\code {FUNCTION{\_}VALUE}}{398}
-\entry {\code {FUNCTION{\_}VALUE{\_}REGNO{\_}P}}{399}
-\entry {functions called via pointer on the RS/6000 and PowerPC}{155}
-\entry {functions in arbitrary sections}{151}
-\entry {functions that are passed arguments in registers on the 386}{151, 155}
-\entry {functions that do not pop the argument stack on the 386}{151}
-\entry {functions that do pop the argument stack on the 386}{155}
-\entry {functions that have no side effects}{151}
-\entry {functions that never return}{151}
-\entry {functions that pop the argument stack on the 386}{151, 155}
-\entry {functions which are exported from a dll on PowerPC Windows NT}{155}
-\entry {functions which are imported from a dll on PowerPC Windows NT}{155}
-\entry {functions which specify exception handling on PowerPC Windows NT}{156}
-\entry {functions with \code {printf} or \code {scanf} style arguments}{151}
-\entry {functions, leaf}{376}
-\initial {G}
-\entry {\samp {g} in constraint}{302}
-\entry {\samp {G} in constraint}{302}
-\entry {\code {g{\tt\char43}{\tt\char43}}}{16}
-\entry {G{\tt\char43}{\tt\char43}}{7}
-\entry {\code {g{\tt\char43}{\tt\char43} 1.\var {xx}}}{16}
-\entry {\code {g{\tt\char43}{\tt\char43}} older version}{16}
-\entry {\code {g{\tt\char43}{\tt\char43}}, separate compiler}{16}
-\entry {GCC}{7}
-\entry {\code {GCC{\_}EXEC{\_}PREFIX}}{92}
-\entry {\code {ge}}{269}
-\entry {\code {ge} and attributes}{342}
-\entry {\code {GEN{\_}ERRNO{\_}RTX}}{416}
-\entry {\code {gencodes}}{240}
-\entry {\code {genconfig}}{244}
-\entry {\code {general{\_}operand}}{294}
-\entry {\code {GENERAL{\_}REGS}}{379}
-\entry {generalized lvalues}{142}
-\entry {generating assembler output}{299}
-\entry {generating insns}{293}
-\entry {\code {genflags}}{240}
-\entry {\code {genflags}, crash on Sun 4}{191}
-\entry {\code {get{\_}attr}}{343}
-\entry {\code {get{\_}attr{\_}length}}{348}
-\entry {\code {GET{\_}CLASS{\_}NARROWEST{\_}MODE}}{258}
-\entry {\code {GET{\_}CODE}}{247}
-\entry {\code {get{\_}frame{\_}size}}{390}
-\entry {\code {get{\_}insns}}{279}
-\entry {\code {get{\_}last{\_}insn}}{279}
-\entry {\code {GET{\_}MODE}}{257}
-\entry {\code {GET{\_}MODE{\_}ALIGNMENT}}{257}
-\entry {\code {GET{\_}MODE{\_}BITSIZE}}{257}
-\entry {\code {GET{\_}MODE{\_}CLASS}}{257}
-\entry {\code {GET{\_}MODE{\_}MASK}}{257}
-\entry {\code {GET{\_}MODE{\_}NAME}}{257}
-\entry {\code {GET{\_}MODE{\_}NUNITS}}{258}
-\entry {\code {GET{\_}MODE{\_}SIZE}}{257}
-\entry {\code {GET{\_}MODE{\_}UNIT{\_}SIZE}}{257}
-\entry {\code {GET{\_}MODE{\_}WIDER{\_}MODE}}{257}
-\entry {\code {GET{\_}RTX{\_}CLASS}}{249}
-\entry {\code {GET{\_}RTX{\_}FORMAT}}{249}
-\entry {\code {GET{\_}RTX{\_}LENGTH}}{248}
-\entry {\code {geu}}{269}
-\entry {\code {geu} and attributes}{342}
-\entry {\code {GIV{\_}SORT{\_}CRITERION}}{468}
-\entry {global offset table}{90}
-\entry {global register after \code {longjmp}}{173}
-\entry {global register allocation}{243}
-\entry {global register variables}{172}
-\entry {\code {GLOBALDEF}}{230}
-\entry {\code {GLOBALREF}}{230}
-\entry {\code {GLOBALVALUEDEF}}{230}
-\entry {\code {GLOBALVALUEREF}}{230}
-\entry {GNU CC and portability}{235}
-\entry {GNU CC command options}{9}
-\entry {\code {GO{\_}IF{\_}LEGITIMATE{\_}ADDRESS}}{419}
-\entry {\code {GO{\_}IF{\_}MODE{\_}DEPENDENT{\_}ADDRESS}}{421}
-\entry {\code {goto} in C{\tt\char43}{\tt\char43}}{181}
-\entry {goto with computed label}{137}
-\entry {gp-relative references (MIPS)}{78}
-\entry {\code {gprof}}{35}
-\entry {greater than}{269}
-\entry {grouping options}{9}
-\entry {\code {gt}}{269}
-\entry {\code {gt} and attributes}{342}
-\entry {\code {gtu}}{269}
-\entry {\code {gtu} and attributes}{342}
-\initial {H}
-\entry {\samp {H} in constraint}{302}
-\entry {\code {HANDLE{\_}PRAGMA}}{466}
-\entry {hard registers}{260}
-\entry {\code {HARD{\_}FRAME{\_}POINTER{\_}REGNUM}}{388}
-\entry {\code {HARD{\_}REGNO{\_}MODE{\_}OK}}{374}
-\entry {\code {HARD{\_}REGNO{\_}NREGS}}{374}
-\entry {hardware models and configurations, specifying}{52}
-\entry {\code {HAS{\_}INIT{\_}SECTION}}{444}
-\entry {\code {HAVE{\_}ATEXIT}}{467}
-\entry {\code {HAVE{\_}POPEN}}{471}
-\entry {\code {HAVE{\_}POST{\_}DECREMENT}}{418}
-\entry {\code {HAVE{\_}POST{\_}INCREMENT}}{418}
-\entry {\code {HAVE{\_}PRE{\_}DECREMENT}}{418}
-\entry {\code {HAVE{\_}PRE{\_}INCREMENT}}{418}
-\entry {\code {HAVE{\_}PUTENV}}{471}
-\entry {\code {HAVE{\_}VPRINTF}}{470}
-\entry {header files and VMS}{229}
-\entry {\code {high}}{260}
-\entry {\code {HImode}}{255}
-\entry {\code {HImode}, in \code {insn}}{282}
-\entry {host makefile fragment}{475}
-\entry {\code {HOST{\_}BITS{\_}PER{\_}CHAR}}{469}
-\entry {\code {HOST{\_}BITS{\_}PER{\_}INT}}{469}
-\entry {\code {HOST{\_}BITS{\_}PER{\_}LONG}}{469}
-\entry {\code {HOST{\_}BITS{\_}PER{\_}SHORT}}{469}
-\entry {\code {HOST{\_}FLOAT{\_}FORMAT}}{469}
-\entry {\code {HOST{\_}FLOAT{\_}WORDS{\_}BIG{\_}ENDIAN}}{469}
-\entry {\code {HOST{\_}WORDS{\_}BIG{\_}ENDIAN}}{469}
-\entry {HPPA Options}{81}
-\initial {I}
-\entry {\samp {i} in constraint}{302}
-\entry {\samp {I} in constraint}{302}
-\entry {i386 Options}{79}
-\entry {IBM RS/6000 and PowerPC Options}{66}
-\entry {IBM RT options}{74}
-\entry {IBM RT PC}{199}
-\entry {identifier names, dollar signs in}{158}
-\entry {identifiers, names in assembler code}{171}
-\entry {identifying source, compiler (88k)}{63}
-\entry {\code {IEEE{\_}FLOAT{\_}FORMAT}}{368}
-\entry {\code {if{\_}then{\_}else}}{269}
-\entry {\code {if{\_}then{\_}else} and attributes}{342}
-\entry {\code {if{\_}then{\_}else} usage}{273}
-\entry {\code {immediate{\_}operand}}{294}
-\entry {\code {IMMEDIATE{\_}PREFIX}}{448}
-\entry {implicit argument: return value}{179}
-\entry {\code {IMPLICIT{\_}FIX{\_}EXPR}}{462}
-\entry {implied \code {#pragma implementation}}{182}
-\entry {\code {in{\_}data}}{428}
-\entry {\code {in{\_}struct}}{253}
-\entry {\code {in{\_}struct}, in \code {code{\_}label}}{252}
-\entry {\code {in{\_}struct}, in \code {insn}}{252, 253}
-\entry {\code {in{\_}struct}, in \code {label{\_}ref}}{252}
-\entry {\code {in{\_}struct}, in \code {mem}}{250}
-\entry {\code {in{\_}struct}, in \code {reg}}{251}
-\entry {\code {in{\_}struct}, in \code {subreg}}{251}
-\entry {\code {in{\_}text}}{428}
-\entry {include files and VMS}{229}
-\entry {\code {INCLUDE{\_}DEFAULTS}}{358}
-\entry {inclusive-or, bitwise}{267}
-\entry {\code {INCOMING{\_}REGNO}}{373}
-\entry {incompatibilities of GNU CC}{201}
-\entry {increment operators}{215}
-\entry {\code {INDEX{\_}REG{\_}CLASS}}{380}
-\entry {\code {indirect{\_}jump} instruction pattern}{324}
-\entry {\code {INIT{\_}CUMULATIVE{\_}ARGS}}{396}
-\entry {\code {INIT{\_}CUMULATIVE{\_}INCOMING{\_}ARGS}}{396}
-\entry {\code {INIT{\_}ENVIRONMENT}}{357}
-\entry {\code {INIT{\_}SECTION{\_}ASM{\_}OP}}{428, 444}
-\entry {\code {INIT{\_}TARGET{\_}OPTABS}}{416}
-\entry {\code {INITIAL{\_}ELIMINATION{\_}OFFSET}}{391}
-\entry {\code {INITIAL{\_}FRAME{\_}POINTER{\_}OFFSET}}{390}
-\entry {initialization routines}{442}
-\entry {initializations in expressions}{148}
-\entry {\code {INITIALIZE{\_}TRAMPOLINE}}{413}
-\entry {initializers with labeled elements}{149}
-\entry {initializers, non-constant}{148}
-\entry {\code {inline} automatic for C{\tt\char43}{\tt\char43} member fns}{166}
-\entry {inline functions}{166}
-\entry {inline functions, omission of}{166}
-\entry {inline, automatic}{240}
-\entry {inlining and C{\tt\char43}{\tt\char43} pragmas}{183}
-\entry {\code {insn}}{280}
-\entry {\code {insn} and \samp {/i}}{253}
-\entry {\code {insn} and \samp {/s}}{252}
-\entry {\code {insn} and \samp {/u}}{252}
-\entry {insn attributes}{340}
-\entry {insn canonicalization}{330}
-\entry {insn lengths, computing}{347}
-\entry {insn splitting}{338}
-\entry {\code {insn-attr.h}}{341}
-\entry {\code {INSN{\_}ANNULLED{\_}BRANCH{\_}P}}{252}
-\entry {\code {INSN{\_}CACHE{\_}DEPTH}}{414}
-\entry {\code {INSN{\_}CACHE{\_}LINE{\_}WIDTH}}{413}
-\entry {\code {INSN{\_}CACHE{\_}SIZE}}{413}
-\entry {\code {INSN{\_}CLOBBERS{\_}REGNO{\_}P}}{378}
-\entry {\code {INSN{\_}CODE}}{283}
-\entry {\code {INSN{\_}DELETED{\_}P}}{252}
-\entry {\code {INSN{\_}FROM{\_}TARGET{\_}P}}{252}
-\entry {\code {insn{\_}list}}{287}
-\entry {\code {INSN{\_}REFERENCES{\_}ARE{\_}DELAYED}}{467}
-\entry {\code {INSN{\_}SETS{\_}ARE{\_}DELAYED}}{467}
-\entry {\code {INSN{\_}UID}}{279}
-\entry {insns}{279}
-\entry {insns, generating}{293}
-\entry {insns, recognizing}{293}
-\entry {\code {INSTALL}}{475}
-\entry {installation trouble}{189}
-\entry {installing GNU CC}{97}
-\entry {installing GNU CC on the Sun}{127}
-\entry {installing GNU CC on VMS}{128}
-\entry {instruction attributes}{340}
-\entry {instruction combination}{242}
-\entry {instruction patterns}{291}
-\entry {instruction recognizer}{244}
-\entry {instruction scheduling}{242, 243}
-\entry {instruction splitting}{338}
-\entry {\code {insv} instruction pattern}{320}
-\entry {\code {INT{\_}TYPE{\_}SIZE}}{369}
-\entry {\code {INTEGRATE{\_}THRESHOLD}}{465}
-\entry {\code {integrated}}{254}
-\entry {\code {integrated}, in \code {insn}}{251}
-\entry {\code {integrated}, in \code {reg}}{251}
-\entry {integrating function code}{166}
-\entry {Intel 386 Options}{79}
-\entry {Interdependence of Patterns}{327}
-\entry {interface and implementation headers, C{\tt\char43}{\tt\char43}}{181}
-\entry {interfacing to GNU CC output}{237}
-\entry {intermediate C version, nonexistent}{7}
-\entry {interrupt handler functions on the H8/300 processors}{156}
-\entry {\code {INTIFY}}{417}
-\entry {invalid assembly code}{215}
-\entry {invalid input}{216}
-\entry {\code {INVOKE{\_}{\_}main}}{444}
-\entry {invoking \code {g{\tt\char43}{\tt\char43}}}{16}
-\entry {\code {ior}}{267}
-\entry {\code {ior} and attributes}{342}
-\entry {\code {ior}, canonicalization of}{331}
-\entry {\code {ior\var {m}3} instruction pattern}{317}
-\entry {\code {IS{\_}ASM{\_}LOGICAL{\_}LINE{\_}SEPARATOR}}{435}
-\entry {\code {isinf}}{459}
-\entry {\code {isnan}}{460}
-\initial {J}
-\entry {jump instruction patterns}{328}
-\entry {jump instructions and \code {set}}{273}
-\entry {jump optimization}{241}
-\entry {jump threading}{241}
-\entry {\code {jump{\_}insn}}{280}
-\entry {\code {JUMP{\_}LABEL}}{280}
-\entry {\code {JUMP{\_}TABLES{\_}IN{\_}TEXT{\_}SECTION}}{429}
-\initial {K}
-\entry {kernel and user registers (29k)}{60}
-\entry {keywords, alternate}{174}
-\entry {known causes of trouble}{189}
-\initial {L}
-\entry {\code {LABEL{\_}NUSES}}{281}
-\entry {\code {LABEL{\_}OUTSIDE{\_}LOOP{\_}P}}{252}
-\entry {\code {LABEL{\_}PRESERVE{\_}P}}{252}
-\entry {\code {label{\_}ref}}{259}
-\entry {\code {label{\_}ref} and \samp {/s}}{252}
-\entry {\code {label{\_}ref}, RTL sharing}{289}
-\entry {labeled elements in initializers}{149}
-\entry {labels as values}{137}
-\entry {\code {labs}}{18}
-\entry {language dialect options}{17}
-\entry {large bit shifts (88k)}{66}
-\entry {large return values}{399}
-\entry {\code {LAST{\_}STACK{\_}REG}}{377}
-\entry {\code {LAST{\_}VIRTUAL{\_}REGISTER}}{261}
-\entry {\code {LD{\_}FINI{\_}SWITCH}}{444}
-\entry {\code {LD{\_}INIT{\_}SWITCH}}{444}
-\entry {\code {LDD{\_}SUFFIX}}{445}
-\entry {\code {ldexp}}{459}
-\entry {\code {le}}{269}
-\entry {\code {le} and attributes}{342}
-\entry {leaf functions}{376}
-\entry {\code {leaf{\_}function}}{377}
-\entry {\code {leaf{\_}function{\_}p}}{323}
-\entry {\code {LEAF{\_}REG{\_}REMAP}}{376}
-\entry {\code {LEAF{\_}REGISTERS}}{376}
-\entry {left rotate}{267}
-\entry {left shift}{267}
-\entry {\code {LEGITIMATE{\_}CONSTANT{\_}P}}{421}
-\entry {\code {LEGITIMATE{\_}PIC{\_}OPERAND{\_}P}}{431}
-\entry {\code {LEGITIMIZE{\_}ADDRESS}}{420}
-\entry {length-zero arrays}{145}
-\entry {less than}{269}
-\entry {less than or equal}{269}
-\entry {\code {leu}}{269}
-\entry {\code {leu} and attributes}{342}
-\entry {\code {LIB{\_}SPEC}}{355}
-\entry {\code {LIB2FUNCS{\_}EXTRA}}{473}
-\entry {\code {LIBCALL{\_}VALUE}}{398}
-\entry {\file {libgcc.a}}{414}
-\entry {\code {LIBGCC{\_}NEEDS{\_}DOUBLE}}{416}
-\entry {\code {LIBGCC{\_}SPEC}}{355}
-\entry {\code {LIBGCC1}}{473}
-\entry {\code {LIBGCC2{\_}CFLAGS}}{473}
-\entry {\code {LIBGCC2{\_}WORDS{\_}BIG{\_}ENDIAN}}{362}
-\entry {Libraries}{48}
-\entry {library subroutine names}{414}
-\entry {\code {LIBRARY{\_}PATH}}{93}
-\entry {\code {LIMIT{\_}RELOAD{\_}CLASS}}{381}
-\entry {link options}{47}
-\entry {\code {LINK{\_}LIBGCC{\_}SPECIAL}}{356}
-\entry {\code {LINK{\_}LIBGCC{\_}SPECIAL{\_}1}}{356}
-\entry {\code {LINK{\_}SPEC}}{355}
-\entry {\code {lo{\_}sum}}{265}
-\entry {load address instruction}{303}
-\entry {\code {LOAD{\_}EXTEND{\_}OP}}{462}
-\entry {\code {load{\_}multiple} instruction pattern}{316}
-\entry {local labels}{136}
-\entry {local register allocation}{243}
-\entry {local variables in macros}{141}
-\entry {local variables, specifying registers}{174}
-\entry {\code {LOCAL{\_}INCLUDE{\_}DIR}}{357}
-\entry {\code {LOCAL{\_}LABEL{\_}PREFIX}}{448}
-\entry {\code {LOG{\_}LINKS}}{283}
-\entry {logical-and, bitwise}{267}
-\entry {\code {long long} data types}{144}
-\entry {\code {LONG{\_}DOUBLE{\_}TYPE{\_}SIZE}}{370}
-\entry {\code {LONG{\_}LONG{\_}TYPE{\_}SIZE}}{369}
-\entry {\code {LONG{\_}TYPE{\_}SIZE}}{369}
-\entry {\code {longjmp}}{173}
-\entry {\code {longjmp} and automatic variables}{19, 237}
-\entry {\code {longjmp} incompatibilities}{202}
-\entry {\code {longjmp} warnings}{30}
-\entry {\code {LONGJMP{\_}RESTORE{\_}FROM{\_}STACK}}{391}
-\entry {loop optimization}{241}
-\entry {\code {lshiftrt}}{267}
-\entry {\code {lshiftrt} and attributes}{342}
-\entry {\code {lshr\var {m}3} instruction pattern}{318}
-\entry {\code {lt}}{269}
-\entry {\code {lt} and attributes}{342}
-\entry {\code {ltu}}{269}
-\entry {lvalues, generalized}{142}
-\initial {M}
-\entry {\samp {m} in constraint}{301}
-\entry {M680x0 options}{53}
-\entry {M88k options}{63}
-\entry {machine dependent options}{52}
-\entry {machine description macros}{353}
-\entry {machine descriptions}{291}
-\entry {machine mode conversions}{270}
-\entry {machine modes}{254}
-\entry {machine specific constraints}{308}
-\entry {\code {MACHINE{\_}DEPENDENT{\_}REORG}}{468}
-\entry {\code {MACHINE{\_}STATE{\_}RESTORE}}{408}
-\entry {\code {MACHINE{\_}STATE{\_}SAVE}}{408}
-\entry {macro with variable arguments}{146}
-\entry {macros containing \code {asm}}{170}
-\entry {macros, inline alternative}{166}
-\entry {macros, local labels}{136}
-\entry {macros, local variables in}{141}
-\entry {macros, statements in expressions}{135}
-\entry {macros, target description}{353}
-\entry {macros, types of arguments}{141}
-\entry {\code {main} and the exit status}{232}
-\entry {make}{46}
-\entry {\code {make{\_}safe{\_}from}}{337}
-\entry {makefile fragment}{473}
-\entry {\code {match{\_}dup}}{294}
-\entry {\code {match{\_}dup} and attributes}{347}
-\entry {\code {match{\_}op{\_}dup}}{296}
-\entry {\code {match{\_}operand}}{293}
-\entry {\code {match{\_}operand} and attributes}{342}
-\entry {\code {match{\_}operator}}{294}
-\entry {\code {match{\_}par{\_}dup}}{297}
-\entry {\code {match{\_}parallel}}{296}
-\entry {\code {match{\_}scratch}}{294}
-\entry {matching constraint}{303}
-\entry {matching operands}{298}
-\entry {math libraries}{238}
-\entry {math, in RTL}{265}
-\entry {\code {MAX{\_}BITS{\_}PER{\_}WORD}}{363}
-\entry {\code {MAX{\_}CHAR{\_}TYPE{\_}SIZE}}{369}
-\entry {\code {MAX{\_}FIXED{\_}MODE{\_}SIZE}}{367}
-\entry {\code {MAX{\_}INT{\_}TYPE{\_}SIZE}}{369}
-\entry {\code {MAX{\_}LONG{\_}TYPE{\_}SIZE}}{369}
-\entry {\code {MAX{\_}MOVE{\_}MAX}}{462}
-\entry {\code {MAX{\_}OFILE{\_}ALIGNMENT}}{365}
-\entry {\code {MAX{\_}REGS{\_}PER{\_}ADDRESS}}{419}
-\entry {\code {MAX{\_}WCHAR{\_}TYPE{\_}SIZE}}{371}
-\entry {maximum operator}{181}
-\entry {\code {MAYBE{\_}REG{\_}PARM{\_}STACK{\_}SPACE}}{392}
-\entry {\code {mcount}}{406}
-\entry {\code {MD{\_}CALL{\_}PROTOTYPES}}{471}
-\entry {\code {MD{\_}EXEC{\_}PREFIX}}{357}
-\entry {\code {MD{\_}STARTFILE{\_}PREFIX}}{357}
-\entry {\code {MD{\_}STARTFILE{\_}PREFIX{\_}1}}{357}
-\entry {\code {mem}}{265}
-\entry {\code {mem} and \samp {/s}}{250}
-\entry {\code {mem} and \samp {/u}}{251}
-\entry {\code {mem} and \samp {/v}}{250}
-\entry {\code {mem}, RTL sharing}{289}
-\entry {\code {MEM{\_}IN{\_}STRUCT{\_}P}}{250}
-\entry {\code {MEM{\_}VOLATILE{\_}P}}{250}
-\entry {member fns, automatically \code {inline}}{166}
-\entry {\code {memcmp}}{18}
-\entry {\code {memcpy}}{18}
-\entry {\code {memcpy}, implicit usage}{416}
-\entry {memory model (29k)}{60}
-\entry {memory reference, nonoffsettable}{305}
-\entry {memory references in constraints}{301}
-\entry {\code {MEMORY{\_}MOVE{\_}COST}}{426}
-\entry {\code {memset}, implicit usage}{416}
-\entry {messages, warning}{26}
-\entry {messages, warning and error}{214}
-\entry {middle-operands, omitted}{143}
-\entry {\code {MIN{\_}UNITS{\_}PER{\_}WORD}}{363}
-\entry {minimum operator}{181}
-\entry {\code {minus}}{265}
-\entry {\code {minus} and attributes}{342}
-\entry {\code {minus}, canonicalization of}{331}
-\entry {MIPS options}{75}
-\entry {misunderstandings in C{\tt\char43}{\tt\char43}}{208}
-\entry {\code {mktemp}, and constant strings}{201}
-\entry {\code {mod}}{266}
-\entry {\code {mod} and attributes}{342}
-\entry {\code {MODDI3{\_}LIBCALL}}{415}
-\entry {\code {mode} attribute}{160}
-\entry {mode classes}{256}
-\entry {\code {MODE{\_}CC}}{257}
-\entry {\code {MODE{\_}COMPLEX{\_}FLOAT}}{256}
-\entry {\code {MODE{\_}COMPLEX{\_}INT}}{256}
-\entry {\code {MODE{\_}FLOAT}}{256}
-\entry {\code {MODE{\_}FUNCTION}}{256}
-\entry {\code {MODE{\_}INT}}{256}
-\entry {\code {MODE{\_}PARTIAL{\_}INT}}{256}
-\entry {\code {MODE{\_}RANDOM}}{257}
-\entry {\code {MODES{\_}TIEABLE{\_}P}}{376}
-\entry {modifiers in constraints}{307}
-\entry {\code {mod\var {m}3} instruction pattern}{317}
-\entry {\code {MODSI3{\_}LIBCALL}}{415}
-\entry {\code {MOVE{\_}MAX}}{462}
-\entry {\code {MOVE{\_}RATIO}}{427}
-\entry {\code {mov\var {m}} instruction pattern}{314}
-\entry {\code {mov\var {mode}cc} instruction pattern}{320}
-\entry {\code {movstrict\var {m}} instruction pattern}{316}
-\entry {\code {movstr\var {m}} instruction pattern}{318}
-\entry {\code {MULDI3{\_}LIBCALL}}{415}
-\entry {\code {mulhisi3} instruction pattern}{317}
-\entry {\code {mul\var {m}3} instruction pattern}{317}
-\entry {\code {mulqihi3} instruction pattern}{317}
-\entry {\code {MULSI3{\_}LIBCALL}}{414}
-\entry {\code {mulsidi3} instruction pattern}{317}
-\entry {\code {mult}}{266}
-\entry {\code {mult} and attributes}{342}
-\entry {\code {mult}, canonicalization of}{331}
-\entry {\code {MULTIBYTE{\_}CHARS}}{470}
-\entry {\code {MULTILIB{\_}DEFAULTS}}{356}
-\entry {\code {MULTILIB{\_}DIRNAMES}}{474}
-\entry {\code {MULTILIB{\_}EXCEPTIONS}}{474}
-\entry {\code {MULTILIB{\_}MATCHES}}{474}
-\entry {\code {MULTILIB{\_}OPTIONS}}{473}
-\entry {multiple alternative constraints}{305}
-\entry {multiplication}{266}
-\entry {multiprecision arithmetic}{144}
-\entry {\code {MUST{\_}PASS{\_}IN{\_}STACK}, and \code {FUNCTION{\_}ARG}}{395}
-\initial {N}
-\entry {\samp {n} in constraint}{302}
-\entry {\code {N{\_}REG{\_}CLASSES}}{380}
-\entry {name augmentation}{232}
-\entry {named patterns and conditions}{291}
-\entry {named return value in C{\tt\char43}{\tt\char43}}{179}
-\entry {names used in assembler code}{171}
-\entry {names, pattern}{314}
-\entry {naming convention, implementation headers}{182}
-\entry {naming types}{141}
-\entry {\code {ne}}{269}
-\entry {\code {ne} and attributes}{342}
-\entry {\code {neg}}{266}
-\entry {\code {neg} and attributes}{342}
-\entry {\code {neg}, canonicalization of}{331}
-\entry {\code {neg\var {m}2} instruction pattern}{318}
-\entry {nested functions}{137}
-\entry {nested functions, trampolines for}{412}
-\entry {newline vs string constants}{20}
-\entry {\code {next{\_}cc0{\_}user}}{329}
-\entry {\code {NEXT{\_}INSN}}{279}
-\entry {\code {NEXT{\_}OBJC{\_}RUNTIME}}{418}
-\entry {nil}{248}
-\entry {no constraints}{314}
-\entry {no-op move instructions}{243}
-\entry {\code {NO{\_}BUILTIN{\_}PTRDIFF{\_}TYPE}}{354}
-\entry {\code {NO{\_}BUILTIN{\_}SIZE{\_}TYPE}}{354}
-\entry {\code {NO{\_}DBX{\_}FUNCTION{\_}END}}{456}
-\entry {\code {NO{\_}DOLLAR{\_}IN{\_}LABEL}}{467}
-\entry {\code {NO{\_}DOT{\_}IN{\_}LABEL}}{467}
-\entry {\code {NO{\_}FUNCTION{\_}CSE}}{427}
-\entry {\code {NO{\_}IMPLICIT{\_}EXTERN{\_}C}}{466}
-\entry {\code {NO{\_}MD{\_}PROTOTYPES}}{471}
-\entry {\code {NO{\_}RECURSIVE{\_}FUNCTION{\_}CSE}}{427}
-\entry {\code {NO{\_}REGS}}{379}
-\entry {\code {NO{\_}STAB{\_}H}}{471}
-\entry {\code {NO{\_}SYS{\_}SIGLIST}}{471}
-\entry {\code {nocommon} attribute}{161}
-\entry {non-constant initializers}{148}
-\entry {non-static inline function}{167}
-\entry {\code {NON{\_}SAVING{\_}SETJMP}}{373}
-\entry {\code {nongcc{\_}SI{\_}type}}{417}
-\entry {\code {nongcc{\_}word{\_}type}}{417}
-\entry {nonoffsettable memory reference}{305}
-\entry {\code {nop} instruction pattern}{324}
-\entry {\code {noreturn} function attribute}{151}
-\entry {\code {not}}{267}
-\entry {\code {not} and attributes}{342}
-\entry {not equal}{269}
-\entry {not using constraints}{314}
-\entry {\code {not}, canonicalization of}{331}
-\entry {\code {note}}{281}
-\entry {\code {NOTE{\_}INSN{\_}BLOCK{\_}BEG}}{281}
-\entry {\code {NOTE{\_}INSN{\_}BLOCK{\_}END}}{281}
-\entry {\code {NOTE{\_}INSN{\_}DELETED}}{281}
-\entry {\code {NOTE{\_}INSN{\_}FUNCTION{\_}END}}{282}
-\entry {\code {NOTE{\_}INSN{\_}LOOP{\_}BEG}}{282}
-\entry {\code {NOTE{\_}INSN{\_}LOOP{\_}CONT}}{282}
-\entry {\code {NOTE{\_}INSN{\_}LOOP{\_}END}}{282}
-\entry {\code {NOTE{\_}INSN{\_}LOOP{\_}VTOP}}{282}
-\entry {\code {NOTE{\_}INSN{\_}SETJMP}}{282}
-\entry {\code {NOTE{\_}LINE{\_}NUMBER}}{281}
-\entry {\code {NOTE{\_}SOURCE{\_}FILE}}{281}
-\entry {\code {NOTICE{\_}UPDATE{\_}CC}}{422}
-\entry {\code {NUM{\_}MACHINE{\_}MODES}}{257}
-\initial {O}
-\entry {\samp {o} in constraint}{301}
-\entry {\code {OBJC{\_}GEN{\_}METHOD{\_}LABEL}}{441}
-\entry {\code {OBJC{\_}INCLUDE{\_}PATH}}{93}
-\entry {\code {OBJC{\_}INT{\_}SELECTORS}}{371}
-\entry {\code {OBJC{\_}PROLOGUE}}{433}
-\entry {\code {OBJC{\_}SELECTORS{\_}WITHOUT{\_}LABELS}}{371}
-\entry {\code {OBJECT{\_}FORMAT{\_}COFF}}{445}
-\entry {\code {OBJECT{\_}FORMAT{\_}ROSE}}{445}
-\entry {\code {OBJECT{\_}SUFFIX}}{472}
-\entry {Objective C}{7}
-\entry {\code {OBSTACK{\_}CHUNK{\_}ALLOC}}{470}
-\entry {\code {OBSTACK{\_}CHUNK{\_}FREE}}{470}
-\entry {\code {OBSTACK{\_}CHUNK{\_}SIZE}}{470}
-\entry {\code {obstack{\_}free}}{113}
-\entry {OCS (88k)}{63}
-\entry {offsettable address}{301}
-\entry {old-style function definitions}{157}
-\entry {\code {OLDAR}}{475}
-\entry {\code {OLDCC}}{475}
-\entry {omitted middle-operands}{143}
-\entry {\code {one{\_}cmpl\var {m}2} instruction pattern}{318}
-\entry {\code {ONLY{\_}INT{\_}FIELDS}}{470}
-\entry {open coding}{166}
-\entry {operand access}{248}
-\entry {operand constraints}{301}
-\entry {operand substitution}{298}
-\entry {\code {operands}}{292}
-\entry {\code {OPTIMIZATION{\_}OPTIONS}}{361}
-\entry {optimize options}{39}
-\entry {optional hardware or system features}{360}
-\entry {options to control warnings}{26}
-\entry {options, C{\tt\char43}{\tt\char43}}{21}
-\entry {options, code generation}{88}
-\entry {options, debugging}{33}
-\entry {options, dialect}{17}
-\entry {options, directory search}{50}
-\entry {options, GNU CC command}{9}
-\entry {options, grouping}{9}
-\entry {options, linking}{47}
-\entry {options, optimization}{39}
-\entry {options, order}{9}
-\entry {options, preprocessor}{44}
-\entry {order of evaluation, side effects}{213}
-\entry {order of options}{9}
-\entry {order of register allocation}{374}
-\entry {\code {ORDER{\_}REGS{\_}FOR{\_}LOCAL{\_}ALLOC}}{374}
-\entry {Ordering of Patterns}{327}
-\entry {other directory, compilation in}{121}
-\entry {\code {OUTGOING{\_}REG{\_}PARM{\_}STACK{\_}SPACE}}{393}
-\entry {\code {OUTGOING{\_}REGNO}}{373}
-\entry {output file option}{16}
-\entry {output of assembler code}{431}
-\entry {output statements}{299}
-\entry {output templates}{298}
-\entry {\code {output{\_}addr{\_}const}}{434}
-\entry {\code {output{\_}asm{\_}insn}}{300}
-\entry {overflow while constant folding}{460}
-\entry {\code {OVERLAPPING{\_}REGNO{\_}P}}{377}
-\entry {overloaded virtual fn, warning}{32}
-\entry {\code {OVERRIDE{\_}OPTIONS}}{361}
-\initial {P}
-\entry {\samp {p} in constraint}{303}
-\entry {\code {packed} attribute}{161}
-\entry {\code {parallel}}{275}
-\entry {parameter forward declaration}{146}
-\entry {parameters, miscellaneous}{461}
-\entry {\code {PARM{\_}BOUNDARY}}{364}
-\entry {\code {PARSE{\_}LDD{\_}OUTPUT}}{445}
-\entry {parser generator, Bison}{101}
-\entry {parsing pass}{239}
-\entry {passes and files of the compiler}{239}
-\entry {passing arguments}{237}
-\entry {\code {PATH{\_}SEPARATOR}}{472}
-\entry {\code {PATTERN}}{282}
-\entry {pattern conditions}{291}
-\entry {pattern names}{314}
-\entry {Pattern Ordering}{327}
-\entry {patterns}{291}
-\entry {\code {pc}}{264}
-\entry {\code {pc} and attributes}{347}
-\entry {\code {pc}, RTL sharing}{289}
-\entry {\code {pc{\_}rtx}}{264}
-\entry {\code {PCC{\_}BITFIELD{\_}TYPE{\_}MATTERS}}{366}
-\entry {\code {PCC{\_}STATIC{\_}STRUCT{\_}RETURN}}{400}
-\entry {\code {PDImode}}{255}
-\entry {peephole optimization}{244}
-\entry {peephole optimization, RTL representation}{276}
-\entry {peephole optimizer definitions}{332}
-\entry {percent sign}{298}
-\entry {\code {perform{\_}\dots {}}}{418}
-\entry {PIC}{90, 430}
-\entry {\code {PIC{\_}OFFSET{\_}TABLE{\_}REG{\_}CALL{\_}CLOBBERED}}{430}
-\entry {\code {PIC{\_}OFFSET{\_}TABLE{\_}REGNUM}}{430}
-\entry {\code {plus}}{265}
-\entry {\code {plus} and attributes}{342}
-\entry {\code {plus}, canonicalization of}{331}
-\entry {\code {Pmode}}{465}
-\entry {pointer arguments}{153}
-\entry {\code {POINTER{\_}SIZE}}{363}
-\entry {\code {POINTERS{\_}EXTEND{\_}UNSIGNED}}{363}
-\entry {\code {popen}}{471}
-\entry {portability}{235}
-\entry {portions of temporary objects, pointers to}{208}
-\entry {position independent code}{430}
-\entry {\code {POSIX}}{471}
-\entry {\code {post{\_}dec}}{277}
-\entry {\code {post{\_}inc}}{277}
-\entry {\code {pragma}}{466}
-\entry {pragma, reason for not using}{157}
-\entry {pragmas in C{\tt\char43}{\tt\char43}, effect on inlining}{183}
-\entry {pragmas, interface and implementation}{182}
-\entry {\code {pre{\_}dec}}{277}
-\entry {\code {pre{\_}inc}}{277}
-\entry {predefined macros}{359}
-\entry {\code {PREDICATE{\_}CODES}}{461}
-\entry {\code {PREFERRED{\_}DEBUGGING{\_}TYPE}}{452}
-\entry {\code {PREFERRED{\_}OUTPUT{\_}RELOAD{\_}CLASS}}{381}
-\entry {\code {PREFERRED{\_}RELOAD{\_}CLASS}}{381}
-\entry {preprocessing numbers}{204}
-\entry {preprocessing tokens}{204}
-\entry {preprocessor options}{44}
-\entry {\code {PRESERVE{\_}DEATH{\_}INFO{\_}REGNO{\_}P}}{378}
-\entry {\code {prev{\_}active{\_}insn}}{333}
-\entry {\code {prev{\_}cc0{\_}setter}}{329}
-\entry {\code {PREV{\_}INSN}}{279}
-\entry {\code {PRINT{\_}OPERAND}}{447}
-\entry {\code {PRINT{\_}OPERAND{\_}ADDRESS}}{448}
-\entry {\code {PRINT{\_}OPERAND{\_}PUNCT{\_}VALID{\_}P}}{447}
-\entry {\code {probe} instruction pattern}{326}
-\entry {processor selection (29k)}{60}
-\entry {product}{266}
-\entry {\code {prof}}{35}
-\entry {\code {PROFILE{\_}BEFORE{\_}PROLOGUE}}{406}
-\entry {\code {profile{\_}block{\_}flag}}{406, 407, 408}
-\entry {profiling, code generation}{405}
-\entry {program counter}{264}
-\entry {prologue}{401}
-\entry {\code {PROMOTE{\_}FOR{\_}CALL{\_}ONLY}}{364}
-\entry {\code {PROMOTE{\_}FUNCTION{\_}ARGS}}{364}
-\entry {\code {PROMOTE{\_}FUNCTION{\_}RETURN}}{364}
-\entry {\code {PROMOTE{\_}MODE}}{363}
-\entry {\code {PROMOTE{\_}PROTOTYPES}}{391}
-\entry {promotion of formal parameters}{157}
-\entry {pseudo registers}{260}
-\entry {\code {PSImode}}{255}
-\entry {\code {PTRDIFF{\_}TYPE}}{370}
-\entry {push address instruction}{303}
-\entry {\code {PUSH{\_}ROUNDING}}{391}
-\entry {\code {PUSH{\_}ROUNDING}, interaction with \code {STACK{\_}BOUNDARY}}{364}
-\entry {\code {PUT{\_}CODE}}{247}
-\entry {\code {PUT{\_}MODE}}{257}
-\entry {\code {PUT{\_}REG{\_}NOTE{\_}KIND}}{284}
-\entry {\code {PUT{\_}SDB{\_}\dots {}}}{457}
-\entry {\code {putenv}}{471}
-\initial {Q}
-\entry {\samp {Q}, in constraint}{303}
-\entry {\code {QImode}}{255}
-\entry {\code {QImode}, in \code {insn}}{282}
-\entry {\code {qsort}, and global register variables}{173}
-\entry {question mark}{306}
-\entry {quotient}{266}
-\initial {R}
-\entry {\samp {r} in constraint}{301}
-\entry {r0-relative references (88k)}{64}
-\entry {ranges in case statements}{150}
-\entry {read-only strings}{201}
-\entry {\code {READONLY{\_}DATA{\_}SECTION}}{429}
-\entry {\code {REAL{\_}ARITHMETIC}}{460}
-\entry {\code {REAL{\_}INFINITY}}{459}
-\entry {\code {REAL{\_}NM{\_}FILE{\_}NAME}}{445}
-\entry {\code {REAL{\_}VALUE{\_}ATOF}}{459}
-\entry {\code {REAL{\_}VALUE{\_}FIX}}{459}
-\entry {\code {REAL{\_}VALUE{\_}FROM{\_}INT}}{461}
-\entry {\code {REAL{\_}VALUE{\_}ISINF}}{459}
-\entry {\code {REAL{\_}VALUE{\_}ISNAN}}{460}
-\entry {\code {REAL{\_}VALUE{\_}LDEXP}}{459}
-\entry {\code {REAL{\_}VALUE{\_}NEGATE}}{460}
-\entry {\code {REAL{\_}VALUE{\_}RNDZINT}}{459}
-\entry {\code {REAL{\_}VALUE{\_}TO{\_}DECIMAL}}{436}
-\entry {\code {REAL{\_}VALUE{\_}TO{\_}INT}}{460}
-\entry {\code {REAL{\_}VALUE{\_}TO{\_}TARGET{\_}DOUBLE}}{435}
-\entry {\code {REAL{\_}VALUE{\_}TO{\_}TARGET{\_}LONG{\_}DOUBLE}}{435}
-\entry {\code {REAL{\_}VALUE{\_}TO{\_}TARGET{\_}SINGLE}}{435}
-\entry {\code {REAL{\_}VALUE{\_}TRUNCATE}}{460}
-\entry {\code {REAL{\_}VALUE{\_}TYPE}}{458}
-\entry {\code {REAL{\_}VALUE{\_}UNSIGNED{\_}FIX}}{459}
-\entry {\code {REAL{\_}VALUE{\_}UNSIGNED{\_}RNDZINT}}{459}
-\entry {\code {REAL{\_}VALUES{\_}EQUAL}}{458}
-\entry {\code {REAL{\_}VALUES{\_}LESS}}{459}
-\entry {\code {recog{\_}operand}}{446}
-\entry {recognizing insns}{293}
-\entry {\code {reg}}{260}
-\entry {\code {reg} and \samp {/i}}{251}
-\entry {\code {reg} and \samp {/s}}{251}
-\entry {\code {reg} and \samp {/u}}{251}
-\entry {\code {reg} and \samp {/v}}{251}
-\entry {\code {reg}, RTL sharing}{289}
-\entry {\code {REG{\_}ALLOC{\_}ORDER}}{374}
-\entry {\code {REG{\_}CC{\_}SETTER}}{287}
-\entry {\code {REG{\_}CC{\_}USER}}{287}
-\entry {\code {REG{\_}CLASS{\_}CONTENTS}}{380}
-\entry {\code {REG{\_}CLASS{\_}FROM{\_}LETTER}}{380}
-\entry {\code {REG{\_}CLASS{\_}NAMES}}{380}
-\entry {\code {REG{\_}DEAD}}{284}
-\entry {\code {REG{\_}DEP{\_}ANTI}}{287}
-\entry {\code {REG{\_}DEP{\_}OUTPUT}}{287}
-\entry {\code {REG{\_}EQUAL}}{285}
-\entry {\code {REG{\_}EQUIV}}{285}
-\entry {\code {REG{\_}FUNCTION{\_}VALUE{\_}P}}{251}
-\entry {\code {REG{\_}INC}}{284}
-\entry {\code {REG{\_}LABEL}}{285}
-\entry {\code {REG{\_}LIBCALL}}{287}
-\entry {\code {REG{\_}LOOP{\_}TEST{\_}P}}{251}
-\entry {\code {reg{\_}names}}{447}
-\entry {\code {REG{\_}NO{\_}CONFLICT}}{284}
-\entry {\code {REG{\_}NONNEG}}{284}
-\entry {\code {REG{\_}NOTE{\_}KIND}}{284}
-\entry {\code {REG{\_}NOTES}}{283}
-\entry {\code {REG{\_}OK{\_}FOR{\_}BASE{\_}P}}{420}
-\entry {\code {REG{\_}OK{\_}FOR{\_}INDEX{\_}P}}{420}
-\entry {\code {REG{\_}OK{\_}STRICT}}{419}
-\entry {\code {REG{\_}PARM{\_}STACK{\_}SPACE}}{392}
-\entry {\code {REG{\_}PARM{\_}STACK{\_}SPACE}, and \code {FUNCTION{\_}ARG}}{395}
-\entry {\code {REG{\_}RETVAL}}{286}
-\entry {\code {REG{\_}UNUSED}}{286}
-\entry {\code {REG{\_}USERVAR{\_}P}}{251}
-\entry {\code {REG{\_}WAS{\_}0}}{286}
-\entry {register allocation}{243}
-\entry {register allocation order}{374}
-\entry {register allocation, stupid}{242}
-\entry {register class definitions}{378}
-\entry {register class preference constraints}{306}
-\entry {register class preference pass}{242}
-\entry {register pairs}{375}
-\entry {register positions in frame (88k)}{63, 64}
-\entry {Register Transfer Language (RTL)}{247}
-\entry {register usage}{372}
-\entry {register use analysis}{241}
-\entry {register variable after \code {longjmp}}{173}
-\entry {register-to-stack conversion}{244}
-\entry {\code {REGISTER{\_}MOVE{\_}COST}}{425}
-\entry {\code {REGISTER{\_}NAMES}}{446}
-\entry {\code {register{\_}operand}}{294}
-\entry {\code {REGISTER{\_}PREFIX}}{448}
-\entry {registers}{167}
-\entry {registers arguments}{394}
-\entry {registers for local variables}{174}
-\entry {registers in constraints}{301}
-\entry {registers, global allocation}{172}
-\entry {registers, global variables in}{172}
-\entry {\code {REGNO{\_}OK{\_}FOR{\_}BASE{\_}P}}{381}
-\entry {\code {REGNO{\_}OK{\_}FOR{\_}INDEX{\_}P}}{381}
-\entry {\code {REGNO{\_}REG{\_}CLASS}}{380}
-\entry {\code {regs{\_}ever{\_}live}}{402}
-\entry {relative costs}{424}
-\entry {\code {RELATIVE{\_}PREFIX{\_}NOT{\_}LINKDIR}}{357}
-\entry {reload pass}{263}
-\entry {\code {reload{\_}completed}}{323}
-\entry {\code {reload{\_}in} instruction pattern}{316}
-\entry {\code {reload{\_}in{\_}progress}}{315}
-\entry {\code {reload{\_}out} instruction pattern}{316}
-\entry {reloading}{243}
-\entry {remainder}{266}
-\entry {reordering, warning}{29}
-\entry {reporting bugs}{215}
-\entry {representation of RTL}{247}
-\entry {rest argument (in macro)}{146}
-\entry {\code {rest{\_}of{\_}compilation}}{239}
-\entry {\code {rest{\_}of{\_}decl{\_}compilation}}{239}
-\entry {\code {restore{\_}stack{\_}block} instruction pattern}{325}
-\entry {\code {restore{\_}stack{\_}function} instruction pattern}{325}
-\entry {\code {restore{\_}stack{\_}nonlocal} instruction pattern}{325}
-\entry {\code {return}}{273}
-\entry {\code {return} instruction pattern}{323}
-\entry {return value of \code {main}}{232}
-\entry {return value, named, in C{\tt\char43}{\tt\char43}}{179}
-\entry {return values in registers}{398}
-\entry {\code {return}, in C{\tt\char43}{\tt\char43} function header}{179}
-\entry {\code {RETURN{\_}ADDR{\_}IN{\_}PREVIOUS{\_}FRAME}}{388}
-\entry {\code {RETURN{\_}ADDR{\_}RTX}}{387}
-\entry {\code {RETURN{\_}ADDRESS{\_}POINTER{\_}REGNUM}}{389}
-\entry {\code {RETURN{\_}IN{\_}MEMORY}}{399}
-\entry {\code {RETURN{\_}POPS{\_}ARGS}}{393}
-\entry {returning aggregate values}{399}
-\entry {returning structures and unions}{237}
-\entry {\code {REVERSIBLE{\_}CC{\_}MODE}}{423}
-\entry {right rotate}{267}
-\entry {right shift}{267}
-\entry {\code {rotate}}{267}
-\entry {\code {rotatert}}{267}
-\entry {\code {rotl\var {m}3} instruction pattern}{318}
-\entry {\code {rotr\var {m}3} instruction pattern}{318}
-\entry {\code {ROUND{\_}TYPE{\_}ALIGN}}{367}
-\entry {\code {ROUND{\_}TYPE{\_}SIZE}}{367}
-\entry {RS/6000 and PowerPC Options}{66}
-\entry {RT options}{74}
-\entry {RT PC}{199}
-\entry {RTL addition}{265}
-\entry {RTL comparison}{265}
-\entry {RTL comparison operations}{268}
-\entry {RTL constant expression types}{258}
-\entry {RTL constants}{258}
-\entry {RTL declarations}{272}
-\entry {RTL difference}{265}
-\entry {RTL expression}{247}
-\entry {RTL expressions for arithmetic}{265}
-\entry {RTL format}{248}
-\entry {RTL format characters}{248}
-\entry {RTL function-call insns}{287}
-\entry {RTL generation}{240}
-\entry {RTL insn template}{293}
-\entry {RTL integers}{247}
-\entry {RTL memory expressions}{260}
-\entry {RTL object types}{247}
-\entry {RTL postdecrement}{277}
-\entry {RTL postincrement}{277}
-\entry {RTL predecrement}{277}
-\entry {RTL preincrement}{277}
-\entry {RTL register expressions}{260}
-\entry {RTL representation}{247}
-\entry {RTL side effect expressions}{272}
-\entry {RTL strings}{247}
-\entry {RTL structure sharing assumptions}{288}
-\entry {RTL subtraction}{265}
-\entry {RTL sum}{265}
-\entry {RTL vectors}{247}
-\entry {RTX (See RTL)}{247}
-\entry {\code {RTX{\_}COSTS}}{424}
-\entry {\code {RTX{\_}INTEGRATED{\_}P}}{251}
-\entry {\code {RTX{\_}UNCHANGING{\_}P}}{251}
-\entry {run-time conventions}{237}
-\entry {run-time options}{88}
-\entry {run-time target specification}{359}
-\initial {S}
-\entry {\samp {s} in constraint}{302}
-\entry {\code {save{\_}stack{\_}block} instruction pattern}{325}
-\entry {\code {save{\_}stack{\_}function} instruction pattern}{325}
-\entry {\code {save{\_}stack{\_}nonlocal} instruction pattern}{325}
-\entry {\code {saveable{\_}obstack}}{420}
-\entry {scalars, returned as values}{398}
-\entry {\code {scanf}, and constant strings}{201}
-\entry {\code {SCCS{\_}DIRECTIVE}}{466}
-\entry {\code {SCHED{\_}GROUP{\_}P}}{253}
-\entry {scheduling, delayed branch}{243}
-\entry {scheduling, instruction}{242, 243}
-\entry {\code {SCmode}}{256}
-\entry {\code {s\var {cond}} instruction pattern}{321}
-\entry {scope of a variable length array}{145}
-\entry {scope of declaration}{206}
-\entry {scope of external declarations}{203}
-\entry {\code {scratch}}{263}
-\entry {scratch operands}{263}
-\entry {\code {scratch}, RTL sharing}{289}
-\entry {\code {SDB{\_}ALLOW{\_}FORWARD{\_}REFERENCES}}{458}
-\entry {\code {SDB{\_}ALLOW{\_}UNKNOWN{\_}REFERENCES}}{458}
-\entry {\code {SDB{\_}DEBUGGING{\_}INFO}}{457}
-\entry {\code {SDB{\_}DELIM}}{457}
-\entry {\code {SDB{\_}GENERATE{\_}FAKE}}{457}
-\entry {search path}{50}
-\entry {second include path}{45}
-\entry {\code {SECONDARY{\_}INPUT{\_}RELOAD{\_}CLASS}}{382}
-\entry {\code {SECONDARY{\_}MEMORY{\_}NEEDED}}{383}
-\entry {\code {SECONDARY{\_}MEMORY{\_}NEEDED{\_}MODE}}{383}
-\entry {\code {SECONDARY{\_}MEMORY{\_}NEEDED{\_}RTX}}{383}
-\entry {\code {SECONDARY{\_}OUTPUT{\_}RELOAD{\_}CLASS}}{382}
-\entry {\code {SECONDARY{\_}RELOAD{\_}CLASS}}{382}
-\entry {\code {section} function attribute}{154}
-\entry {\code {section} variable attribute}{161}
-\entry {\code {SELECT{\_}CC{\_}MODE}}{423}
-\entry {\code {SELECT{\_}RTX{\_}SECTION}}{429}
-\entry {\code {SELECT{\_}SECTION}}{429}
-\entry {separate directory, compilation in}{121}
-\entry {\code {sequence}}{276}
-\entry {sequential consistency on 88k}{64}
-\entry {\code {set}}{272}
-\entry {\code {set{\_}attr}}{345}
-\entry {\code {set{\_}attr{\_}alternative}}{345}
-\entry {\code {SET{\_}DEFAULT{\_}TYPE{\_}ATTRIBUTES}}{466}
-\entry {\code {SET{\_}DEST}}{273}
-\entry {\code {SET{\_}SRC}}{273}
-\entry {\code {setjmp}}{173}
-\entry {\code {setjmp} incompatibilities}{202}
-\entry {\code {SETUP{\_}FRAME{\_}ADDRESSES}}{387}
-\entry {\code {SETUP{\_}INCOMING{\_}VARARGS}}{411}
-\entry {\code {SFmode}}{255}
-\entry {shared strings}{201}
-\entry {shared VMS run time system}{232}
-\entry {\code {SHARED{\_}BSS{\_}SECTION{\_}ASM{\_}OP}}{428}
-\entry {\code {SHARED{\_}SECTION{\_}ASM{\_}OP}}{428}
-\entry {sharing of RTL components}{288}
-\entry {shift}{267}
-\entry {\code {SHIFT{\_}COUNT{\_}TRUNCATED}}{463}
-\entry {\code {SHORT{\_}TYPE{\_}SIZE}}{369}
-\entry {side effect in ?:}{143}
-\entry {side effects, macro argument}{135}
-\entry {side effects, order of evaluation}{213}
-\entry {\code {sign{\_}extend}}{270}
-\entry {\code {sign{\_}extract}}{270}
-\entry {\code {sign{\_}extract}, canonicalization of}{332}
-\entry {\code {signature}}{186}
-\entry {\code {signature} in C{\tt\char43}{\tt\char43}, advantages}{187}
-\entry {signature member function default implementation}{187}
-\entry {signatures, C{\tt\char43}{\tt\char43}}{186}
-\entry {signed and unsigned values, comparison warning}{29}
-\entry {signed division}{266}
-\entry {signed maximum}{266}
-\entry {signed minimum}{266}
-\entry {\code {SIGNED{\_}CHAR{\_}SPEC}}{354}
-\entry {\code {SImode}}{255}
-\entry {simple constraints}{301}
-\entry {simplifications, arithmetic}{239}
-\entry {\code {sin}}{18}
-\entry {\code {SIZE{\_}TYPE}}{370}
-\entry {\code {sizeof}}{141}
-\entry {\code {SLOW{\_}BYTE{\_}ACCESS}}{426}
-\entry {\code {SLOW{\_}UNALIGNED{\_}ACCESS}}{426}
-\entry {\code {SLOW{\_}ZERO{\_}EXTEND}}{426}
-\entry {\code {SMALL{\_}REGISTER{\_}CLASSES}}{384}
-\entry {smaller data references (88k)}{64}
-\entry {smaller data references (MIPS)}{78}
-\entry {smaller data references (PowerPC)}{74}
-\entry {\code {smax}}{266}
-\entry {\code {smax\var {m}3} instruction pattern}{317}
-\entry {\code {smin}}{266}
-\entry {\code {smin\var {m}3} instruction pattern}{317}
-\entry {\code {smul\var {m}3{\_}highpart} instruction pattern}{317}
-\entry {SPARC options}{55}
-\entry {specified registers}{172}
-\entry {specifying compiler version and target machine}{51}
-\entry {specifying hardware config}{52}
-\entry {specifying machine version}{51}
-\entry {specifying registers for local variables}{174}
-\entry {speed of instructions}{424}
-\entry {splitting instructions}{338}
-\entry {\code {sqrt}}{18, 267}
-\entry {\code {sqrt\var {m}2} instruction pattern}{318}
-\entry {square root}{267}
-\entry {\code {sscanf}, and constant strings}{201}
-\entry {stack arguments}{391}
-\entry {stack checks (29k)}{61}
-\entry {stack frame layout}{386}
-\entry {\code {STACK{\_}BOUNDARY}}{364}
-\entry {\code {STACK{\_}DYNAMIC{\_}OFFSET}}{387}
-\entry {\code {STACK{\_}DYNAMIC{\_}OFFSET} and virtual registers}{262}
-\entry {\code {STACK{\_}GROWS{\_}DOWNWARD}}{386}
-\entry {\code {STACK{\_}PARMS{\_}IN{\_}REG{\_}PARM{\_}AREA}}{393}
-\entry {\code {STACK{\_}POINTER{\_}OFFSET}}{387}
-\entry {\code {STACK{\_}POINTER{\_}OFFSET} and virtual registers}{262}
-\entry {\code {STACK{\_}POINTER{\_}REGNUM}}{388}
-\entry {\code {STACK{\_}POINTER{\_}REGNUM} and virtual registers}{262}
-\entry {\code {stack{\_}pointer{\_}rtx}}{389}
-\entry {\code {STACK{\_}REGS}}{377}
-\entry {stage1}{102}
-\entry {standard pattern names}{314}
-\entry {\code {STANDARD{\_}EXEC{\_}PREFIX}}{357}
-\entry {\code {STANDARD{\_}INCLUDE{\_}DIR}}{358}
-\entry {\code {STANDARD{\_}STARTFILE{\_}PREFIX}}{357}
-\entry {start files}{124}
-\entry {\code {STARTFILE{\_}SPEC}}{355}
-\entry {\code {STARTING{\_}FRAME{\_}OFFSET}}{386}
-\entry {\code {STARTING{\_}FRAME{\_}OFFSET} and virtual registers}{261}
-\entry {statements inside expressions}{135}
-\entry {static data in C{\tt\char43}{\tt\char43}, declaring and defining}{208}
-\entry {\code {STATIC{\_}CHAIN}}{389}
-\entry {\code {STATIC{\_}CHAIN{\_}INCOMING}}{389}
-\entry {\code {STATIC{\_}CHAIN{\_}INCOMING{\_}REGNUM}}{389}
-\entry {\code {STATIC{\_}CHAIN{\_}REGNUM}}{389}
-\entry {\file {stdarg.h} and register arguments}{394}
-\entry {\file {stdarg.h} and RT PC}{74}
-\entry {storage layout}{362}
-\entry {\code {STORE{\_}FLAG{\_}VALUE}}{463}
-\entry {\samp {store{\_}multiple} instruction pattern}{316}
-\entry {storem bug (29k)}{61}
-\entry {\code {strcmp}}{18}
-\entry {\code {strcpy}}{18, 365}
-\entry {strength-reduction}{241}
-\entry {\code {STRICT{\_}ALIGNMENT}}{366}
-\entry {\code {STRICT{\_}ARGUMENT{\_}NAMING}}{411}
-\entry {\code {strict{\_}low{\_}part}}{272}
-\entry {string constants}{201}
-\entry {string constants vs newline}{20}
-\entry {\code {STRIP{\_}NAME{\_}ENCODING}}{430}
-\entry {\code {strlen}}{18}
-\entry {\code {strlen\var {m}} instruction pattern}{319}
-\entry {\code {STRUCT{\_}VALUE}}{400}
-\entry {\code {STRUCT{\_}VALUE{\_}INCOMING}}{400}
-\entry {\code {STRUCT{\_}VALUE{\_}INCOMING{\_}REGNUM}}{400}
-\entry {\code {STRUCT{\_}VALUE{\_}REGNUM}}{400}
-\entry {structure passing (88k)}{66}
-\entry {structure value address}{399}
-\entry {\code {STRUCTURE{\_}SIZE{\_}BOUNDARY}}{365}
-\entry {structures}{204}
-\entry {structures, constructor expression}{148}
-\entry {structures, returning}{237}
-\entry {stupid register allocation}{242}
-\entry {\code {sub\var {m}3} instruction pattern}{317}
-\entry {submodel options}{52}
-\entry {\code {subreg}}{262}
-\entry {\code {subreg} and \samp {/s}}{251}
-\entry {\code {subreg} and \samp {/u}}{251}
-\entry {\code {subreg}, in \code {strict{\_}low{\_}part}}{272}
-\entry {\code {subreg}, special reload handling}{263}
-\entry {\code {SUBREG{\_}PROMOTED{\_}UNSIGNED{\_}P}}{251}
-\entry {\code {SUBREG{\_}PROMOTED{\_}VAR{\_}P}}{251}
-\entry {\code {SUBREG{\_}REG}}{263}
-\entry {\code {SUBREG{\_}WORD}}{263}
-\entry {subscripting}{147}
-\entry {subscripting and function values}{147}
-\entry {subtype polymorphism, C{\tt\char43}{\tt\char43}}{186}
-\entry {\code {SUCCESS{\_}EXIT{\_}CODE}}{469}
-\entry {suffixes for C{\tt\char43}{\tt\char43} source}{16}
-\entry {Sun installation}{127}
-\entry {\code {SUPPORTS{\_}WEAK}}{439}
-\entry {suppressing warnings}{26}
-\entry {surprises in C{\tt\char43}{\tt\char43}}{208}
-\entry {SVr4}{65}
-\entry {\code {SWITCH{\_}TAKES{\_}ARG}}{353}
-\entry {\code {SWITCHES{\_}NEED{\_}SPACES}}{353}
-\entry {\code {symbol{\_}ref}}{259}
-\entry {\code {symbol{\_}ref} and \samp {/u}}{252}
-\entry {\code {symbol{\_}ref} and \samp {/v}}{252}
-\entry {\code {symbol{\_}ref}, RTL sharing}{289}
-\entry {\code {SYMBOL{\_}REF{\_}FLAG}}{252}
-\entry {\code {SYMBOL{\_}REF{\_}FLAG}, in \code {ENCODE{\_}SECTION{\_}INFO}}{430}
-\entry {\code {SYMBOL{\_}REF{\_}USED}}{252}
-\entry {symbolic label}{289}
-\entry {syntax checking}{26}
-\entry {synthesized methods, warning}{33}
-\entry {\code {sys{\_}siglist}}{471}
-\entry {\code {SYSTEM{\_}INCLUDE{\_}DIR}}{358}
-\initial {T}
-\entry {\file {t-\var {target}}}{473}
-\entry {\code {tablejump} instruction pattern}{324}
-\entry {tagging insns}{344}
-\entry {tail recursion optimization}{240}
-\entry {target description macros}{353}
-\entry {target machine, specifying}{51}
-\entry {target makefile fragment}{473}
-\entry {target options}{51}
-\entry {target specifications}{359}
-\entry {target-parameter-dependent code}{240}
-\entry {\code {TARGET{\_}BELL}}{371}
-\entry {\code {TARGET{\_}BS}}{371}
-\entry {\code {TARGET{\_}CR}}{371}
-\entry {\code {TARGET{\_}EDOM}}{416}
-\entry {\code {TARGET{\_}FF}}{371}
-\entry {\code {TARGET{\_}FLOAT{\_}FORMAT}}{368}
-\entry {\code {TARGET{\_}MEM{\_}FUNCTIONS}}{416}
-\entry {\code {TARGET{\_}NEWLINE}}{371}
-\entry {\code {TARGET{\_}OPTIONS}}{360}
-\entry {\code {TARGET{\_}SWITCHES}}{360}
-\entry {\code {TARGET{\_}TAB}}{371}
-\entry {\code {TARGET{\_}VERSION}}{361}
-\entry {\code {TARGET{\_}VT}}{371}
-\entry {\code {TCmode}}{256}
-\entry {\code {tcov}}{35}
-\entry {template debugging}{29}
-\entry {template instantiation}{183}
-\entry {temporaries, lifetime of}{208}
-\entry {termination routines}{442}
-\entry {\code {text{\_}section}}{429}
-\entry {\code {TEXT{\_}SECTION{\_}ASM{\_}OP}}{428}
-\entry {\code {TFmode}}{255}
-\entry {thunks}{137}
-\entry {\code {TImode}}{255}
-\entry {\file {tm.h} macros}{353}
-\entry {\code {TMPDIR}}{92}
-\entry {top level of compiler}{239}
-\entry {traditional C language}{18}
-\entry {\code {TRADITIONAL{\_}RETURN{\_}FLOAT}}{398}
-\entry {\code {TRAMPOLINE{\_}ALIGNMENT}}{412}
-\entry {\code {TRAMPOLINE{\_}SECTION}}{412}
-\entry {\code {TRAMPOLINE{\_}SIZE}}{412}
-\entry {\code {TRAMPOLINE{\_}TEMPLATE}}{412}
-\entry {trampolines for nested functions}{412}
-\entry {\code {TRANSFER{\_}FROM{\_}TRAMPOLINE}}{414}
-\entry {\code {TRULY{\_}NOOP{\_}TRUNCATION}}{463}
-\entry {\code {truncate}}{271}
-\entry {\code {trunc\var {mn}} instruction pattern}{320}
-\entry {\code {tst\var {m}} instruction pattern}{318}
-\entry {type abstraction, C{\tt\char43}{\tt\char43}}{186}
-\entry {type alignment}{159}
-\entry {type attributes}{162}
-\entry {typedef names as function parameters}{203}
-\entry {\code {typeof}}{141}
-\initial {U}
-\entry {\code {udiv}}{266}
-\entry {\code {UDIVDI3{\_}LIBCALL}}{415}
-\entry {\code {udiv\var {m}3} instruction pattern}{317}
-\entry {\code {udivmod\var {m}4} instruction pattern}{317}
-\entry {\code {UDIVSI3{\_}LIBCALL}}{415}
-\entry {Ultrix calling convention}{199}
-\entry {\code {umax}}{267}
-\entry {\code {umax\var {m}3} instruction pattern}{317}
-\entry {\code {umin}}{267}
-\entry {\code {umin\var {m}3} instruction pattern}{317}
-\entry {\code {umod}}{266}
-\entry {\code {UMODDI3{\_}LIBCALL}}{416}
-\entry {\code {umod\var {m}3} instruction pattern}{317}
-\entry {\code {UMODSI3{\_}LIBCALL}}{415}
-\entry {\code {umulhisi3} instruction pattern}{317}
-\entry {\code {umul\var {m}3{\_}highpart} instruction pattern}{317}
-\entry {\code {umulqihi3} instruction pattern}{317}
-\entry {\code {umulsidi3} instruction pattern}{317}
-\entry {\code {unchanging}}{254}
-\entry {\code {unchanging}, in \code {call{\_}insn}}{252}
-\entry {\code {unchanging}, in \code {insn}}{252}
-\entry {\code {unchanging}, in \code {reg} and \code {mem}}{251}
-\entry {\code {unchanging}, in \code {subreg}}{251}
-\entry {\code {unchanging}, in \code {symbol{\_}ref}}{252}
-\entry {undefined behavior}{215}
-\entry {undefined function value}{215}
-\entry {underscores in variables in macros}{141}
-\entry {underscores, avoiding (88k)}{63}
-\entry {union, casting to a}{151}
-\entry {unions}{204}
-\entry {unions, returning}{237}
-\entry {\code {UNIQUE{\_}SECTION}}{430}
-\entry {\code {UNITS{\_}PER{\_}WORD}}{363}
-\entry {\code {UNKNOWN{\_}FLOAT{\_}FORMAT}}{368}
-\entry {unreachable code}{241}
-\entry {unresolved references and \code {-nodefaultlibs}}{49}
-\entry {unresolved references and \code {-nostdlib}}{49}
-\entry {\code {unshare{\_}all{\_}rtl}}{289}
-\entry {unsigned division}{266}
-\entry {unsigned greater than}{269}
-\entry {unsigned less than}{269}
-\entry {unsigned minimum and maximum}{267}
-\entry {\code {unsigned{\_}fix}}{271}
-\entry {\code {unsigned{\_}float}}{271}
-\entry {\code {unspec}}{276}
-\entry {\code {unspec{\_}volatile}}{276}
-\entry {\code {untyped{\_}call} instruction pattern}{322}
-\entry {\code {untyped{\_}return} instruction pattern}{323}
-\entry {\code {use}}{275}
-\entry {\code {USE{\_}C{\_}ALLOCA}}{470}
-\entry {\code {USE{\_}PROTOTYPES}}{471}
-\entry {\code {used}}{253}
-\entry {\code {used}, in \code {symbol{\_}ref}}{252}
-\entry {\code {USER{\_}LABEL{\_}PREFIX}}{448}
-\entry {\code {USG}}{469}
-\initial {V}
-\entry {\samp {V} in constraint}{301}
-\entry {\code {VALID{\_}MACHINE{\_}DECL{\_}ATTRIBUTE}}{466}
-\entry {\code {VALID{\_}MACHINE{\_}TYPE{\_}ATTRIBUTE}}{466}
-\entry {value after \code {longjmp}}{173}
-\entry {values, returned by functions}{398}
-\entry {varargs implementation}{409}
-\entry {\file {varargs.h} and RT PC}{74}
-\entry {variable alignment}{159}
-\entry {variable attributes}{159}
-\entry {variable number of arguments}{146}
-\entry {variable-length array scope}{145}
-\entry {variable-length arrays}{145}
-\entry {variables in specified registers}{172}
-\entry {variables, local, in macros}{141}
-\entry {Vax calling convention}{199}
-\entry {VAX options}{55}
-\entry {\code {VAX{\_}FLOAT{\_}FORMAT}}{368}
-\entry {\file {VAXCRTL}}{232}
-\entry {\code {VIRTUAL{\_}INCOMING{\_}ARGS{\_}REGNUM}}{261}
-\entry {\code {VIRTUAL{\_}OUTGOING{\_}ARGS{\_}REGNUM}}{262}
-\entry {\code {VIRTUAL{\_}STACK{\_}DYNAMIC{\_}REGNUM}}{261}
-\entry {\code {VIRTUAL{\_}STACK{\_}VARS{\_}REGNUM}}{261}
-\entry {\code {VMS}}{469}
-\entry {VMS and case sensitivity}{232}
-\entry {VMS and include files}{229}
-\entry {VMS installation}{128}
-\entry {void pointers, arithmetic}{148}
-\entry {void, size of pointer to}{148}
-\entry {\code {VOIDmode}}{256}
-\entry {\code {volatil}}{253}
-\entry {\code {volatil}, in \code {insn}}{252}
-\entry {\code {volatil}, in \code {mem}}{250}
-\entry {\code {volatil}, in \code {reg}}{251}
-\entry {\code {volatil}, in \code {symbol{\_}ref}}{252}
-\entry {\code {volatile} applied to function}{151}
-\entry {volatile memory references}{253}
-\entry {voting between constraint alternatives}{306}
-\entry {\code {vprintf}}{470}
-\initial {W}
-\entry {warning for comparison of signed and unsigned values}{29}
-\entry {warning for overloaded virtual fn}{32}
-\entry {warning for reordering of member initializers}{29}
-\entry {warning for synthesized methods}{33}
-\entry {warning messages}{26}
-\entry {warnings vs errors}{214}
-\entry {\code {WCHAR{\_}TYPE}}{370}
-\entry {\code {WCHAR{\_}TYPE{\_}SIZE}}{371}
-\entry {\code {weak} attribute}{154}
-\entry {\code {which{\_}alternative}}{300}
-\entry {whitespace}{203}
-\entry {\code {word{\_}mode}}{258}
-\entry {\code {WORD{\_}REGISTER{\_}OPERATIONS}}{462}
-\entry {\code {WORD{\_}SWITCH{\_}TAKES{\_}ARG}}{353}
-\entry {\code {WORDS{\_}BIG{\_}ENDIAN}}{362}
-\entry {\code {WORDS{\_}BIG{\_}ENDIAN}, effect on \code {subreg}}{263}
-\initial {X}
-\entry {\samp {X} in constraint}{303}
-\entry {\file {x-\var {host}}}{475}
-\entry {\code {XCmode}}{256}
-\entry {\code {XCOFF{\_}DEBUGGING{\_}INFO}}{452}
-\entry {\code {XEXP}}{249}
-\entry {\code {XFmode}}{255}
-\entry {\code {XINT}}{249}
-\entry {\file {xm-\var {machine}.h}}{469}
-\entry {\code {xor}}{267}
-\entry {\code {xor}, canonicalization of}{331}
-\entry {\code {xor\var {m}3} instruction pattern}{317}
-\entry {\code {XSTR}}{249}
-\entry {\code {XVEC}}{250}
-\entry {\code {XVECEXP}}{250}
-\entry {\code {XVECLEN}}{250}
-\entry {\code {XWINT}}{249}
-\initial {Z}
-\entry {zero division on 88k}{65}
-\entry {zero-length arrays}{145}
-\entry {\code {zero{\_}extend}}{271}
-\entry {\code {zero{\_}extend\var {mn}} instruction pattern}{320}
-\entry {\code {zero{\_}extract}}{270}
-\entry {\code {zero{\_}extract}, canonicalization of}{332}
diff --git a/gcc/gcc.texi b/gcc/gcc.texi
deleted file mode 100755
index 9bef7a7..0000000
--- a/gcc/gcc.texi
+++ /dev/null
@@ -1,4735 +0,0 @@
-\input texinfo @c -*-texinfo-*-
-@c %**start of header
-@setfilename gcc.info
-@c @setfilename usegcc.info
-@c @setfilename portgcc.info
-@c To produce the full manual, use the "gcc.info" setfilename, and
-@c make sure the following do NOT begin with '@c' (and the @clear lines DO)
-@set INTERNALS
-@set USING
-@c To produce a user-only manual, use the "usegcc.info" setfilename, and
-@c make sure the following does NOT begin with '@c':
-@c @clear INTERNALS
-@c To produce a porter-only manual, use the "portgcc.info" setfilename,
-@c and make sure the following does NOT begin with '@c':
-@c @clear USING
-
-@c CYGNUS LOCAL doc
-@ifinfo
-@ifset INTERNALS
-@format
-START-INFO-DIR-ENTRY
-* Gcc: (gcc). Using and Porting the GNU C compiler.
-END-INFO-DIR-ENTRY
-@end format
-@end ifset
-@ifclear INTERNALS
-@format
-START-INFO-DIR-ENTRY
-* usegcc: (usegcc). Using the GNU C compiler.
-END-INFO-DIR-ENTRY
-@end format
-@end ifclear
-@end ifinfo
-
-@finalout
-@c END CYGNUS LOCAL
-
-@c (For FSF printing, turn on smallbook, comment out finalout below;
-@c that is all that is needed.)
-
-@c 6/27/96 FSF DO wants smallbook fmt for 1st bound edition.
-@c @smallbook
-
-@c i also commented out the finalout command, so if there *are* any
-@c overfulls, you'll (hopefully) see the rectangle in the right hand
-@c margin. -mew 15june93
-@c @finalout
-
-@c NOTE: checks/things to do:
-@c
-@c -have bob do a search in all seven files for "mew" (ideally --mew,
-@c but i may have forgotten the occasional "--"..).
-@c Just checked... all have `--'! Bob 22Jul96
-@c Use this to search: grep -n '\-\-mew' *.texi
-@c -item/itemx, text after all (sub/sub)section titles, etc..
-@c -consider putting the lists of options on pp 17--> etc in columns or
-@c some such.
-@c -spellcheck
-@c -continuity of phrasing; ie, bit-field vs bitfield in rtl.texi
-@c -overfulls. do a search for "mew" in the files, and you will see
-@c overfulls that i noted but could not deal with.
-@c -have to add text: beginning of chapter 8
-
-@c
-@c anything else? --mew 10feb93
-
-
-
-@ifset INTERNALS
-@ifset USING
-@settitle Using and Porting GNU CC
-@end ifset
-@end ifset
-@c seems reasonable to assume at least one of INTERNALS or USING is set...
-@ifclear INTERNALS
-@settitle Using GNU CC
-@end ifclear
-@ifclear USING
-@settitle Porting GNU CC
-@end ifclear
-
-@syncodeindex fn cp
-@syncodeindex vr cp
-@c %**end of header
-
-@c Use with @@smallbook.
-
-@c Cause even numbered pages to be printed on the left hand side of
-@c the page and odd numbered pages to be printed on the right hand
-@c side of the page. Using this, you can print on both sides of a
-@c sheet of paper and have the text on the same part of the sheet.
-
-@c The text on right hand pages is pushed towards the right hand
-@c margin and the text on left hand pages is pushed toward the left
-@c hand margin.
-@c (To provide the reverse effect, set bindingoffset to -0.75in.)
-
-@c @tex
-@c \global\bindingoffset=0.75in
-@c \global\normaloffset =0.75in
-@c @end tex
-
-@ifinfo
-@dircategory Programming
-@direntry
-* gcc: (gcc). The GNU C compiler.
-@end direntry
-@ifset INTERNALS
-@ifset USING
-This file documents the use and the internals of the GNU compiler.
-@end ifset
-@end ifset
-@ifclear USING
-This file documents the internals of the GNU compiler.
-@end ifclear
-@ifclear INTERNALS
-This file documents the use of the GNU compiler.
-@end ifclear
-
-Published by the Free Software Foundation
-59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
-
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
-@ignore
-Permission is granted to process this file through Tex and print the
-results, provided the printed document carries copying permission
-notice identical to this one except for the removal of this paragraph
-(this paragraph not being relevant to the printed manual).
-
-@end ignore
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided also that the
-sections entitled ``GNU General Public License'' and ``Funding for Free
-Software'' are included exactly as in the original, and provided that
-the entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-
-Permission is granted to copy and distribute translations of this manual
-into another language, under the above conditions for modified versions,
-except that the sections entitled ``GNU General Public License'' and
-``Funding for Free Software'', and this permission notice, may be
-included in translations approved by the Free Software Foundation
-instead of in the original English.
-@end ifinfo
-
-@setchapternewpage odd
-@c @finalout
-@titlepage
-@ifset INTERNALS
-@ifset USING
-@center @titlefont{Using and Porting GNU CC}
-
-@end ifset
-@end ifset
-@ifclear INTERNALS
-@title Using GNU CC
-@end ifclear
-@ifclear USING
-@title Porting GNU CC
-@end ifclear
-@sp 2
-@center Richard M. Stallman
-@sp 3
-@center Last updated 16 March 1998
-@sp 1
-@c The version number appears five times more in this file.
-
-@center for egcs-1.1
-@page
-@vskip 0pt plus 1filll
-Copyright @copyright{} 1988, 89, 92, 93, 94, 95, 96, 98 Free Software Foundation, Inc.
-@sp 2
-For EGCS Version 1.0@*
-@sp 1
-Published by the Free Software Foundation @*
-59 Temple Place - Suite 330@*
-Boston, MA 02111-1307, USA@*
-Last printed April, 1998.@*
-Printed copies are available for $50 each.@*
-ISBN 1-882114-37-X
-@sp 1
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided also that the
-sections entitled ``GNU General Public License'' and ``Funding for Free
-Software'' are included exactly as in the original, and provided that
-the entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-
-Permission is granted to copy and distribute translations of this manual
-into another language, under the above conditions for modified versions,
-except that the sections entitled ``GNU General Public License'' and
-``Funding for Free Software'', and this permission notice, may be
-included in translations approved by the Free Software Foundation
-instead of in the original English.
-@end titlepage
-@page
-
-@ifinfo
-
-@node Top, G++ and GCC,, (DIR)
-@top Introduction
-@cindex introduction
-
-@ifset INTERNALS
-@ifset USING
-This manual documents how to run, install and port the GNU
-compiler, as well as its new features and incompatibilities, and how to
-report bugs. It corresponds to EGCS version 1.0.
-@end ifset
-@end ifset
-
-@ifclear INTERNALS
-This manual documents how to run and install the GNU compiler,
-as well as its new features and incompatibilities, and how to report
-bugs. It corresponds to EGCS version 1.0.
-@end ifclear
-@ifclear USING
-This manual documents how to port the GNU compiler,
-as well as its new features and incompatibilities, and how to report
-bugs. It corresponds to EGCS version 1.0.
-@end ifclear
-
-@end ifinfo
-@menu
-@ifset USING
-* G++ and GCC:: You can compile C or C++ programs.
-* Invoking GCC:: Command options supported by @samp{gcc}.
-* Installation:: How to configure, compile and install GNU CC.
-* C Extensions:: GNU extensions to the C language family.
-* C++ Extensions:: GNU extensions to the C++ language.
-* Gcov:: gcov: a GNU CC test coverage program.
-* Trouble:: If you have trouble installing GNU CC.
-* Bugs:: How, why and where to report bugs.
-* Service:: How to find suppliers of support for GNU CC.
-* Contributing:: How to contribute to testing and developing GNU CC.
-* VMS:: Using GNU CC on VMS.
-@end ifset
-@ifset INTERNALS
-* Portability:: Goals of GNU CC's portability features.
-* Interface:: Function-call interface of GNU CC output.
-* Passes:: Order of passes, what they do, and what each file is for.
-* RTL:: The intermediate representation that most passes work on.
-* Machine Desc:: How to write machine description instruction patterns.
-* Target Macros:: How to write the machine description C macros.
-* Config:: Writing the @file{xm-@var{machine}.h} file.
-* Fragments:: Writing the @file{t-@var{target}} and @file{x-@var{host}} files.
-@end ifset
-
-* Funding:: How to help assure funding for free software.
-* GNU/Linux:: Linux and the GNU Project
-
-* Copying:: GNU General Public License says
- how you can copy and share GNU CC.
-* Contributors:: People who have contributed to GNU CC.
-
-* Index:: Index of concepts and symbol names.
-@end menu
-
-@ifset USING
-@node G++ and GCC
-@chapter Compile C, C++, or Objective C
-
-@cindex Objective C
-The C, C++, and Objective C versions of the compiler are integrated; the
-GNU C compiler can compile programs written in C, C++, or Objective C.
-
-@cindex GCC
-``GCC'' is a common shorthand term for the GNU C compiler. This is both
-the most general name for the compiler, and the name used when the
-emphasis is on compiling C programs.
-
-@cindex C++
-@cindex G++
-When referring to C++ compilation, it is usual to call the compiler
-``G++''. Since there is only one compiler, it is also accurate to call
-it ``GCC'' no matter what the language context; however, the term
-``G++'' is more useful when the emphasis is on compiling C++ programs.
-
-We use the name ``GNU CC'' to refer to the compilation system as a
-whole, and more specifically to the language-independent part of the
-compiler. For example, we refer to the optimization options as
-affecting the behavior of ``GNU CC'' or sometimes just ``the compiler''.
-
-Front ends for other languages, such as Ada 9X, Fortran, Modula-3, and
-Pascal, are under development. These front-ends, like that for C++, are
-built in subdirectories of GNU CC and link to it. The result is an
-integrated compiler that can compile programs written in C, C++,
-Objective C, or any of the languages for which you have installed front
-ends.
-
-In this manual, we only discuss the options for the C, Objective-C, and
-C++ compilers and those of the GNU CC core. Consult the documentation
-of the other front ends for the options to use when compiling programs
-written in other languages.
-
-@cindex compiler compared to C++ preprocessor
-@cindex intermediate C version, nonexistent
-@cindex C intermediate output, nonexistent
-G++ is a @emph{compiler}, not merely a preprocessor. G++ builds object
-code directly from your C++ program source. There is no intermediate C
-version of the program. (By contrast, for example, some other
-implementations use a program that generates a C program from your C++
-source.) Avoiding an intermediate C representation of the program means
-that you get better object code, and better debugging information. The
-GNU debugger, GDB, works with this information in the object code to
-give you comprehensive C++ source-level editing capabilities
-(@pxref{C,,C and C++,gdb.info, Debugging with GDB}).
-
-@c FIXME! Someone who knows something about Objective C ought to put in
-@c a paragraph or two about it here, and move the index entry down when
-@c there is more to point to than the general mention in the 1st par.
-
-@include invoke.texi
-
-@include install.texi
-
-@include extend.texi
-
-@include gcov.texi
-
-@node Trouble
-@chapter Known Causes of Trouble with GNU CC
-@cindex bugs, known
-@cindex installation trouble
-@cindex known causes of trouble
-
-This section describes known problems that affect users of GNU CC. Most
-of these are not GNU CC bugs per se---if they were, we would fix them.
-But the result for a user may be like the result of a bug.
-
-Some of these problems are due to bugs in other software, some are
-missing features that are too much work to add, and some are places
-where people's opinions differ as to what is best.
-
-@menu
-* Actual Bugs:: Bugs we will fix later.
-* Installation Problems:: Problems that manifest when you install GNU CC.
-* Cross-Compiler Problems:: Common problems of cross compiling with GNU CC.
-* Interoperation:: Problems using GNU CC with other compilers,
- and with certain linkers, assemblers and debuggers.
-* External Bugs:: Problems compiling certain programs.
-* Incompatibilities:: GNU CC is incompatible with traditional C.
-* Fixed Headers:: GNU C uses corrected versions of system header files.
- This is necessary, but doesn't always work smoothly.
-* Standard Libraries:: GNU C uses the system C library, which might not be
- compliant with the ISO/ANSI C standard.
-* Disappointments:: Regrettable things we can't change, but not quite bugs.
-* C++ Misunderstandings:: Common misunderstandings with GNU C++.
-* Protoize Caveats:: Things to watch out for when using @code{protoize}.
-* Non-bugs:: Things we think are right, but some others disagree.
-* Warnings and Errors:: Which problems in your code get warnings,
- and which get errors.
-@end menu
-
-@node Actual Bugs
-@section Actual Bugs We Haven't Fixed Yet
-
-@itemize @bullet
-@item
-The @code{fixincludes} script interacts badly with automounters; if the
-directory of system header files is automounted, it tends to be
-unmounted while @code{fixincludes} is running. This would seem to be a
-bug in the automounter. We don't know any good way to work around it.
-
-@item
-The @code{fixproto} script will sometimes add prototypes for the
-@code{sigsetjmp} and @code{siglongjmp} functions that reference the
-@code{jmp_buf} type before that type is defined. To work around this,
-edit the offending file and place the typedef in front of the
-prototypes.
-
-@item
-There are several obscure case of mis-using struct, union, and
-enum tags that are not detected as errors by the compiler.
-
-@item
-When @samp{-pedantic-errors} is specified, GNU C will incorrectly give
-an error message when a function name is specified in an expression
-involving the comma operator.
-
-@item
-Loop unrolling doesn't work properly for certain C++ programs. This is
-a bug in the C++ front end. It sometimes emits incorrect debug info, and
-the loop unrolling code is unable to recover from this error.
-@end itemize
-
-@node Installation Problems
-@section Installation Problems
-
-This is a list of problems (and some apparent problems which don't
-really mean anything is wrong) that show up during installation of GNU
-CC.
-
-@itemize @bullet
-@item
-On certain systems, defining certain environment variables such as
-@code{CC} can interfere with the functioning of @code{make}.
-
-@item
-If you encounter seemingly strange errors when trying to build the
-compiler in a directory other than the source directory, it could be
-because you have previously configured the compiler in the source
-directory. Make sure you have done all the necessary preparations.
-@xref{Other Dir}.
-
-@item
-If you build GNU CC on a BSD system using a directory stored in a System
-V file system, problems may occur in running @code{fixincludes} if the
-System V file system doesn't support symbolic links. These problems
-result in a failure to fix the declaration of @code{size_t} in
-@file{sys/types.h}. If you find that @code{size_t} is a signed type and
-that type mismatches occur, this could be the cause.
-
-The solution is not to use such a directory for building GNU CC.
-
-@item
-In previous versions of GNU CC, the @code{gcc} driver program looked for
-@code{as} and @code{ld} in various places; for example, in files
-beginning with @file{/usr/local/lib/gcc-}. GNU CC version 2 looks for
-them in the directory
-@file{/usr/local/lib/gcc-lib/@var{target}/@var{version}}.
-
-Thus, to use a version of @code{as} or @code{ld} that is not the system
-default, for example @code{gas} or GNU @code{ld}, you must put them in
-that directory (or make links to them from that directory).
-
-@item
-Some commands executed when making the compiler may fail (return a
-non-zero status) and be ignored by @code{make}. These failures, which
-are often due to files that were not found, are expected, and can safely
-be ignored.
-
-@item
-It is normal to have warnings in compiling certain files about
-unreachable code and about enumeration type clashes. These files' names
-begin with @samp{insn-}. Also, @file{real.c} may get some warnings that
-you can ignore.
-
-@item
-Sometimes @code{make} recompiles parts of the compiler when installing
-the compiler. In one case, this was traced down to a bug in
-@code{make}. Either ignore the problem or switch to GNU Make.
-
-@item
-If you have installed a program known as purify, you may find that it
-causes errors while linking @code{enquire}, which is part of building
-GNU CC. The fix is to get rid of the file @code{real-ld} which purify
-installs---so that GNU CC won't try to use it.
-
-@item
-On GNU/Linux SLS 1.01, there is a problem with @file{libc.a}: it does not
-contain the obstack functions. However, GNU CC assumes that the obstack
-functions are in @file{libc.a} when it is the GNU C library. To work
-around this problem, change the @code{__GNU_LIBRARY__} conditional
-around line 31 to @samp{#if 1}.
-
-@item
-On some 386 systems, building the compiler never finishes because
-@code{enquire} hangs due to a hardware problem in the motherboard---it
-reports floating point exceptions to the kernel incorrectly. You can
-install GNU CC except for @file{float.h} by patching out the command to
-run @code{enquire}. You may also be able to fix the problem for real by
-getting a replacement motherboard. This problem was observed in
-Revision E of the Micronics motherboard, and is fixed in Revision F.
-It has also been observed in the MYLEX MXA-33 motherboard.
-
-If you encounter this problem, you may also want to consider removing
-the FPU from the socket during the compilation. Alternatively, if you
-are running SCO Unix, you can reboot and force the FPU to be ignored.
-To do this, type @samp{hd(40)unix auto ignorefpu}.
-
-@item
-On some 386 systems, GNU CC crashes trying to compile @file{enquire.c}.
-This happens on machines that don't have a 387 FPU chip. On 386
-machines, the system kernel is supposed to emulate the 387 when you
-don't have one. The crash is due to a bug in the emulator.
-
-One of these systems is the Unix from Interactive Systems: 386/ix.
-On this system, an alternate emulator is provided, and it does work.
-To use it, execute this command as super-user:
-
-@example
-ln /etc/emulator.rel1 /etc/emulator
-@end example
-
-@noindent
-and then reboot the system. (The default emulator file remains present
-under the name @file{emulator.dflt}.)
-
-Try using @file{/etc/emulator.att}, if you have such a problem on the
-SCO system.
-
-Another system which has this problem is Esix. We don't know whether it
-has an alternate emulator that works.
-
-On NetBSD 0.8, a similar problem manifests itself as these error messages:
-
-@example
-enquire.c: In function `fprop':
-enquire.c:2328: floating overflow
-@end example
-
-@item
-On SCO systems, when compiling GNU CC with the system's compiler,
-do not use @samp{-O}. Some versions of the system's compiler miscompile
-GNU CC with @samp{-O}.
-
-@cindex @code{genflags}, crash on Sun 4
-@item
-Sometimes on a Sun 4 you may observe a crash in the program
-@code{genflags} or @code{genoutput} while building GNU CC. This is said to
-be due to a bug in @code{sh}. You can probably get around it by running
-@code{genflags} or @code{genoutput} manually and then retrying the
-@code{make}.
-
-@item
-On Solaris 2, executables of GNU CC version 2.0.2 are commonly
-available, but they have a bug that shows up when compiling current
-versions of GNU CC: undefined symbol errors occur during assembly if you
-use @samp{-g}.
-
-The solution is to compile the current version of GNU CC without
-@samp{-g}. That makes a working compiler which you can use to recompile
-with @samp{-g}.
-
-@item
-Solaris 2 comes with a number of optional OS packages. Some of these
-packages are needed to use GNU CC fully. If you did not install all
-optional packages when installing Solaris, you will need to verify that
-the packages that GNU CC needs are installed.
-
-To check whether an optional package is installed, use
-the @code{pkginfo} command. To add an optional package, use the
-@code{pkgadd} command. For further details, see the Solaris
-documentation.
-
-For Solaris 2.0 and 2.1, GNU CC needs six packages: @samp{SUNWarc},
-@samp{SUNWbtool}, @samp{SUNWesu}, @samp{SUNWhea}, @samp{SUNWlibm}, and
-@samp{SUNWtoo}.
-
-For Solaris 2.2, GNU CC needs an additional seventh package: @samp{SUNWsprot}.
-
-@item
-On Solaris 2, trying to use the linker and other tools in
-@file{/usr/ucb} to install GNU CC has been observed to cause trouble.
-For example, the linker may hang indefinitely. The fix is to remove
-@file{/usr/ucb} from your @code{PATH}.
-
-@item
-If you use the 1.31 version of the MIPS assembler (such as was shipped
-with Ultrix 3.1), you will need to use the -fno-delayed-branch switch
-when optimizing floating point code. Otherwise, the assembler will
-complain when the GCC compiler fills a branch delay slot with a
-floating point instruction, such as @code{add.d}.
-
-@item
-If on a MIPS system you get an error message saying ``does not have gp
-sections for all it's [sic] sectons [sic]'', don't worry about it. This
-happens whenever you use GAS with the MIPS linker, but there is not
-really anything wrong, and it is okay to use the output file. You can
-stop such warnings by installing the GNU linker.
-
-It would be nice to extend GAS to produce the gp tables, but they are
-optional, and there should not be a warning about their absence.
-
-@item
-In Ultrix 4.0 on the MIPS machine, @file{stdio.h} does not work with GNU
-CC at all unless it has been fixed with @code{fixincludes}. This causes
-problems in building GNU CC. Once GNU CC is installed, the problems go
-away.
-
-To work around this problem, when making the stage 1 compiler, specify
-this option to Make:
-
-@example
-GCC_FOR_TARGET="./xgcc -B./ -I./include"
-@end example
-
-When making stage 2 and stage 3, specify this option:
-
-@example
-CFLAGS="-g -I./include"
-@end example
-
-@item
-Users have reported some problems with version 2.0 of the MIPS
-compiler tools that were shipped with Ultrix 4.1. Version 2.10
-which came with Ultrix 4.2 seems to work fine.
-
-Users have also reported some problems with version 2.20 of the
-MIPS compiler tools that were shipped with RISC/os 4.x. The earlier
-version 2.11 seems to work fine.
-
-@item
-Some versions of the MIPS linker will issue an assertion failure
-when linking code that uses @code{alloca} against shared
-libraries on RISC-OS 5.0, and DEC's OSF/1 systems. This is a bug
-in the linker, that is supposed to be fixed in future revisions.
-To protect against this, GNU CC passes @samp{-non_shared} to the
-linker unless you pass an explicit @samp{-shared} or
-@samp{-call_shared} switch.
-
-@item
-On System V release 3, you may get this error message
-while linking:
-
-@smallexample
-ld fatal: failed to write symbol name @var{something}
- in strings table for file @var{whatever}
-@end smallexample
-
-This probably indicates that the disk is full or your ULIMIT won't allow
-the file to be as large as it needs to be.
-
-This problem can also result because the kernel parameter @code{MAXUMEM}
-is too small. If so, you must regenerate the kernel and make the value
-much larger. The default value is reported to be 1024; a value of 32768
-is said to work. Smaller values may also work.
-
-@item
-On System V, if you get an error like this,
-
-@example
-/usr/local/lib/bison.simple: In function `yyparse':
-/usr/local/lib/bison.simple:625: virtual memory exhausted
-@end example
-
-@noindent
-that too indicates a problem with disk space, ULIMIT, or @code{MAXUMEM}.
-
-@item
-Current GNU CC versions probably do not work on version 2 of the NeXT
-operating system.
-
-@item
-On NeXTStep 3.0, the Objective C compiler does not work, due,
-apparently, to a kernel bug that it happens to trigger. This problem
-does not happen on 3.1.
-
-@item
-On the Tower models 4@var{n}0 and 6@var{n}0, by default a process is not
-allowed to have more than one megabyte of memory. GNU CC cannot compile
-itself (or many other programs) with @samp{-O} in that much memory.
-
-To solve this problem, reconfigure the kernel adding the following line
-to the configuration file:
-
-@smallexample
-MAXUMEM = 4096
-@end smallexample
-
-@item
-On HP 9000 series 300 or 400 running HP-UX release 8.0, there is a bug
-in the assembler that must be fixed before GNU CC can be built. This
-bug manifests itself during the first stage of compilation, while
-building @file{libgcc2.a}:
-
-@smallexample
-_floatdisf
-cc1: warning: `-g' option not supported on this version of GCC
-cc1: warning: `-g1' option not supported on this version of GCC
-./xgcc: Internal compiler error: program as got fatal signal 11
-@end smallexample
-
-A patched version of the assembler is available by anonymous ftp from
-@code{altdorf.ai.mit.edu} as the file
-@file{archive/cph/hpux-8.0-assembler}. If you have HP software support,
-the patch can also be obtained directly from HP, as described in the
-following note:
-
-@quotation
-This is the patched assembler, to patch SR#1653-010439, where the
-assembler aborts on floating point constants.
-
-The bug is not really in the assembler, but in the shared library
-version of the function ``cvtnum(3c)''. The bug on ``cvtnum(3c)'' is
-SR#4701-078451. Anyway, the attached assembler uses the archive
-library version of ``cvtnum(3c)'' and thus does not exhibit the bug.
-@end quotation
-
-This patch is also known as PHCO_4484.
-
-@item
-On HP-UX version 8.05, but not on 8.07 or more recent versions,
-the @code{fixproto} shell script triggers a bug in the system shell.
-If you encounter this problem, upgrade your operating system or
-use BASH (the GNU shell) to run @code{fixproto}.
-
-@item
-Some versions of the Pyramid C compiler are reported to be unable to
-compile GNU CC. You must use an older version of GNU CC for
-bootstrapping. One indication of this problem is if you get a crash
-when GNU CC compiles the function @code{muldi3} in file @file{libgcc2.c}.
-
-You may be able to succeed by getting GNU CC version 1, installing it,
-and using it to compile GNU CC version 2. The bug in the Pyramid C
-compiler does not seem to affect GNU CC version 1.
-
-@item
-There may be similar problems on System V Release 3.1 on 386 systems.
-
-@item
-On the Intel Paragon (an i860 machine), if you are using operating
-system version 1.0, you will get warnings or errors about redefinition
-of @code{va_arg} when you build GNU CC.
-
-If this happens, then you need to link most programs with the library
-@file{iclib.a}. You must also modify @file{stdio.h} as follows: before
-the lines
-
-@example
-#if defined(__i860__) && !defined(_VA_LIST)
-#include <va_list.h>
-@end example
-
-@noindent
-insert the line
-
-@example
-#if __PGC__
-@end example
-
-@noindent
-and after the lines
-
-@example
-extern int vprintf(const char *, va_list );
-extern int vsprintf(char *, const char *, va_list );
-#endif
-@end example
-
-@noindent
-insert the line
-
-@example
-#endif /* __PGC__ */
-@end example
-
-These problems don't exist in operating system version 1.1.
-
-@item
-On the Altos 3068, programs compiled with GNU CC won't work unless you
-fix a kernel bug. This happens using system versions V.2.2 1.0gT1 and
-V.2.2 1.0e and perhaps later versions as well. See the file
-@file{README.ALTOS}.
-
-@item
-You will get several sorts of compilation and linking errors on the
-we32k if you don't follow the special instructions. @xref{Configurations}.
-
-@item
-A bug in the HP-UX 8.05 (and earlier) shell will cause the fixproto
-program to report an error of the form:
-
-@example
-./fixproto: sh internal 1K buffer overflow
-@end example
-
-To fix this, change the first line of the fixproto script to look like:
-
-@example
-#!/bin/ksh
-@end example
-@end itemize
-
-@node Cross-Compiler Problems
-@section Cross-Compiler Problems
-
-You may run into problems with cross compilation on certain machines,
-for several reasons.
-
-@itemize @bullet
-@item
-Cross compilation can run into trouble for certain machines because
-some target machines' assemblers require floating point numbers to be
-written as @emph{integer} constants in certain contexts.
-
-The compiler writes these integer constants by examining the floating
-point value as an integer and printing that integer, because this is
-simple to write and independent of the details of the floating point
-representation. But this does not work if the compiler is running on
-a different machine with an incompatible floating point format, or
-even a different byte-ordering.
-
-In addition, correct constant folding of floating point values
-requires representing them in the target machine's format.
-(The C standard does not quite require this, but in practice
-it is the only way to win.)
-
-It is now possible to overcome these problems by defining macros such
-as @code{REAL_VALUE_TYPE}. But doing so is a substantial amount of
-work for each target machine.
-@ifset INTERNALS
-@xref{Cross-compilation}.
-@end ifset
-@ifclear INTERNALS
-@xref{Cross-compilation,,Cross Compilation and Floating Point Format,
-gcc.info, Using and Porting GCC}.
-@end ifclear
-
-@item
-At present, the program @file{mips-tfile} which adds debug
-support to object files on MIPS systems does not work in a cross
-compile environment.
-@end itemize
-
-@node Interoperation
-@section Interoperation
-
-This section lists various difficulties encountered in using GNU C or
-GNU C++ together with other compilers or with the assemblers, linkers,
-libraries and debuggers on certain systems.
-
-@itemize @bullet
-@item
-Objective C does not work on the RS/6000.
-
-@item
-GNU C++ does not do name mangling in the same way as other C++
-compilers. This means that object files compiled with one compiler
-cannot be used with another.
-
-This effect is intentional, to protect you from more subtle problems.
-Compilers differ as to many internal details of C++ implementation,
-including: how class instances are laid out, how multiple inheritance is
-implemented, and how virtual function calls are handled. If the name
-encoding were made the same, your programs would link against libraries
-provided from other compilers---but the programs would then crash when
-run. Incompatible libraries are then detected at link time, rather than
-at run time.
-
-@item
-Older GDB versions sometimes fail to read the output of GNU CC version
-2. If you have trouble, get GDB version 4.4 or later.
-
-@item
-@cindex DBX
-DBX rejects some files produced by GNU CC, though it accepts similar
-constructs in output from PCC. Until someone can supply a coherent
-description of what is valid DBX input and what is not, there is
-nothing I can do about these problems. You are on your own.
-
-@item
-The GNU assembler (GAS) does not support PIC. To generate PIC code, you
-must use some other assembler, such as @file{/bin/as}.
-
-@item
-On some BSD systems, including some versions of Ultrix, use of profiling
-causes static variable destructors (currently used only in C++) not to
-be run.
-
-@item
-Use of @samp{-I/usr/include} may cause trouble.
-
-Many systems come with header files that won't work with GNU CC unless
-corrected by @code{fixincludes}. The corrected header files go in a new
-directory; GNU CC searches this directory before @file{/usr/include}.
-If you use @samp{-I/usr/include}, this tells GNU CC to search
-@file{/usr/include} earlier on, before the corrected headers. The
-result is that you get the uncorrected header files.
-
-Instead, you should use these options (when compiling C programs):
-
-@smallexample
--I/usr/local/lib/gcc-lib/@var{target}/@var{version}/include -I/usr/include
-@end smallexample
-
-For C++ programs, GNU CC also uses a special directory that defines C++
-interfaces to standard C subroutines. This directory is meant to be
-searched @emph{before} other standard include directories, so that it
-takes precedence. If you are compiling C++ programs and specifying
-include directories explicitly, use this option first, then the two
-options above:
-
-@example
--I/usr/local/lib/g++-include
-@end example
-
-@ignore
-@cindex @code{vfork}, for the Sun-4
-@item
-There is a bug in @code{vfork} on the Sun-4 which causes the registers
-of the child process to clobber those of the parent. Because of this,
-programs that call @code{vfork} are likely to lose when compiled
-optimized with GNU CC when the child code alters registers which contain
-C variables in the parent. This affects variables which are live in the
-parent across the call to @code{vfork}.
-
-If you encounter this, you can work around the problem by declaring
-variables @code{volatile} in the function that calls @code{vfork}, until
-the problem goes away, or by not declaring them @code{register} and not
-using @samp{-O} for those source files.
-@end ignore
-
-@item
-On some SGI systems, when you use @samp{-lgl_s} as an option,
-it gets translated magically to @samp{-lgl_s -lX11_s -lc_s}.
-Naturally, this does not happen when you use GNU CC.
-You must specify all three options explicitly.
-
-@item
-On a Sparc, GNU CC aligns all values of type @code{double} on an 8-byte
-boundary, and it expects every @code{double} to be so aligned. The Sun
-compiler usually gives @code{double} values 8-byte alignment, with one
-exception: function arguments of type @code{double} may not be aligned.
-
-As a result, if a function compiled with Sun CC takes the address of an
-argument of type @code{double} and passes this pointer of type
-@code{double *} to a function compiled with GNU CC, dereferencing the
-pointer may cause a fatal signal.
-
-One way to solve this problem is to compile your entire program with GNU
-CC. Another solution is to modify the function that is compiled with
-Sun CC to copy the argument into a local variable; local variables
-are always properly aligned. A third solution is to modify the function
-that uses the pointer to dereference it via the following function
-@code{access_double} instead of directly with @samp{*}:
-
-@smallexample
-inline double
-access_double (double *unaligned_ptr)
-@{
- union d2i @{ double d; int i[2]; @};
-
- union d2i *p = (union d2i *) unaligned_ptr;
- union d2i u;
-
- u.i[0] = p->i[0];
- u.i[1] = p->i[1];
-
- return u.d;
-@}
-@end smallexample
-
-@noindent
-Storing into the pointer can be done likewise with the same union.
-
-@item
-On Solaris, the @code{malloc} function in the @file{libmalloc.a} library
-may allocate memory that is only 4 byte aligned. Since GNU CC on the
-Sparc assumes that doubles are 8 byte aligned, this may result in a
-fatal signal if doubles are stored in memory allocated by the
-@file{libmalloc.a} library.
-
-The solution is to not use the @file{libmalloc.a} library. Use instead
-@code{malloc} and related functions from @file{libc.a}; they do not have
-this problem.
-
-@item
-Sun forgot to include a static version of @file{libdl.a} with some
-versions of SunOS (mainly 4.1). This results in undefined symbols when
-linking static binaries (that is, if you use @samp{-static}). If you
-see undefined symbols @code{_dlclose}, @code{_dlsym} or @code{_dlopen}
-when linking, compile and link against the file
-@file{mit/util/misc/dlsym.c} from the MIT version of X windows.
-
-@item
-The 128-bit long double format that the Sparc port supports currently
-works by using the architecturally defined quad-word floating point
-instructions. Since there is no hardware that supports these
-instructions they must be emulated by the operating system. Long
-doubles do not work in Sun OS versions 4.0.3 and earlier, because the
-kernel emulator uses an obsolete and incompatible format. Long doubles
-do not work in Sun OS version 4.1.1 due to a problem in a Sun library.
-Long doubles do work on Sun OS versions 4.1.2 and higher, but GNU CC
-does not enable them by default. Long doubles appear to work in Sun OS
-5.x (Solaris 2.x).
-
-@item
-On HP-UX version 9.01 on the HP PA, the HP compiler @code{cc} does not
-compile GNU CC correctly. We do not yet know why. However, GNU CC
-compiled on earlier HP-UX versions works properly on HP-UX 9.01 and can
-compile itself properly on 9.01.
-
-@item
-On the HP PA machine, ADB sometimes fails to work on functions compiled
-with GNU CC. Specifically, it fails to work on functions that use
-@code{alloca} or variable-size arrays. This is because GNU CC doesn't
-generate HP-UX unwind descriptors for such functions. It may even be
-impossible to generate them.
-
-@item
-Debugging (@samp{-g}) is not supported on the HP PA machine, unless you use
-the preliminary GNU tools (@pxref{Installation}).
-
-@item
-Taking the address of a label may generate errors from the HP-UX
-PA assembler. GAS for the PA does not have this problem.
-
-@item
-Using floating point parameters for indirect calls to static functions
-will not work when using the HP assembler. There simply is no way for GCC
-to specify what registers hold arguments for static functions when using
-the HP assembler. GAS for the PA does not have this problem.
-
-@item
-In extremely rare cases involving some very large functions you may
-receive errors from the HP linker complaining about an out of bounds
-unconditional branch offset. This used to occur more often in previous
-versions of GNU CC, but is now exceptionally rare. If you should run
-into it, you can work around by making your function smaller.
-
-@item
-GNU CC compiled code sometimes emits warnings from the HP-UX assembler of
-the form:
-
-@smallexample
-(warning) Use of GR3 when
- frame >= 8192 may cause conflict.
-@end smallexample
-
-These warnings are harmless and can be safely ignored.
-
-@item
-The current version of the assembler (@file{/bin/as}) for the RS/6000
-has certain problems that prevent the @samp{-g} option in GCC from
-working. Note that @file{Makefile.in} uses @samp{-g} by default when
-compiling @file{libgcc2.c}.
-
-IBM has produced a fixed version of the assembler. The upgraded
-assembler unfortunately was not included in any of the AIX 3.2 update
-PTF releases (3.2.2, 3.2.3, or 3.2.3e). Users of AIX 3.1 should request
-PTF U403044 from IBM and users of AIX 3.2 should request PTF U416277.
-See the file @file{README.RS6000} for more details on these updates.
-
-You can test for the presense of a fixed assembler by using the
-command
-
-@smallexample
-as -u < /dev/null
-@end smallexample
-
-@noindent
-If the command exits normally, the assembler fix already is installed.
-If the assembler complains that "-u" is an unknown flag, you need to
-order the fix.
-
-@item
-On the IBM RS/6000, compiling code of the form
-
-@smallexample
-extern int foo;
-
-@dots{} foo @dots{}
-
-static int foo;
-@end smallexample
-
-@noindent
-will cause the linker to report an undefined symbol @code{foo}.
-Although this behavior differs from most other systems, it is not a
-bug because redefining an @code{extern} variable as @code{static}
-is undefined in ANSI C.
-
-@item
-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 GCC 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".
-
-@item
-Even if you specify @samp{-fdollars-in-identifiers},
-you cannot successfully use @samp{$} in identifiers on the RS/6000 due
-to a restriction in the IBM assembler. GAS supports these
-identifiers.
-
-@item
-On the RS/6000, XLC version 1.3.0.0 will miscompile @file{jump.c}. XLC
-version 1.3.0.1 or later fixes this problem. You can obtain XLC-1.3.0.2
-by requesting PTF 421749 from IBM.
-
-@item
-There is an assembler bug in versions of DG/UX prior to 5.4.2.01 that
-occurs when the @samp{fldcr} instruction is used. GNU CC uses
-@samp{fldcr} on the 88100 to serialize volatile memory references. Use
-the option @samp{-mno-serialize-volatile} if your version of the
-assembler has this bug.
-
-@item
-On VMS, GAS versions 1.38.1 and earlier may cause spurious warning
-messages from the linker. These warning messages complain of mismatched
-psect attributes. You can ignore them. @xref{VMS Install}.
-
-@item
-On NewsOS version 3, if you include both of the files @file{stddef.h}
-and @file{sys/types.h}, you get an error because there are two typedefs
-of @code{size_t}. You should change @file{sys/types.h} by adding these
-lines around the definition of @code{size_t}:
-
-@smallexample
-#ifndef _SIZE_T
-#define _SIZE_T
-@var{actual typedef here}
-#endif
-@end smallexample
-
-@cindex Alliant
-@item
-On the Alliant, the system's own convention for returning structures
-and unions is unusual, and is not compatible with GNU CC no matter
-what options are used.
-
-@cindex RT PC
-@cindex IBM RT PC
-@item
-On the IBM RT PC, the MetaWare HighC compiler (hc) uses a different
-convention for structure and union returning. Use the option
-@samp{-mhc-struct-return} to tell GNU CC to use a convention compatible
-with it.
-
-@cindex Vax calling convention
-@cindex Ultrix calling convention
-@item
-On Ultrix, the Fortran compiler expects registers 2 through 5 to be saved
-by function calls. However, the C compiler uses conventions compatible
-with BSD Unix: registers 2 through 5 may be clobbered by function calls.
-
-GNU CC uses the same convention as the Ultrix C compiler. You can use
-these options to produce code compatible with the Fortran compiler:
-
-@smallexample
--fcall-saved-r2 -fcall-saved-r3 -fcall-saved-r4 -fcall-saved-r5
-@end smallexample
-
-@item
-On the WE32k, you may find that programs compiled with GNU CC do not
-work with the standard shared C library. You may need to link with
-the ordinary C compiler. If you do so, you must specify the following
-options:
-
-@smallexample
--L/usr/local/lib/gcc-lib/we32k-att-sysv/2.8.1 -lgcc -lc_s
-@end smallexample
-
-The first specifies where to find the library @file{libgcc.a}
-specified with the @samp{-lgcc} option.
-
-GNU CC does linking by invoking @code{ld}, just as @code{cc} does, and
-there is no reason why it @emph{should} matter which compilation program
-you use to invoke @code{ld}. If someone tracks this problem down,
-it can probably be fixed easily.
-
-@item
-On the Alpha, you may get assembler errors about invalid syntax as a
-result of floating point constants. This is due to a bug in the C
-library functions @code{ecvt}, @code{fcvt} and @code{gcvt}. Given valid
-floating point numbers, they sometimes print @samp{NaN}.
-
-@item
-On Irix 4.0.5F (and perhaps in some other versions), an assembler bug
-sometimes reorders instructions incorrectly when optimization is turned
-on. If you think this may be happening to you, try using the GNU
-assembler; GAS version 2.1 supports ECOFF on Irix.
-
-Or use the @samp{-noasmopt} option when you compile GNU CC with itself,
-and then again when you compile your program. (This is a temporary
-kludge to turn off assembler optimization on Irix.) If this proves to
-be what you need, edit the assembler spec in the file @file{specs} so
-that it unconditionally passes @samp{-O0} to the assembler, and never
-passes @samp{-O2} or @samp{-O3}.
-@end itemize
-
-@node External Bugs
-@section Problems Compiling Certain Programs
-
-@c prevent bad page break with this line
-Certain programs have problems compiling.
-
-@itemize @bullet
-@item
-Parse errors may occur compiling X11 on a Decstation running Ultrix 4.2
-because of problems in DEC's versions of the X11 header files
-@file{X11/Xlib.h} and @file{X11/Xutil.h}. People recommend adding
-@samp{-I/usr/include/mit} to use the MIT versions of the header files,
-using the @samp{-traditional} switch to turn off ANSI C, or fixing the
-header files by adding this:
-
-@example
-#ifdef __STDC__
-#define NeedFunctionPrototypes 0
-#endif
-@end example
-
-@item
-If you have trouble compiling Perl on a SunOS 4 system, it may be
-because Perl specifies @samp{-I/usr/ucbinclude}. This accesses the
-unfixed header files. Perl specifies the options
-
-@example
--traditional -Dvolatile=__volatile__
--I/usr/include/sun -I/usr/ucbinclude
--fpcc-struct-return
-@end example
-
-@noindent
-most of which are unnecessary with GCC 2.4.5 and newer versions. You
-can make a properly working Perl by setting @code{ccflags} to
-@samp{-fwritable-strings} (implied by the @samp{-traditional} in the
-original options) and @code{cppflags} to empty in @file{config.sh}, then
-typing @samp{./doSH; make depend; make}.
-
-@item
-On various 386 Unix systems derived from System V, including SCO, ISC,
-and ESIX, you may get error messages about running out of virtual memory
-while compiling certain programs.
-
-You can prevent this problem by linking GNU CC with the GNU malloc
-(which thus replaces the malloc that comes with the system). GNU malloc
-is available as a separate package, and also in the file
-@file{src/gmalloc.c} in the GNU Emacs 19 distribution.
-
-If you have installed GNU malloc as a separate library package, use this
-option when you relink GNU CC:
-
-@example
-MALLOC=/usr/local/lib/libgmalloc.a
-@end example
-
-Alternatively, if you have compiled @file{gmalloc.c} from Emacs 19, copy
-the object file to @file{gmalloc.o} and use this option when you relink
-GNU CC:
-
-@example
-MALLOC=gmalloc.o
-@end example
-@end itemize
-
-@node Incompatibilities
-@section Incompatibilities of GNU CC
-@cindex incompatibilities of GNU CC
-
-There are several noteworthy incompatibilities between GNU C and most
-existing (non-ANSI) versions of C. The @samp{-traditional} option
-eliminates many of these incompatibilities, @emph{but not all}, by
-telling GNU C to behave like the other C compilers.
-
-@itemize @bullet
-@cindex string constants
-@cindex read-only strings
-@cindex shared strings
-@item
-GNU CC normally makes string constants read-only. If several
-identical-looking string constants are used, GNU CC stores only one
-copy of the string.
-
-@cindex @code{mktemp}, and constant strings
-One consequence is that you cannot call @code{mktemp} with a string
-constant argument. The function @code{mktemp} always alters the
-string its argument points to.
-
-@cindex @code{sscanf}, and constant strings
-@cindex @code{fscanf}, and constant strings
-@cindex @code{scanf}, and constant strings
-Another consequence is that @code{sscanf} does not work on some systems
-when passed a string constant as its format control string or input.
-This is because @code{sscanf} incorrectly tries to write into the string
-constant. Likewise @code{fscanf} and @code{scanf}.
-
-The best solution to these problems is to change the program to use
-@code{char}-array variables with initialization strings for these
-purposes instead of string constants. But if this is not possible,
-you can use the @samp{-fwritable-strings} flag, which directs GNU CC
-to handle string constants the same way most C compilers do.
-@samp{-traditional} also has this effect, among others.
-
-@item
-@code{-2147483648} is positive.
-
-This is because 2147483648 cannot fit in the type @code{int}, so
-(following the ANSI C rules) its data type is @code{unsigned long int}.
-Negating this value yields 2147483648 again.
-
-@item
-GNU CC does not substitute macro arguments when they appear inside of
-string constants. For example, the following macro in GNU CC
-
-@example
-#define foo(a) "a"
-@end example
-
-@noindent
-will produce output @code{"a"} regardless of what the argument @var{a} is.
-
-The @samp{-traditional} option directs GNU CC to handle such cases
-(among others) in the old-fashioned (non-ANSI) fashion.
-
-@cindex @code{setjmp} incompatibilities
-@cindex @code{longjmp} incompatibilities
-@item
-When you use @code{setjmp} and @code{longjmp}, the only automatic
-variables guaranteed to remain valid are those declared
-@code{volatile}. This is a consequence of automatic register
-allocation. Consider this function:
-
-@example
-jmp_buf j;
-
-foo ()
-@{
- int a, b;
-
- a = fun1 ();
- if (setjmp (j))
- return a;
-
- a = fun2 ();
- /* @r{@code{longjmp (j)} may occur in @code{fun3}.} */
- return a + fun3 ();
-@}
-@end example
-
-Here @code{a} may or may not be restored to its first value when the
-@code{longjmp} occurs. If @code{a} is allocated in a register, then
-its first value is restored; otherwise, it keeps the last value stored
-in it.
-
-If you use the @samp{-W} option with the @samp{-O} option, you will
-get a warning when GNU CC thinks such a problem might be possible.
-
-The @samp{-traditional} option directs GNU C to put variables in
-the stack by default, rather than in registers, in functions that
-call @code{setjmp}. This results in the behavior found in
-traditional C compilers.
-
-@item
-Programs that use preprocessing directives in the middle of macro
-arguments do not work with GNU CC. For example, a program like this
-will not work:
-
-@example
-foobar (
-#define luser
- hack)
-@end example
-
-ANSI C does not permit such a construct. It would make sense to support
-it when @samp{-traditional} is used, but it is too much work to
-implement.
-
-@cindex external declaration scope
-@cindex scope of external declarations
-@cindex declaration scope
-@item
-Declarations of external variables and functions within a block apply
-only to the block containing the declaration. In other words, they
-have the same scope as any other declaration in the same place.
-
-In some other C compilers, a @code{extern} declaration affects all the
-rest of the file even if it happens within a block.
-
-The @samp{-traditional} option directs GNU C to treat all @code{extern}
-declarations as global, like traditional compilers.
-
-@item
-In traditional C, you can combine @code{long}, etc., with a typedef name,
-as shown here:
-
-@example
-typedef int foo;
-typedef long foo bar;
-@end example
-
-In ANSI C, this is not allowed: @code{long} and other type modifiers
-require an explicit @code{int}. Because this criterion is expressed
-by Bison grammar rules rather than C code, the @samp{-traditional}
-flag cannot alter it.
-
-@cindex typedef names as function parameters
-@item
-PCC allows typedef names to be used as function parameters. The
-difficulty described immediately above applies here too.
-
-@cindex whitespace
-@item
-PCC allows whitespace in the middle of compound assignment operators
-such as @samp{+=}. GNU CC, following the ANSI standard, does not
-allow this. The difficulty described immediately above applies here
-too.
-
-@cindex apostrophes
-@cindex '
-@item
-GNU CC complains about unterminated character constants inside of
-preprocessing conditionals that fail. Some programs have English
-comments enclosed in conditionals that are guaranteed to fail; if these
-comments contain apostrophes, GNU CC will probably report an error. For
-example, this code would produce an error:
-
-@example
-#if 0
-You can't expect this to work.
-#endif
-@end example
-
-The best solution to such a problem is to put the text into an actual
-C comment delimited by @samp{/*@dots{}*/}. However,
-@samp{-traditional} suppresses these error messages.
-
-@item
-Many user programs contain the declaration @samp{long time ();}. In the
-past, the system header files on many systems did not actually declare
-@code{time}, so it did not matter what type your program declared it to
-return. But in systems with ANSI C headers, @code{time} is declared to
-return @code{time_t}, and if that is not the same as @code{long}, then
-@samp{long time ();} is erroneous.
-
-The solution is to change your program to use @code{time_t} as the return
-type of @code{time}.
-
-@cindex @code{float} as function value type
-@item
-When compiling functions that return @code{float}, PCC converts it to
-a double. GNU CC actually returns a @code{float}. If you are concerned
-with PCC compatibility, you should declare your functions to return
-@code{double}; you might as well say what you mean.
-
-@cindex structures
-@cindex unions
-@item
-When compiling functions that return structures or unions, GNU CC
-output code normally uses a method different from that used on most
-versions of Unix. As a result, code compiled with GNU CC cannot call
-a structure-returning function compiled with PCC, and vice versa.
-
-The method used by GNU CC is as follows: a structure or union which is
-1, 2, 4 or 8 bytes long is returned like a scalar. A structure or union
-with any other size is stored into an address supplied by the caller
-(usually in a special, fixed register, but on some machines it is passed
-on the stack). The machine-description macros @code{STRUCT_VALUE} and
-@code{STRUCT_INCOMING_VALUE} tell GNU CC where to pass this address.
-
-By contrast, PCC on most target machines returns structures and unions
-of any size by copying the data into an area of static storage, and then
-returning the address of that storage as if it were a pointer value.
-The caller must copy the data from that memory area to the place where
-the value is wanted. GNU CC does not use this method because it is
-slower and nonreentrant.
-
-On some newer machines, PCC uses a reentrant convention for all
-structure and union returning. GNU CC on most of these machines uses a
-compatible convention when returning structures and unions in memory,
-but still returns small structures and unions in registers.
-
-You can tell GNU CC to use a compatible convention for all structure and
-union returning with the option @samp{-fpcc-struct-return}.
-
-@cindex preprocessing tokens
-@cindex preprocessing numbers
-@item
-GNU C complains about program fragments such as @samp{0x74ae-0x4000}
-which appear to be two hexadecimal constants separated by the minus
-operator. Actually, this string is a single @dfn{preprocessing token}.
-Each such token must correspond to one token in C. Since this does not,
-GNU C prints an error message. Although it may appear obvious that what
-is meant is an operator and two values, the ANSI C standard specifically
-requires that this be treated as erroneous.
-
-A @dfn{preprocessing token} is a @dfn{preprocessing number} if it
-begins with a digit and is followed by letters, underscores, digits,
-periods and @samp{e+}, @samp{e-}, @samp{E+}, or @samp{E-} character
-sequences.
-
-To make the above program fragment valid, place whitespace in front of
-the minus sign. This whitespace will end the preprocessing number.
-@end itemize
-
-@node Fixed Headers
-@section Fixed Header Files
-
-GNU CC needs to install corrected versions of some system header files.
-This is because most target systems have some header files that won't
-work with GNU CC unless they are changed. Some have bugs, some are
-incompatible with ANSI C, and some depend on special features of other
-compilers.
-
-Installing GNU CC automatically creates and installs the fixed header
-files, by running a program called @code{fixincludes} (or for certain
-targets an alternative such as @code{fixinc.svr4}). Normally, you
-don't need to pay attention to this. But there are cases where it
-doesn't do the right thing automatically.
-
-@itemize @bullet
-@item
-If you update the system's header files, such as by installing a new
-system version, the fixed header files of GNU CC are not automatically
-updated. The easiest way to update them is to reinstall GNU CC. (If
-you want to be clever, look in the makefile and you can find a
-shortcut.)
-
-@item
-On some systems, in particular SunOS 4, header file directories contain
-machine-specific symbolic links in certain places. This makes it
-possible to share most of the header files among hosts running the
-same version of SunOS 4 on different machine models.
-
-The programs that fix the header files do not understand this special
-way of using symbolic links; therefore, the directory of fixed header
-files is good only for the machine model used to build it.
-
-In SunOS 4, only programs that look inside the kernel will notice the
-difference between machine models. Therefore, for most purposes, you
-need not be concerned about this.
-
-It is possible to make separate sets of fixed header files for the
-different machine models, and arrange a structure of symbolic links so
-as to use the proper set, but you'll have to do this by hand.
-
-@item
-On Lynxos, GNU CC by default does not fix the header files. This is
-because bugs in the shell cause the @code{fixincludes} script to fail.
-
-This means you will encounter problems due to bugs in the system header
-files. It may be no comfort that they aren't GNU CC's fault, but it
-does mean that there's nothing for us to do about them.
-@end itemize
-
-@node Standard Libraries
-@section Standard Libraries
-
-GNU CC by itself attempts to be what the ISO/ANSI C standard calls a
-@dfn{conforming freestanding implementation}. This means all ANSI
-C language features are available, as well as the contents of
-@file{float.h}, @file{limits.h}, @file{stdarg.h}, and
-@file{stddef.h}. The rest of the C library is supplied by the
-vendor of the operating system. If that C library doesn't conform to
-the C standards, then your programs might get warnings (especially when
-using @samp{-Wall}) that you don't expect.
-
-For example, the @code{sprintf} function on SunOS 4.1.3 returns
-@code{char *} while the C standard says that @code{sprintf} returns an
-@code{int}. The @code{fixincludes} program could make the prototype for
-this function match the Standard, but that would be wrong, since the
-function will still return @code{char *}.
-
-If you need a Standard compliant library, then you need to find one, as
-GNU CC does not provide one. The GNU C library (called @code{glibc})
-has been ported to a number of operating systems, and provides ANSI/ISO,
-POSIX, BSD and SystemV compatibility. You could also ask your operating
-system vendor if newer libraries are available.
-
-@node Disappointments
-@section Disappointments and Misunderstandings
-
-These problems are perhaps regrettable, but we don't know any practical
-way around them.
-
-@itemize @bullet
-@item
-Certain local variables aren't recognized by debuggers when you compile
-with optimization.
-
-This occurs because sometimes GNU CC optimizes the variable out of
-existence. There is no way to tell the debugger how to compute the
-value such a variable ``would have had'', and it is not clear that would
-be desirable anyway. So GNU CC simply does not mention the eliminated
-variable when it writes debugging information.
-
-You have to expect a certain amount of disagreement between the
-executable and your source code, when you use optimization.
-
-@cindex conflicting types
-@cindex scope of declaration
-@item
-Users often think it is a bug when GNU CC reports an error for code
-like this:
-
-@example
-int foo (struct mumble *);
-
-struct mumble @{ @dots{} @};
-
-int foo (struct mumble *x)
-@{ @dots{} @}
-@end example
-
-This code really is erroneous, because the scope of @code{struct
-mumble} in the prototype is limited to the argument list containing it.
-It does not refer to the @code{struct mumble} defined with file scope
-immediately below---they are two unrelated types with similar names in
-different scopes.
-
-But in the definition of @code{foo}, the file-scope type is used
-because that is available to be inherited. Thus, the definition and
-the prototype do not match, and you get an error.
-
-This behavior may seem silly, but it's what the ANSI standard specifies.
-It is easy enough for you to make your code work by moving the
-definition of @code{struct mumble} above the prototype. It's not worth
-being incompatible with ANSI C just to avoid an error for the example
-shown above.
-
-@item
-Accesses to bitfields even in volatile objects works by accessing larger
-objects, such as a byte or a word. You cannot rely on what size of
-object is accessed in order to read or write the bitfield; it may even
-vary for a given bitfield according to the precise usage.
-
-If you care about controlling the amount of memory that is accessed, use
-volatile but do not use bitfields.
-
-@item
-GNU CC comes with shell scripts to fix certain known problems in system
-header files. They install corrected copies of various header files in
-a special directory where only GNU CC will normally look for them. The
-scripts adapt to various systems by searching all the system header
-files for the problem cases that we know about.
-
-If new system header files are installed, nothing automatically arranges
-to update the corrected header files. You will have to reinstall GNU CC
-to fix the new header files. More specifically, go to the build
-directory and delete the files @file{stmp-fixinc} and
-@file{stmp-headers}, and the subdirectory @code{include}; then do
-@samp{make install} again.
-
-@item
-@cindex floating point precision
-On 68000 and x86 systems, for instance, you can get paradoxical results
-if you test the precise values of floating point numbers. For example,
-you can find that a floating point value which is not a NaN is not equal
-to itself. This results from the fact that the floating point registers
-hold a few more bits of precision than fit in a @code{double} in memory.
-Compiled code moves values between memory and floating point registers
-at its convenience, and moving them into memory truncates them.
-
-You can partially avoid this problem by using the @samp{-ffloat-store}
-option (@pxref{Optimize Options}).
-
-@item
-On the MIPS, variable argument functions using @file{varargs.h}
-cannot have a floating point value for the first argument. The
-reason for this is that in the absence of a prototype in scope,
-if the first argument is a floating point, it is passed in a
-floating point register, rather than an integer register.
-
-If the code is rewritten to use the ANSI standard @file{stdarg.h}
-method of variable arguments, and the prototype is in scope at
-the time of the call, everything will work fine.
-
-@item
-On the H8/300 and H8/300H, variable argument functions must be
-implemented using the ANSI standard @file{stdarg.h} method of
-variable arguments. Furthermore, calls to functions using @file{stdarg.h}
-variable arguments must have a prototype for the called function
-in scope at the time of the call.
-@end itemize
-
-@node C++ Misunderstandings
-@section Common Misunderstandings with GNU C++
-
-@cindex misunderstandings in C++
-@cindex surprises in C++
-@cindex C++ misunderstandings
-C++ is a complex language and an evolving one, and its standard definition
-(the ANSI C++ draft standard) is also evolving. As a result,
-your C++ compiler may occasionally surprise you, even when its behavior is
-correct. This section discusses some areas that frequently give rise to
-questions of this sort.
-
-@menu
-* Static Definitions:: Static member declarations are not definitions
-* Temporaries:: Temporaries may vanish before you expect
-@end menu
-
-@node Static Definitions
-@subsection Declare @emph{and} Define Static Members
-
-@cindex C++ static data, declaring and defining
-@cindex static data in C++, declaring and defining
-@cindex declaring static data in C++
-@cindex defining static data in C++
-When a class has static data members, it is not enough to @emph{declare}
-the static member; you must also @emph{define} it. For example:
-
-@example
-class Foo
-@{
- @dots{}
- void method();
- static int bar;
-@};
-@end example
-
-This declaration only establishes that the class @code{Foo} has an
-@code{int} named @code{Foo::bar}, and a member function named
-@code{Foo::method}. But you still need to define @emph{both}
-@code{method} and @code{bar} elsewhere. According to the draft ANSI
-standard, you must supply an initializer in one (and only one) source
-file, such as:
-
-@example
-int Foo::bar = 0;
-@end example
-
-Other C++ compilers may not correctly implement the standard behavior.
-As a result, when you switch to @code{g++} from one of these compilers,
-you may discover that a program that appeared to work correctly in fact
-does not conform to the standard: @code{g++} reports as undefined
-symbols any static data members that lack definitions.
-
-@node Temporaries
-@subsection Temporaries May Vanish Before You Expect
-
-@cindex temporaries, lifetime of
-@cindex portions of temporary objects, pointers to
-It is dangerous to use pointers or references to @emph{portions} of a
-temporary object. The compiler may very well delete the object before
-you expect it to, leaving a pointer to garbage. The most common place
-where this problem crops up is in classes like the libg++
-@code{String} class, that define a conversion function to type
-@code{char *} or @code{const char *}. However, any class that returns
-a pointer to some internal structure is potentially subject to this
-problem.
-
-For example, a program may use a function @code{strfunc} that returns
-@code{String} objects, and another function @code{charfunc} that
-operates on pointers to @code{char}:
-
-@example
-String strfunc ();
-void charfunc (const char *);
-@end example
-
-@noindent
-In this situation, it may seem natural to write @w{@samp{charfunc
-(strfunc ());}} based on the knowledge that class @code{String} has an
-explicit conversion to @code{char} pointers. However, what really
-happens is akin to @samp{charfunc (@w{strfunc ()}.@w{convert ()});},
-where the @code{convert} method is a function to do the same data
-conversion normally performed by a cast. Since the last use of the
-temporary @code{String} object is the call to the conversion function,
-the compiler may delete that object before actually calling
-@code{charfunc}. The compiler has no way of knowing that deleting the
-@code{String} object will invalidate the pointer. The pointer then
-points to garbage, so that by the time @code{charfunc} is called, it
-gets an invalid argument.
-
-Code like this may run successfully under some other compilers,
-especially those that delete temporaries relatively late. However, the
-GNU C++ behavior is also standard-conforming, so if your program depends
-on late destruction of temporaries it is not portable.
-
-If you think this is surprising, you should be aware that the ANSI C++
-committee continues to debate the lifetime-of-temporaries problem.
-
-For now, at least, the safe way to write such code is to give the
-temporary a name, which forces it to remain until the end of the scope of
-the name. For example:
-
-@example
-String& tmp = strfunc ();
-charfunc (tmp);
-@end example
-
-@node Protoize Caveats
-@section Caveats of using @code{protoize}
-
-The conversion programs @code{protoize} and @code{unprotoize} can
-sometimes change a source file in a way that won't work unless you
-rearrange it.
-
-@itemize @bullet
-@item
-@code{protoize} can insert references to a type name or type tag before
-the definition, or in a file where they are not defined.
-
-If this happens, compiler error messages should show you where the new
-references are, so fixing the file by hand is straightforward.
-
-@item
-There are some C constructs which @code{protoize} cannot figure out.
-For example, it can't determine argument types for declaring a
-pointer-to-function variable; this you must do by hand. @code{protoize}
-inserts a comment containing @samp{???} each time it finds such a
-variable; so you can find all such variables by searching for this
-string. ANSI C does not require declaring the argument types of
-pointer-to-function types.
-
-@item
-Using @code{unprotoize} can easily introduce bugs. If the program
-relied on prototypes to bring about conversion of arguments, these
-conversions will not take place in the program without prototypes.
-One case in which you can be sure @code{unprotoize} is safe is when
-you are removing prototypes that were made with @code{protoize}; if
-the program worked before without any prototypes, it will work again
-without them.
-
-You can find all the places where this problem might occur by compiling
-the program with the @samp{-Wconversion} option. It prints a warning
-whenever an argument is converted.
-
-@item
-Both conversion programs can be confused if there are macro calls in and
-around the text to be converted. In other words, the standard syntax
-for a declaration or definition must not result from expanding a macro.
-This problem is inherent in the design of C and cannot be fixed. If
-only a few functions have confusing macro calls, you can easily convert
-them manually.
-
-@item
-@code{protoize} cannot get the argument types for a function whose
-definition was not actually compiled due to preprocessing conditionals.
-When this happens, @code{protoize} changes nothing in regard to such
-a function. @code{protoize} tries to detect such instances and warn
-about them.
-
-You can generally work around this problem by using @code{protoize} step
-by step, each time specifying a different set of @samp{-D} options for
-compilation, until all of the functions have been converted. There is
-no automatic way to verify that you have got them all, however.
-
-@item
-Confusion may result if there is an occasion to convert a function
-declaration or definition in a region of source code where there is more
-than one formal parameter list present. Thus, attempts to convert code
-containing multiple (conditionally compiled) versions of a single
-function header (in the same vicinity) may not produce the desired (or
-expected) results.
-
-If you plan on converting source files which contain such code, it is
-recommended that you first make sure that each conditionally compiled
-region of source code which contains an alternative function header also
-contains at least one additional follower token (past the final right
-parenthesis of the function header). This should circumvent the
-problem.
-
-@item
-@code{unprotoize} can become confused when trying to convert a function
-definition or declaration which contains a declaration for a
-pointer-to-function formal argument which has the same name as the
-function being defined or declared. We recommand you avoid such choices
-of formal parameter names.
-
-@item
-You might also want to correct some of the indentation by hand and break
-long lines. (The conversion programs don't write lines longer than
-eighty characters in any case.)
-@end itemize
-
-@node Non-bugs
-@section Certain Changes We Don't Want to Make
-
-This section lists changes that people frequently request, but which
-we do not make because we think GNU CC is better without them.
-
-@itemize @bullet
-@item
-Checking the number and type of arguments to a function which has an
-old-fashioned definition and no prototype.
-
-Such a feature would work only occasionally---only for calls that appear
-in the same file as the called function, following the definition. The
-only way to check all calls reliably is to add a prototype for the
-function. But adding a prototype eliminates the motivation for this
-feature. So the feature is not worthwhile.
-
-@item
-Warning about using an expression whose type is signed as a shift count.
-
-Shift count operands are probably signed more often than unsigned.
-Warning about this would cause far more annoyance than good.
-
-@item
-Warning about assigning a signed value to an unsigned variable.
-
-Such assignments must be very common; warning about them would cause
-more annoyance than good.
-
-@item
-Warning about unreachable code.
-
-It's very common to have unreachable code in machine-generated
-programs. For example, this happens normally in some files of GNU C
-itself.
-
-@item
-Warning when a non-void function value is ignored.
-
-Coming as I do from a Lisp background, I balk at the idea that there is
-something dangerous about discarding a value. There are functions that
-return values which some callers may find useful; it makes no sense to
-clutter the program with a cast to @code{void} whenever the value isn't
-useful.
-
-@item
-Assuming (for optimization) that the address of an external symbol is
-never zero.
-
-This assumption is false on certain systems when @samp{#pragma weak} is
-used.
-
-@item
-Making @samp{-fshort-enums} the default.
-
-This would cause storage layout to be incompatible with most other C
-compilers. And it doesn't seem very important, given that you can get
-the same result in other ways. The case where it matters most is when
-the enumeration-valued object is inside a structure, and in that case
-you can specify a field width explicitly.
-
-@item
-Making bitfields unsigned by default on particular machines where ``the
-ABI standard'' says to do so.
-
-The ANSI C standard leaves it up to the implementation whether a bitfield
-declared plain @code{int} is signed or not. This in effect creates two
-alternative dialects of C.
-
-The GNU C compiler supports both dialects; you can specify the signed
-dialect with @samp{-fsigned-bitfields} and the unsigned dialect with
-@samp{-funsigned-bitfields}. However, this leaves open the question of
-which dialect to use by default.
-
-Currently, the preferred dialect makes plain bitfields signed, because
-this is simplest. Since @code{int} is the same as @code{signed int} in
-every other context, it is cleanest for them to be the same in bitfields
-as well.
-
-Some computer manufacturers have published Application Binary Interface
-standards which specify that plain bitfields should be unsigned. It is
-a mistake, however, to say anything about this issue in an ABI. This is
-because the handling of plain bitfields distinguishes two dialects of C.
-Both dialects are meaningful on every type of machine. Whether a
-particular object file was compiled using signed bitfields or unsigned
-is of no concern to other object files, even if they access the same
-bitfields in the same data structures.
-
-A given program is written in one or the other of these two dialects.
-The program stands a chance to work on most any machine if it is
-compiled with the proper dialect. It is unlikely to work at all if
-compiled with the wrong dialect.
-
-Many users appreciate the GNU C compiler because it provides an
-environment that is uniform across machines. These users would be
-inconvenienced if the compiler treated plain bitfields differently on
-certain machines.
-
-Occasionally users write programs intended only for a particular machine
-type. On these occasions, the users would benefit if the GNU C compiler
-were to support by default the same dialect as the other compilers on
-that machine. But such applications are rare. And users writing a
-program to run on more than one type of machine cannot possibly benefit
-from this kind of compatibility.
-
-This is why GNU CC does and will treat plain bitfields in the same
-fashion on all types of machines (by default).
-
-There are some arguments for making bitfields unsigned by default on all
-machines. If, for example, this becomes a universal de facto standard,
-it would make sense for GNU CC to go along with it. This is something
-to be considered in the future.
-
-(Of course, users strongly concerned about portability should indicate
-explicitly in each bitfield whether it is signed or not. In this way,
-they write programs which have the same meaning in both C dialects.)
-
-@item
-Undefining @code{__STDC__} when @samp{-ansi} is not used.
-
-Currently, GNU CC defines @code{__STDC__} as long as you don't use
-@samp{-traditional}. This provides good results in practice.
-
-Programmers normally use conditionals on @code{__STDC__} to ask whether
-it is safe to use certain features of ANSI C, such as function
-prototypes or ANSI token concatenation. Since plain @samp{gcc} supports
-all the features of ANSI C, the correct answer to these questions is
-``yes''.
-
-Some users try to use @code{__STDC__} to check for the availability of
-certain library facilities. This is actually incorrect usage in an ANSI
-C program, because the ANSI C standard says that a conforming
-freestanding implementation should define @code{__STDC__} even though it
-does not have the library facilities. @samp{gcc -ansi -pedantic} is a
-conforming freestanding implementation, and it is therefore required to
-define @code{__STDC__}, even though it does not come with an ANSI C
-library.
-
-Sometimes people say that defining @code{__STDC__} in a compiler that
-does not completely conform to the ANSI C standard somehow violates the
-standard. This is illogical. The standard is a standard for compilers
-that claim to support ANSI C, such as @samp{gcc -ansi}---not for other
-compilers such as plain @samp{gcc}. Whatever the ANSI C standard says
-is relevant to the design of plain @samp{gcc} without @samp{-ansi} only
-for pragmatic reasons, not as a requirement.
-
-GNU CC normally defines @code{__STDC__} to be 1, and in addition
-defines @code{__STRICT_ANSI__} if you specify the @samp{-ansi} option.
-On some hosts, system include files use a different convention, where
-@code{__STDC__} is normally 0, but is 1 if the user specifies strict
-conformance to the C Standard. GNU CC follows the host convention when
-processing system include files, but when processing user files it follows
-the usual GNU C convention.
-
-@item
-Undefining @code{__STDC__} in C++.
-
-Programs written to compile with C++-to-C translators get the
-value of @code{__STDC__} that goes with the C compiler that is
-subsequently used. These programs must test @code{__STDC__}
-to determine what kind of C preprocessor that compiler uses:
-whether they should concatenate tokens in the ANSI C fashion
-or in the traditional fashion.
-
-These programs work properly with GNU C++ if @code{__STDC__} is defined.
-They would not work otherwise.
-
-In addition, many header files are written to provide prototypes in ANSI
-C but not in traditional C. Many of these header files can work without
-change in C++ provided @code{__STDC__} is defined. If @code{__STDC__}
-is not defined, they will all fail, and will all need to be changed to
-test explicitly for C++ as well.
-
-@item
-Deleting ``empty'' loops.
-
-GNU CC does not delete ``empty'' loops because the most likely reason
-you would put one in a program is to have a delay. Deleting them will
-not make real programs run any faster, so it would be pointless.
-
-Historically, GNU CC has not deleted ``empty'' loops under the
-assumption that the most likely reason you would put one in a program is
-to have a delay, so deleting them will not make real programs run any
-faster.
-
-However, the rationale here is that optimization of a nonempty loop
-cannot produce an empty one, which holds for C but is not always the
-case for C++.
-
-Moreover, with @samp{-funroll-loops} small ``empty'' loops are already
-removed, so the current behavior is both sub-optimal and inconsistent
-and will change in the future.
-
-@item
-Making side effects happen in the same order as in some other compiler.
-
-@cindex side effects, order of evaluation
-@cindex order of evaluation, side effects
-It is never safe to depend on the order of evaluation of side effects.
-For example, a function call like this may very well behave differently
-from one compiler to another:
-
-@example
-void func (int, int);
-
-int i = 2;
-func (i++, i++);
-@end example
-
-There is no guarantee (in either the C or the C++ standard language
-definitions) that the increments will be evaluated in any particular
-order. Either increment might happen first. @code{func} might get the
-arguments @samp{2, 3}, or it might get @samp{3, 2}, or even @samp{2, 2}.
-
-@item
-Not allowing structures with volatile fields in registers.
-
-Strictly speaking, there is no prohibition in the ANSI C standard
-against allowing structures with volatile fields in registers, but
-it does not seem to make any sense and is probably not what you wanted
-to do. So the compiler will give an error message in this case.
-@end itemize
-
-@node Warnings and Errors
-@section Warning Messages and Error Messages
-
-@cindex error messages
-@cindex warnings vs errors
-@cindex messages, warning and error
-The GNU compiler can produce two kinds of diagnostics: errors and
-warnings. Each kind has a different purpose:
-
-@itemize @w{}
-@item
-@emph{Errors} report problems that make it impossible to compile your
-program. GNU CC reports errors with the source file name and line
-number where the problem is apparent.
-
-@item
-@emph{Warnings} report other unusual conditions in your code that
-@emph{may} indicate a problem, although compilation can (and does)
-proceed. Warning messages also report the source file name and line
-number, but include the text @samp{warning:} to distinguish them
-from error messages.
-@end itemize
-
-Warnings may indicate danger points where you should check to make sure
-that your program really does what you intend; or the use of obsolete
-features; or the use of nonstandard features of GNU C or C++. Many
-warnings are issued only if you ask for them, with one of the @samp{-W}
-options (for instance, @samp{-Wall} requests a variety of useful
-warnings).
-
-GNU CC always tries to compile your program if possible; it never
-gratuitously rejects a program whose meaning is clear merely because
-(for instance) it fails to conform to a standard. In some cases,
-however, the C and C++ standards specify that certain extensions are
-forbidden, and a diagnostic @emph{must} be issued by a conforming
-compiler. The @samp{-pedantic} option tells GNU CC to issue warnings in
-such cases; @samp{-pedantic-errors} says to make them errors instead.
-This does not mean that @emph{all} non-ANSI constructs get warnings
-or errors.
-
-@xref{Warning Options,,Options to Request or Suppress Warnings}, for
-more detail on these and related command-line options.
-
-@node Bugs
-@chapter Reporting Bugs
-@cindex bugs
-@cindex reporting bugs
-
-Your bug reports play an essential role in making GNU CC reliable.
-
-When you encounter a problem, the first thing to do is to see if it is
-already known. @xref{Trouble}. If it isn't known, then you should
-report the problem.
-
-Reporting a bug may help you by bringing a solution to your problem, or
-it may not. (If it does not, look in the service directory; see
-@ref{Service}.) In any case, the principal function of a bug report is
-to help the entire community by making the next version of GNU CC work
-better. Bug reports are your contribution to the maintenance of GNU CC.
-
-Since the maintainers are very overloaded, we cannot respond to every
-bug report. However, if the bug has not been fixed, we are likely to
-send you a patch and ask you to tell us whether it works.
-
-In order for a bug report to serve its purpose, you must include the
-information that makes for fixing the bug.
-
-@menu
-* Criteria: Bug Criteria. Have you really found a bug?
-* Where: Bug Lists. Where to send your bug report.
-* Reporting: Bug Reporting. How to report a bug effectively.
-* Patches: Sending Patches. How to send a patch for GNU CC.
-* Known: Trouble. Known problems.
-* Help: Service. Where to ask for help.
-@end menu
-
-@node Bug Criteria
-@section Have You Found a Bug?
-@cindex bug criteria
-
-If you are not sure whether you have found a bug, here are some guidelines:
-
-@itemize @bullet
-@cindex fatal signal
-@cindex core dump
-@item
-If the compiler gets a fatal signal, for any input whatever, that is a
-compiler bug. Reliable compilers never crash.
-
-@cindex invalid assembly code
-@cindex assembly code, invalid
-@item
-If the compiler produces invalid assembly code, for any input whatever
-(except an @code{asm} statement), that is a compiler bug, unless the
-compiler reports errors (not just warnings) which would ordinarily
-prevent the assembler from being run.
-
-@cindex undefined behavior
-@cindex undefined function value
-@cindex increment operators
-@item
-If the compiler produces valid assembly code that does not correctly
-execute the input source code, that is a compiler bug.
-
-However, you must double-check to make sure, because you may have run
-into an incompatibility between GNU C and traditional C
-(@pxref{Incompatibilities}). These incompatibilities might be considered
-bugs, but they are inescapable consequences of valuable features.
-
-Or you may have a program whose behavior is undefined, which happened
-by chance to give the desired results with another C or C++ compiler.
-
-For example, in many nonoptimizing compilers, you can write @samp{x;}
-at the end of a function instead of @samp{return x;}, with the same
-results. But the value of the function is undefined if @code{return}
-is omitted; it is not a bug when GNU CC produces different results.
-
-Problems often result from expressions with two increment operators,
-as in @code{f (*p++, *p++)}. Your previous compiler might have
-interpreted that expression the way you intended; GNU CC might
-interpret it another way. Neither compiler is wrong. The bug is
-in your code.
-
-After you have localized the error to a single source line, it should
-be easy to check for these things. If your program is correct and
-well defined, you have found a compiler bug.
-
-@item
-If the compiler produces an error message for valid input, that is a
-compiler bug.
-
-@cindex invalid input
-@item
-If the compiler does not produce an error message for invalid input,
-that is a compiler bug. However, you should note that your idea of
-``invalid input'' might be my idea of ``an extension'' or ``support
-for traditional practice''.
-
-@item
-If you are an experienced user of C or C++ compilers, your suggestions
-for improvement of GNU CC or GNU C++ are welcome in any case.
-@end itemize
-
-@node Bug Lists
-@section Where to Report Bugs
-@cindex bug report mailing lists
-@kindex egcs-bugs@@cygnus.com
-Send bug reports for GNU C to @samp{egcs-bugs@@cygnus.com}.
-
-@kindex egcs-bugs@@cygnus.com
-@kindex egcs-bugs@@cygnus.com
-Send bug reports for GNU C++ and the C++ runtime libraries to
-@samp{egcs-bugs@@cygnus.com}.
-
-Often people think of posting bug reports to the newsgroup instead of
-mailing them. This appears to work, but it has one problem which can be
-crucial: a newsgroup posting does not contain a mail path back to the
-sender. Thus, if maintainers need more information, they may be unable
-to reach you. For this reason, you should always send bug reports by
-mail to the proper mailing list.
-
-As a last resort, send bug reports on paper to:
-
-@example
-GNU Compiler Bugs
-Free Software Foundation
-59 Temple Place - Suite 330
-Boston, MA 02111-1307, USA
-@end example
-
-@node Bug Reporting
-@section How to Report Bugs
-@cindex compiler bugs, reporting
-
-The fundamental principle of reporting bugs usefully is this:
-@strong{report all the facts}. If you are not sure whether to state a
-fact or leave it out, state it!
-
-Often people omit facts because they think they know what causes the
-problem and they conclude that some details don't matter. Thus, you might
-assume that the name of the variable you use in an example does not matter.
-Well, probably it doesn't, but one cannot be sure. Perhaps the bug is a
-stray memory reference which happens to fetch from the location where that
-name is stored in memory; perhaps, if the name were different, the contents
-of that location would fool the compiler into doing the right thing despite
-the bug. Play it safe and give a specific, complete example. That is the
-easiest thing for you to do, and the most helpful.
-
-Keep in mind that the purpose of a bug report is to enable someone to
-fix the bug if it is not known. It isn't very important what happens if
-the bug is already known. Therefore, always write your bug reports on
-the assumption that the bug is not known.
-
-Sometimes people give a few sketchy facts and ask, ``Does this ring a
-bell?'' This cannot help us fix a bug, so it is basically useless. We
-respond by asking for enough details to enable us to investigate.
-You might as well expedite matters by sending them to begin with.
-
-Try to make your bug report self-contained. If we have to ask you for
-more information, it is best if you include all the previous information
-in your response, as well as the information that was missing.
-
-Please report each bug in a separate message. This makes it easier for
-us to track which bugs have been fixed and to forward your bugs reports
-to the appropriate maintainer.
-
-If you include source code in your message, you can send it as clear
-text if it is small. If the message is larger, you may compress it using
-@file{gzip}, @file{bzip2}, or @file{pkzip}. Please be aware that sending
-compressed files needs an additional binary-safe mechanism such as
-@code{MIME} or @code{uuencode}. There is a 40k message soft limit on the
-@samp{egcs-bugs@@cygnus.com} mailing list at the time of this writing
-(August 1998). However, if you can't reduce a bug report to less than
-that, post it anyway; it will be manually approved as long as it is
-compressed. Don't think that posting a URL to the code is better, we do
-want to archive bug reports, and not all maintainers have good network
-connectivity to download large pieces of software when they need them;
-it's much easier for them to have them in their mailboxes.
-
-To enable someone to investigate the bug, you should include all these
-things:
-
-@itemize @bullet
-@item
-The version of GNU CC. You can get this by running it with the
-@samp{-v} option.
-
-Without this, we won't know whether there is any point in looking for
-the bug in the current version of GNU CC.
-
-@item
-A complete input file that will reproduce the bug. If the bug is in the
-C preprocessor, send a source file and any header files that it
-requires. If the bug is in the compiler proper (@file{cc1}), send the
-preprocessor output generated by adding @samp{-save-temps} to the
-compilation command (@pxref{Debugging Options}). When you do this, use
-the same @samp{-I}, @samp{-D} or @samp{-U} options that you used in
-actual compilation. Then send the @var{input}.i or @var{input}.ii files
-generated.
-
-A single statement is not enough of an example. In order to compile it,
-it must be embedded in a complete file of compiler input; and the bug
-might depend on the details of how this is done.
-
-Without a real example one can compile, all anyone can do about your bug
-report is wish you luck. It would be futile to try to guess how to
-provoke the bug. For example, bugs in register allocation and reloading
-frequently depend on every little detail of the function they happen in.
-
-Even if the input file that fails comes from a GNU program, you should
-still send the complete test case. Don't ask the GNU CC maintainers to
-do the extra work of obtaining the program in question---they are all
-overworked as it is. Also, the problem may depend on what is in the
-header files on your system; it is unreliable for the GNU CC maintainers
-to try the problem with the header files available to them. By sending
-CPP output, you can eliminate this source of uncertainty and save us
-a certain percentage of wild goose chases.
-
-@item
-The command arguments you gave GNU CC or GNU C++ to compile that example
-and observe the bug. For example, did you use @samp{-O}? To guarantee
-you won't omit something important, list all the options.
-
-If we were to try to guess the arguments, we would probably guess wrong
-and then we would not encounter the bug.
-
-@item
-The type of machine you are using, and the operating system name and
-version number.
-
-@item
-The operands you gave to the @code{configure} command when you installed
-the compiler.
-
-@item
-A complete list of any modifications you have made to the compiler
-source. (We don't promise to investigate the bug unless it happens in
-an unmodified compiler. But if you've made modifications and don't tell
-us, then you are sending us on a wild goose chase.)
-
-Be precise about these changes. A description in English is not
-enough---send a context diff for them.
-
-Adding files of your own (such as a machine description for a machine we
-don't support) is a modification of the compiler source.
-
-@item
-Details of any other deviations from the standard procedure for installing
-GNU CC.
-
-@item
-A description of what behavior you observe that you believe is
-incorrect. For example, ``The compiler gets a fatal signal,'' or,
-``The assembler instruction at line 208 in the output is incorrect.''
-
-Of course, if the bug is that the compiler gets a fatal signal, then one
-can't miss it. But if the bug is incorrect output, the maintainer might
-not notice unless it is glaringly wrong. None of us has time to study
-all the assembler code from a 50-line C program just on the chance that
-one instruction might be wrong. We need @emph{you} to do this part!
-
-Even if the problem you experience is a fatal signal, you should still
-say so explicitly. Suppose something strange is going on, such as, your
-copy of the compiler is out of synch, or you have encountered a bug in
-the C library on your system. (This has happened!) Your copy might
-crash and the copy here would not. If you @i{said} to expect a crash,
-then when the compiler here fails to crash, we would know that the bug
-was not happening. If you don't say to expect a crash, then we would
-not know whether the bug was happening. We would not be able to draw
-any conclusion from our observations.
-
-If the problem is a diagnostic when compiling GNU CC with some other
-compiler, say whether it is a warning or an error.
-
-Often the observed symptom is incorrect output when your program is run.
-Sad to say, this is not enough information unless the program is short
-and simple. None of us has time to study a large program to figure out
-how it would work if compiled correctly, much less which line of it was
-compiled wrong. So you will have to do that. Tell us which source line
-it is, and what incorrect result happens when that line is executed. A
-person who understands the program can find this as easily as finding a
-bug in the program itself.
-
-@item
-If you send examples of assembler code output from GNU CC or GNU C++,
-please use @samp{-g} when you make them. The debugging information
-includes source line numbers which are essential for correlating the
-output with the input.
-
-@item
-If you wish to mention something in the GNU CC source, refer to it by
-context, not by line number.
-
-The line numbers in the development sources don't match those in your
-sources. Your line numbers would convey no useful information to the
-maintainers.
-
-@item
-Additional information from a debugger might enable someone to find a
-problem on a machine which he does not have available. However, you
-need to think when you collect this information if you want it to have
-any chance of being useful.
-
-@cindex backtrace for bug reports
-For example, many people send just a backtrace, but that is never
-useful by itself. A simple backtrace with arguments conveys little
-about GNU CC because the compiler is largely data-driven; the same
-functions are called over and over for different RTL insns, doing
-different things depending on the details of the insn.
-
-Most of the arguments listed in the backtrace are useless because they
-are pointers to RTL list structure. The numeric values of the
-pointers, which the debugger prints in the backtrace, have no
-significance whatever; all that matters is the contents of the objects
-they point to (and most of the contents are other such pointers).
-
-In addition, most compiler passes consist of one or more loops that
-scan the RTL insn sequence. The most vital piece of information about
-such a loop---which insn it has reached---is usually in a local variable,
-not in an argument.
-
-@findex debug_rtx
-What you need to provide in addition to a backtrace are the values of
-the local variables for several stack frames up. When a local
-variable or an argument is an RTX, first print its value and then use
-the GDB command @code{pr} to print the RTL expression that it points
-to. (If GDB doesn't run on your machine, use your debugger to call
-the function @code{debug_rtx} with the RTX as an argument.) In
-general, whenever a variable is a pointer, its value is no use
-without the data it points to.
-@end itemize
-
-Here are some things that are not necessary:
-
-@itemize @bullet
-@item
-A description of the envelope of the bug.
-
-Often people who encounter a bug spend a lot of time investigating
-which changes to the input file will make the bug go away and which
-changes will not affect it.
-
-This is often time consuming and not very useful, because the way we
-will find the bug is by running a single example under the debugger with
-breakpoints, not by pure deduction from a series of examples. You might
-as well save your time for something else.
-
-Of course, if you can find a simpler example to report @emph{instead} of
-the original one, that is a convenience. Errors in the output will be
-easier to spot, running under the debugger will take less time, etc.
-Most GNU CC bugs involve just one function, so the most straightforward
-way to simplify an example is to delete all the function definitions
-except the one where the bug occurs. Those earlier in the file may be
-replaced by external declarations if the crucial function depends on
-them. (Exception: inline functions may affect compilation of functions
-defined later in the file.)
-
-However, simplification is not vital; if you don't want to do this,
-report the bug anyway and send the entire test case you used.
-
-@item
-In particular, some people insert conditionals @samp{#ifdef BUG} around
-a statement which, if removed, makes the bug not happen. These are just
-clutter; we won't pay any attention to them anyway. Besides, you should
-send us cpp output, and that can't have conditionals.
-
-@item
-A patch for the bug.
-
-A patch for the bug is useful if it is a good one. But don't omit the
-necessary information, such as the test case, on the assumption that a
-patch is all we need. We might see problems with your patch and decide
-to fix the problem another way, or we might not understand it at all.
-
-Sometimes with a program as complicated as GNU CC it is very hard to
-construct an example that will make the program follow a certain path
-through the code. If you don't send the example, we won't be able to
-construct one, so we won't be able to verify that the bug is fixed.
-
-And if we can't understand what bug you are trying to fix, or why your
-patch should be an improvement, we won't install it. A test case will
-help us to understand.
-
-@xref{Sending Patches}, for guidelines on how to make it easy for us to
-understand and install your patches.
-
-@item
-A guess about what the bug is or what it depends on.
-
-Such guesses are usually wrong. Even I can't guess right about such
-things without first using the debugger to find the facts.
-
-@item
-A core dump file.
-
-We have no way of examining a core dump for your type of machine
-unless we have an identical system---and if we do have one,
-we should be able to reproduce the crash ourselves.
-@end itemize
-
-@node Sending Patches,, Bug Reporting, Bugs
-@section Sending Patches for GNU CC
-
-If you would like to write bug fixes or improvements for the GNU C
-compiler, that is very helpful. Send suggested fixes to the bug report
-mailing list, @code{egcs-bugs@@cygnus.com}.
-
-Please follow these guidelines so we can study your patches efficiently.
-If you don't follow these guidelines, your information might still be
-useful, but using it will take extra work. Maintaining GNU C is a lot
-of work in the best of circumstances, and we can't keep up unless you do
-your best to help.
-
-@itemize @bullet
-@item
-Send an explanation with your changes of what problem they fix or what
-improvement they bring about. For a bug fix, just include a copy of the
-bug report, and explain why the change fixes the bug.
-
-(Referring to a bug report is not as good as including it, because then
-we will have to look it up, and we have probably already deleted it if
-we've already fixed the bug.)
-
-@item
-Always include a proper bug report for the problem you think you have
-fixed. We need to convince ourselves that the change is right before
-installing it. Even if it is right, we might have trouble judging it if
-we don't have a way to reproduce the problem.
-
-@item
-Include all the comments that are appropriate to help people reading the
-source in the future understand why this change was needed.
-
-@item
-Don't mix together changes made for different reasons.
-Send them @emph{individually}.
-
-If you make two changes for separate reasons, then we might not want to
-install them both. We might want to install just one. If you send them
-all jumbled together in a single set of diffs, we have to do extra work
-to disentangle them---to figure out which parts of the change serve
-which purpose. If we don't have time for this, we might have to ignore
-your changes entirely.
-
-If you send each change as soon as you have written it, with its own
-explanation, then the two changes never get tangled up, and we can
-consider each one properly without any extra work to disentangle them.
-
-Ideally, each change you send should be impossible to subdivide into
-parts that we might want to consider separately, because each of its
-parts gets its motivation from the other parts.
-
-@item
-Send each change as soon as that change is finished. Sometimes people
-think they are helping us by accumulating many changes to send them all
-together. As explained above, this is absolutely the worst thing you
-could do.
-
-Since you should send each change separately, you might as well send it
-right away. That gives us the option of installing it immediately if it
-is important.
-
-@item
-Use @samp{diff -c} to make your diffs. Diffs without context are hard
-for us to install reliably. More than that, they make it hard for us to
-study the diffs to decide whether we want to install them. Unidiff
-format is better than contextless diffs, but not as easy to read as
-@samp{-c} format.
-
-If you have GNU diff, use @samp{diff -cp}, which shows the name of the
-function that each change occurs in.
-
-@item
-Write the change log entries for your changes. We get lots of changes,
-and we don't have time to do all the change log writing ourselves.
-
-Read the @file{ChangeLog} file to see what sorts of information to put
-in, and to learn the style that we use. The purpose of the change log
-is to show people where to find what was changed. So you need to be
-specific about what functions you changed; in large functions, it's
-often helpful to indicate where within the function the change was.
-
-On the other hand, once you have shown people where to find the change,
-you need not explain its purpose. Thus, if you add a new function, all
-you need to say about it is that it is new. If you feel that the
-purpose needs explaining, it probably does---but the explanation will be
-much more useful if you put it in comments in the code.
-
-If you would like your name to appear in the header line for who made
-the change, send us the header line.
-
-@item
-When you write the fix, keep in mind that we can't install a change that
-would break other systems.
-
-People often suggest fixing a problem by changing machine-independent
-files such as @file{toplev.c} to do something special that a particular
-system needs. Sometimes it is totally obvious that such changes would
-break GNU CC for almost all users. We can't possibly make a change like
-that. At best it might tell us how to write another patch that would
-solve the problem acceptably.
-
-Sometimes people send fixes that @emph{might} be an improvement in
-general---but it is hard to be sure of this. It's hard to install
-such changes because we have to study them very carefully. Of course,
-a good explanation of the reasoning by which you concluded the change
-was correct can help convince us.
-
-The safest changes are changes to the configuration files for a
-particular machine. These are safe because they can't create new bugs
-on other machines.
-
-Please help us keep up with the workload by designing the patch in a
-form that is good to install.
-@end itemize
-
-@node Service
-@chapter How To Get Help with GNU CC
-
-If you need help installing, using or changing GNU CC, there are two
-ways to find it:
-
-@itemize @bullet
-@item
-Send a message to a suitable network mailing list. First try
-@code{egcs-bugs@@cygnus.com}, and if that brings no response, try
-@code{egcs@@cygnus.com}.
-
-@item
-Look in the service directory for someone who might help you for a fee.
-The service directory is found in the file named @file{SERVICE} in the
-GNU CC distribution.
-@end itemize
-
-@node Contributing
-@chapter Contributing to GNU CC Development
-
-If you would like to help pretest GNU CC releases to assure they work
-well, or if you would like to work on improving GNU CC, please contact
-the maintainers at @code{egcs@@cygnus.com}. A pretester should
-be willing to try to investigate bugs as well as report them.
-
-If you'd like to work on improvements, please ask for suggested projects
-or suggest your own ideas. If you have already written an improvement,
-please tell us about it. If you have not yet started work, it is useful
-to contact @code{egcs@@cygnus.com} before you start; the
-maintainers may be able to suggest ways to make your extension fit in
-better with the rest of GNU CC and with other development plans.
-
-@node VMS
-@chapter Using GNU CC on VMS
-
-@c prevent bad page break with this line
-Here is how to use GNU CC on VMS.
-
-@menu
-* Include Files and VMS:: Where the preprocessor looks for the include files.
-* Global Declarations:: How to do globaldef, globalref and globalvalue with
- GNU CC.
-* VMS Misc:: Misc information.
-@end menu
-
-@node Include Files and VMS
-@section Include Files and VMS
-
-@cindex include files and VMS
-@cindex VMS and include files
-@cindex header files and VMS
-Due to the differences between the filesystems of Unix and VMS, GNU CC
-attempts to translate file names in @samp{#include} into names that VMS
-will understand. The basic strategy is to prepend a prefix to the
-specification of the include file, convert the whole filename to a VMS
-filename, and then try to open the file. GNU CC tries various prefixes
-one by one until one of them succeeds:
-
-@enumerate
-@item
-The first prefix is the @samp{GNU_CC_INCLUDE:} logical name: this is
-where GNU C header files are traditionally stored. If you wish to store
-header files in non-standard locations, then you can assign the logical
-@samp{GNU_CC_INCLUDE} to be a search list, where each element of the
-list is suitable for use with a rooted logical.
-
-@item
-The next prefix tried is @samp{SYS$SYSROOT:[SYSLIB.]}. This is where
-VAX-C header files are traditionally stored.
-
-@item
-If the include file specification by itself is a valid VMS filename, the
-preprocessor then uses this name with no prefix in an attempt to open
-the include file.
-
-@item
-If the file specification is not a valid VMS filename (i.e. does not
-contain a device or a directory specifier, and contains a @samp{/}
-character), the preprocessor tries to convert it from Unix syntax to
-VMS syntax.
-
-Conversion works like this: the first directory name becomes a device,
-and the rest of the directories are converted into VMS-format directory
-names. For example, the name @file{X11/foobar.h} is
-translated to @file{X11:[000000]foobar.h} or @file{X11:foobar.h},
-whichever one can be opened. This strategy allows you to assign a
-logical name to point to the actual location of the header files.
-
-@item
-If none of these strategies succeeds, the @samp{#include} fails.
-@end enumerate
-
-Include directives of the form:
-
-@example
-#include foobar
-@end example
-
-@noindent
-are a common source of incompatibility between VAX-C and GNU CC. VAX-C
-treats this much like a standard @code{#include <foobar.h>} directive.
-That is incompatible with the ANSI C behavior implemented by GNU CC: to
-expand the name @code{foobar} as a macro. Macro expansion should
-eventually yield one of the two standard formats for @code{#include}:
-
-@example
-#include "@var{file}"
-#include <@var{file}>
-@end example
-
-If you have this problem, the best solution is to modify the source to
-convert the @code{#include} directives to one of the two standard forms.
-That will work with either compiler. If you want a quick and dirty fix,
-define the file names as macros with the proper expansion, like this:
-
-@example
-#define stdio <stdio.h>
-@end example
-
-@noindent
-This will work, as long as the name doesn't conflict with anything else
-in the program.
-
-Another source of incompatibility is that VAX-C assumes that:
-
-@example
-#include "foobar"
-@end example
-
-@noindent
-is actually asking for the file @file{foobar.h}. GNU CC does not
-make this assumption, and instead takes what you ask for literally;
-it tries to read the file @file{foobar}. The best way to avoid this
-problem is to always specify the desired file extension in your include
-directives.
-
-GNU CC for VMS is distributed with a set of include files that is
-sufficient to compile most general purpose programs. Even though the
-GNU CC distribution does not contain header files to define constants
-and structures for some VMS system-specific functions, there is no
-reason why you cannot use GNU CC with any of these functions. You first
-may have to generate or create header files, either by using the public
-domain utility @code{UNSDL} (which can be found on a DECUS tape), or by
-extracting the relevant modules from one of the system macro libraries,
-and using an editor to construct a C header file.
-
-A @code{#include} file name cannot contain a DECNET node name. The
-preprocessor reports an I/O error if you attempt to use a node name,
-whether explicitly, or implicitly via a logical name.
-
-@node Global Declarations
-@section Global Declarations and VMS
-
-@findex GLOBALREF
-@findex GLOBALDEF
-@findex GLOBALVALUEDEF
-@findex GLOBALVALUEREF
-GNU CC does not provide the @code{globalref}, @code{globaldef} and
-@code{globalvalue} keywords of VAX-C. You can get the same effect with
-an obscure feature of GAS, the GNU assembler. (This requires GAS
-version 1.39 or later.) The following macros allow you to use this
-feature in a fairly natural way:
-
-@smallexample
-#ifdef __GNUC__
-#define GLOBALREF(TYPE,NAME) \
- TYPE NAME \
- asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME)
-#define GLOBALDEF(TYPE,NAME,VALUE) \
- TYPE NAME \
- asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME) \
- = VALUE
-#define GLOBALVALUEREF(TYPE,NAME) \
- const TYPE NAME[1] \
- asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME)
-#define GLOBALVALUEDEF(TYPE,NAME,VALUE) \
- const TYPE NAME[1] \
- asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME) \
- = @{VALUE@}
-#else
-#define GLOBALREF(TYPE,NAME) \
- globalref TYPE NAME
-#define GLOBALDEF(TYPE,NAME,VALUE) \
- globaldef TYPE NAME = VALUE
-#define GLOBALVALUEDEF(TYPE,NAME,VALUE) \
- globalvalue TYPE NAME = VALUE
-#define GLOBALVALUEREF(TYPE,NAME) \
- globalvalue TYPE NAME
-#endif
-@end smallexample
-
-@noindent
-(The @code{_$$PsectAttributes_GLOBALSYMBOL} prefix at the start of the
-name is removed by the assembler, after it has modified the attributes
-of the symbol). These macros are provided in the VMS binaries
-distribution in a header file @file{GNU_HACKS.H}. An example of the
-usage is:
-
-@example
-GLOBALREF (int, ijk);
-GLOBALDEF (int, jkl, 0);
-@end example
-
-The macros @code{GLOBALREF} and @code{GLOBALDEF} cannot be used
-straightforwardly for arrays, since there is no way to insert the array
-dimension into the declaration at the right place. However, you can
-declare an array with these macros if you first define a typedef for the
-array type, like this:
-
-@example
-typedef int intvector[10];
-GLOBALREF (intvector, foo);
-@end example
-
-Array and structure initializers will also break the macros; you can
-define the initializer to be a macro of its own, or you can expand the
-@code{GLOBALDEF} macro by hand. You may find a case where you wish to
-use the @code{GLOBALDEF} macro with a large array, but you are not
-interested in explicitly initializing each element of the array. In
-such cases you can use an initializer like: @code{@{0,@}}, which will
-initialize the entire array to @code{0}.
-
-A shortcoming of this implementation is that a variable declared with
-@code{GLOBALVALUEREF} or @code{GLOBALVALUEDEF} is always an array. For
-example, the declaration:
-
-@example
-GLOBALVALUEREF(int, ijk);
-@end example
-
-@noindent
-declares the variable @code{ijk} as an array of type @code{int [1]}.
-This is done because a globalvalue is actually a constant; its ``value''
-is what the linker would normally consider an address. That is not how
-an integer value works in C, but it is how an array works. So treating
-the symbol as an array name gives consistent results---with the
-exception that the value seems to have the wrong type. @strong{Don't
-try to access an element of the array.} It doesn't have any elements.
-The array ``address'' may not be the address of actual storage.
-
-The fact that the symbol is an array may lead to warnings where the
-variable is used. Insert type casts to avoid the warnings. Here is an
-example; it takes advantage of the ANSI C feature allowing macros that
-expand to use the same name as the macro itself.
-
-@example
-GLOBALVALUEREF (int, ss$_normal);
-GLOBALVALUEDEF (int, xyzzy,123);
-#ifdef __GNUC__
-#define ss$_normal ((int) ss$_normal)
-#define xyzzy ((int) xyzzy)
-#endif
-@end example
-
-Don't use @code{globaldef} or @code{globalref} with a variable whose
-type is an enumeration type; this is not implemented. Instead, make the
-variable an integer, and use a @code{globalvaluedef} for each of the
-enumeration values. An example of this would be:
-
-@example
-#ifdef __GNUC__
-GLOBALDEF (int, color, 0);
-GLOBALVALUEDEF (int, RED, 0);
-GLOBALVALUEDEF (int, BLUE, 1);
-GLOBALVALUEDEF (int, GREEN, 3);
-#else
-enum globaldef color @{RED, BLUE, GREEN = 3@};
-#endif
-@end example
-
-@node VMS Misc
-@section Other VMS Issues
-
-@cindex exit status and VMS
-@cindex return value of @code{main}
-@cindex @code{main} and the exit status
-GNU CC automatically arranges for @code{main} to return 1 by default if
-you fail to specify an explicit return value. This will be interpreted
-by VMS as a status code indicating a normal successful completion.
-Version 1 of GNU CC did not provide this default.
-
-GNU CC on VMS works only with the GNU assembler, GAS. You need version
-1.37 or later of GAS in order to produce value debugging information for
-the VMS debugger. Use the ordinary VMS linker with the object files
-produced by GAS.
-
-@cindex shared VMS run time system
-@cindex @file{VAXCRTL}
-Under previous versions of GNU CC, the generated code would occasionally
-give strange results when linked to the sharable @file{VAXCRTL} library.
-Now this should work.
-
-A caveat for use of @code{const} global variables: the @code{const}
-modifier must be specified in every external declaration of the variable
-in all of the source files that use that variable. Otherwise the linker
-will issue warnings about conflicting attributes for the variable. Your
-program will still work despite the warnings, but the variable will be
-placed in writable storage.
-
-@cindex name augmentation
-@cindex case sensitivity and VMS
-@cindex VMS and case sensitivity
-Although the VMS linker does distinguish between upper and lower case
-letters in global symbols, most VMS compilers convert all such symbols
-into upper case and most run-time library routines also have upper case
-names. To be able to reliably call such routines, GNU CC (by means of
-the assembler GAS) converts global symbols into upper case like other
-VMS compilers. However, since the usual practice in C is to distinguish
-case, GNU CC (via GAS) tries to preserve usual C behavior by augmenting
-each name that is not all lower case. This means truncating the name
-to at most 23 characters and then adding more characters at the end
-which encode the case pattern of those 23. Names which contain at
-least one dollar sign are an exception; they are converted directly into
-upper case without augmentation.
-
-Name augmentation yields bad results for programs that use precompiled
-libraries (such as Xlib) which were generated by another compiler. You
-can use the compiler option @samp{/NOCASE_HACK} to inhibit augmentation;
-it makes external C functions and variables case-independent as is usual
-on VMS. Alternatively, you could write all references to the functions
-and variables in such libraries using lower case; this will work on VMS,
-but is not portable to other systems. The compiler option @samp{/NAMES}
-also provides control over global name handling.
-
-Function and variable names are handled somewhat differently with GNU
-C++. The GNU C++ compiler performs @dfn{name mangling} on function
-names, which means that it adds information to the function name to
-describe the data types of the arguments that the function takes. One
-result of this is that the name of a function can become very long.
-Since the VMS linker only recognizes the first 31 characters in a name,
-special action is taken to ensure that each function and variable has a
-unique name that can be represented in 31 characters.
-
-If the name (plus a name augmentation, if required) is less than 32
-characters in length, then no special action is performed. If the name
-is longer than 31 characters, the assembler (GAS) will generate a
-hash string based upon the function name, truncate the function name to
-23 characters, and append the hash string to the truncated name. If the
-@samp{/VERBOSE} compiler option is used, the assembler will print both
-the full and truncated names of each symbol that is truncated.
-
-The @samp{/NOCASE_HACK} compiler option should not be used when you are
-compiling programs that use libg++. libg++ has several instances of
-objects (i.e. @code{Filebuf} and @code{filebuf}) which become
-indistinguishable in a case-insensitive environment. This leads to
-cases where you need to inhibit augmentation selectively (if you were
-using libg++ and Xlib in the same program, for example). There is no
-special feature for doing this, but you can get the result by defining a
-macro for each mixed case symbol for which you wish to inhibit
-augmentation. The macro should expand into the lower case equivalent of
-itself. For example:
-
-@example
-#define StuDlyCapS studlycaps
-@end example
-
-These macro definitions can be placed in a header file to minimize the
-number of changes to your source code.
-@end ifset
-
-@ifset INTERNALS
-@node Portability
-@chapter GNU CC and Portability
-@cindex portability
-@cindex GNU CC and portability
-
-The main goal of GNU CC was to make a good, fast compiler for machines in
-the class that the GNU system aims to run on: 32-bit machines that address
-8-bit bytes and have several general registers. Elegance, theoretical
-power and simplicity are only secondary.
-
-GNU CC gets most of the information about the target machine from a machine
-description which gives an algebraic formula for each of the machine's
-instructions. This is a very clean way to describe the target. But when
-the compiler needs information that is difficult to express in this
-fashion, I have not hesitated to define an ad-hoc parameter to the machine
-description. The purpose of portability is to reduce the total work needed
-on the compiler; it was not of interest for its own sake.
-
-@cindex endianness
-@cindex autoincrement addressing, availability
-@findex abort
-GNU CC does not contain machine dependent code, but it does contain code
-that depends on machine parameters such as endianness (whether the most
-significant byte has the highest or lowest address of the bytes in a word)
-and the availability of autoincrement addressing. In the RTL-generation
-pass, it is often necessary to have multiple strategies for generating code
-for a particular kind of syntax tree, strategies that are usable for different
-combinations of parameters. Often I have not tried to address all possible
-cases, but only the common ones or only the ones that I have encountered.
-As a result, a new target may require additional strategies. You will know
-if this happens because the compiler will call @code{abort}. Fortunately,
-the new strategies can be added in a machine-independent fashion, and will
-affect only the target machines that need them.
-@end ifset
-
-@ifset INTERNALS
-@node Interface
-@chapter Interfacing to GNU CC Output
-@cindex interfacing to GNU CC output
-@cindex run-time conventions
-@cindex function call conventions
-@cindex conventions, run-time
-
-GNU CC is normally configured to use the same function calling convention
-normally in use on the target system. This is done with the
-machine-description macros described (@pxref{Target Macros}).
-
-@cindex unions, returning
-@cindex structures, returning
-@cindex returning structures and unions
-However, returning of structure and union values is done differently on
-some target machines. As a result, functions compiled with PCC
-returning such types cannot be called from code compiled with GNU CC,
-and vice versa. This does not cause trouble often because few Unix
-library routines return structures or unions.
-
-GNU CC code returns structures and unions that are 1, 2, 4 or 8 bytes
-long in the same registers used for @code{int} or @code{double} return
-values. (GNU CC typically allocates variables of such types in
-registers also.) Structures and unions of other sizes are returned by
-storing them into an address passed by the caller (usually in a
-register). The machine-description macros @code{STRUCT_VALUE} and
-@code{STRUCT_INCOMING_VALUE} tell GNU CC where to pass this address.
-
-By contrast, PCC on most target machines returns structures and unions
-of any size by copying the data into an area of static storage, and then
-returning the address of that storage as if it were a pointer value.
-The caller must copy the data from that memory area to the place where
-the value is wanted. This is slower than the method used by GNU CC, and
-fails to be reentrant.
-
-On some target machines, such as RISC machines and the 80386, the
-standard system convention is to pass to the subroutine the address of
-where to return the value. On these machines, GNU CC has been
-configured to be compatible with the standard compiler, when this method
-is used. It may not be compatible for structures of 1, 2, 4 or 8 bytes.
-
-@cindex argument passing
-@cindex passing arguments
-GNU CC uses the system's standard convention for passing arguments. On
-some machines, the first few arguments are passed in registers; in
-others, all are passed on the stack. It would be possible to use
-registers for argument passing on any machine, and this would probably
-result in a significant speedup. But the result would be complete
-incompatibility with code that follows the standard convention. So this
-change is practical only if you are switching to GNU CC as the sole C
-compiler for the system. We may implement register argument passing on
-certain machines once we have a complete GNU system so that we can
-compile the libraries with GNU CC.
-
-On some machines (particularly the Sparc), certain types of arguments
-are passed ``by invisible reference''. This means that the value is
-stored in memory, and the address of the memory location is passed to
-the subroutine.
-
-@cindex @code{longjmp} and automatic variables
-If you use @code{longjmp}, beware of automatic variables. ANSI C says that
-automatic variables that are not declared @code{volatile} have undefined
-values after a @code{longjmp}. And this is all GNU CC promises to do,
-because it is very difficult to restore register variables correctly, and
-one of GNU CC's features is that it can put variables in registers without
-your asking it to.
-
-If you want a variable to be unaltered by @code{longjmp}, and you don't
-want to write @code{volatile} because old C compilers don't accept it,
-just take the address of the variable. If a variable's address is ever
-taken, even if just to compute it and ignore it, then the variable cannot
-go in a register:
-
-@example
-@{
- int careful;
- &careful;
- @dots{}
-@}
-@end example
-
-@cindex arithmetic libraries
-@cindex math libraries
-Code compiled with GNU CC may call certain library routines. Most of
-them handle arithmetic for which there are no instructions. This
-includes multiply and divide on some machines, and floating point
-operations on any machine for which floating point support is disabled
-with @samp{-msoft-float}. Some standard parts of the C library, such as
-@code{bcopy} or @code{memcpy}, are also called automatically. The usual
-function call interface is used for calling the library routines.
-
-These library routines should be defined in the library @file{libgcc.a},
-which GNU CC automatically searches whenever it links a program. On
-machines that have multiply and divide instructions, if hardware
-floating point is in use, normally @file{libgcc.a} is not needed, but it
-is searched just in case.
-
-Each arithmetic function is defined in @file{libgcc1.c} to use the
-corresponding C arithmetic operator. As long as the file is compiled
-with another C compiler, which supports all the C arithmetic operators,
-this file will work portably. However, @file{libgcc1.c} does not work if
-compiled with GNU CC, because each arithmetic function would compile
-into a call to itself!
-@end ifset
-
-@ifset INTERNALS
-@node Passes
-@chapter Passes and Files of the Compiler
-@cindex passes and files of the compiler
-@cindex files and passes of the compiler
-@cindex compiler passes and files
-
-@cindex top level of compiler
-The overall control structure of the compiler is in @file{toplev.c}. This
-file is responsible for initialization, decoding arguments, opening and
-closing files, and sequencing the passes.
-
-@cindex parsing pass
-The parsing pass is invoked only once, to parse the entire input. The RTL
-intermediate code for a function is generated as the function is parsed, a
-statement at a time. Each statement is read in as a syntax tree and then
-converted to RTL; then the storage for the tree for the statement is
-reclaimed. Storage for types (and the expressions for their sizes),
-declarations, and a representation of the binding contours and how they nest,
-remain until the function is finished being compiled; these are all needed
-to output the debugging information.
-
-@findex rest_of_compilation
-@findex rest_of_decl_compilation
-Each time the parsing pass reads a complete function definition or
-top-level declaration, it calls either the function
-@code{rest_of_compilation}, or the function
-@code{rest_of_decl_compilation} in @file{toplev.c}, which are
-responsible for all further processing necessary, ending with output of
-the assembler language. All other compiler passes run, in sequence,
-within @code{rest_of_compilation}. When that function returns from
-compiling a function definition, the storage used for that function
-definition's compilation is entirely freed, unless it is an inline
-function
-@ifset USING
-(@pxref{Inline,,An Inline Function is As Fast As a Macro}).
-@end ifset
-@ifclear USING
-(@pxref{Inline,,An Inline Function is As Fast As a Macro,gcc.texi,Using GCC}).
-@end ifclear
-
-Here is a list of all the passes of the compiler and their source files.
-Also included is a description of where debugging dumps can be requested
-with @samp{-d} options.
-
-@itemize @bullet
-@item
-Parsing. This pass reads the entire text of a function definition,
-constructing partial syntax trees. This and RTL generation are no longer
-truly separate passes (formerly they were), but it is easier to think
-of them as separate.
-
-The tree representation does not entirely follow C syntax, because it is
-intended to support other languages as well.
-
-Language-specific data type analysis is also done in this pass, and every
-tree node that represents an expression has a data type attached.
-Variables are represented as declaration nodes.
-
-@cindex constant folding
-@cindex arithmetic simplifications
-@cindex simplifications, arithmetic
-Constant folding and some arithmetic simplifications are also done
-during this pass.
-
-The language-independent source files for parsing are
-@file{stor-layout.c}, @file{fold-const.c}, and @file{tree.c}.
-There are also header files @file{tree.h} and @file{tree.def}
-which define the format of the tree representation.@refill
-
-@c Avoiding overfull is tricky here.
-The source files to parse C are
-@file{c-parse.in},
-@file{c-decl.c},
-@file{c-typeck.c},
-@file{c-aux-info.c},
-@file{c-convert.c},
-and @file{c-lang.c}
-along with header files
-@file{c-lex.h}, and
-@file{c-tree.h}.
-
-The source files for parsing C++ are @file{cp-parse.y},
-@file{cp-class.c},@*
-@file{cp-cvt.c}, @file{cp-decl.c}, @file{cp-decl2.c},
-@file{cp-dem.c}, @file{cp-except.c},@*
-@file{cp-expr.c}, @file{cp-init.c}, @file{cp-lex.c},
-@file{cp-method.c}, @file{cp-ptree.c},@*
-@file{cp-search.c}, @file{cp-tree.c}, @file{cp-type2.c}, and
-@file{cp-typeck.c}, along with header files @file{cp-tree.def},
-@file{cp-tree.h}, and @file{cp-decl.h}.
-
-The special source files for parsing Objective C are
-@file{objc-parse.y}, @file{objc-actions.c}, @file{objc-tree.def}, and
-@file{objc-actions.h}. Certain C-specific files are used for this as
-well.
-
-The file @file{c-common.c} is also used for all of the above languages.
-
-@cindex RTL generation
-@item
-RTL generation. This is the conversion of syntax tree into RTL code.
-It is actually done statement-by-statement during parsing, but for
-most purposes it can be thought of as a separate pass.
-
-@cindex target-parameter-dependent code
-This is where the bulk of target-parameter-dependent code is found,
-since often it is necessary for strategies to apply only when certain
-standard kinds of instructions are available. The purpose of named
-instruction patterns is to provide this information to the RTL
-generation pass.
-
-@cindex tail recursion optimization
-Optimization is done in this pass for @code{if}-conditions that are
-comparisons, boolean operations or conditional expressions. Tail
-recursion is detected at this time also. Decisions are made about how
-best to arrange loops and how to output @code{switch} statements.
-
-@c Avoiding overfull is tricky here.
-The source files for RTL generation include
-@file{stmt.c},
-@file{calls.c},
-@file{expr.c},
-@file{explow.c},
-@file{expmed.c},
-@file{function.c},
-@file{optabs.c}
-and @file{emit-rtl.c}.
-Also, the file
-@file{insn-emit.c}, generated from the machine description by the
-program @code{genemit}, is used in this pass. The header file
-@file{expr.h} is used for communication within this pass.@refill
-
-@findex genflags
-@findex gencodes
-The header files @file{insn-flags.h} and @file{insn-codes.h},
-generated from the machine description by the programs @code{genflags}
-and @code{gencodes}, tell this pass which standard names are available
-for use and which patterns correspond to them.@refill
-
-Aside from debugging information output, none of the following passes
-refers to the tree structure representation of the function (only
-part of which is saved).
-
-@cindex inline, automatic
-The decision of whether the function can and should be expanded inline
-in its subsequent callers is made at the end of rtl generation. The
-function must meet certain criteria, currently related to the size of
-the function and the types and number of parameters it has. Note that
-this function may contain loops, recursive calls to itself
-(tail-recursive functions can be inlined!), gotos, in short, all
-constructs supported by GNU CC. The file @file{integrate.c} contains
-the code to save a function's rtl for later inlining and to inline that
-rtl when the function is called. The header file @file{integrate.h}
-is also used for this purpose.
-
-The option @samp{-dr} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.rtl} to
-the input file name.
-
-@cindex jump optimization
-@cindex unreachable code
-@cindex dead code
-@item
-Jump optimization. This pass simplifies jumps to the following
-instruction, jumps across jumps, and jumps to jumps. It deletes
-unreferenced labels and unreachable code, except that unreachable code
-that contains a loop is not recognized as unreachable in this pass.
-(Such loops are deleted later in the basic block analysis.) It also
-converts some code originally written with jumps into sequences of
-instructions that directly set values from the results of comparisons,
-if the machine has such instructions.
-
-Jump optimization is performed two or three times. The first time is
-immediately following RTL generation. The second time is after CSE,
-but only if CSE says repeated jump optimization is needed. The
-last time is right before the final pass. That time, cross-jumping
-and deletion of no-op move instructions are done together with the
-optimizations described above.
-
-The source file of this pass is @file{jump.c}.
-
-The option @samp{-dj} causes a debugging dump of the RTL code after
-this pass is run for the first time. This dump file's name is made by
-appending @samp{.jump} to the input file name.
-
-@cindex register use analysis
-@item
-Register scan. This pass finds the first and last use of each
-register, as a guide for common subexpression elimination. Its source
-is in @file{regclass.c}.
-
-@cindex jump threading
-@item
-Jump threading. This pass detects a condition jump that branches to an
-identical or inverse test. Such jumps can be @samp{threaded} through
-the second conditional test. The source code for this pass is in
-@file{jump.c}. This optimization is only performed if
-@samp{-fthread-jumps} is enabled.
-
-@cindex common subexpression elimination
-@cindex constant propagation
-@item
-Common subexpression elimination. This pass also does constant
-propagation. Its source file is @file{cse.c}. If constant
-propagation causes conditional jumps to become unconditional or to
-become no-ops, jump optimization is run again when CSE is finished.
-
-The option @samp{-ds} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.cse} to
-the input file name.
-
-@cindex global common subexpression elimination
-@cindex constant propagation
-@cindex copy propagation
-@item
-Global common subexpression elimination. This pass performs GCSE
-using Morel-Renvoise Partial Redundancy Elimination, with the exception
-that it does not try to move invariants out of loops - that is left to
-the loop optimization pass. This pass also performs global constant
-and copy propagation.
-
-The source file for this pass is gcse.c.
-
-The option @samp{-dG} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.gcse} to
-the input file name.
-
-@cindex loop optimization
-@cindex code motion
-@cindex strength-reduction
-@item
-Loop optimization. This pass moves constant expressions out of loops,
-and optionally does strength-reduction and loop unrolling as well.
-Its source files are @file{loop.c} and @file{unroll.c}, plus the header
-@file{loop.h} used for communication between them. Loop unrolling uses
-some functions in @file{integrate.c} and the header @file{integrate.h}.
-
-The option @samp{-dL} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.loop} to
-the input file name.
-
-@item
-If @samp{-frerun-cse-after-loop} was enabled, a second common
-subexpression elimination pass is performed after the loop optimization
-pass. Jump threading is also done again at this time if it was specified.
-
-The option @samp{-dt} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.cse2} to
-the input file name.
-
-@cindex register allocation, stupid
-@cindex stupid register allocation
-@item
-Stupid register allocation is performed at this point in a
-nonoptimizing compilation. It does a little data flow analysis as
-well. When stupid register allocation is in use, the next pass
-executed is the reloading pass; the others in between are skipped.
-The source file is @file{stupid.c}.
-
-@cindex data flow analysis
-@cindex analysis, data flow
-@cindex basic blocks
-@item
-Data flow analysis (@file{flow.c}). This pass divides the program
-into basic blocks (and in the process deletes unreachable loops); then
-it computes which pseudo-registers are live at each point in the
-program, and makes the first instruction that uses a value point at
-the instruction that computed the value.
-
-@cindex autoincrement/decrement analysis
-This pass also deletes computations whose results are never used, and
-combines memory references with add or subtract instructions to make
-autoincrement or autodecrement addressing.
-
-The option @samp{-df} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.flow} to
-the input file name. If stupid register allocation is in use, this
-dump file reflects the full results of such allocation.
-
-@cindex instruction combination
-@item
-Instruction combination (@file{combine.c}). This pass attempts to
-combine groups of two or three instructions that are related by data
-flow into single instructions. It combines the RTL expressions for
-the instructions by substitution, simplifies the result using algebra,
-and then attempts to match the result against the machine description.
-
-The option @samp{-dc} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.combine}
-to the input file name.
-
-@cindex instruction scheduling
-@cindex scheduling, instruction
-@item
-Instruction scheduling (@file{sched.c}). This pass looks for
-instructions whose output will not be available by the time that it is
-used in subsequent instructions. (Memory loads and floating point
-instructions often have this behavior on RISC machines). It re-orders
-instructions within a basic block to try to separate the definition and
-use of items that otherwise would cause pipeline stalls.
-
-Instruction scheduling is performed twice. The first time is immediately
-after instruction combination and the second is immediately after reload.
-
-The option @samp{-dS} causes a debugging dump of the RTL code after this
-pass is run for the first time. The dump file's name is made by
-appending @samp{.sched} to the input file name.
-
-@cindex register class preference pass
-@item
-Register class preferencing. The RTL code is scanned to find out
-which register class is best for each pseudo register. The source
-file is @file{regclass.c}.
-
-@cindex register allocation
-@cindex local register allocation
-@item
-Local register allocation (@file{local-alloc.c}). This pass allocates
-hard registers to pseudo registers that are used only within one basic
-block. Because the basic block is linear, it can use fast and
-powerful techniques to do a very good job.
-
-The option @samp{-dl} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.lreg} to
-the input file name.
-
-@cindex global register allocation
-@item
-Global register allocation (@file{global.c}). This pass
-allocates hard registers for the remaining pseudo registers (those
-whose life spans are not contained in one basic block).
-
-@cindex reloading
-@item
-Reloading. This pass renumbers pseudo registers with the hardware
-registers numbers they were allocated. Pseudo registers that did not
-get hard registers are replaced with stack slots. Then it finds
-instructions that are invalid because a value has failed to end up in
-a register, or has ended up in a register of the wrong kind. It fixes
-up these instructions by reloading the problematical values
-temporarily into registers. Additional instructions are generated to
-do the copying.
-
-The reload pass also optionally eliminates the frame pointer and inserts
-instructions to save and restore call-clobbered registers around calls.
-
-Source files are @file{reload.c} and @file{reload1.c}, plus the header
-@file{reload.h} used for communication between them.
-
-The option @samp{-dg} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.greg} to
-the input file name.
-
-@cindex instruction scheduling
-@cindex scheduling, instruction
-@item
-Instruction scheduling is repeated here to try to avoid pipeline stalls
-due to memory loads generated for spilled pseudo registers.
-
-The option @samp{-dR} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.sched2}
-to the input file name.
-
-@cindex cross-jumping
-@cindex no-op move instructions
-@item
-Jump optimization is repeated, this time including cross-jumping
-and deletion of no-op move instructions.
-
-The option @samp{-dJ} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.jump2}
-to the input file name.
-
-@cindex delayed branch scheduling
-@cindex scheduling, delayed branch
-@item
-Delayed branch scheduling. This optional pass attempts to find
-instructions that can go into the delay slots of other instructions,
-usually jumps and calls. The source file name is @file{reorg.c}.
-
-The option @samp{-dd} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.dbr}
-to the input file name.
-
-@cindex register-to-stack conversion
-@item
-Conversion from usage of some hard registers to usage of a register
-stack may be done at this point. Currently, this is supported only
-for the floating-point registers of the Intel 80387 coprocessor. The
-source file name is @file{reg-stack.c}.
-
-The options @samp{-dk} causes a debugging dump of the RTL code after
-this pass. This dump file's name is made by appending @samp{.stack}
-to the input file name.
-
-@cindex final pass
-@cindex peephole optimization
-@item
-Final. This pass outputs the assembler code for the function. It is
-also responsible for identifying spurious test and compare
-instructions. Machine-specific peephole optimizations are performed
-at the same time. The function entry and exit sequences are generated
-directly as assembler code in this pass; they never exist as RTL.
-
-The source files are @file{final.c} plus @file{insn-output.c}; the
-latter is generated automatically from the machine description by the
-tool @file{genoutput}. The header file @file{conditions.h} is used
-for communication between these files.
-
-@cindex debugging information generation
-@item
-Debugging information output. This is run after final because it must
-output the stack slot offsets for pseudo registers that did not get
-hard registers. Source files are @file{dbxout.c} for DBX symbol table
-format, @file{sdbout.c} for SDB symbol table format, and
-@file{dwarfout.c} for DWARF symbol table format.
-@end itemize
-
-Some additional files are used by all or many passes:
-
-@itemize @bullet
-@item
-Every pass uses @file{machmode.def} and @file{machmode.h} which define
-the machine modes.
-
-@item
-Several passes use @file{real.h}, which defines the default
-representation of floating point constants and how to operate on them.
-
-@item
-All the passes that work with RTL use the header files @file{rtl.h}
-and @file{rtl.def}, and subroutines in file @file{rtl.c}. The tools
-@code{gen*} also use these files to read and work with the machine
-description RTL.
-
-@findex genconfig
-@item
-Several passes refer to the header file @file{insn-config.h} which
-contains a few parameters (C macro definitions) generated
-automatically from the machine description RTL by the tool
-@code{genconfig}.
-
-@cindex instruction recognizer
-@item
-Several passes use the instruction recognizer, which consists of
-@file{recog.c} and @file{recog.h}, plus the files @file{insn-recog.c}
-and @file{insn-extract.c} that are generated automatically from the
-machine description by the tools @file{genrecog} and
-@file{genextract}.@refill
-
-@item
-Several passes use the header files @file{regs.h} which defines the
-information recorded about pseudo register usage, and @file{basic-block.h}
-which defines the information recorded about basic blocks.
-
-@item
-@file{hard-reg-set.h} defines the type @code{HARD_REG_SET}, a bit-vector
-with a bit for each hard register, and some macros to manipulate it.
-This type is just @code{int} if the machine has few enough hard registers;
-otherwise it is an array of @code{int} and some of the macros expand
-into loops.
-
-@item
-Several passes use instruction attributes. A definition of the
-attributes defined for a particular machine is in file
-@file{insn-attr.h}, which is generated from the machine description by
-the program @file{genattr}. The file @file{insn-attrtab.c} contains
-subroutines to obtain the attribute values for insns. It is generated
-from the machine description by the program @file{genattrtab}.@refill
-@end itemize
-@end ifset
-
-@ifset INTERNALS
-@include rtl.texi
-@include md.texi
-@include tm.texi
-@end ifset
-
-@ifset INTERNALS
-@node Config
-@chapter The Configuration File
-@cindex configuration file
-@cindex @file{xm-@var{machine}.h}
-
-The configuration file @file{xm-@var{machine}.h} contains macro
-definitions that describe the machine and system on which the compiler
-is running, unlike the definitions in @file{@var{machine}.h}, which
-describe the machine for which the compiler is producing output. Most
-of the values in @file{xm-@var{machine}.h} are actually the same on all
-machines that GNU CC runs on, so large parts of all configuration files
-are identical. But there are some macros that vary:
-
-@table @code
-@findex USG
-@item USG
-Define this macro if the host system is System V.
-
-@findex VMS
-@item VMS
-Define this macro if the host system is VMS.
-
-@findex FATAL_EXIT_CODE
-@item FATAL_EXIT_CODE
-A C expression for the status code to be returned when the compiler
-exits after serious errors.
-
-@findex SUCCESS_EXIT_CODE
-@item SUCCESS_EXIT_CODE
-A C expression for the status code to be returned when the compiler
-exits without serious errors.
-
-@findex HOST_WORDS_BIG_ENDIAN
-@item HOST_WORDS_BIG_ENDIAN
-Defined if the host machine stores words of multi-word values in
-big-endian order. (GNU CC does not depend on the host byte ordering
-within a word.)
-
-@findex HOST_FLOAT_WORDS_BIG_ENDIAN
-@item HOST_FLOAT_WORDS_BIG_ENDIAN
-Define this macro to be 1 if the host machine stores @code{DFmode},
-@code{XFmode} or @code{TFmode} floating point numbers in memory with the
-word containing the sign bit at the lowest address; otherwise, define it
-to be zero.
-
-This macro need not be defined if the ordering is the same as for
-multi-word integers.
-
-@findex HOST_FLOAT_FORMAT
-@item HOST_FLOAT_FORMAT
-A numeric code distinguishing the floating point format for the host
-machine. See @code{TARGET_FLOAT_FORMAT} in @ref{Storage Layout} for the
-alternatives and default.
-
-@findex HOST_BITS_PER_CHAR
-@item HOST_BITS_PER_CHAR
-A C expression for the number of bits in @code{char} on the host
-machine.
-
-@findex HOST_BITS_PER_SHORT
-@item HOST_BITS_PER_SHORT
-A C expression for the number of bits in @code{short} on the host
-machine.
-
-@findex HOST_BITS_PER_INT
-@item HOST_BITS_PER_INT
-A C expression for the number of bits in @code{int} on the host
-machine.
-
-@findex HOST_BITS_PER_LONG
-@item HOST_BITS_PER_LONG
-A C expression for the number of bits in @code{long} on the host
-machine.
-
-@findex ONLY_INT_FIELDS
-@item ONLY_INT_FIELDS
-Define this macro to indicate that the host compiler only supports
-@code{int} bit fields, rather than other integral types, including
-@code{enum}, as do most C compilers.
-
-@findex OBSTACK_CHUNK_SIZE
-@item OBSTACK_CHUNK_SIZE
-A C expression for the size of ordinary obstack chunks.
-If you don't define this, a usually-reasonable default is used.
-
-@findex OBSTACK_CHUNK_ALLOC
-@item OBSTACK_CHUNK_ALLOC
-The function used to allocate obstack chunks.
-If you don't define this, @code{xmalloc} is used.
-
-@findex OBSTACK_CHUNK_FREE
-@item OBSTACK_CHUNK_FREE
-The function used to free obstack chunks.
-If you don't define this, @code{free} is used.
-
-@findex USE_C_ALLOCA
-@item USE_C_ALLOCA
-Define this macro to indicate that the compiler is running with the
-@code{alloca} implemented in C. This version of @code{alloca} can be
-found in the file @file{alloca.c}; to use it, you must also alter the
-@file{Makefile} variable @code{ALLOCA}. (This is done automatically
-for the systems on which we know it is needed.)
-
-If you do define this macro, you should probably do it as follows:
-
-@example
-#ifndef __GNUC__
-#define USE_C_ALLOCA
-#else
-#define alloca __builtin_alloca
-#endif
-@end example
-
-@noindent
-so that when the compiler is compiled with GNU CC it uses the more
-efficient built-in @code{alloca} function.
-
-@item FUNCTION_CONVERSION_BUG
-@findex FUNCTION_CONVERSION_BUG
-Define this macro to indicate that the host compiler does not properly
-handle converting a function value to a pointer-to-function when it is
-used in an expression.
-
-@findex MULTIBYTE_CHARS
-@item MULTIBYTE_CHARS
-Define this macro to enable support for multibyte characters in the
-input to GNU CC. This requires that the host system support the ANSI C
-library functions for converting multibyte characters to wide
-characters.
-
-@findex POSIX
-@item POSIX
-Define this if your system is POSIX.1 compliant.
-
-@findex NO_SYS_SIGLIST
-@item NO_SYS_SIGLIST
-Define this if your system @emph{does not} provide the variable
-@code{sys_siglist}.
-
-@vindex sys_siglist
-Some systems do provide this variable, but with a different name such
-as @code{_sys_siglist}. On these systems, you can define
-@code{sys_siglist} as a macro which expands into the name actually
-provided.
-
-Autoconf normally defines @code{SYS_SIGLIST_DECLARED} when it finds a
-declaration of @code{sys_siglist} in the system header files.
-However, when you define @code{sys_siglist} to a different name
-autoconf will not automatically define @code{SYS_SIGLIST_DECLARED}.
-Therefore, if you define @code{sys_siglist}, you should also define
-@code{SYS_SIGLIST_DECLARED}.
-
-@findex USE_PROTOTYPES
-@item USE_PROTOTYPES
-Define this to be 1 if you know that the host compiler supports
-prototypes, even if it doesn't define __STDC__, or define
-it to be 0 if you do not want any prototypes used in compiling
-GNU CC. If @samp{USE_PROTOTYPES} is not defined, it will be
-determined automatically whether your compiler supports
-prototypes by checking if @samp{__STDC__} is defined.
-
-@findex NO_MD_PROTOTYPES
-@item NO_MD_PROTOTYPES
-Define this if you wish suppression of prototypes generated from
-the machine description file, but to use other prototypes within
-GNU CC. If @samp{USE_PROTOTYPES} is defined to be 0, or the
-host compiler does not support prototypes, this macro has no
-effect.
-
-@findex MD_CALL_PROTOTYPES
-@item MD_CALL_PROTOTYPES
-Define this if you wish to generate prototypes for the
-@code{gen_call} or @code{gen_call_value} functions generated from
-the machine description file. If @samp{USE_PROTOTYPES} is
-defined to be 0, or the host compiler does not support
-prototypes, or @samp{NO_MD_PROTOTYPES} is defined, this macro has
-no effect. As soon as all of the machine descriptions are
-modified to have the appropriate number of arguments, this macro
-will be removed.
-
-@findex PATH_SEPARATOR
-@item PATH_SEPARATOR
-Define this macro to be a C character constant representing the
-character used to separate components in paths. The default value is
-the colon character
-
-@findex DIR_SEPARATOR
-@item DIR_SEPARATOR
-If your system uses some character other than slash to separate
-directory names within a file specification, define this macro to be a C
-character constant specifying that character. When GNU CC displays file
-names, the character you specify will be used. GNU CC will test for
-both slash and the character you specify when parsing filenames.
-
-@findex OBJECT_SUFFIX
-@item OBJECT_SUFFIX
-Define this macro to be a C string representing the suffix for object
-files on your machine. If you do not define this macro, GNU CC will use
-@samp{.o} as the suffix for object files.
-
-@findex EXECUTABLE_SUFFIX
-@item EXECUTABLE_SUFFIX
-Define this macro to be a C string representing the suffix for executable
-files on your machine. If you do not define this macro, GNU CC will use
-the null string as the suffix for object files.
-
-@findex COLLECT_EXPORT_LIST
-@item COLLECT_EXPORT_LIST
-If defined, @code{collect2} will scan the individual object files
-specified on its command line and create an export list for the linker.
-Define this macro for systems like AIX, where the linker discards
-object files that are not referenced from @code{main} and uses export
-lists.
-@end table
-
-@findex bzero
-@findex bcmp
-In addition, configuration files for system V define @code{bcopy},
-@code{bzero} and @code{bcmp} as aliases. Some files define @code{alloca}
-as a macro when compiled with GNU CC, in order to take advantage of the
-benefit of GNU CC's built-in @code{alloca}.
-
-@node Fragments
-@chapter Makefile Fragments
-@cindex makefile fragment
-
-When you configure GNU CC using the @file{configure} script
-(@pxref{Installation}), it will construct the file @file{Makefile} from
-the template file @file{Makefile.in}. When it does this, it will
-incorporate makefile fragment files from the @file{config} directory,
-named @file{t-@var{target}} and @file{x-@var{host}}. If these files do
-not exist, it means nothing needs to be added for a given target or
-host.
-
-@menu
-* Target Fragment:: Writing the @file{t-@var{target}} file.
-* Host Fragment:: Writing the @file{x-@var{host}} file.
-@end menu
-
-@node Target Fragment
-@section The Target Makefile Fragment
-@cindex target makefile fragment
-@cindex @file{t-@var{target}}
-
-The target makefile fragment, @file{t-@var{target}}, defines special
-target dependent variables and targets used in the @file{Makefile}:
-
-@table @code
-@findex LIBGCC1
-@item LIBGCC1
-The rule to use to build @file{libgcc1.a}.
-If your target does not need to use the functions in @file{libgcc1.a},
-set this to empty.
-@xref{Interface}.
-
-@findex CROSS_LIBGCC1
-@item CROSS_LIBGCC1
-The rule to use to build @file{libgcc1.a} when building a cross
-compiler. If your target does not need to use the functions in
-@file{libgcc1.a}, set this to empty. @xref{Cross Runtime}.
-
-@findex LIBGCC2_CFLAGS
-@item LIBGCC2_CFLAGS
-Compiler flags to use when compiling @file{libgcc2.c}.
-
-@findex LIB2FUNCS_EXTRA
-@item LIB2FUNCS_EXTRA
-A list of source file names to be compiled or assembled and inserted
-into @file{libgcc.a}.
-
-@findex CRTSTUFF_T_CFLAGS
-@item CRTSTUFF_T_CFLAGS
-Special flags used when compiling @file{crtstuff.c}.
-@xref{Initialization}.
-
-@findex CRTSTUFF_T_CFLAGS_S
-@item CRTSTUFF_T_CFLAGS_S
-Special flags used when compiling @file{crtstuff.c} for shared
-linking. Used if you use @file{crtbeginS.o} and @file{crtendS.o}
-in @code{EXTRA-PARTS}.
-@xref{Initialization}.
-
-@findex MULTILIB_OPTIONS
-@item MULTILIB_OPTIONS
-For some targets, invoking GNU CC in different ways produces objects
-that can not be linked together. For example, for some targets GNU CC
-produces both big and little endian code. For these targets, you must
-arrange for multiple versions of @file{libgcc.a} to be compiled, one for
-each set of incompatible options. When GNU CC invokes the linker, it
-arranges to link in the right version of @file{libgcc.a}, based on
-the command line options used.
-
-The @code{MULTILIB_OPTIONS} macro lists the set of options for which
-special versions of @file{libgcc.a} must be built. Write options that
-are mutually incompatible side by side, separated by a slash. Write
-options that may be used together separated by a space. The build
-procedure will build all combinations of compatible options.
-
-For example, if you set @code{MULTILIB_OPTIONS} to @samp{m68000/m68020
-msoft-float}, @file{Makefile} will build special versions of
-@file{libgcc.a} using the following sets of options: @samp{-m68000},
-@samp{-m68020}, @samp{-msoft-float}, @samp{-m68000 -msoft-float}, and
-@samp{-m68020 -msoft-float}.
-
-@findex MULTILIB_DIRNAMES
-@item MULTILIB_DIRNAMES
-If @code{MULTILIB_OPTIONS} is used, this variable specifies the
-directory names that should be used to hold the various libraries.
-Write one element in @code{MULTILIB_DIRNAMES} for each element in
-@code{MULTILIB_OPTIONS}. If @code{MULTILIB_DIRNAMES} is not used, the
-default value will be @code{MULTILIB_OPTIONS}, with all slashes treated
-as spaces.
-
-For example, if @code{MULTILIB_OPTIONS} is set to @samp{m68000/m68020
-msoft-float}, then the default value of @code{MULTILIB_DIRNAMES} is
-@samp{m68000 m68020 msoft-float}. You may specify a different value if
-you desire a different set of directory names.
-
-@findex MULTILIB_MATCHES
-@item MULTILIB_MATCHES
-Sometimes the same option may be written in two different ways. If an
-option is listed in @code{MULTILIB_OPTIONS}, GNU CC needs to know about
-any synonyms. In that case, set @code{MULTILIB_MATCHES} to a list of
-items of the form @samp{option=option} to describe all relevant
-synonyms. For example, @samp{m68000=mc68000 m68020=mc68020}.
-
-@findex MULTILIB_EXCEPTIONS
-@item MULTILIB_EXCEPTIONS
-Sometimes when there are multiple sets of @code{MULTILIB_OPTIONS} being
-specified, there are combinations that should not be built. In that
-case, set @code{MULTILIB_EXCEPTIONS} to be all of the switch exceptions
-in shell case syntax that should not be built.
-
-For example, in the PowerPC embedded ABI support, it was not desirable
-to build libraries that compiled with the @samp{-mcall-aixdesc} option
-and either of the @samp{-mcall-aixdesc} or @samp{-mlittle} options at
-the same time, and therefore @code{MULTILIB_EXCEPTIONS} is set to
-@code{*mrelocatable/*mcall-aixdesc* *mlittle/*mcall-aixdesc*}.
-
-@findex MULTILIB_EXTRA_OPTS
-@item MULTILIB_EXTRA_OPTS
-Sometimes it is desirable that when building multiple versions of
-@file{libgcc.a} certain options should always be passed on to the
-compiler. In that case, set @code{MULTILIB_EXTRA_OPTS} to be the list
-of options to be used for all builds.
-@end table
-
-@node Host Fragment
-@section The Host Makefile Fragment
-@cindex host makefile fragment
-@cindex @file{x-@var{host}}
-
-The host makefile fragment, @file{x-@var{host}}, defines special host
-dependent variables and targets used in the @file{Makefile}:
-
-@table @code
-@findex CC
-@item CC
-The compiler to use when building the first stage.
-
-@findex CLIB
-@item CLIB
-Additional host libraries to link with.
-
-@findex OLDCC
-@item OLDCC
-The compiler to use when building @file{libgcc1.a} for a native
-compilation.
-
-@findex OLDAR
-@item OLDAR
-The version of @code{ar} to use when building @file{libgcc1.a} for a native
-compilation.
-
-@findex INSTALL
-@item INSTALL
-The install program to use.
-@end table
-
-@node Funding
-@unnumbered Funding Free Software
-
-If you want to have more free software a few years from now, it makes
-sense for you to help encourage people to contribute funds for its
-development. The most effective approach known is to encourage
-commercial redistributors to donate.
-
-Users of free software systems can boost the pace of development by
-encouraging for-a-fee distributors to donate part of their selling price
-to free software developers---the Free Software Foundation, and others.
-
-The way to convince distributors to do this is to demand it and expect
-it from them. So when you compare distributors, judge them partly by
-how much they give to free software development. Show distributors
-they must compete to be the one who gives the most.
-
-To make this approach work, you must insist on numbers that you can
-compare, such as, ``We will donate ten dollars to the Frobnitz project
-for each disk sold.'' Don't be satisfied with a vague promise, such as
-``A portion of the profits are donated,'' since it doesn't give a basis
-for comparison.
-
-Even a precise fraction ``of the profits from this disk'' is not very
-meaningful, since creative accounting and unrelated business decisions
-can greatly alter what fraction of the sales price counts as profit.
-If the price you pay is $50, ten percent of the profit is probably
-less than a dollar; it might be a few cents, or nothing at all.
-
-Some redistributors do development work themselves. This is useful too;
-but to keep everyone honest, you need to inquire how much they do, and
-what kind. Some kinds of development make much more long-term
-difference than others. For example, maintaining a separate version of
-a program contributes very little; maintaining the standard version of a
-program for the whole community contributes much. Easy new ports
-contribute little, since someone else would surely do them; difficult
-ports such as adding a new CPU to the GNU C compiler contribute more;
-major new features or packages contribute the most.
-
-By establishing the idea that supporting further development is ``the
-proper thing to do'' when distributing free software for a fee, we can
-assure a steady flow of resources into making more free software.
-
-@display
-Copyright (C) 1994 Free Software Foundation, Inc.
-Verbatim copying and redistribution of this section is permitted
-without royalty; alteration is not permitted.
-@end display
-
-@node GNU/Linux
-@unnumbered Linux and the GNU Project
-
-Many computer users run a modified version of the GNU system every
-day, without realizing it. Through a peculiar turn of events, the
-version of GNU which is widely used today is more often known as
-``Linux'', and many users are not aware of the extent of its
-connection with the GNU Project.
-
-There really is a Linux; it is a kernel, and these people are using
-it. But you can't use a kernel by itself; a kernel is useful only as
-part of a whole system. The system in which Linux is typically used
-is a modified variant of the GNU system---in other words, a Linux-based
-GNU system.
-
-Many users are not fully aware of the distinction between the kernel,
-which is Linux, and the whole system, which they also call ``Linux''.
-The ambiguous use of the name doesn't promote understanding.
-
-Programmers generally know that Linux is a kernel. But since they
-have generally heard the whole system called ``Linux'' as well, they
-often envisage a history which fits that name. For example, many
-believe that once Linus Torvalds finished writing the kernel, his
-friends looked around for other free software, and for no particular
-reason most everything necessary to make a Unix-like system was
-already available.
-
-What they found was no accident---it was the GNU system. The available
-free software added up to a complete system because the GNU Project
-had been working since 1984 to make one. The GNU Manifesto
-had set forth the goal of developing a free Unix-like system, called
-GNU. By the time Linux was written, the system was almost finished.
-
-Most free software projects have the goal of developing a particular
-program for a particular job. For example, Linus Torvalds set out to
-write a Unix-like kernel (Linux); Donald Knuth set out to write a text
-formatter (TeX); Bob Scheifler set out to develop a window system (X
-Windows). It's natural to measure the contribution of this kind of
-project by specific programs that came from the project.
-
-If we tried to measure the GNU Project's contribution in this way,
-what would we conclude? One CD-ROM vendor found that in their ``Linux
-distribution'', GNU software was the largest single contingent, around
-28% of the total source code, and this included some of the essential
-major components without which there could be no system. Linux itself
-was about 3%. So if you were going to pick a name for the system
-based on who wrote the programs in the system, the most appropriate
-single choice would be ``GNU''.
-
-But we don't think that is the right way to consider the question.
-The GNU Project was not, is not, a project to develop specific
-software packages. It was not a project to develop a C compiler,
-although we did. It was not a project to develop a text editor,
-although we developed one. The GNU Project's aim was to develop
-@emph{a complete free Unix-like system}.
-
-Many people have made major contributions to the free software in the
-system, and they all deserve credit. But the reason it is @emph{a
-system}---and not just a collection of useful programs---is because the
-GNU Project set out to make it one. We wrote the programs that were
-needed to make a @emph{complete} free system. We wrote essential but
-unexciting major components, such as the assembler and linker, because
-you can't have a system without them. A complete system needs more
-than just programming tools, so we wrote other components as well,
-such as the Bourne Again SHell, the PostScript interpreter
-Ghostscript, and the GNU C library.
-
-By the early 90s we had put together the whole system aside from the
-kernel (and we were also working on a kernel, the GNU Hurd, which runs
-on top of Mach). Developing this kernel has been a lot harder than we
-expected, and we are still working on finishing it.
-
-Fortunately, you don't have to wait for it, because Linux is working
-now. When Linus Torvalds wrote Linux, he filled the last major gap.
-People could then put Linux together with the GNU system to make a
-complete free system: a Linux-based GNU system (or GNU/Linux system,
-for short).
-
-Putting them together sounds simple, but it was not a trivial job.
-The GNU C library (called glibc for short) needed substantial changes.
-Integrating a complete system as a distribution that would work ``out
-of the box'' was a big job, too. It required addressing the issue of
-how to install and boot the system---a problem we had not tackled,
-because we hadn't yet reached that point. The people who developed
-the various system distributions made a substantial contribution.
-
-The GNU Project supports GNU/Linux systems as well as @emph{the}
-GNU system---even with funds. We funded the rewriting of the
-Linux-related extensions to the GNU C library, so that now they are
-well integrated, and the newest GNU/Linux systems use the current
-library release with no changes. We also funded an early stage of the
-development of Debian GNU/Linux.
-
-We use Linux-based GNU systems today for most of our work, and we hope
-you use them too. But please don't confuse the public by using the
-name ``Linux'' ambiguously. Linux is the kernel, one of the essential
-major components of the system. The system as a whole is more or less
-the GNU system.
-
-@node Copying
-@unnumbered GNU GENERAL PUBLIC LICENSE
-@center Version 2, June 1991
-
-@display
-Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
-59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-@end display
-
-@unnumberedsec Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software---to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
-@iftex
-@unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-@end iftex
-@ifinfo
-@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-@end ifinfo
-
-@enumerate 0
-@item
-This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The ``Program'', below,
-refers to any such program or work, and a ``work based on the Program''
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term ``modification''.) Each licensee is addressed as ``you''.
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-@item
-You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-@item
-You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-@enumerate a
-@item
-You must cause the modified files to carry prominent notices
-stating that you changed the files and the date of any change.
-
-@item
-You must cause any work that you distribute or publish, that in
-whole or in part contains or is derived from the Program or any
-part thereof, to be licensed as a whole at no charge to all third
-parties under the terms of this License.
-
-@item
-If the modified program normally reads commands interactively
-when run, you must cause it, when started running for such
-interactive use in the most ordinary way, to print or display an
-announcement including an appropriate copyright notice and a
-notice that there is no warranty (or else, saying that you provide
-a warranty) and that users may redistribute the program under
-these conditions, and telling the user how to view a copy of this
-License. (Exception: if the Program itself is interactive but
-does not normally print such an announcement, your work based on
-the Program is not required to print an announcement.)
-@end enumerate
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-@item
-You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-@enumerate a
-@item
-Accompany it with the complete corresponding machine-readable
-source code, which must be distributed under the terms of Sections
-1 and 2 above on a medium customarily used for software interchange; or,
-
-@item
-Accompany it with a written offer, valid for at least three
-years, to give any third party, for a charge no more than your
-cost of physically performing source distribution, a complete
-machine-readable copy of the corresponding source code, to be
-distributed under the terms of Sections 1 and 2 above on a medium
-customarily used for software interchange; or,
-
-@item
-Accompany it with the information you received as to the offer
-to distribute corresponding source code. (This alternative is
-allowed only for noncommercial distribution and only if you
-received the program in object code or executable form with such
-an offer, in accord with Subsection b above.)
-@end enumerate
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-@item
-You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-@item
-You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-@item
-Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-@item
-If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-@item
-If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-@item
-The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and ``any
-later version'', you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-@item
-If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-@iftex
-@heading NO WARRANTY
-@end iftex
-@ifinfo
-@center NO WARRANTY
-@end ifinfo
-
-@item
-BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-@item
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-@end enumerate
-
-@iftex
-@heading END OF TERMS AND CONDITIONS
-@end iftex
-@ifinfo
-@center END OF TERMS AND CONDITIONS
-@end ifinfo
-
-@page
-@unnumberedsec How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the ``copyright'' line and a pointer to where the full notice is found.
-
-@smallexample
-@var{one line to give the program's name and a brief idea of what it does.}
-Copyright (C) 19@var{yy} @var{name of author}
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-@end smallexample
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-@smallexample
-Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author}
-Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
-type `show w'.
-This is free software, and you are welcome to redistribute it
-under certain conditions; type `show c' for details.
-@end smallexample
-
-The hypothetical commands @samp{show w} and @samp{show c} should show
-the appropriate parts of the General Public License. Of course, the
-commands you use may be called something other than @samp{show w} and
-@samp{show c}; they could even be mouse-clicks or menu items---whatever
-suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a ``copyright disclaimer'' for the program, if
-necessary. Here is a sample; alter the names:
-
-@smallexample
-Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-`Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-@var{signature of Ty Coon}, 1 April 1989
-Ty Coon, President of Vice
-@end smallexample
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
-
-@node Contributors
-@unnumbered Contributors to GNU CC
-@cindex contributors
-
-In addition to Richard Stallman, several people have written parts
-of GNU CC.
-
-@itemize @bullet
-@item
-The idea of using RTL and some of the optimization ideas came from the
-program PO written at the University of Arizona by Jack Davidson and
-Christopher Fraser. See ``Register Allocation and Exhaustive Peephole
-Optimization'', Software Practice and Experience 14 (9), Sept. 1984,
-857-866.
-
-@item
-Paul Rubin wrote most of the preprocessor.
-
-@item
-Leonard Tower wrote parts of the parser, RTL generator, and RTL
-definitions, and of the Vax machine description.
-
-@item
-Ted Lemon wrote parts of the RTL reader and printer.
-
-@item
-Jim Wilson implemented loop strength reduction and some other
-loop optimizations.
-
-@item
-Nobuyuki Hikichi of Software Research Associates, Tokyo, contributed
-the support for the Sony NEWS machine.
-
-@item
-Charles LaBrec contributed the support for the Integrated Solutions
-68020 system.
-
-@item
-Michael Tiemann of Cygnus Support wrote the front end for C++, as well
-as the support for inline functions and instruction scheduling. Also
-the descriptions of the National Semiconductor 32000 series cpu, the
-SPARC cpu and part of the Motorola 88000 cpu.
-
-@item
-Gerald Baumgartner added the signature extension to the C++ front-end.
-
-@item
-Jan Stein of the Chalmers Computer Society provided support for
-Genix, as well as part of the 32000 machine description.
-
-@item
-Randy Smith finished the Sun FPA support.
-
-@item
-Robert Brown implemented the support for Encore 32000 systems.
-
-@item
-David Kashtan of SRI adapted GNU CC to VMS.
-
-@item
-Alex Crain provided changes for the 3b1.
-
-@item
-Greg Satz and Chris Hanson assisted in making GNU CC work on HP-UX for
-the 9000 series 300.
-
-@item
-William Schelter did most of the work on the Intel 80386 support.
-
-@item
-Christopher Smith did the port for Convex machines.
-
-@item
-Paul Petersen wrote the machine description for the Alliant FX/8.
-
-@item
-Dario Dariol contributed the four varieties of sample programs
-that print a copy of their source.
-
-@item
-Alain Lichnewsky ported GNU CC to the Mips cpu.
-
-@item
-Devon Bowen, Dale Wiles and Kevin Zachmann ported GNU CC to the Tahoe.
-
-@item
-Jonathan Stone wrote the machine description for the Pyramid computer.
-
-@item
-Gary Miller ported GNU CC to Charles River Data Systems machines.
-
-@item
-Richard Kenner of the New York University Ultracomputer Research
-Laboratory wrote the machine descriptions for the AMD 29000, the DEC
-Alpha, the IBM RT PC, and the IBM RS/6000 as well as the support for
-instruction attributes. He also made changes to better support RISC
-processors including changes to common subexpression elimination,
-strength reduction, function calling sequence handling, and condition
-code support, in addition to generalizing the code for frame pointer
-elimination.
-
-@item
-Richard Kenner and Michael Tiemann jointly developed reorg.c, the delay
-slot scheduler.
-
-@item
-Mike Meissner and Tom Wood of Data General finished the port to the
-Motorola 88000.
-
-@item
-Masanobu Yuhara of Fujitsu Laboratories implemented the machine
-description for the Tron architecture (specifically, the Gmicro).
-
-@item
-NeXT, Inc.@: donated the front end that supports the Objective C
-language.
-@c We need to be careful to make it clear that "Objective C"
-@c is the name of a language, not that of a program or product.
-
-@item
-James van Artsdalen wrote the code that makes efficient use of
-the Intel 80387 register stack.
-
-@item
-Mike Meissner at the Open Software Foundation finished the port to the
-MIPS cpu, including adding ECOFF debug support, and worked on the
-Intel port for the Intel 80386 cpu. Later at Cygnus Support, he worked
-on the rs6000 and PowerPC ports.
-
-@item
-Ron Guilmette implemented the @code{protoize} and @code{unprotoize}
-tools, the support for Dwarf symbolic debugging information, and much of
-the support for System V Release 4. He has also worked heavily on the
-Intel 386 and 860 support.
-
-@item
-Torbjorn Granlund implemented multiply- and divide-by-constant
-optimization, improved long long support, and improved leaf function
-register allocation.
-
-@item
-Mike Stump implemented the support for Elxsi 64 bit CPU.
-
-@item
-John Wehle added the machine description for the Western Electric 32000
-processor used in several 3b series machines (no relation to the
-National Semiconductor 32000 processor).
-
-@ignore @c These features aren't advertised yet, since they don't fully work.
-@item
-Analog Devices helped implement the support for complex data types
-and iterators.
-@end ignore
-
-@item
-Holger Teutsch provided the support for the Clipper cpu.
-
-@item
-Kresten Krab Thorup wrote the run time support for the Objective C
-language.
-
-@item
-Stephen Moshier contributed the floating point emulator that assists in
-cross-compilation and permits support for floating point numbers wider
-than 64 bits.
-
-@item
-David Edelsohn contributed the changes to RS/6000 port to make it
-support the PowerPC and POWER2 architectures.
-
-@item
-Steve Chamberlain wrote the support for the Hitachi SH processor.
-
-@item
-Peter Schauer wrote the code to allow debugging to work on the Alpha.
-
-@item
-Oliver M. Kellogg of Deutsche Aerospace contributed the port to the
-MIL-STD-1750A.
-
-@item
-Michael K. Gschwind contributed the port to the PDP-11.
-
-@item
-David Reese of Sun Microsystems contributed to the Solaris on PowerPC
-port.
-@end itemize
-
-@node Index
-@unnumbered Index
-@end ifset
-
-@ifclear INTERNALS
-@node Index
-@unnumbered Index
-@end ifclear
-
-@printindex cp
-
-@summarycontents
-@contents
-@bye
diff --git a/gcc/genmultilib b/gcc/genmultilib
deleted file mode 100755
index 0220696..0000000
--- a/gcc/genmultilib
+++ /dev/null
@@ -1,269 +0,0 @@
-#!/bin/sh
-# Generates multilib.h.
-# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
-
-#This file is part of GNU CC.
-
-#GNU CC is free software; you can redistribute it and/or modify
-#it under the terms of the GNU General Public License as published by
-#the Free Software Foundation; either version 2, or (at your option)
-#any later version.
-
-#GNU CC is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-#GNU General Public License for more details.
-
-#You should have received a copy of the GNU General Public License
-#along with GNU CC; see the file COPYING. If not, write to
-#the Free Software Foundation, 59 Temple Place - Suite 330,
-#Boston, MA 02111-1307, USA.
-
-# This shell script produces a header file which the gcc driver
-# program uses to pick which library to use based on the machine
-# specific options that it is given.
-
-# The first argument is a list of sets of options. The elements in
-# the list are separated by spaces. Within an element, the options
-# are separated by slashes. No leading dash is used on the options.
-# Each option in a set is mutually incompatible with all other options
-# in the set.
-
-# The optional second argument is a list of subdirectory names. If
-# the second argument is non-empty, there must be as many elements in
-# the second argument as there are options in the first argument. The
-# elements in the second list are separated by spaces. If the second
-# argument is empty, the option names will be used as the directory
-# names.
-
-# The optional third argument is a list of options which are
-# identical. The elements in the list are separated by spaces. Each
-# element must be of the form OPTION=OPTION. The first OPTION should
-# appear in the first argument, and the second should be a synonym for
-# it. Question marks are replaced with equal signs in both options.
-
-# The optional fourth argument is a list of multilib directory
-# combinations that should not be built.
-
-# The optional fifth argument is a list of options that should be
-# used whenever building multilib libraries.
-
-# The output looks like
-# #define MULTILIB_MATCHES "\
-# SUBDIRECTORY OPTIONS;\
-# ...
-# "
-# The SUBDIRECTORY is the subdirectory to use. The OPTIONS are
-# multiple options separated by spaces. Each option may start with an
-# exclamation point. gcc will consider each line in turn. If none of
-# the options beginning with an exclamation point are present, and all
-# of the other options are present, that subdirectory will be used.
-# The order of the subdirectories is such that they can be created in
-# order; that is, a subdirectory is preceded by all its parents.
-
-# Here is a example (this is simplified from the actual 680x0 case):
-# genmultilib "m68000/m68020 msoft-float" "m68000 m68020 msoft-float"
-# "m68000=mc68000"
-# This produces:
-# ". !m68000 !mc68000 !m68020 !msoft-float;",
-# "m68000 m68000 !m68020 !msoft-float;",
-# "m68000 mc60000 !m68020 !msoft-float;",
-# "m68020 !m68000 !mc68000 m68020 !msoft-float;",
-# "msoft-float !m68000 !mc68000 !m68020 msoft-float;",
-# "m68000/msoft-float m68000 !m68020 msoft-float;",
-# "m68000/msoft-float mc68000 !m68020 msoft-float;",
-# "m68020/msoft-float !m68000 !mc68000 m68020 msoft-float;",
-#
-# The effect is that `gcc -msoft-float' (for example) will append
-# msoft-float to the directory name when searching for libraries or
-# startup files, and `gcc -m68000 -msoft-float' (for example) will
-# append m68000/msoft-float.
-
-# Copy the positional parameters into variables.
-options=$1
-dirnames=$2
-matches=$3
-exceptions=$4
-extra=$5
-
-echo "static char *multilib_raw[] = {"
-
-# What we want to do is select all combinations of the sets in
-# options. Each combination which includes a set of mutually
-# exclusive options must then be output multiple times, once for each
-# item in the set. Selecting combinations is a recursive process.
-# Since not all versions of sh support functions, we achieve recursion
-# by creating a temporary shell script which invokes itself.
-rm -f tmpmultilib
-cat >tmpmultilib <<\EOF
-#!/bin/sh
-# This recursive script basically outputs all combinations of its
-# input arguments, handling mutually exclusive sets of options by
-# repetition. When the script is called, ${initial} is the list of
-# options which should appear before all combinations this will
-# output. The output looks like a list of subdirectory names with
-# leading and trailing slashes.
-if [ "$#" != "0" ]; then
- first=$1
- shift
- for opt in `echo $first | sed -e 's|/| |'g`; do
- echo ${initial}${opt}/
- done
- ./tmpmultilib $@
- for opt in `echo $first | sed -e 's|/| |'g`; do
- initial="${initial}${opt}/" ./tmpmultilib $@
- done
-fi
-EOF
-chmod +x tmpmultilib
-
-combinations=`initial=/ ./tmpmultilib ${options}`
-
-rm -f tmpmultilib
-
-# If there exceptions, weed them out now
-if [ -n "${exceptions}" ]; then
- rm -f tmpmultilib2
- cat >tmpmultilib2 <<\EOF
-#!/bin/sh
-# This recursive script weeds out any combination of multilib
-# switches that should not be generated. The output looks like
-# a list of subdirectory names with leading and trailing slashes.
-
- for opt in $@; do
- case "$opt" in
-EOF
-
- for except in ${exceptions}; do
- echo " /${except}/) : ;;" >> tmpmultilib2
- done
-
-cat >>tmpmultilib2 <<\EOF
- *) echo ${opt};;
- esac
- done
-EOF
- chmod +x tmpmultilib2
- combinations=`./tmpmultilib2 ${combinations}`
- rm -f ./tmpmultilib2
-fi
-
-# Construct a sed pattern which will convert option names to directory
-# names.
-todirnames=
-if [ -n "${dirnames}" ]; then
- set x ${dirnames}
- shift
- for set in ${options}; do
- for opt in `echo ${set} | sed -e 's|/| |'g`; do
- if [ "$1" != "${opt}" ]; then
- todirnames="${todirnames} -e s|/${opt}/|/${1}/|g"
- fi
- shift
- done
- done
-fi
-
-# We need another recursive shell script to correctly handle positive
-# matches. If we are invoked as
-# genmultilib "opt1 opt2" "" "opt1=nopt1 opt2=nopt2"
-# we must output
-# opt1/opt2 opt1 opt2
-# opt1/opt2 nopt1 opt2
-# opt1/opt2 opt1 nopt2
-# opt1/opt2 nopt1 nopt2
-# In other words, we must output all combinations of matches.
-rm -f tmpmultilib2
-cat >tmpmultilib2 <<\EOF
-#!/bin/sh
-# The positional parameters are a list of matches to consider.
-# ${dirout} is the directory name and ${optout} is the current list of
-# options.
-if [ "$#" = "0" ]; then
- echo "\"${dirout} ${optout};\","
-else
- first=$1
- shift
- dirout="${dirout}" optout="${optout}" ./tmpmultilib2 $@
- l=`echo ${first} | sed -e 's/=.*$//' -e 's/?/=/g'`
- r=`echo ${first} | sed -e 's/^.*=//' -e 's/?/=/g'`
- if expr " ${optout} " : ".* ${l} .*" > /dev/null; then
- newopt=`echo " ${optout} " | sed -e "s/ ${l} / ${r} /" -e 's/^ //' -e 's/ $//'`
- dirout="${dirout}" optout="${newopt}" ./tmpmultilib2 $@
- fi
-fi
-EOF
-chmod +x tmpmultilib2
-
-# Start with the current directory, which includes only negations.
-optout=
-for set in ${options}; do
- for opt in `echo ${set} | sed -e 's|/| |'g`; do
- optout="${optout} !${opt}"
- done
-done
-optout=`echo ${optout} | sed -e 's/^ //'`
-echo "\". ${optout};\","
-
-# Work over the list of combinations. We have to translate each one
-# to use the directory names rather than the option names, we have to
-# include the information in matches, and we have to generate the
-# correct list of options and negations.
-for combo in ${combinations}; do
- # Use the directory names rather than the option names.
- if [ -n "${todirnames}" ]; then
- dirout=`echo ${combo} | sed ${todirnames}`
- else
- dirout=${combo}
- fi
- # Remove the leading and trailing slashes.
- dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/$||g'`
-
- # Look through the options. We must output each option that is
- # present, and negate each option that is not present.
- optout=
- for set in ${options}; do
- setopts=`echo ${set} | sed -e 's|/| |g'`
- for opt in ${setopts}; do
- if expr "${combo} " : ".*/${opt}/.*" > /dev/null; then
- optout="${optout} ${opt}"
- else
- optout="${optout} !${opt}"
- fi
- done
- done
- optout=`echo ${optout} | sed -e 's/^ //'`
-
- # Output the line with all appropriate matches.
- dirout="${dirout}" optout="${optout}" ./tmpmultilib2
-done
-
-# Terminate the list of string.
-echo "NULL"
-echo "};"
-
-# Output all of the matches now as option and that is the same as that, with
-# a semicolon trailer. Include all of the normal options as well.
-# Note, the format of the matches is reversed compared
-# to what we want, so switch them around.
-echo ""
-echo "static char *multilib_matches_raw[] = {"
-for match in ${matches}; do
- l=`echo ${match} | sed -e 's/=.*$//' -e 's/?/=/g'`
- r=`echo ${match} | sed -e 's/^.*=//' -e 's/?/=/g'`
- echo "\"${r} ${l};\","
-done
-for set in ${options}; do
- for opt in `echo ${set} | sed -e 's|/| |'g`; do
- echo "\"${opt} ${opt};\","
- done
-done
-echo "NULL"
-echo "};"
-
-# Output the default options now
-echo ""
-echo "static char *multilib_extra = \"${extra}\";"
-rm -f tmpmultilib2
-
-exit 0
diff --git a/gcc/ginclude/limits.h b/gcc/ginclude/limits.h
index 32e7800..3d74de0 100644
--- a/gcc/ginclude/limits.h
+++ b/gcc/ginclude/limits.h
@@ -21,22 +21,14 @@
#define UCHAR_MAX 255
/* Minimum and maximum values a `char' can hold. */
-#ifdef __CHAR_UNSIGNED__
#undef CHAR_MIN
#define CHAR_MIN 0
#undef CHAR_MAX
#define CHAR_MAX 255
-#else
-#undef CHAR_MIN
-#define CHAR_MIN (-128)
-#undef CHAR_MAX
-#define CHAR_MAX 127
-#endif
/* Minimum and maximum values a `signed short int' can hold. */
#undef SHRT_MIN
-/* For the sake of 16 bit hosts, we may not use -32768 */
-#define SHRT_MIN (-32767-1)
+#define SHRT_MIN -32768
#undef SHRT_MAX
#define SHRT_MAX 32767
diff --git a/gcc/hash.h b/gcc/hash.h
index 16e5db5..7638a99 100755
--- a/gcc/hash.h
+++ b/gcc/hash.h
@@ -19,10 +19,6 @@ along with this program; if not, write to the Free Software
Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#ifndef IN_GCC
-#include <ansidecl.h>
-#endif /* ! IN_GCC */
-
#include "obstack.h"
typedef enum {false, true} boolean;
diff --git a/gcc/install.texi b/gcc/install.texi
deleted file mode 100755
index c0a54e3..0000000
--- a/gcc/install.texi
+++ /dev/null
@@ -1,2381 +0,0 @@
-@c Copyright (C) 1988,89,92,93,94,95,96,97,1998 Free Software Foundation, Inc.
-@c This is part of the GCC manual.
-@c For copying conditions, see the file gcc.texi.
-
-@c The text of this file appears in the file INSTALL
-@c in the GCC distribution, as well as in the GCC manual.
-
-Note most of this information is out of date and superceded by the EGCS
-install procedures. It is provided for historical reference only.
-
-@ifclear INSTALLONLY
-@node Installation
-@chapter Installing GNU CC
-@end ifclear
-@cindex installing GNU CC
-
-@menu
-* Configurations:: Configurations Supported by GNU CC.
-* Other Dir:: Compiling in a separate directory (not where the source is).
-* Cross-Compiler:: Building and installing a cross-compiler.
-* Sun Install:: See below for installation on the Sun.
-* VMS Install:: See below for installation on VMS.
-* Collect2:: How @code{collect2} works; how it finds @code{ld}.
-* Header Dirs:: Understanding the standard header file directories.
-@end menu
-
-Here is the procedure for installing GNU CC on a Unix system. See
-@ref{VMS Install}, for VMS systems. In this section we assume you
-compile in the same directory that contains the source files; see
-@ref{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.
-
-@enumerate
-@item
-If you have built GNU CC previously in the same directory for a
-different target machine, do @samp{make distclean} to delete all files
-that might be invalid. One of the files this deletes is
-@file{Makefile}; if @samp{make distclean} complains that @file{Makefile}
-does not exist, it probably means that the directory is already suitably
-clean.
-
-@item
-On a System V release 4 system, make sure @file{/usr/bin} precedes
-@file{/usr/ucb} in @code{PATH}. The @code{cc} command in
-@file{/usr/ucb} uses libraries which have bugs.
-
-@item
-Specify the host, build and target machine configurations. You do this
-by running the file @file{configure}.
-
-The @dfn{build} machine is the system which you are using, the
-@dfn{host} machine is the system where you want to run the resulting
-compiler (normally the build machine), and the @dfn{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 @file{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
-@file{configure} cannot figure out what your configuration is or guesses
-wrong.
-
-In those cases, specify the build machine's @dfn{configuration name}
-with the @samp{--host} option; the host and target will default to be
-the same as the host machine. (If you are building a cross-compiler,
-see @ref{Cross-Compiler}.)
-
-Here is an example:
-
-@smallexample
-./configure --host=sparc-sun-sunos4.1
-@end smallexample
-
-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: @samp{@var{cpu}-@var{company}-@var{system}}.
-(The three parts may themselves contain dashes; @file{configure}
-can figure out which dashes serve which purpose.) For example,
-@samp{m68k-sun-sunos4.1} specifies a Sun 3.
-
-You can also replace parts of the configuration by nicknames or aliases.
-For example, @samp{sun3} stands for @samp{m68k-sun}, so
-@samp{sun3-sunos4.1} is another way to specify a Sun 3. You can also
-use simply @samp{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 @ref{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
-@samp{--with-gnu-as}, @samp{--with-gnu-ld}, @samp{--with-stabs} and
-@samp{--nfp}.
-
-@table @samp
-@item --with-gnu-as
-If you will use GNU CC with the GNU assembler (GAS), you should declare
-this by using the @samp{--with-gnu-as} option when you run
-@file{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 @emph{do not} wish to use GAS and do not specify
-@samp{--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
-@code{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 @samp{-v} when you run it.
-
-The systems where it makes a difference whether you use GAS are@*
-@samp{hppa1.0-@var{any}-@var{any}}, @samp{hppa1.1-@var{any}-@var{any}},
-@samp{i386-@var{any}-sysv}, @samp{i386-@var{any}-isc},@*
-@samp{i860-@var{any}-bsd}, @samp{m68k-bull-sysv},@*
-@samp{m68k-hp-hpux}, @samp{m68k-sony-bsd},@*
-@samp{m68k-altos-sysv}, @samp{m68000-hp-hpux},@*
-@samp{m68000-att-sysv}, @samp{@var{any}-lynx-lynxos},
-and @samp{mips-@var{any}}).
-On any other system, @samp{--with-gnu-as} has no effect.
-
-On the systems listed above (except for the HP-PA, for ISC on the
-386, and for @samp{mips-sgi-irix5.*}), if you use GAS, you should also
-use the GNU linker (and specify @samp{--with-gnu-ld}).
-
-@item --with-gnu-ld
-Specify the option @samp{--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.
-@c Specifically, it inhibits the installation of @code{collect2}, a program
-@c which otherwise serves as a front-end for the system's linker on most
-@c configurations.
-
-@item --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 @samp{--with-stabs} when you configure GNU
-CC.
-
-No matter which default you choose when you configure GNU CC, the user
-can use the @samp{-gcoff} and @samp{-gstabs+} options to specify explicitly
-the debug format for a particular compilation.
-
-@samp{--with-stabs} is meaningful on the ISC system on the 386, also, if
-@samp{--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.
-
-@samp{--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.
-
-@item --nfp
-On certain systems, you must specify whether the machine has a floating
-point unit. These systems include @samp{m68k-sun-sunos@var{n}} and
-@samp{m68k-isi-bsd}. On any other system, @samp{--nfp} currently has no
-effect, though perhaps there are other systems where it could usefully
-make a difference.
-
-@cindex Haifa scheduler
-@cindex scheduler, experimental
-@item --enable-haifa
-@itemx --disable-haifa
-Use @samp{--enable-haifa} to enable use of an experimental instruction
-scheduler (from IBM Haifa). This may or may not produce better code.
-Some targets on which it is known to be a win enable it by default; use
-@samp{--disable-haifa} to disable it in these cases. @code{configure}
-will print out whether the Haifa scheduler is enabled when it is run.
-
-@cindex Objective C threads
-@cindex threads, Objective C
-@item --enable-threads=@var{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 @var{type}, probably
-@samp{posix}. The possibilities for @var{type} are @samp{single},
-@samp{posix}, @samp{win32}, @samp{solaris}, @samp{irix} and @samp{mach}.
-
-@cindex Internal Compiler Checking
-@item --enable-checking
-When you specify this option, the compiler is built to perform checking
-of tree node types when referencing fields of that node. This does not
-change the generated code, but adds error checking within the compiler.
-This will slow down the compiler and may only work properly if you
-are building the compiler with GNU C.
-@end table
-
-The @file{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
-@file{cp}. @file{configure} inserts rules into @file{Makefile} to build
-all of those compilers.
-
-Here we spell out what files will be set up by @code{configure}. Normally
-you need not be concerned with these files.
-
-@itemize @bullet
-@item
-@ifset INTERNALS
-A file named @file{config.h} is created that contains a @samp{#include}
-of the top-level config file for the machine you will run the compiler
-on (@pxref{Config}). This file is responsible for defining information
-about the host machine. It includes @file{tm.h}.
-@end ifset
-@ifclear INTERNALS
-A file named @file{config.h} is created that contains a @samp{#include}
-of the top-level config file for the machine you will run the compiler
-on (@pxref{Config,,The Configuration File, gcc.info, Using and Porting
-GCC}). This file is responsible for defining information about the host
-machine. It includes @file{tm.h}.
-@end ifclear
-
-The top-level config file is located in the subdirectory @file{config}.
-Its name is always @file{xm-@var{something}.h}; usually
-@file{xm-@var{machine}.h}, but there are some exceptions.
-
-If your system does not support symbolic links, you might want to
-set up @file{config.h} to contain a @samp{#include} command which
-refers to the appropriate file.
-
-@item
-A file named @file{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.
-
-@item
-A file named @file{tm.h} is created which includes the
-machine-description macro file for your target machine. It should be in
-the subdirectory @file{config} and its name is often
-@file{@var{machine}.h}.
-
-@item
-The command file @file{configure} also constructs the file
-@file{Makefile} by adding some text to the template file
-@file{Makefile.in}. The additional text comes from files in the
-@file{config} directory, named @file{t-@var{target}} and
-@file{x-@var{host}}. If these files do not exist, it means nothing
-needs to be added for a given target or host.
-@end itemize
-
-@item
-The standard directory for installing GNU CC is @file{/usr/local/lib}.
-If you want to install its files somewhere else, specify
-@samp{--prefix=@var{dir}} when you run @file{configure}. Here @var{dir}
-is a directory name to use instead of @file{/usr/local} for all purposes
-with one exception: the directory @file{/usr/local/include} is searched
-for header files no matter where you install the compiler. To override
-this name, use the @code{--with-local-prefix} option below. The directory
-you specify need not exist, but its parent directory must exist.
-
-@item
-Specify @samp{--with-local-prefix=@var{dir}} if you want the compiler to
-search directory @file{@var{dir}/include} for locally installed header
-files @emph{instead} of @file{/usr/local/include}.
-
-You should specify @samp{--with-local-prefix} @strong{only} if your site has
-a different convention (not @file{/usr/local}) for where to put
-site-specific files.
-
-The default value for @samp{--with-local-prefix} is @file{/usr/local}
-regardless of the value of @samp{--prefix}. Specifying @samp{--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 @samp{--prefix} is to specify where to @emph{install GNU
-CC}. The local header files in @file{/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 @samp{--prefix} value.)
-
-@strong{Do not} specify @file{/usr} as the @samp{--with-local-prefix}! The
-directory you use for @samp{--with-local-prefix} @strong{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 @code{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.
-
-@cindex Bison parser generator
-@cindex parser generator, Bison
-@item
-Make sure the Bison parser generator is installed. (This is
-unnecessary if the Bison output files @file{c-parse.c} and
-@file{cexp.c} are more recent than @file{c-parse.y} and @file{cexp.y}
-and you do not plan to change the @samp{.y} files.)
-
-Bison versions older than Sept 8, 1988 will produce incorrect output
-for @file{c-parse.c}.
-
-@item
-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
-@file{as}, @file{ld} or whatever is appropriate. This will enable the
-compiler to find the proper tools for compilation of the program
-@file{enquire}.
-
-Alternatively, you can do subsequent compilation using a value of the
-@code{PATH} environment variable such that the necessary GNU tools come
-before the standard system tools.
-
-@item
-Build the compiler. Just type @samp{make LANGUAGES=c} in the compiler
-directory.
-
-@samp{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 @samp{LANGUAGES="@var{list}"}, where @var{list} is one or more
-words from the list @samp{c}, @samp{c++}, and @samp{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
-@file{insn-emit.c}; they are normal. Also, warnings about ``unknown
-escape sequence'' are normal in @file{genopinit.c} and perhaps some
-other files. Likewise, you should ignore warnings about ``constant is
-so large that it is unsigned'' in @file{insn-emit.c} and
-@file{insn-recog.c}, a warning about a comparison always being zero
-in @file{enquire.o}, and warnings about shift counts exceeding type
-widths in @file{cexp.y}. Any other compilation errors may represent bugs in
-the port to your machine or operating system, and
-@ifclear INSTALLONLY
-should be investigated and reported (@pxref{Bugs}).
-@end ifclear
-@ifset INSTALLONLY
-should be investigated and reported.
-@end ifset
-
-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.
-
-@item
-If you are building a cross-compiler, stop here. @xref{Cross-Compiler}.
-
-@cindex stage1
-@item
-Move the first-stage object files and executables into a subdirectory
-with this command:
-
-@smallexample
-make stage1
-@end smallexample
-
-The files are moved into a subdirectory named @file{stage1}.
-Once installation is complete, you may wish to delete these files
-with @code{rm -r stage1}.
-
-@item
-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 @file{stage1} subdirectory
-under the names @file{as}, @file{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
-@code{PATH} environment variable such that the necessary GNU tools come
-before the standard system tools.
-
-@item
-Recompile the compiler with itself, with this command:
-
-@smallexample
-make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2"
-@end smallexample
-
-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 @samp{LANGUAGES="@var{list}"}. @var{list}
-should contain one or more words from the list @samp{c}, @samp{c++},
-@samp{objective-c}, and @samp{proto}. Separate the words with spaces.
-@samp{proto} stands for the programs @code{protoize} and
-@code{unprotoize}; they are not a separate language, but you use
-@code{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 @file{stage1}.
-
-On a 68000 or 68020 system lacking floating point hardware,
-unless you have selected a @file{tm.h} file that expects by default
-that there is no such hardware, do this instead:
-
-@smallexample
-make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2 -msoft-float"
-@end smallexample
-
-@item
-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 @file{stage2} subdirectory as you did in the
-@file{stage1} subdirectory, then do this:
-
-@smallexample
-make stage2
-make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2"
-@end smallexample
-
-@noindent
-This is called making the stage 3 compiler. Aside from the @samp{-B}
-option, the compiler options should be the same as when you made the
-stage 2 compiler. But the @code{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 @samp{LANGUAGES="@var{list}"}, as described
-above.
-
-If you do not have to install any additional GNU tools, you may use the
-command
-
-@smallexample
-make bootstrap LANGUAGES=@var{language-list} BOOT_CFLAGS=@var{option-list}
-@end smallexample
-
-@noindent
-instead of making @file{stage1}, @file{stage2}, and performing
-the two compiler builds.
-
-@item
-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 @file{-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:
-
-@smallexample
-make compare
-@end smallexample
-
-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
-@ifclear INSTALLONLY
-serious bug which you should investigate and report (@pxref{Bugs}).
-@end ifclear
-@ifset INSTALLONLY
-serious bug which you should investigate and report.
-@end ifset
-
-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):
-
-@smallexample
-for file in *.o; do
-cmp $file stage2/$file
-done
-@end smallexample
-
-If you have built the compiler with the @samp{-mno-mips-tfile} option on
-MIPS machines, you will not be able to compare the files.
-
-@item
-Install the compiler driver, the compiler's passes and run-time support
-with @samp{make install}. Use the same value for @code{CC},
-@code{CFLAGS} and @code{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:
-
-@smallexample
-make install CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O" LANGUAGES="@var{list}"
-@end smallexample
-
-@noindent
-This copies the files @file{cc1}, @file{cpp} and @file{libgcc.a} to
-files @file{cc1}, @file{cpp} and @file{libgcc.a} in the directory
-@file{/usr/local/lib/gcc-lib/@var{target}/@var{version}}, which is where
-the compiler driver program looks for them. Here @var{target} is the
-canonicalized form of target machine type specified when you ran
-@file{configure}, and @var{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., @file{cc1plus} for C++) to the same directory.
-
-This also copies the driver program @file{xgcc} into
-@file{/usr/local/bin/gcc}, so that it appears in typical execution
-search paths. It also copies @file{gcc.1} into
-@file{/usr/local/man/man1} and info pages into @file{/usr/local/info}.
-
-On some systems, this command causes recompilation of some files. This
-is usually due to bugs in @code{make}. You should either ignore this
-problem, or use GNU Make.
-
-@cindex @code{alloca} and SunOS
-@strong{Warning: there is a bug in @code{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 @code{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.)
-
-@item
-@cindex C++ runtime library
-@cindex @code{libstdc++}
-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.
-
-The standard C++ runtime library for GNU CC is called @samp{libstdc++}.
-An obsolescent library @samp{libg++} may also be available, but it's
-necessary only for older software that hasn't been converted yet; if
-you don't know whether you need @samp{libg++} then you probably don't
-need it.
-
-Here's one way to build and install @samp{libstdc++} for GNU CC:
-
-@itemize @bullet
-@item
-Build and install GNU CC, so that invoking @samp{gcc} obtains the GNU CC
-that was just built.
-
-@item
-Obtain a copy of a compatible @samp{libstdc++} distribution. For
-example, the @samp{libstdc++-2.8.0.tar.gz} distribution should be
-compatible with GCC 2.8.0. GCC distributors normally distribute
-@samp{libstdc++} as well.
-
-@item
-Set the @samp{CXX} environment variable to @samp{gcc} while running the
-@samp{libstdc++} distribution's @file{configure} command. Use the same
-@file{configure} options that you used when you invoked GCC's
-@file{configure} command.
-
-@item
-Invoke @samp{make} to build the C++ runtime.
-
-@item
-Invoke @samp{make install} to install the C++ runtime.
-
-@end itemize
-
-To summarize, after building and installing GNU CC, invoke the following
-shell commands in the topmost directory of the C++ library distribution.
-For @var{configure-options}, use the same options that
-you used to configure GNU CC.
-
-@example
-$ CXX=gcc ./configure @var{configure-options}
-$ make
-$ make install
-@end example
-
-@item
-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 @file{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. @xref{Cross Headers,
-Cross-Compilers and Header Files, Cross-Compilers and Header Files}, for
-discussion about header files issues for cross-compilation.
-
-When you run @file{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
-@var{OBJC_THREAD_FILE} makefile variable on the command line when you
-run make, for example:
-
-@smallexample
-make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2" OBJC_THREAD_FILE=thr-single
-@end smallexample
-
-@noindent
-Below is a list of the currently available back-ends.
-
-@itemize @bullet
-@item thr-single
-Disable thread support, should work for all platforms.
-@item thr-decosf1
-DEC OSF/1 thread support.
-@item thr-irix
-SGI IRIX thread support.
-@item thr-mach
-Generic MACH thread support, known to work on NEXTSTEP.
-@item thr-os2
-IBM OS/2 thread support.
-@item thr-posix
-Generix POSIX thread support.
-@item thr-pthreads
-PCThreads on Linux-based GNU systems.
-@item thr-solaris
-SUN Solaris thread support.
-@item thr-win32
-Microsoft Win32 API thread support.
-@end itemize
-@end enumerate
-
-@node Configurations
-@section Configurations Supported by GNU CC
-@cindex configurations supported by GNU CC
-
-Here are the possible CPU types:
-
-@quotation
-@c gmicro, alliant, spur and tahoe omitted since they don't work.
-1750a, a29k, alpha, arm, c@var{n}, 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.
-@end quotation
-
-Here are the recognized company names. As you can see, customary
-abbreviations are used rather than the longer official names.
-
-@c What should be done about merlin, tek*, dolphin?
-@quotation
-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.
-@end quotation
-
-The company name is meaningful only to disambiguate when the rest of
-the information supplied is insufficient. You can omit it, writing
-just @samp{@var{cpu}-@var{system}}, if it is not needed. For example,
-@samp{vax-ultrix4.2} is equivalent to @samp{vax-dec-ultrix4.2}.
-
-Here is a list of system types:
-
-@quotation
-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.
-@end quotation
-
-@noindent
-You can omit the system type; then @file{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 @samp{bsd4.3} or
-@samp{bsd4.4} to distinguish versions of BSD. In practice, the version
-number is most needed for @samp{sysv3} and @samp{sysv4}, which are often
-treated differently.
-
-If you specify an impossible combination such as @samp{i860-dg-vms},
-then you may get an error message from @file{configure}, or it may
-ignore part of the information and do the best it can with the rest.
-@file{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 @samp{sun3}, mentioned above, is an alias for @samp{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:
-
-@quotation
-3300, 3b1, 3b@var{n}, 7300, altos3068, altos,
-apollo68, att-7300, balance,
-convex-c@var{n}, crds, decstation-3100,
-decstation, delta, encore,
-fx2800, gmicro, hp7@var{nn}, hp8@var{nn},
-hp9k2@var{nn}, hp9k3@var{nn}, hp9k7@var{nn},
-hp9k8@var{nn}, 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.
-@end quotation
-
-@noindent
-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 @samp{local} as the company name to access them. If you use
-configuration @samp{@var{cpu}-local}, the configuration name
-without the cpu prefix
-is used to form the configuration file names.
-
-Thus, if you specify @samp{m68k-local}, configuration uses
-files @file{m68k.md}, @file{local.h}, @file{m68k.c},
-@file{xm-local.h}, @file{t-local}, and @file{x-local}, all in the
-directory @file{config/m68k}.
-
-Here is a list of configurations that have special treatment or special
-things you must know:
-
-@table @samp
-@item 1750a-*-*
-MIL-STD-1750A processors.
-
-The MIL-STD-1750A cross configuration produces output for
-@code{as1750}, an assembler/linker available under the GNU Public
-License for the 1750A. @code{as1750} can be obtained at
-@emph{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 @code{as1750} assembler requires the file @file{ms1750.inc}, which is
-found in the directory @file{config/1750a}.
-
-GNU CC produced the same sections as the Fairchild F9450 C Compiler,
-namely:
-
-@table @code
-@item Normal
-The program code section.
-
-@item Static
-The read/write (RAM) data section.
-
-@item Konst
-The read-only (ROM) constants section.
-
-@item Init
-Initialization section (code to copy KREL to SREL).
-@end table
-
-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.
-
-@item 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 @samp{.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 @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.
-
-@code{make compare} may fail on old versions of DEC Unix unless you add
-@samp{-save-temps} to @code{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 @code{stage1} and
-@code{stage2} compilations. The option @samp{-save-temps} forces a
-fixed name to be used for the assembler input file, instead of a
-randomly chosen name in @file{/tmp}. Do not add @samp{-save-temps}
-unless the comparisons fail without that option. If you add
-@samp{-save-temps}, you will have to manually delete the @samp{.i} and
-@samp{.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 @samp{--with-stabs} option of @file{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 @samp{.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 @samp{-O} is specified are
-different depending on whether or not @samp{-g} is also specified.
-
-To avoid this behavior, specify @samp{-gstabs+} and use GDB instead of
-DBX. DEC is now aware of this problem with the assembler and hopes to
-provide a fix shortly.
-
-@item arc-*-elf
-Argonaut ARC processor.
-This configuration is intended for embedded systems.
-
-@item 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 @file{a.out} format object modules.
-
-You may need to make a variant of the file @file{arm.h} for your particular
-configuration.
-
-@item arm-*-linuxaout
-Any of the ARM family processors running the Linux-based GNU system with
-the @file{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 @file{sunsite.unc.edu:/pub/Linux/GCC} and other mirror sites for
-Linux-based GNU systems.
-
-@item 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
-@file{ftp.acorn.com:/pub/riscix/as+xterm.tar.Z}. To enable stabs
-debugging, pass @samp{--with-gnu-as} to configure.
-
-You will need to install GNU @file{sed} before you can run configure.
-
-@item 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 @file{a29k.h} for your
-particular configuration.
-
-@item a29k-*-bsd
-AMD Am29050 used in a system running a variant of BSD Unix.
-
-@item decstation-*
-MIPS-based DECstations can support three different personalities:
-Ultrix, DEC OSF/1, and OSF/rose. (Alpha-based DECstation products have
-a configuration name beginning with @samp{alpha-dec}.) To configure GCC
-for these platforms use the following configurations:
-
-@table @samp
-@item decstation-ultrix
-Ultrix configuration.
-
-@item decstation-osf1
-Dec's version of OSF/1.
-
-@item 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.
-@end table
-
-The MIPS C compiler needs to be told to increase its table size
-for switch statements with the @samp{-Wf,-XNg1500} option in
-order to compile @file{cp/parse.c}. If you use the @samp{-O2}
-optimization option, you also need to use @samp{-Olimit 3000}.
-Both of these options are automatically generated in the
-@file{Makefile} that the shell script @file{configure} builds.
-If you override the @code{CC} make variable and use the MIPS
-compilers, you may need to add @samp{-Wf,-XNg1500 -Olimit 3000}.
-
-@item elxsi-elxsi-bsd
-The Elxsi's C compiler has known limitations that prevent it from
-compiling GNU C. Please contact @code{mrs@@cygnus.com} for more details.
-
-@item dsp16xx
-A port to the AT&T DSP1610 family of processors.
-
-@ignore
-@item fx80
-Alliant FX/8 computer. Note that the standard installed C compiler in
-Concentrix 5.0 has a bug which prevent it from compiling GNU CC
-correctly. You can patch the compiler bug as follows:
-
-@smallexample
-cp /bin/pcc ./pcc
-adb -w ./pcc - << EOF
-15f6?w 6610
-EOF
-@end smallexample
-
-Then you must use the @samp{-ip12} option when compiling GNU CC
-with the patched compiler, as shown here:
-
-@smallexample
-make CC="./pcc -ip12" CFLAGS=-w
-@end smallexample
-
-Note also that Alliant's version of DBX does not manage to work with the
-output from GNU CC.
-@end ignore
-
-@item 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.
-
-@item 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 @emph{not} specify a target
-when configuring GNU CC, the @file{configure} script will try to automatically
-determine the right processor type and operating system.
-
-@samp{-g} does not work on HP-UX, since that system uses a peculiar
-debugging format which GNU CC does not know about. However, @samp{-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.
-
-On some versions of HP-UX, you will need to install GNU @file{sed}.
-
-You will need to be install GAS into a directory before @code{/bin},
-@code{/usr/bin}, and @code{/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 @samp{--with-gnu-as}
-option before building.
-
-@item i370-*-*
-This port is very preliminary and has many known bugs. We hope to
-have a higher-quality port for this machine soon.
-
-@item i386-*-linux-gnuoldld
-Use this configuration to generate @file{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.
-
-@item i386-*-linux-gnuaout
-Use this configuration to generate @file{a.out} binaries on Linux-based
-GNU systems. This configuration is being superseded. You must use
-gas/binutils version 2.5.2 or later.
-
-@item 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.
-
-@item 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.
-
-@item i386-*-sco3.2v4
-Use this configuration for SCO release 3.2 version 4.
-
-@item i386-*-sco3.2v5*
-Use this for the SCO OpenServer Release family including 5.0.0, 5.0.2,
-5.0.4, 5.0.5, Internet FastStart 1.0, and Internet FastStart 1.1.
-
-GNU CC can generate COFF binaries if you specify @samp{-mcoff} or ELF
-binaries, the default. A full @samp{make bootstrap} is recommended
-so that an ELF compiler that builds ELF is generated.
-
-You must have TLS597 from @emph{ftp://ftp.sco.com/TLS} installed for ELF
-C++ binaries to work correctly on releases before 5.0.4.
-
-The native SCO assembler that is provided with the OS at no charge
-is normally required. If, however, you must be able to use the GNU
-assembler (perhaps you have complex asms) you must configure this
-package @samp{--with-gnu-as}. To do this, install (cp or symlink)
-gcc/as to your copy of the GNU assembler. You must use a recent version
-of GNU binutils; version 2.9.1 seems to work well. If you select this
-option, you will be unable to build COFF images. Trying to do so will
-result in non-obvious failures. In general, the "--with-gnu-as" option
-isn't as well tested as the native assembler.
-
-@emph{NOTE:} If you are building C++, you must follow the instructions
-about invoking @samp{make bootstrap} because the native OpenServer
-compiler may build a @file{cc1plus} that will not correctly parse many
-valid C++ programs. You must do a @samp{make bootstrap} if you are
-building with the native compiler.
-
-@item 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, @file{sed} core dumps when building
-@file{deduced.h}. Use the version of @file{sed} from version 4.0.
-
-@item i386-*-esix
-It may be good idea to link with GNU malloc instead of the malloc that
-comes with the system.
-
-@item i386-ibm-aix
-You need to use GAS version 2.1 or later, and LD from
-GNU binutils version 2.2 or later.
-
-@item i386-sequent-bsd
-Go to the Berkeley universe before compiling.
-
-@item i386-sequent-ptx1*
-@itemx i386-sequent-ptx2*
-You must install GNU @file{sed} before running @file{configure}.
-
-@item 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
-@file{libgcc2.c}. GNU CC version 2 compiled with GNU CC (any version)
-seems not to have this problem.
-
-See @ref{Sun Install}, for information on installing GNU CC on Sun
-systems.
-
-@item 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
-@file{cs.washington.edu:pub/gnat} or @file{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 @file{/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 @file{ld.exe},
-which mimics the behaviour of Unix @file{ld} in the specification of
-libraries (@samp{-L} and @samp{-l}). @file{ld.exe} looks for both Unix
-and Microsoft named libraries. For example, if you specify
-@samp{-lfoo}, @file{ld.exe} will look first for @file{libfoo.a}
-and then for @file{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.
-
-@enumerate
-@item
-If you do not have a Unix-like shell and few Unix-like utilities, you
-will use a DOS style batch script called @file{configure.bat}. Invoke
-it as @code{configure winnt} from an MSDOS console window or from the
-program manager dialog box. @file{configure.bat} assumes you have
-already installed and have in your path a Unix-like @file{sed} program
-which is used to create a working @file{Makefile} from @file{Makefile.in}.
-
-@file{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 @file{sed} and @file{touch} to use this installation method,
-which only automatically builds the compiler itself. You must then
-examine what @file{fixinc.winnt} does, edit the header files by hand and
-build @file{libgcc.a} manually.
-
-@item
-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 @file{configure} script in the normal
-fashion.
-@end enumerate
-
-@item i860-intel-osf1
-This is the Paragon.
-@ifset INSTALLONLY
-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.
-@end ifset
-@ifclear INSTALLONLY
-If you have version 1.0 of the operating system,
-see @ref{Installation Problems}, for special things you need to do to
-compensate for peculiarities in the system.
-@end ifclear
-
-@item *-lynx-lynxos
-LynxOS 2.2 and earlier comes with GNU CC 1.x already installed as
-@file{/bin/gcc}. You should compile with this instead of @file{/bin/cc}.
-You can tell GNU CC to use the GNU assembler and linker, by specifying
-@samp{--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 @file{a.out} format executables.
-
-@item m32r-*-elf
-Mitsubishi M32R processor.
-This configuration is intended for embedded systems.
-
-@item m68000-hp-bsd
-HP 9000 series 200 running BSD. Note that the C compiler that comes
-with this system cannot compile GNU CC; contact @code{law@@cygnus.com}
-to get binaries of GNU CC for bootstrapping.
-
-@item m68k-altos
-Altos 3068. You must use the GNU assembler, linker and debugger.
-Also, you must fix a kernel bug. Details in the file @file{README.ALTOS}.
-
-@item 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 @samp{--with-gnu-as} and @samp{--with-gnu-ld}
-options to @code{configure}.
-
-Note the C compiler that comes
-with this system cannot compile GNU CC. You can find binaries of GNU CC
-for bootstrapping on @code{jagubox.gsfc.nasa.gov}.
-You will also a patched version of @file{/bin/ld} there that
-raises some of the arbitrary limits found in the original.
-
-@item 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.
-
-@enumerate
-@item
-Comment out the @samp{#include "config.h"} line near the start of
-@file{cccp.c} and do @samp{make cpp}. This makes a preliminary version
-of GNU cpp.
-
-@item
-Save the old @file{/lib/cpp} and copy the preliminary GNU cpp to that
-file name.
-
-@item
-Undo your change in @file{cccp.c}, or reinstall the original version,
-and do @samp{make cpp} again.
-
-@item
-Copy this final version of GNU cpp into @file{/lib/cpp}.
-
-@findex obstack_free
-@item
-Replace every occurrence of @code{obstack_free} in the file
-@file{tree.c} with @code{_obstack_free}.
-
-@item
-Run @code{make} to get the first-stage GNU CC.
-
-@item
-Reinstall the original version of @file{/lib/cpp}.
-
-@item
-Now you can compile GNU CC with itself and install it in the normal
-fashion.
-@end enumerate
-
-@item 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 @samp{--with-gnu-as} to
-the configure script or use GNU assembler with dbx-in-coff encapsulation
-by providing @samp{--with-gnu-as --stabs}. For any problem with native
-assembler or for availability of the DPX/2 port of GAS, contact
-@code{F.Pierresteguy@@frcl.bull.fr}.
-
-@item m68k-crds-unox
-Use @samp{configure unos} for building on Unos.
-
-The Unos assembler is named @code{casm} instead of @code{as}. For some
-strange reason linking @file{/bin/as} to @file{/bin/casm} changes the
-behavior, and does not work. So, when installing GNU CC, you should
-install the following script as @file{as} in the subdirectory where
-the passes of GCC are installed:
-
-@example
-#!/bin/sh
-casm $*
-@end example
-
-The default Unos library is named @file{libunos.a} instead of
-@file{libc.a}. To allow GNU CC to function, either change all
-references to @samp{-lc} in @file{gcc.c} to @samp{-lunos} or link
-@file{/lib/libc.a} to @file{/lib/libunos.a}.
-
-@cindex @code{alloca}, for Unos
-When compiling GNU CC with the standard compiler, to overcome bugs in
-the support of @code{alloca}, do not use @samp{-O} when making stage 2.
-Then use the stage 2 compiler with @samp{-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 @code{ALLOCA} in @file{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 @file{cc1} fails, try putting the object files into a library
-and linking from that library.
-
-@item 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 @samp{--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.
-
-@item 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 @ref{Sun Install}, for information on installing GNU CC on Sun
-systems.
-
-@item 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.
-
-@item m88k-*-dgux
-Motorola m88k running DG/UX. To build 88open BCS native or cross
-compilers on DG/UX, specify the configuration name as
-@samp{m88k-*-dguxbcs} and build in the 88open BCS software development
-environment. To build ELF native or cross compilers on DG/UX, specify
-@samp{m88k-*-dgux} and build in the DG/UX ELF development environment.
-You set the software development environment by issuing
-@samp{sde-target} command and specifying either @samp{m88kbcs} or
-@samp{m88kdguxelf} as the operand.
-
-If you do not specify a configuration name, @file{configure} guesses the
-configuration based on the current software development environment.
-
-@item 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.
-
-@item 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
-@code{memcpy}, @code{memcmp}, and @code{memset}. If your system lacks
-these, you must remove or undo the definition of
-@code{TARGET_MEM_FUNCTIONS} in @file{mips-bsd.h}.
-
-The MIPS C compiler needs to be told to increase its table size
-for switch statements with the @samp{-Wf,-XNg1500} option in
-order to compile @file{cp/parse.c}. If you use the @samp{-O2}
-optimization option, you also need to use @samp{-Olimit 3000}.
-Both of these options are automatically generated in the
-@file{Makefile} that the shell script @file{configure} builds.
-If you override the @code{CC} make variable and use the MIPS
-compilers, you may need to add @samp{-Wf,-XNg1500 -Olimit 3000}.
-
-@item mips-mips-riscos*
-The MIPS C compiler needs to be told to increase its table size
-for switch statements with the @samp{-Wf,-XNg1500} option in
-order to compile @file{cp/parse.c}. If you use the @samp{-O2}
-optimization option, you also need to use @samp{-Olimit 3000}.
-Both of these options are automatically generated in the
-@file{Makefile} that the shell script @file{configure} builds.
-If you override the @code{CC} make variable and use the MIPS
-compilers, you may need to add @samp{-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:
-
-@table @samp
-@item mips-mips-riscos@code{rev}
-Default configuration for RISC-OS, revision @code{rev}.
-
-@item mips-mips-riscos@code{rev}bsd
-BSD 4.3 configuration for RISC-OS, revision @code{rev}.
-
-@item mips-mips-riscos@code{rev}sysv4
-System V.4 configuration for RISC-OS, revision @code{rev}.
-
-@item mips-mips-riscos@code{rev}sysv
-System V.3 configuration for RISC-OS, revision @code{rev}.
-@end table
-
-The revision @code{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
-@ifclear INSTALLONLY
-bug (see @ref{Installation Problems}, for more details).
-@end ifclear
-@ifset INSTALLONLY
-bug.
-@end ifset
-
-@item 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.
-
-@code{make compare} may fail on version 5 of IRIX unless you add
-@samp{-save-temps} to @code{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 @code{stage1} and
-@code{stage2} compilations. The option @samp{-save-temps} forces a
-fixed name to be used for the assembler input file, instead of a
-randomly chosen name in @file{/tmp}. Do not add @samp{-save-temps}
-unless the comparisons fail without that option. If you do you
-@samp{-save-temps}, you will have to manually delete the @samp{.i} and
-@samp{.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 @samp{-Wf,-XNg1500} option in
-order to compile @file{cp/parse.c}. If you use the @samp{-O2}
-optimization option, you also need to use @samp{-Olimit 3000}.
-Both of these options are automatically generated in the
-@file{Makefile} that the shell script @file{configure} builds.
-If you override the @code{CC} make variable and use the MIPS
-compilers, you may need to add @samp{-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
-@samp{mips-sgi-irix4loser}. This configuration inhibits assembler
-optimization.
-
-In a compiler configured with target @samp{mips-sgi-irix4}, you can turn
-off assembler optimization by using the @samp{-noasmopt} option. This
-compiler option passes the option @samp{-O0} to the assembler, to
-inhibit reordering.
-
-The @samp{-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 @samp{-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 @samp{--with-gnu-as} configure option when configuring gcc.
-GNU as is distributed as part of the binutils package.
-
-@item 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.
-
-@item ns32k-encore
-Encore ns32000 system. Encore systems are supported only under BSD.
-
-@item ns32k-*-genix
-National Semiconductor ns32000 system. Genix has bugs in @code{alloca}
-and @code{malloc}; you must get the compiled versions of these from GNU
-Emacs.
-
-@item ns32k-sequent
-Go to the Berkeley universe before compiling.
-
-@item ns32k-utek
-UTEK ns32000 system (``merlin''). The C compiler that comes with this
-system cannot compile GNU CC; contact @samp{tektronix!reed!mason} to get
-binaries of GNU CC for bootstrapping.
-
-@item romp-*-aos
-@itemx 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 @code{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.
-
-@item rs6000-*-aix
-@itemx 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 @file{libgcc.a} or
-@file{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.
-
-Release 4.3.0 of AIX and ones 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 @file{README.RS6000} for more details on any 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 @samp{-mcpu=}@var{cpu_type}
-switch by using the configure option @samp{--with-cpu-}@var{cpu_type}.
-
-@item powerpc-*-elf
-@itemx powerpc-*-sysv4
-PowerPC system in big endian mode, running System V.4.
-
-You can specify a default version for the @samp{-mcpu=}@var{cpu_type}
-switch by using the configure option @samp{--with-cpu-}@var{cpu_type}.
-
-@item powerpc-*-linux-gnu
-PowerPC system in big endian mode, running the Linux-based GNU system.
-
-You can specify a default version for the @samp{-mcpu=}@var{cpu_type}
-switch by using the configure option @samp{--with-cpu-}@var{cpu_type}.
-
-@item powerpc-*-eabiaix
-Embedded PowerPC system in big endian mode with -mcall-aix selected as
-the default.
-
-You can specify a default version for the @samp{-mcpu=}@var{cpu_type}
-switch by using the configure option @samp{--with-cpu-}@var{cpu_type}.
-
-@item 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 @samp{-mcpu=}@var{cpu_type}
-switch by using the configure option @samp{--with-cpu-}@var{cpu_type}.
-
-@item powerpc-*-eabi
-Embedded PowerPC system in big endian mode.
-
-You can specify a default version for the @samp{-mcpu=}@var{cpu_type}
-switch by using the configure option @samp{--with-cpu-}@var{cpu_type}.
-
-@item powerpcle-*-elf
-@itemx powerpcle-*-sysv4
-PowerPC system in little endian mode, running System V.4.
-
-You can specify a default version for the @samp{-mcpu=}@var{cpu_type}
-switch by using the configure option @samp{--with-cpu-}@var{cpu_type}.
-
-@item powerpcle-*-solaris2*
-PowerPC system in little endian mode, running Solaris 2.5.1 or higher.
-
-You can specify a default version for the @samp{-mcpu=}@var{cpu_type}
-switch by using the configure option @samp{--with-cpu-}@var{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.
-
-@item powerpcle-*-eabisim
-Embedded PowerPC system in little endian mode for use in running under
-the PSIM simulator.
-
-@itemx powerpcle-*-eabi
-Embedded PowerPC system in little endian mode.
-
-You can specify a default version for the @samp{-mcpu=}@var{cpu_type}
-switch by using the configure option @samp{--with-cpu-}@var{cpu_type}.
-
-@item powerpcle-*-winnt
-@itemx powerpcle-*-pe
-PowerPC system in little endian mode running Windows NT.
-
-You can specify a default version for the @samp{-mcpu=}@var{cpu_type}
-switch by using the configure option @samp{--with-cpu-}@var{cpu_type}.
-
-@item vax-dec-ultrix
-Don't try compiling with Vax C (@code{vcc}). It produces incorrect code
-in some cases (for example, when @code{alloca} is used).
-
-Meanwhile, compiling @file{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.
-
-@item sparc-sun-*
-See @ref{Sun Install}, for information on installing GNU CC on Sun
-systems.
-
-@item vax-dec-vms
-See @ref{VMS Install}, for details on how to install GNU CC on VMS.
-
-@item we32k-*-*
-These computers are also known as the 3b2, 3b5, 3b20 and other similar
-names. (However, the 3b1 is actually a 68000; see
-@ref{Configurations}.)
-
-Don't use @samp{-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 @file{stmt.c}
-in GNU CC. You can work around this by building @file{cpp} in GNU CC
-first, then use that instead of the system's preprocessor with the
-system's C compiler to compile @file{stmt.c}. Here is how:
-
-@smallexample
-mv /lib/cpp /lib/cpp.att
-cp cpp /lib/cpp.gnu
-echo '/lib/cpp.gnu -traditional $@{1+"$@@"@}' > /lib/cpp
-chmod +x /lib/cpp
-@end smallexample
-
-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:
-
-@smallexample
-make LANGUAGES=c CC=stage1/xgcc CFLAGS="-Bstage1/ -g"
-make stage2
-make CC=stage2/xgcc CFLAGS="-Bstage2/ -g -O"
-@end smallexample
-
-You may need to raise the ULIMIT setting to build a C++ compiler,
-as the file @file{cc1plus} is larger than one megabyte.
-@end table
-
-@node Other Dir
-@section Compilation in a Separate Directory
-@cindex other directory, compilation in
-@cindex compilation in a separate directory
-@cindex separate directory, compilation in
-
-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:
-
-@enumerate
-@item
-Make sure you have a version of Make that supports the @code{VPATH}
-feature. (GNU Make supports it, as do Make versions on most BSD
-systems.)
-
-@item
-If you have ever run @file{configure} in the source directory, you must undo
-the configuration. Do this by running:
-
-@example
-make distclean
-@end example
-
-@item
-Go to the directory in which you want to build the compiler before
-running @file{configure}:
-
-@example
-mkdir gcc-sun3
-cd gcc-sun3
-@end example
-
-On systems that do not support symbolic links, this directory must be
-on the same file system as the source code directory.
-
-@item
-Specify where to find @file{configure} when you run it:
-
-@example
-../gcc/configure @dots{}
-@end example
-
-This also tells @code{configure} where to find the compiler sources;
-@code{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 @samp{--srcdir} option, like this:
-
-@example
-../gcc/configure --srcdir=../gcc @var{other options}
-@end example
-
-The directory you specify with @samp{--srcdir} need not be the same
-as the one that @code{configure} is found in.
-@end enumerate
-
-Now, you can run @code{make} in that directory. You need not repeat the
-configuration steps shown above, when ordinary source files change. You
-must, however, run @code{configure} again when the configuration files
-change, if your system does not support symbolic links.
-
-@node Cross-Compiler
-@section Building and Installing a Cross-Compiler
-@cindex cross-compiler, installation
-
-GNU CC can function as a cross-compiler for many machines, but not all.
-
-@itemize @bullet
-@item
-Cross-compilers for the Mips as target using the Mips assembler
-currently do not work, because the auxiliary programs
-@file{mips-tdump.c} and @file{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.
-
-@item
-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.
-
-@item
-Cross-compilation between machines of different word sizes is
-somewhat problematic and sometimes does not work.
-@end itemize
-
-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.
-
-@menu
-* Steps of Cross:: Using a cross-compiler involves several steps
- that may be carried out on different machines.
-* Configure Cross:: Configuring a cross-compiler.
-* Tools and Libraries:: Where to put the linker and assembler, and the C library.
-* Cross Headers:: Finding and installing header files
- for a cross-compiler.
-* Cross Runtime:: Supplying arithmetic runtime routines (@file{libgcc1.a}).
-* Build Cross:: Actually compiling the cross-compiler.
-@end menu
-
-@node Steps of Cross
-@subsection Steps of Cross-Compilation
-
-To compile and run a program using a cross-compiler involves several
-steps:
-
-@itemize @bullet
-@item
-Run the cross-compiler on the host machine to produce assembler files
-for the target machine. This requires header files for the target
-machine.
-
-@item
-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.
-
-@item
-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 @file{crt@dots{}.o}) for the target machine.
-@end itemize
-
-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.
-
-@node Configure Cross
-@subsection Configuring a Cross-Compiler
-
-To build GNU CC as a cross-compiler, you start out by running
-@file{configure}. Use the @samp{--target=@var{target}} to specify the
-target type. If @file{configure} was unable to correctly identify the
-system you are running on, also specify the @samp{--build=@var{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
-@file{configure} can correctly identify:
-
-@smallexample
-./configure --target=m68k-hp-bsd4.3
-@end smallexample
-
-@node Tools and Libraries
-@subsection 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
-@file{/usr/local/@var{target}/bin}. Here is a table of the tools
-you should put in this directory:
-
-@table @file
-@item as
-This should be the cross-assembler.
-
-@item ld
-This should be the cross-linker.
-
-@item ar
-This should be the cross-archiver: a program which can manipulate
-archive files (linker libraries) in the target machine's format.
-
-@item ranlib
-This should be a program to construct a symbol table in an archive file.
-@end table
-
-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 @samp{--host} and @samp{--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
-@file{/usr/local/@var{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:
-
-@example
-ftp @var{target-machine}
-lcd /usr/local/@var{target}/lib
-cd /lib
-get libc.a
-cd /usr/lib
-get libg.a
-get libm.a
-quit
-@end example
-
-@noindent
-The precise set of libraries you'll need, and their locations on
-the target machine, vary depending on its operating system.
-
-@cindex start files
-Many targets require ``start files'' such as @file{crt0.o} and
-@file{crtn.o} which are linked into each executable; these too should be
-placed in @file{/usr/local/@var{target}/lib}. There may be several
-alternatives for @file{crt0.o}, for use with profiling or other
-compilation options. Check your target's definition of
-@code{STARTFILE_SPEC} to find out what start files it uses.
-Here's an example of copying these files from a target machine:
-
-@example
-ftp @var{target-machine}
-lcd /usr/local/@var{target}/lib
-prompt
-cd /lib
-mget *crt*.o
-cd /usr/lib
-mget *crt*.o
-quit
-@end example
-
-@node Cross Runtime
-@subsection @file{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 @file{libgcc1.c}; the library made from them is called
-@file{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 @file{libgcc1.a} that does the job it is expected to do.
-
-To compile @file{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 @file{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 @code{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 @file{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 @file{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 @file{libgcc1.a}
-routines written in C or assembler. These targets build
-@file{libgcc1.a} automatically and you do not need to do anything
-special for them. Other embedded targets do not need any
-@file{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 @file{libgcc1.a} with
-@samp{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:
-
-@example
-cd @var{target-build-dir}
-./configure --host=sparc --target=sun3
-make libgcc1.a
-@end example
-
-@noindent
-And then this on the host machine:
-
-@example
-ftp @var{target-machine}
-binary
-cd @var{target-build-dir}
-get libgcc1.a
-quit
-@end example
-
-Another way to provide the functions you need in @file{libgcc1.a} is to
-define the appropriate @code{perform_@dots{}} 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 @file{libgcc1.a} using the perform macros, use
-@samp{LIBGCC1=libgcc1.a OLDCC=./xgcc} when building the compiler.
-Otherwise, you should place your replacement library under the name
-@file{libgcc1.a} in the directory in which you will build the
-cross-compiler, before you run @code{make}.
-
-@node Cross Headers
-@subsection 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
-@file{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
-@file{/usr/local/@var{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
-@file{libgcc.a}. (These are the parts that @emph{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:
-
-@example
-(cd /usr/include; tar cf - .) > tarfile
-@end example
-
-Then, on the host machine, do this:
-
-@example
-ftp @var{target-machine}
-lcd /usr/local/@var{target}/include
-get tarfile
-quit
-tar xf tarfile
-@end example
-
-@node Build Cross
-@subsection 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 @file{libgcc1.a}, then compilation will give up at the point
-where it needs that file, printing a suitable error message. If you
-do provide @file{libgcc1.a}, then building the compiler will automatically
-compile and link a test program called @file{libgcc1-test}; if you get
-errors in the linking, it means that not all of the necessary routines
-in @file{libgcc1.a} are available.
-
-You must provide the header file @file{float.h}. One way to do this is
-to compile @file{enquire} and run it on your target machine. The job of
-@file{enquire} is to run on the target machine and figure out by
-experiment the nature of its floating point representation.
-@file{enquire} records its findings in the header file @file{float.h}.
-If you can't produce this file by running @file{enquire} on the target
-machine, then you will need to come up with a suitable @file{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 @samp{make install}, as usual.
-
-@node Sun Install
-@section Installing GNU CC on the Sun
-@cindex Sun installation
-@cindex installing GNU CC on the Sun
-
-On Solaris, do not use the linker or other tools in
-@file{/usr/ucb} to build GNU CC. Use @code{/usr/ccs/bin}.
-
-If the assembler reports @samp{Error: misaligned data} when bootstrapping,
-you are probably using an obsolete version of the GNU assembler. Upgrade
-to the latest version of GNU @code{binutils}, or use the Solaris assembler.
-
-Make sure the environment variable @code{FLOAT_OPTION} is not set when
-you compile @file{libgcc.a}. If this option were set to @code{f68881}
-when @file{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.
-
-@cindex @code{alloca}, for SunOS
-There is a bug in @code{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 @code{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:
-
-@example
-make CC="TERMCAP=x OBJS=x LIBFUNCS=x STAGESTUFF=x cc"
-@end example
-
-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.
-
-@node VMS Install
-@section Installing GNU CC on VMS
-@cindex VMS installation
-@cindex 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 @file{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:
-
-@enumerate
-@item
-Define the VMS logical names @samp{GNU_CC} and @samp{GNU_CC_INCLUDE}
-to point to the directories where the GNU CC executables
-(@file{gcc-cpp.exe}, @file{gcc-cc1.exe}, etc.) and the C include files are
-kept respectively. This should be done with the commands:@refill
-
-@smallexample
-$ assign /system /translation=concealed -
- disk:[gcc.] gnu_cc
-$ assign /system /translation=concealed -
- disk:[gcc.include.] gnu_cc_include
-@end smallexample
-
-@noindent
-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
-@file{GCC_INSTALL.COM} script in the @file{[GCC]} directory.
-
-@item
-Install the @file{GCC} command with the command line:
-
-@smallexample
-$ set command /table=sys$common:[syslib]dcltables -
- /output=sys$common:[syslib]dcltables gnu_cc:[000000]gcc
-$ install replace sys$common:[syslib]dcltables
-@end smallexample
-
-@item
-To install the help file, do the following:
-
-@smallexample
-$ library/help sys$library:helplib.hlb gcc.hlp
-@end smallexample
-
-@noindent
-Now you can invoke the compiler with a command like @samp{gcc /verbose
-file.c}, which is equivalent to the command @samp{gcc -v -c file.c} in
-Unix.
-@end enumerate
-
-If you wish to use GNU C++ you must first install GNU CC, and then
-perform the following steps:
-
-@enumerate
-@item
-Define the VMS logical name @samp{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:@refill
-
-@smallexample
-$ assign /system /translation=concealed -
- disk:[gcc.gxx_include.] gnu_gxx_include
-@end smallexample
-
-@noindent
-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.
-
-@item
-Obtain the file @file{gcc-cc1plus.exe}, and place this in the same
-directory that @file{gcc-cc1.exe} is kept.
-
-The GNU C++ compiler can be invoked with a command like @samp{gcc /plus
-/verbose file.cc}, which is equivalent to the command @samp{g++ -v -c
-file.cc} in Unix.
-@end enumerate
-
-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
-@samp{/version} option to determine the version number of the binaries and
-compare it with the source file @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:
-
-@enumerate
-@item
-Execute the command procedure @file{vmsconfig.com} to set up the files
-@file{tm.h}, @file{config.h}, @file{aux-output.c}, and @file{md.}, and
-to create files @file{tconfig.h} and @file{hconfig.h}. This procedure
-also creates several linker option files used by @file{make-cc1.com} and
-a data file used by @file{make-l2.com}.@refill
-
-@smallexample
-$ @@vmsconfig.com
-@end smallexample
-
-@item
-Setup the logical names and command tables as defined above. In
-addition, define the VMS logical name @samp{GNU_BISON} to point at the
-to the directories where the Bison executable is kept. This should be
-done with the command:@refill
-
-@smallexample
-$ assign /system /translation=concealed -
- disk:[bison.] gnu_bison
-@end smallexample
-
-You may, if you choose, use the @file{INSTALL_BISON.COM} script in the
-@file{[BISON]} directory.
-
-@item
-Install the @samp{BISON} command with the command line:@refill
-
-@smallexample
-$ set command /table=sys$common:[syslib]dcltables -
- /output=sys$common:[syslib]dcltables -
- gnu_bison:[000000]bison
-$ install replace sys$common:[syslib]dcltables
-@end smallexample
-
-@item
-Type @samp{@@make-gcc} to recompile everything (alternatively, submit
-the file @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
-@file{make-gcc.com} and follow the instructions that appear in the
-comments.@refill
-
-@item
-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 @file{libgcc2.c}. To compile this you should use the command procedure
-@file{make-l2.com}, which will generate the library @file{libgcc2.olb}.
-@file{libgcc2.olb} should be built using the compiler built from
-the same distribution that @file{libgcc2.c} came from, and
-@file{make-gcc.com} will automatically do all of this for you.
-
-To install the library, use the following commands:@refill
-
-@smallexample
-$ 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
-@end smallexample
-
-The first command simply removes old modules that will be replaced with
-modules from @file{libgcc2} under different module names. The modules
-@code{new} and @code{eprintf} may not actually be present in your
-@file{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 @file{libgcc2.c}.
-
-Whenever you update the compiler on your system, you should also update the
-library with the above procedure.
-
-@item
-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):
-
-@smallexample
-$ assign dua0:[gcc.build_dir.]/translation=concealed, -
- dua1:[gcc.source_dir.]/translation=concealed gcc_build
-$ set default gcc_build:[000000]
-@end smallexample
-
-@noindent
-where the directory @file{dua1:[gcc.source_dir]} contains the source
-code, and the directory @file{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 @file{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).
-
-@item
-@strong{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 @code{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
-@samp{/DEFINE=("inline=")} as an option in all the compilations. This
-requires editing all the @code{gcc} commands in @file{make-cc1.com}.
-(The older versions had problems supporting @code{inline}.) Once you
-have a working 1.33 or newer GNU CC, you can change this file back.
-
-@item
-If you want to build GNU CC with the VAX C compiler, you will need to
-make minor changes in @file{make-cccp.com} and @file{make-cc1.com}
-to choose alternate definitions of @code{CC}, @code{CFLAGS}, and
-@code{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 @file{libgcc2} in order to build @file{gcclib} (see above);
-@file{make-l2.com} expects to be able to find it operational in
-@file{gnu_cc:[000000]gnu-as.exe}.
-
-To use GNU CC on VMS, you need the VMS driver programs
-@file{gcc.exe}, @file{gcc.com}, and @file{gcc.cld}. They are
-distributed with the VMS binaries (@file{gcc-vms}) rather than the
-GNU CC sources. GAS is also included in @file{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 @code{CC}, @code{CFLAGS}, and @code{LIBS} definitions in
-@file{make-cccp.com} and @file{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.
-@end enumerate
-
-Under previous versions of GNU CC, the generated code would occasionally
-give strange results when linked with the sharable @file{VAXCRTL} library.
-Now this should work.
-
-Even with this version, however, GNU CC itself should not be linked with
-the sharable @file{VAXCRTL}. The version of @code{qsort} in
-@file{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 @file{make-cc1.com} and
-@file{make-cccp.com} use the object library version of @file{VAXCRTL} in
-order to make use of the @code{qsort} routine in @file{gcclib.olb}. If
-you wish to link the compiler executables with the shareable image
-version of @file{VAXCRTL}, you should edit the file @file{tm.h} (created
-by @file{vmsconfig.com}) to define the macro @code{QSORT_WORKAROUND}.
-
-@code{QSORT_WORKAROUND} is always defined when GNU CC is compiled with
-VAX C, to avoid a problem in case @file{gcclib.olb} is not yet
-available.
-
-@node Collect2
-@section @code{collect2}
-
-GNU CC uses a utility called @code{collect2} on nearly all systems to arrange
-to call various initialization functions at start time.
-
-The program @code{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 @samp{.c} file containing a table of them,
-compiles it, and links the program a second time including that file.
-
-@findex __main
-@cindex constructors, automatic calls
-The actual calls to the constructors are carried out by a subroutine
-called @code{__main}, which is called (automatically) at the beginning
-of the body of @code{main} (provided @code{main} was compiled with GNU
-CC). Calling @code{__main} is necessary, even when compiling C code, to
-allow linking C and C++ object code together. (If you use
-@samp{-nostdlib}, you get an unresolved reference to @code{__main},
-since it's defined in the standard GCC library. Include @samp{-lgcc} at
-the end of your compiler command line to resolve this reference.)
-
-The program @code{collect2} is installed as @code{ld} in the directory
-where the passes of the compiler are installed. When @code{collect2}
-needs to find the @emph{real} @code{ld}, it tries the following file
-names:
-
-@itemize @bullet
-@item
-@file{real-ld} in the directories listed in the compiler's search
-directories.
-
-@item
-@file{real-ld} in the directories listed in the environment variable
-@code{PATH}.
-
-@item
-The file specified in the @code{REAL_LD_FILE_NAME} configuration macro,
-if specified.
-
-@item
-@file{ld} in the compiler's search directories, except that
-@code{collect2} will not execute itself recursively.
-
-@item
-@file{ld} in @code{PATH}.
-@end itemize
-
-``The compiler's search directories'' means all the directories where
-@code{gcc} searches for passes of the compiler. This includes
-directories that you specify with @samp{-B}.
-
-Cross-compilers search a little differently:
-
-@itemize @bullet
-@item
-@file{real-ld} in the compiler's search directories.
-
-@item
-@file{@var{target}-real-ld} in @code{PATH}.
-
-@item
-The file specified in the @code{REAL_LD_FILE_NAME} configuration macro,
-if specified.
-
-@item
-@file{ld} in the compiler's search directories.
-
-@item
-@file{@var{target}-ld} in @code{PATH}.
-@end itemize
-
-@code{collect2} explicitly avoids running @code{ld} using the file name
-under which @code{collect2} itself was invoked. In fact, it remembers
-up a list of such names---in case one copy of @code{collect2} finds
-another copy (or version) of @code{collect2} installed as @code{ld} in a
-second place in the search path.
-
-@code{collect2} searches for the utilities @code{nm} and @code{strip}
-using the same algorithm as above for @code{ld}.
-
-@node Header Dirs
-@section Standard Header File Directories
-
-@code{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
-@code{fixincludes} on the header files in @file{$(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).
-
-@code{GPLUS_INCLUDE_DIR} means the same thing for native and cross. It
-is where @code{g++} looks first for header files. The C++ library
-installs only target independent header files in that directory.
-
-@code{LOCAL_INCLUDE_DIR} is used only for a native compiler. It is
-normally @file{/usr/local/include}. GNU CC searches this directory so
-that users can install header files in @file{/usr/local/include}.
-
-@code{CROSS_INCLUDE_DIR} is used only for a cross compiler. GNU CC
-doesn't install anything there.
-
-@code{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
-@file{/usr/include}. When you build a cross-compiler,
-@code{fixincludes} processes any header files in this directory.
diff --git a/gcc/install1.texi b/gcc/install1.texi
deleted file mode 100755
index 21c08b9..0000000
--- a/gcc/install1.texi
+++ /dev/null
@@ -1,15 +0,0 @@
-@setfilename INSTALL
-@set INSTALLONLY
-
-@c This file itself, install1.texi, does not appear in the GCC distribution.
-@c The immediately following lines apply to the INSTALL file
-@c which is generated using this file.
-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.
-
-@node Installation,,, (dir)
-@chapter Installing GNU CC
-@include install.texi
-@bye
diff --git a/gcc/invoke.texi b/gcc/invoke.texi
deleted file mode 100755
index 4e614f4..0000000
--- a/gcc/invoke.texi
+++ /dev/null
@@ -1,7000 +0,0 @@
-@c Copyright (C) 1988,89,92,93,94,95,96,97,98,1999 Free Software Foundation, Inc.
-@c This is part of the GCC manual.
-@c For copying conditions, see the file gcc.texi.
-
-@node Invoking GCC
-@chapter GNU CC Command Options
-@cindex GNU CC command options
-@cindex command options
-@cindex options, GNU CC command
-
-When you invoke GNU CC, it normally does preprocessing, compilation,
-assembly and linking. The ``overall options'' allow you to stop this
-process at an intermediate stage. For example, the @samp{-c} option
-says not to run the linker. Then the output consists of object files
-output by the assembler.
-
-Other options are passed on to one stage of processing. Some options
-control the preprocessor and others the compiler itself. Yet other
-options control the assembler and linker; most of these are not
-documented here, since you rarely need to use any of them.
-
-@cindex C compilation options
-Most of the command line options that you can use with GNU CC are useful
-for C programs; when an option is only useful with another language
-(usually C++), the explanation says so explicitly. If the description
-for a particular option does not mention a source language, you can use
-that option with all supported languages.
-
-@cindex C++ compilation options
-@xref{Invoking G++,,Compiling C++ Programs}, for a summary of special
-options for compiling C++ programs.
-
-@cindex grouping options
-@cindex options, grouping
-The @code{gcc} program accepts options and file names as operands. Many
-options have multiletter names; therefore multiple single-letter options
-may @emph{not} be grouped: @samp{-dr} is very different from @w{@samp{-d
--r}}.
-
-@cindex order of options
-@cindex options, order
-You can mix options and other arguments. For the most part, the order
-you use doesn't matter. Order does matter when you use several options
-of the same kind; for example, if you specify @samp{-L} more than once,
-the directories are searched in the order specified.
-
-Many options have long names starting with @samp{-f} or with
-@samp{-W}---for example, @samp{-fforce-mem},
-@samp{-fstrength-reduce}, @samp{-Wformat} and so on. Most of
-these have both positive and negative forms; the negative form of
-@samp{-ffoo} would be @samp{-fno-foo}. This manual documents
-only one of these two forms, whichever one is not the default.
-
-@c CYGNUS LOCAL v850 Offset Info
-@c The entry "Offset info" in the following menu is needed for
-@c Cygnus-only sections of the doc. Unfortunately makeinfo gets confused if
-@c comments to this effect are inside the menu.
-@menu
-* Option Summary:: Brief list of all options, without explanations.
-* Overall Options:: Controlling the kind of output:
- an executable, object files, assembler files,
- or preprocessed source.
-* Invoking G++:: Compiling C++ programs.
-* C Dialect Options:: Controlling the variant of C language compiled.
-* C++ Dialect Options:: Variations on C++.
-* Warning Options:: How picky should the compiler be?
-* Debugging Options:: Symbol tables, measurements, and debugging dumps.
-* Optimize Options:: How much optimization?
-* Preprocessor Options:: Controlling header files and macro definitions.
- Also, getting dependency information for Make.
-* Assembler Options:: Passing options to the assembler.
-* Link Options:: Specifying libraries and so on.
-* Directory Options:: Where to find header files and libraries.
- Where to find the compiler executable files.
-* Target Options:: Running a cross-compiler, or an old version of GNU CC.
-* Submodel Options:: Specifying minor hardware or convention variations,
- such as 68010 vs 68020.
-* Code Gen Options:: Specifying conventions for function calls, data layout
- and register usage.
-* Offset info Option:: Producing assembler symbols for structure members.
-* Environment Variables:: Env vars that affect GNU CC.
-* Running Protoize:: Automatically adding or removing function prototypes.
-@end menu
-
-@node Option Summary
-@section Option Summary
-
-Here is a summary of all the options, grouped by type. Explanations are
-in the following sections.
-
-@table @emph
-@item Overall Options
-@xref{Overall Options,,Options Controlling the Kind of Output}.
-@smallexample
--c -S -E -o @var{file} -pipe -v --help -x @var{language}
-@end smallexample
-
-@item C Language Options
-@xref{C Dialect Options,,Options Controlling C Dialect}.
-@smallexample
--ansi -flang-isoc9x -fallow-single-precision -fcond-mismatch -fno-asm
--fno-builtin -ffreestanding -fhosted -fsigned-bitfields -fsigned-char
--funsigned-bitfields -funsigned-char -fwritable-strings
--traditional -traditional-cpp -trigraphs
-@end smallexample
-
-@item C++ Language Options
-@xref{C++ Dialect Options,,Options Controlling C++ Dialect}.
-@smallexample
--fno-access-control -fcheck-new -fconserve-space -fdollars-in-identifiers
--fno-elide-constructors -fexternal-templates -ffor-scope
--fno-for-scope -fno-gnu-keywords -fguiding-decls -fhandle-signatures
--fhonor-std -fhuge-objects -fno-implicit-templates -finit-priority
--fno-implement-inlines -fname-mangling-version-@var{n} -fno-default-inline
--foperator-names -fno-optional-diags -frepo -fstrict-prototype
--fsquangle -ftemplate-depth-@var{n} -fthis-is-variable -fvtable-thunks
--nostdinc++ -Wctor-dtor-privacy -Weffc++ -Wno-non-template-friend
--Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual
--Wno-pmf-conversions -Wreorder -Wsign-promo -Wsynth
-@end smallexample
-
-@item Warning Options
-@xref{Warning Options,,Options to Request or Suppress Warnings}.
-@smallexample
--fsyntax-only -pedantic -pedantic-errors
--w -W -Wall -Waggregate-return -Wbad-function-cast
--Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment
--Wconversion -Werror -Wformat
--Wid-clash-@var{len} -Wimplicit -Wimplicit-int
--Wimplicit-function-declaration -Wimport
--Werror-implicit-function-declaration -Winline
--Wlarger-than-@var{len} -Wlong-long
--Wmain -Wmissing-declarations -Wmissing-noreturn
--Wmissing-prototypes -Wmultichar -Wnested-externs -Wno-import
--Wparentheses -Wpointer-arith -Wredundant-decls
--Wreturn-type -Wshadow -Wsign-compare -Wstrict-prototypes
--Wswitch -Wtraditional
--Wtrigraphs -Wundef -Wuninitialized -Wunused -Wwrite-strings
--Wunknown-pragmas
-@end smallexample
-
-@item Debugging Options
-@xref{Debugging Options,,Options for Debugging Your Program or GCC}.
-@smallexample
--a -ax -d@var{letters} -fdump-unnumbered -fpretend-float
--fprofile-arcs -ftest-coverage
--g -g@var{level} -gcoff -gdwarf -gdwarf-1 -gdwarf-1+ -gdwarf-2
--ggdb -gstabs -gstabs+ -gxcoff -gxcoff+
--p -pg -print-file-name=@var{library} -print-libgcc-file-name
--print-prog-name=@var{program} -print-search-dirs -save-temps
-@end smallexample
-
-@item Optimization Options
-@xref{Optimize Options,,Options that Control Optimization}.
-@smallexample
--fbranch-probabilities -foptimize-register-moves
--fcaller-saves -fcse-follow-jumps -fcse-skip-blocks
--fdelayed-branch -fexpensive-optimizations
--ffast-math -ffloat-store -fforce-addr -fforce-mem
--fdata-sections -ffunction-sections -fgcse
-@c CYGNUS LOCAL LRS
--flive-range
-@c END CYGNUS LOCAL
--finline-functions -fkeep-inline-functions
--fno-default-inline -fno-defer-pop -fno-function-cse
--fno-inline -fno-peephole -fomit-frame-pointer -fregmove
--frerun-cse-after-loop -frerun-loop-opt -fschedule-insns
--fschedule-insns2 -fstrength-reduce -fthread-jumps
--funroll-all-loops -funroll-loops
--fmove-all-movables -freduce-all-givs -fstrict-aliasing
--O -O0 -O1 -O2 -O3 -Os
-@end smallexample
-
-@item Preprocessor Options
-@xref{Preprocessor Options,,Options Controlling the Preprocessor}.
-@smallexample
--A@var{question}(@var{answer}) -C -dD -dM -dN
--D@var{macro}@r{[}=@var{defn}@r{]} -E -H
--idirafter @var{dir}
--include @var{file} -imacros @var{file}
--iprefix @var{file} -iwithprefix @var{dir}
--iwithprefixbefore @var{dir} -isystem @var{dir} -isystem-c++ @var{dir}
--M -MD -MM -MMD -MG -nostdinc -P -trigraphs
--undef -U@var{macro} -Wp,@var{option}
-@end smallexample
-
-@item Assembler Option
-@xref{Assembler Options,,Passing Options to the Assembler}.
-@smallexample
--Wa,@var{option}
-@end smallexample
-
-@item Linker Options
-@xref{Link Options,,Options for Linking}.
-@smallexample
-@var{object-file-name} -l@var{library}
--nostartfiles -nodefaultlibs -nostdlib
--s -static -shared -symbolic
--Wl,@var{option} -Xlinker @var{option}
--u @var{symbol}
-@end smallexample
-
-@item Directory Options
-@xref{Directory Options,,Options for Directory Search}.
-@smallexample
--B@var{prefix} -I@var{dir} -I- -L@var{dir} -specs=@var{file}
-@end smallexample
-
-@item Target Options
-@c I wrote this xref this way to avoid overfull hbox. -- rms
-@xref{Target Options}.
-@smallexample
--b @var{machine} -V @var{version}
-@end smallexample
-
-@item Machine Dependent Options
-@xref{Submodel Options,,Hardware Models and Configurations}.
-@smallexample
-@emph{M680x0 Options}
--m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040
--m68060 -mcpu32 -m5200 -m68881 -mbitfield -mc68000 -mc68020
--mfpa -mnobitfield -mrtd -mshort -msoft-float
--malign-int
-
-@emph{VAX Options}
--mg -mgnu -munix
-
-@emph{SPARC Options}
--mcpu=@var{cpu type}
--mtune=@var{cpu type}
--mcmodel=@var{code model}
--malign-jumps=@var{num} -malign-loops=@var{num}
--malign-functions=@var{num}
--m32 -m64
--mapp-regs -mbroken-saverestore -mcypress -mepilogue
--mflat -mfpu -mhard-float -mhard-quad-float
--mimpure-text -mlive-g0 -mno-app-regs -mno-epilogue
--mno-flat -mno-fpu -mno-impure-text
--mno-stack-bias -mno-unaligned-doubles
--msoft-float -msoft-quad-float -msparclite -mstack-bias
--msupersparc -munaligned-doubles -mv8
-
-@emph{Convex Options}
--mc1 -mc2 -mc32 -mc34 -mc38
--margcount -mnoargcount
--mlong32 -mlong64
--mvolatile-cache -mvolatile-nocache
-
-@emph{AMD29K Options}
--m29000 -m29050 -mbw -mnbw -mdw -mndw
--mlarge -mnormal -msmall
--mkernel-registers -mno-reuse-arg-regs
--mno-stack-check -mno-storem-bug
--mreuse-arg-regs -msoft-float -mstack-check
--mstorem-bug -muser-registers
-
-@emph{ARM Options}
--mapcs-frame -mno-apcs-frame
--mapcs-26 -mapcs-32
--mapcs-stack-check -mno-apcs-stack-check
--mapcs-float -mno-apcs-float
--mapcs-reentrant -mno-apcs-reentrant
--msched-prolog -mno-sched-prolog
--mlittle-endian -mbig-endian -mwords-little-endian
--mshort-load-bytes -mno-short-load-bytes -mshort-load-words -mno-short-load-words
--msoft-float -mhard-float -mfpe
--mthumb-interwork -mno-thumb-interwork
--mcpu= -march= -mfpe=
--mstructure-size-boundary=
--mbsd -mxopen -mno-symrename
--mabort-on-noreturn
-@c CYGNUS LOCAL nickc/thumb-pe
--mnop-fun-dllimport -mno-nop-fun-dllimport
-@c END CYGNUS LOCAL
-
-@emph{Thumb Options}
--mtpcs-frame -mno-tpcs-frame
--mtpcs-leaf-frame -mno-tpcs-leaf-frame
--mlittle-endian -mbig-endian
--mthumb-interwork -mno-thumb-interwork
--mstructure-size-boundary=
-@c CYGNUS LOCAL nickc/thumb-pe
--mnop-fun-dllimport -mno-nop-fun-dllimport
--mcallee-super-interworking -mno-callee-super-interworking
--mcaller-super-interworking -mno-caller-super-interworking
-@c END CYGNUS LOCAL
-
-@emph{MN10200 Options}
--mrelax
-
-@emph{MN10300 Options}
--mmult-bug
--mno-mult-bug
--mrelax
-
-@emph{M32R/D/X Options}
--mcode-model=@var{model type} -msdata=@var{sdata type}
--G @var{num}
--m32rx -m32r
--mcond-exec=@var{n}
-
-@emph{M88K Options}
--m88000 -m88100 -m88110 -mbig-pic
--mcheck-zero-division -mhandle-large-shift
--midentify-revision -mno-check-zero-division
--mno-ocs-debug-info -mno-ocs-frame-position
--mno-optimize-arg-area -mno-serialize-volatile
--mno-underscores -mocs-debug-info
--mocs-frame-position -moptimize-arg-area
--mserialize-volatile -mshort-data-@var{num} -msvr3
--msvr4 -mtrap-large-shift -muse-div-instruction
--mversion-03.00 -mwarn-passed-structs
-
-@emph{RS/6000 and PowerPC Options}
--mcpu=@var{cpu type}
--mtune=@var{cpu type}
--mpower -mno-power -mpower2 -mno-power2
--mpowerpc -mno-powerpc
--mpowerpc-gpopt -mno-powerpc-gpopt
--mpowerpc-gfxopt -mno-powerpc-gfxopt
--mnew-mnemonics -mno-new-mnemonics
--mfull-toc -mminimal-toc -mno-fop-in-toc -mno-sum-in-toc
--maix64 -maix32 -mxl-call -mno-xl-call -mthreads -mpe
--msoft-float -mhard-float -mmultiple -mno-multiple
--mstring -mno-string -mupdate -mno-update
--mfused-madd -mno-fused-madd -mbit-align -mno-bit-align
--mstrict-align -mno-strict-align -mrelocatable
--mno-relocatable -mrelocatable-lib -mno-relocatable-lib
--mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian
--mcall-aix -mcall-sysv -mprototype -mno-prototype
-@c CYGNUS LOCAL vmakarov
--msched-epilog -mno-sched-epilog -msched-prolog -mno-sched-prolog
--mcall-i960-old -mbit-word -mno-bit-word -mbranch-cost=@var{n}
-@c END CYGNUS LOCAL
--msim -mmvme -mads -myellowknife -memb -msdata
--msdata=@var{opt} -G @var{num}
-@c CYGNUS LOCAL vmakarov
--mvxworks
-@c END CYGNUS LOCAL
-@c CYGNUS LOCAL jlemke
--mmpc860c0[=@var{num}]
-@c END CYGNUS LOCAL
-
-@emph{RT Options}
--mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs
--mfull-fp-blocks -mhc-struct-return -min-line-mul
--mminimum-fp-blocks -mnohc-struct-return
-
-@emph{MIPS Options}
--mabicalls -mcpu=@var{cpu type} -membedded-data
--membedded-pic -mfp32 -mfp64 -mgas -mgp32 -mgp64
--mgpopt -mhalf-pic -mhard-float -mint64 -mips1
--mips2 -mips3 -mips4 -mlong64 -mlong-calls -mmemcpy
--mmips-as -mmips-tfile -mno-abicalls
--mno-embedded-data -mno-embedded-pic
--mno-gpopt -mno-long-calls
--mno-memcpy -mno-mips-tfile -mno-rnames -mno-stats
--mrnames -msoft-float
--m4650 -msingle-float -mmad
--mstats -EL -EB -G @var{num} -nocpp
--mabi=32 -mabi=n32 -mabi=64 -mabi=eabi
-@c CYGNUS LOCAL law
--malign-jumps=@var{num} -malign-loops=@var{num}
--malign-functions=@var{num}
--mmax-skip-jumps=@var{num}
--mmax-skip-loops=@var{num}
--mmax-skip-funtions=@var{num}
-@c END CYGNUS LOCAL
-
-@emph{i386 Options}
--mcpu=@var{cpu type}
--march=@var{cpu type}
--mieee-fp -mno-fancy-math-387
--mno-fp-ret-in-387 -msoft-float -msvr3-shlib
--mno-wide-multiply -mrtd -malign-double
--mreg-alloc=@var{list} -mregparm=@var{num}
--malign-jumps=@var{num} -malign-loops=@var{num}
--malign-functions=@var{num}
-
-@emph{HPPA Options}
--mbig-switch -mdisable-fpregs -mdisable-indexing
--mfast-indirect-calls -mgas -mjump-in-delay
--mlong-load-store -mno-big-switch -mno-disable-fpregs
--mno-disable-indexing -mno-fast-indirect-calls -mno-gas
--mno-jump-in-delay -mno-long-load-store
--mno-portable-runtime -mno-soft-float -mno-space
--mno-space-regs -msoft-float -mpa-risc-1-0
--mpa-risc-1-1 -mportable-runtime
--mschedule=@var{list} -mspace -mspace-regs
-
-@emph{Intel 960 Options}
--m@var{cpu type} -masm-compat -mclean-linkage
--mcode-align -mcomplex-addr -mleaf-procedures
--mic-compat -mic2.0-compat -mic3.0-compat
--mintel-asm -mno-clean-linkage -mno-code-align
--mno-complex-addr -mno-leaf-procedures
--mno-old-align -mno-strict-align -mno-tail-call
--mnumerics -mold-align -msoft-float -mstrict-align
--mtail-call
-
-@emph{DEC Alpha Options}
--mfp-regs -mno-fp-regs -mno-soft-float -msoft-float
--malpha-as -mgas
--mieee -mieee-with-inexact -mieee-conformant
--mfp-trap-mode=@var{mode} -mfp-rounding-mode=@var{mode}
--mtrap-precision=@var{mode} -mbuild-constants
--mcpu=@var{cpu type}
--mbwx -mno-bwx -mcix -mno-cix -mmax -mno-max
--mmemory-latency=@var{time}
-
-@emph{Clipper Options}
--mc300 -mc400
-
-@emph{H8/300 Options}
--mrelax -mh -ms -mint32 -malign-300
-
-@emph{SH Options}
--m1 -m2 -m3 -m3e -mb -ml -mdalign -mrelax
-
-@emph{System V Options}
--Qy -Qn -YP,@var{paths} -Ym,@var{dir}
-
-@c CYGNUS LOCAL: z8k docs
-@emph{Z8000 Option}
--mz8001
-@c END CYGNUS LOCAL
-
-@emph{ARC Options}
--EB -EL
--mmangle-cpu -mcpu=@var{cpu} -mtext=@var{text section}
--mdata=@var{data section} -mrodata=@var{readonly data section}
-
-@c CYGNUS LOCAL -- meissner/d10v
-@emph{D10V Options}
--mint16 -mint32 -mdouble32 -mdouble64
--maddac3 -mno-addac3 -maccum -mno-accum -msim
--mno-cond-move -mcond-move
--masm-optimize -mno-asm-optimize
--msmall-insns -mno-small-insns
--mbranch-cost=@var{n} -mcond-exec=@var{n}
-@c END CYGNUS LOCAL -- meissner/d10v
-
-@emph{V850 Options}
--mlong-calls -mno-long-calls -mep -mno-ep
--mprolog-function -mno-prolog-function -mspace
--mtda=@var{n} -msda=@var{n} -mzda=@var{n}
--mv850 -mbig-switch
--mapp-regs -mno-app-regs
-@c CYGNUS LOCAL v850e
--mv850e
--mdisable-callt -mno-disable-callt
-@c CYGNUS LOCAL v850e
-
-@emph{NS32K Options}
--m32032 -m32332 -m32532 -m32081 -m32381 -mmult-add -mnomult-add
--msoft-float -mrtd -mnortd -mregparam -mnoregparam -msb -mnosb
--mbitfield -mnobitfield -mhimem -mnohimem
-@end smallexample
-
-@item Code Generation Options
-@xref{Code Gen Options,,Options for Code Generation Conventions}.
-@smallexample
--fcall-saved-@var{reg} -fcall-used-@var{reg}
--fexceptions -ffixed-@var{reg} -finhibit-size-directive
--fcheck-memory-usage -fprefix-function-name
--fno-common -fno-ident -fno-gnu-linker
--fpcc-struct-return -fpic -fPIC
--freg-struct-return -fshared-data -fshort-enums
--fshort-double -fvolatile -fvolatile-global
-@c CYGNUS LOCAL unaligned-pointers, unaligned-struct-hack
--funaligned-pointers -funaligned-struct-hack
-@c END CYGNUS LOCAL
-@c CYGNUS LOCAL -- meissner/nortel
--foptimize-comparisons
-@c END CYGNUS LOCAL -- meissner/nortel
--fverbose-asm -fpack-struct -fstack-check
--fargument-alias -fargument-noalias
--fargument-noalias-global
--fleading-underscore
-@end smallexample
-@end table
-
-@menu
-* Overall Options:: Controlling the kind of output:
- an executable, object files, assembler files,
- or preprocessed source.
-* C Dialect Options:: Controlling the variant of C language compiled.
-* C++ Dialect Options:: Variations on C++.
-* Warning Options:: How picky should the compiler be?
-* Debugging Options:: Symbol tables, measurements, and debugging dumps.
-* Optimize Options:: How much optimization?
-* Preprocessor Options:: Controlling header files and macro definitions.
- Also, getting dependency information for Make.
-* Assembler Options:: Passing options to the assembler.
-* Link Options:: Specifying libraries and so on.
-* Directory Options:: Where to find header files and libraries.
- Where to find the compiler executable files.
-* Target Options:: Running a cross-compiler, or an old version of GNU CC.
-@end menu
-
-@node Overall Options
-@section Options Controlling the Kind of Output
-
-Compilation can involve up to four stages: preprocessing, compilation
-proper, assembly and linking, always in that order. The first three
-stages apply to an individual source file, and end by producing an
-object file; linking combines all the object files (those newly
-compiled, and those specified as input) into an executable file.
-
-@cindex file name suffix
-For any given input file, the file name suffix determines what kind of
-compilation is done:
-
-@table @code
-@item @var{file}.c
-C source code which must be preprocessed.
-
-@item @var{file}.i
-C source code which should not be preprocessed.
-
-@item @var{file}.ii
-C++ source code which should not be preprocessed.
-
-@item @var{file}.m
-Objective-C source code. Note that you must link with the library
-@file{libobjc.a} to make an Objective-C program work.
-
-@item @var{file}.h
-C header file (not to be compiled or linked).
-
-@item @var{file}.cc
-@itemx @var{file}.cxx
-@itemx @var{file}.cpp
-@itemx @var{file}.C
-C++ source code which must be preprocessed. Note that in @samp{.cxx},
-the last two letters must both be literally @samp{x}. Likewise,
-@samp{.C} refers to a literal capital C.
-
-@item @var{file}.s
-Assembler code.
-
-@item @var{file}.S
-Assembler code which must be preprocessed.
-
-@item @var{other}
-An object file to be fed straight into linking.
-Any file name with no recognized suffix is treated this way.
-@end table
-
-You can specify the input language explicitly with the @samp{-x} option:
-
-@table @code
-@item -x @var{language}
-Specify explicitly the @var{language} for the following input files
-(rather than letting the compiler choose a default based on the file
-name suffix). This option applies to all following input files until
-the next @samp{-x} option. Possible values for @var{language} are:
-@example
-c objective-c c++
-c-header cpp-output c++-cpp-output
-assembler assembler-with-cpp
-@end example
-
-@item -x none
-Turn off any specification of a language, so that subsequent files are
-handled according to their file name suffixes (as they are if @samp{-x}
-has not been used at all).
-@end table
-
-If you only want some of the stages of compilation, you can use
-@samp{-x} (or filename suffixes) to tell @code{gcc} where to start, and
-one of the options @samp{-c}, @samp{-S}, or @samp{-E} to say where
-@code{gcc} is to stop. Note that some combinations (for example,
-@samp{-x cpp-output -E} instruct @code{gcc} to do nothing at all.
-
-@table @code
-@item -c
-Compile or assemble the source files, but do not link. The linking
-stage simply is not done. The ultimate output is in the form of an
-object file for each source file.
-
-By default, the object file name for a source file is made by replacing
-the suffix @samp{.c}, @samp{.i}, @samp{.s}, etc., with @samp{.o}.
-
-Unrecognized input files, not requiring compilation or assembly, are
-ignored.
-
-@item -S
-Stop after the stage of compilation proper; do not assemble. The output
-is in the form of an assembler code file for each non-assembler input
-file specified.
-
-By default, the assembler file name for a source file is made by
-replacing the suffix @samp{.c}, @samp{.i}, etc., with @samp{.s}.
-
-Input files that don't require compilation are ignored.
-
-@item -E
-Stop after the preprocessing stage; do not run the compiler proper. The
-output is in the form of preprocessed source code, which is sent to the
-standard output.
-
-Input files which don't require preprocessing are ignored.
-
-@cindex output file option
-@item -o @var{file}
-Place output in file @var{file}. This applies regardless to whatever
-sort of output is being produced, whether it be an executable file,
-an object file, an assembler file or preprocessed C code.
-
-Since only one output file can be specified, it does not make sense to
-use @samp{-o} when compiling more than one input file, unless you are
-producing an executable file as output.
-
-If @samp{-o} is not specified, the default is to put an executable file
-in @file{a.out}, the object file for @file{@var{source}.@var{suffix}} in
-@file{@var{source}.o}, its assembler file in @file{@var{source}.s}, and
-all preprocessed C source on standard output.@refill
-
-@item -v
-Print (on standard error output) the commands executed to run the stages
-of compilation. Also print the version number of the compiler driver
-program and of the preprocessor and the compiler proper.
-
-@item -pipe
-Use pipes rather than temporary files for communication between the
-various stages of compilation. This fails to work on some systems where
-the assembler is unable to read from a pipe; but the GNU assembler has
-no trouble.
-
-@item --help
-Print (on the standard output) a description of the command line options
-understood by @code{gcc}. If the @code{-v} option is also specified
-then @code{--help} will also be passed on to the various processes
-invoked by @code{gcc}, so that they can display the command line options
-they accept. If the @code{-W} option is also specified then command
-line options which have no documentation associated with them will also
-be displayed.
-@end table
-
-@node Invoking G++
-@section Compiling C++ Programs
-
-@cindex suffixes for C++ source
-@cindex C++ source file suffixes
-C++ source files conventionally use one of the suffixes @samp{.C},
-@samp{.cc}, @samp{.cpp}, @samp{.c++}, @samp{.cp}, or @samp{.cxx};
-preprocessed C++ files use the suffix @samp{.ii}. GNU CC recognizes
-files with these names and compiles them as C++ programs even if you
-call the compiler the same way as for compiling C programs (usually with
-the name @code{gcc}).
-
-@findex g++
-@findex c++
-However, C++ programs often require class libraries as well as a
-compiler that understands the C++ language---and under some
-circumstances, you might want to compile programs from standard input,
-or otherwise without a suffix that flags them as C++ programs.
-@code{g++} is a program that calls GNU CC with the default language
-set to C++, and automatically specifies linking against the C++
-library. On many systems, the script @code{g++} is also
-installed with the name @code{c++}.
-
-@cindex invoking @code{g++}
-When you compile C++ programs, you may specify many of the same
-command-line options that you use for compiling programs in any
-language; or command-line options meaningful for C and related
-languages; or options that are meaningful only for C++ programs.
-@xref{C Dialect Options,,Options Controlling C Dialect}, for
-explanations of options for languages related to C.
-@xref{C++ Dialect Options,,Options Controlling C++ Dialect}, for
-explanations of options that are meaningful only for C++ programs.
-
-@node C Dialect Options
-@section Options Controlling C Dialect
-@cindex dialect options
-@cindex language dialect options
-@cindex options, dialect
-
-The following options control the dialect of C (or languages derived
-from C, such as C++ and Objective C) that the compiler accepts:
-
-@table @code
-@cindex ANSI support
-@item -ansi
-Support all ANSI standard C programs.
-
-This turns off certain features of GNU C that are incompatible with ANSI
-C, such as the @code{asm}, @code{inline} and @code{typeof} keywords, and
-predefined macros such as @code{unix} and @code{vax} that identify the
-type of system you are using. It also enables the undesirable and
-rarely used ANSI trigraph feature, and it disables recognition of C++
-style @samp{//} comments.
-
-The alternate keywords @code{__asm__}, @code{__extension__},
-@code{__inline__} and @code{__typeof__} continue to work despite
-@samp{-ansi}. You would not want to use them in an ANSI C program, of
-course, but it is useful to put them in header files that might be included
-in compilations done with @samp{-ansi}. Alternate predefined macros
-such as @code{__unix__} and @code{__vax__} are also available, with or
-without @samp{-ansi}.
-
-The @samp{-ansi} option does not cause non-ANSI programs to be
-rejected gratuitously. For that, @samp{-pedantic} is required in
-addition to @samp{-ansi}. @xref{Warning Options}.
-
-The macro @code{__STRICT_ANSI__} is predefined when the @samp{-ansi}
-option is used. Some header files may notice this macro and refrain
-from declaring certain functions or defining certain macros that the
-ANSI standard doesn't call for; this is to avoid interfering with any
-programs that might use these names for other things.
-
-The functions @code{alloca}, @code{abort}, @code{exit}, and
-@code{_exit} are not builtin functions when @samp{-ansi} is used.
-
-@item -flang-isoc9x
-Enable support for features found in the C9X standard. In particular,
-enable support for the C9X @code{restrict} keyword.
-
-Even when this option is not specified, you can still use some C9X
-features in so far as they do not conflict with previous C standards.
-For example, you may use @code{__restrict__} even when -flang-isoc9x
-is not specified.
-
-@item -fno-asm
-Do not recognize @code{asm}, @code{inline} or @code{typeof} as a
-keyword, so that code can use these words as identifiers. You can use
-the keywords @code{__asm__}, @code{__inline__} and @code{__typeof__}
-instead. @samp{-ansi} implies @samp{-fno-asm}.
-
-In C++, this switch only affects the @code{typeof} keyword, since
-@code{asm} and @code{inline} are standard keywords. You may want to
-use the @samp{-fno-gnu-keywords} flag instead, as it also disables the
-other, C++-specific, extension keywords such as @code{headof}.
-
-@item -fno-builtin
-@cindex builtin functions
-@findex abort
-@findex abs
-@findex alloca
-@findex cos
-@findex exit
-@findex fabs
-@findex ffs
-@findex labs
-@findex memcmp
-@findex memcpy
-@findex sin
-@findex sqrt
-@findex strcmp
-@findex strcpy
-@findex strlen
-Don't recognize builtin functions that do not begin with `__builtin_'
-as prefix. Currently, the functions affected include @code{abort},
-@code{abs}, @code{alloca}, @code{cos}, @code{exit}, @code{fabs},
-@code{ffs}, @code{labs}, @code{memcmp}, @code{memcpy}, @code{sin},
-@code{sqrt}, @code{strcmp}, @code{strcpy}, and @code{strlen}.
-
-GCC normally generates special code to handle certain builtin functions
-more efficiently; for instance, calls to @code{alloca} may become single
-instructions that adjust the stack directly, and calls to @code{memcpy}
-may become inline copy loops. The resulting code is often both smaller
-and faster, but since the function calls no longer appear as such, you
-cannot set a breakpoint on those calls, nor can you change the behavior
-of the functions by linking with a different library.
-
-The @samp{-ansi} option prevents @code{alloca} and @code{ffs} from being
-builtin functions, since these functions do not have an ANSI standard
-meaning.
-
-@item -fhosted
-@cindex hosted environment
-
-Assert that compilation takes place in a hosted environment. This implies
-@samp{-fbuiltin}. A hosted environment is one in which the
-entire standard library is available, and in which @code{main} has a return
-type of @code{int}. Examples are nearly everything except a kernel.
-This is equivalent to @samp{-fno-freestanding}.
-
-@item -ffreestanding
-@cindex hosted environment
-
-Assert that compilation takes place in a freestanding environment. This
-implies @samp{-fno-builtin}. A freestanding environment
-is one in which the standard library may not exist, and program startup may
-not necessarily be at @code{main}. The most obvious example is an OS kernel.
-This is equivalent to @samp{-fno-hosted}.
-
-@item -trigraphs
-Support ANSI C trigraphs. You don't want to know about this
-brain-damage. The @samp{-ansi} option implies @samp{-trigraphs}.
-
-@cindex traditional C language
-@cindex C language, traditional
-@item -traditional
-Attempt to support some aspects of traditional C compilers.
-Specifically:
-
-@itemize @bullet
-@item
-All @code{extern} declarations take effect globally even if they
-are written inside of a function definition. This includes implicit
-declarations of functions.
-
-@item
-The newer keywords @code{typeof}, @code{inline}, @code{signed}, @code{const}
-and @code{volatile} are not recognized. (You can still use the
-alternative keywords such as @code{__typeof__}, @code{__inline__}, and
-so on.)
-
-@item
-Comparisons between pointers and integers are always allowed.
-
-@item
-Integer types @code{unsigned short} and @code{unsigned char} promote
-to @code{unsigned int}.
-
-@item
-Out-of-range floating point literals are not an error.
-
-@item
-Certain constructs which ANSI regards as a single invalid preprocessing
-number, such as @samp{0xe-0xd}, are treated as expressions instead.
-
-@item
-String ``constants'' are not necessarily constant; they are stored in
-writable space, and identical looking constants are allocated
-separately. (This is the same as the effect of
-@samp{-fwritable-strings}.)
-
-@cindex @code{longjmp} and automatic variables
-@item
-All automatic variables not declared @code{register} are preserved by
-@code{longjmp}. Ordinarily, GNU C follows ANSI C: automatic variables
-not declared @code{volatile} may be clobbered.
-
-@item
-@kindex \x
-@kindex \a
-@cindex escape sequences, traditional
-The character escape sequences @samp{\x} and @samp{\a} evaluate as the
-literal characters @samp{x} and @samp{a} respectively. Without
-@w{@samp{-traditional}}, @samp{\x} is a prefix for the hexadecimal
-representation of a character, and @samp{\a} produces a bell.
-@end itemize
-
-You may wish to use @samp{-fno-builtin} as well as @samp{-traditional}
-if your program uses names that are normally GNU C builtin functions for
-other purposes of its own.
-
-You cannot use @samp{-traditional} if you include any header files that
-rely on ANSI C features. Some vendors are starting to ship systems with
-ANSI C header files and you cannot use @samp{-traditional} on such
-systems to compile files that include any system headers.
-
-The @samp{-traditional} option also enables @samp{-traditional-cpp},
-which is described next.
-
-@item -traditional-cpp
-Attempt to support some aspects of traditional C preprocessors.
-Specifically:
-
-@itemize @bullet
-@item
-Comments convert to nothing at all, rather than to a space. This allows
-traditional token concatenation.
-
-@item
-In a preprocessing directive, the @samp{#} symbol must appear as the first
-character of a line.
-
-@item
-Macro arguments are recognized within string constants in a macro
-definition (and their values are stringified, though without additional
-quote marks, when they appear in such a context). The preprocessor
-always considers a string constant to end at a newline.
-
-@item
-@cindex detecting @w{@samp{-traditional}}
-The predefined macro @code{__STDC__} is not defined when you use
-@samp{-traditional}, but @code{__GNUC__} is (since the GNU extensions
-which @code{__GNUC__} indicates are not affected by
-@samp{-traditional}). If you need to write header files that work
-differently depending on whether @samp{-traditional} is in use, by
-testing both of these predefined macros you can distinguish four
-situations: GNU C, traditional GNU C, other ANSI C compilers, and other
-old C compilers. The predefined macro @code{__STDC_VERSION__} is also
-not defined when you use @samp{-traditional}. @xref{Standard
-Predefined,,Standard Predefined Macros,cpp.info,The C Preprocessor},
-for more discussion of these and other predefined macros.
-
-@item
-@cindex string constants vs newline
-@cindex newline vs string constants
-The preprocessor considers a string constant to end at a newline (unless
-the newline is escaped with @samp{\}). (Without @w{@samp{-traditional}},
-string constants can contain the newline character as typed.)
-@end itemize
-
-@item -fcond-mismatch
-Allow conditional expressions with mismatched types in the second and
-third arguments. The value of such an expression is void.
-
-@item -funsigned-char
-Let the type @code{char} be unsigned, like @code{unsigned char}.
-
-Each kind of machine has a default for what @code{char} should
-be. It is either like @code{unsigned char} by default or like
-@code{signed char} by default.
-
-Ideally, a portable program should always use @code{signed char} or
-@code{unsigned char} when it depends on the signedness of an object.
-But many programs have been written to use plain @code{char} and
-expect it to be signed, or expect it to be unsigned, depending on the
-machines they were written for. This option, and its inverse, let you
-make such a program work with the opposite default.
-
-The type @code{char} is always a distinct type from each of
-@code{signed char} or @code{unsigned char}, even though its behavior
-is always just like one of those two.
-
-@item -fsigned-char
-Let the type @code{char} be signed, like @code{signed char}.
-
-Note that this is equivalent to @samp{-fno-unsigned-char}, which is
-the negative form of @samp{-funsigned-char}. Likewise, the option
-@samp{-fno-signed-char} is equivalent to @samp{-funsigned-char}.
-
-You may wish to use @samp{-fno-builtin} as well as @samp{-traditional}
-if your program uses names that are normally GNU C builtin functions for
-other purposes of its own.
-
-You cannot use @samp{-traditional} if you include any header files that
-rely on ANSI C features. Some vendors are starting to ship systems with
-ANSI C header files and you cannot use @samp{-traditional} on such
-systems to compile files that include any system headers.
-
-@item -fsigned-bitfields
-@itemx -funsigned-bitfields
-@itemx -fno-signed-bitfields
-@itemx -fno-unsigned-bitfields
-These options control whether a bitfield is signed or unsigned, when the
-declaration does not use either @code{signed} or @code{unsigned}. By
-default, such a bitfield is signed, because this is consistent: the
-basic integer types such as @code{int} are signed types.
-
-However, when @samp{-traditional} is used, bitfields are all unsigned
-no matter what.
-
-@item -fwritable-strings
-Store string constants in the writable data segment and don't uniquize
-them. This is for compatibility with old programs which assume they can
-write into string constants. The option @samp{-traditional} also has
-this effect.
-
-Writing into string constants is a very bad idea; ``constants'' should
-be constant.
-
-@item -fallow-single-precision
-Do not promote single precision math operations to double precision,
-even when compiling with @samp{-traditional}.
-
-Traditional K&R C promotes all floating point operations to double
-precision, regardless of the sizes of the operands. On the
-architecture for which you are compiling, single precision may be faster
-than double precision. If you must use @samp{-traditional}, but want
-to use single precision operations when the operands are single
-precision, use this option. This option has no effect when compiling
-with ANSI or GNU C conventions (the default).
-
-@end table
-
-@node C++ Dialect Options
-@section Options Controlling C++ Dialect
-
-@cindex compiler options, C++
-@cindex C++ options, command line
-@cindex options, C++
-This section describes the command-line options that are only meaningful
-for C++ programs; but you can also use most of the GNU compiler options
-regardless of what language your program is in. For example, you
-might compile a file @code{firstClass.C} like this:
-
-@example
-g++ -g -frepo -O -c firstClass.C
-@end example
-
-@noindent
-In this example, only @samp{-frepo} is an option meant
-only for C++ programs; you can use the other options with any
-language supported by GNU CC.
-
-Here is a list of options that are @emph{only} for compiling C++ programs:
-
-@table @code
-@item -fno-access-control
-Turn off all access checking. This switch is mainly useful for working
-around bugs in the access control code.
-
-@item -fcheck-new
-Check that the pointer returned by @code{operator new} is non-null
-before attempting to modify the storage allocated. The current Working
-Paper requires that @code{operator new} never return a null pointer, so
-this check is normally unnecessary.
-
-An alternative to using this option is to specify that your
-@code{operator new} does not throw any exceptions; if you declare it
-@samp{throw()}, g++ will check the return value. See also @samp{new
-(nothrow)}.
-
-@item -fconserve-space
-Put uninitialized or runtime-initialized global variables into the
-common segment, as C does. This saves space in the executable at the
-cost of not diagnosing duplicate definitions. If you compile with this
-flag and your program mysteriously crashes after @code{main()} has
-completed, you may have an object that is being destroyed twice because
-two definitions were merged.
-
-This option is no longer useful on most targets, now that support has
-been added for putting variables into BSS without making them common.
-
-@item -fdollars-in-identifiers
-Accept @samp{$} in identifiers. You can also explicitly prohibit use of
-@samp{$} with the option @samp{-fno-dollars-in-identifiers}. (GNU C allows
-@samp{$} by default on most target systems, but there are a few exceptions.)
-Traditional C allowed the character @samp{$} to form part of
-identifiers. However, ANSI C and C++ forbid @samp{$} in identifiers.
-
-@c CYGNUS LOCAL Embedded C++
-@item -fembedded-cxx
-In compliance with the Embedded C++ specification, make the use of templates,
-exception handling, multiple inheritance, or RTTI illegal. Attempts to use
-namespaces are also not allowed. This makes the use of these keywords result
-in warnings by default: @code{template}, @code{typename}, @code{catch},
-@code{throw}, @code{try}, @code{using}, @code{namespace}, @code{dynamic_cast},
-@code{static_cast}, @code{reinterpret_cast}, @code{const_cast}, and
-@code{typeid}.
-To make the warnings for these things be given as errors, add the
-@code{-pedantic-errors} flag.
-@c END CYGNUS LOCAL Embedded C++
-
-@item -fno-elide-constructors
-The C++ standard allows an implementation to omit creating a temporary
-which is only used to initialize another object of the same type.
-Specifying this option disables that optimization, and forces g++ to
-call the copy constructor in all cases.
-
-@item -fexternal-templates
-Cause template instantiations to obey @samp{#pragma interface} and
-@samp{implementation}; template instances are emitted or not according
-to the location of the template definition. @xref{Template
-Instantiation}, for more information.
-
-This option is deprecated.
-
-@item -falt-external-templates
-Similar to -fexternal-templates, but template instances are emitted or
-not according to the place where they are first instantiated.
-@xref{Template Instantiation}, for more information.
-
-This option is deprecated.
-
-@item -ffor-scope
-@itemx -fno-for-scope
-If -ffor-scope is specified, the scope of variables declared in
-a @i{for-init-statement} is limited to the @samp{for} loop itself,
-as specified by the draft C++ standard.
-If -fno-for-scope is specified, the scope of variables declared in
-a @i{for-init-statement} extends to the end of the enclosing scope,
-as was the case in old versions of gcc, and other (traditional)
-implementations of C++.
-
-The default if neither flag is given to follow the standard,
-but to allow and give a warning for old-style code that would
-otherwise be invalid, or have different behavior.
-
-@item -fno-gnu-keywords
-Do not recognize @code{classof}, @code{headof}, @code{signature},
-@code{sigof} or @code{typeof} as a keyword, so that code can use these
-words as identifiers. You can use the keywords @code{__classof__},
-@code{__headof__}, @code{__signature__}, @code{__sigof__}, and
-@code{__typeof__} instead. @samp{-ansi} implies
-@samp{-fno-gnu-keywords}.
-
-@item -fguiding-decls
-Treat a function declaration with the same type as a potential function
-template instantiation as though it declares that instantiation, not a
-normal function. If a definition is given for the function later in the
-translation unit (or another translation unit if the target supports
-weak symbols), that definition will be used; otherwise the template will
-be instantiated. This behavior reflects the C++ language prior to
-September 1996, when guiding declarations were removed.
-
-This option implies @samp{-fname-mangling-version-0}, and will not work
-with other name mangling versions. Like all options that change the
-ABI, all C++ code, @emph{including libgcc.a} must be built with the same
-setting of this option.
-
-@item -fno-implicit-templates
-Never emit code for templates which are instantiated implicitly (i.e. by
-use); only emit code for explicit instantiations. @xref{Template
-Instantiation}, for more information.
-
-@item -fhandle-signatures
-Recognize the @code{signature} and @code{sigof} keywords for specifying
-abstract types. The default (@samp{-fno-handle-signatures}) is not to
-recognize them. @xref{C++ Signatures, Type Abstraction using
-Signatures}.
-
-@item -fhonor-std
-Treat the @code{namespace std} as a namespace, instead of ignoring
-it. For compatibility with earlier versions of g++, the compiler will,
-by default, ignore @code{namespace-declarations},
-@code{using-declarations}, @code{using-directives}, and
-@code{namespace-names}, if they involve @code{std}.
-
-@item -fhuge-objects
-Support virtual function calls for objects that exceed the size
-representable by a @samp{short int}. Users should not use this flag by
-default; if you need to use it, the compiler will tell you so.
-
-This flag is not useful when compiling with -fvtable-thunks.
-
-Like all options that change the ABI, all C++ code, @emph{including
-libgcc} must be built with the same setting of this option.
-
-@item -fno-implicit-templates
-Never emit code for non-inline templates which are instantiated
-implicitly (i.e. by use); only emit code for explicit instantiations.
-@xref{Template Instantiation}, for more information.
-
-@item -fno-implicit-inline-templates
-Don't emit code for implicit instantiations of inline templates, either.
-The default is to handle inlines differently so that compiles with and
-without optimization will need the same set of explicit instantiations.
-
-@item -finit-priority
-Support @samp{__attribute__ ((init_priority (n)))} for controlling the
-order of initialization of file-scope objects. On ELF targets, this
-requires GNU ld 2.10 or later.
-
-@item -fno-implement-inlines
-To save space, do not emit out-of-line copies of inline functions
-controlled by @samp{#pragma implementation}. This will cause linker
-errors if these functions are not inlined everywhere they are called.
-
-@item -fname-mangling-version-@var{n}
-Control the way in which names are mangled. Version 0 is compatible
-with versions of g++ before 2.8. Version 1 is the default. Version 1
-will allow correct mangling of function templates. For example,
-version 0 mangling does not mangle foo<int, double> and foo<int, char>
-given this declaration:
-
-@example
-template <class T, class U> void foo(T t);
-@end example
-
-Like all options that change the ABI, all C++ code, @emph{including
-libgcc} must be built with the same setting of this option.
-
-@item -foperator-names
-Recognize the operator name keywords @code{and}, @code{bitand},
-@code{bitor}, @code{compl}, @code{not}, @code{or} and @code{xor} as
-synonyms for the symbols they refer to. @samp{-ansi} implies
-@samp{-foperator-names}.
-
-@item -fno-optional-diags
-Disable diagnostics that the standard says a compiler does not need to
-issue. Currently, the only such diagnostic issued by g++ is the one for
-a name having multiple meanings within a class.
-
-@item -frepo
-Enable automatic template instantiation. This option also implies
-@samp{-fno-implicit-templates}. @xref{Template Instantiation}, for more
-information.
-
-@item -fstrict-prototype
-Within an @samp{extern "C"} linkage specification, treat a function
-declaration with no arguments, such as @samp{int foo ();}, as declaring
-the function to take no arguments. Normally, such a declaration means
-that the function @code{foo} can take any combination of arguments, as
-in C. @samp{-pedantic} implies @samp{-fstrict-prototype} unless
-overridden with @samp{-fno-strict-prototype}.
-
-Specifying this option will also suppress implicit declarations of
-functions.
-
-This flag no longer affects declarations with C++ linkage.
-
-@item -fsquangle
-@itemx -fno-squangle
-@samp{-fsquangle} will enable a compressed form of name mangling for
-identifiers. In particular, it helps to shorten very long names by recognizing
-types and class names which occur more than once, replacing them with special
-short ID codes. This option also requires any C++ libraries being used to
-be compiled with this option as well. The compiler has this disabled (the
-equivalent of @samp{-fno-squangle}) by default.
-
-Like all options that change the ABI, all C++ code, @emph{including
-libgcc.a} must be built with the same setting of this option.
-
-@item -ftemplate-depth-@var{n}
-Set the maximum instantiation depth for template classes to @var{n}.
-A limit on the template instantiation depth is needed to detect
-endless recursions during template class instantiation. ANSI/ISO C++
-conforming programs must not rely on a maximum depth greater than 17.
-
-@item -fthis-is-variable
-Permit assignment to @code{this}. The incorporation of user-defined
-free store management into C++ has made assignment to @samp{this} an
-anachronism. Therefore, by default it is invalid to assign to
-@code{this} within a class member function; that is, GNU C++ treats
-@samp{this} in a member function of class @code{X} as a non-lvalue of
-type @samp{X *}. However, for backwards compatibility, you can make it
-valid with @samp{-fthis-is-variable}.
-
-@item -fvtable-thunks
-Use @samp{thunks} to implement the virtual function dispatch table
-(@samp{vtable}). The traditional (cfront-style) approach to
-implementing vtables was to store a pointer to the function and two
-offsets for adjusting the @samp{this} pointer at the call site. Newer
-implementations store a single pointer to a @samp{thunk} function which
-does any necessary adjustment and then calls the target function.
-
-This option also enables a heuristic for controlling emission of
-vtables; if a class has any non-inline virtual functions, the vtable
-will be emitted in the translation unit containing the first one of
-those.
-
-Like all options that change the ABI, all C++ code, @emph{including
-libgcc.a} must be built with the same setting of this option.
-
-@item -nostdinc++
-Do not search for header files in the standard directories specific to
-C++, but do still search the other standard directories. (This option
-is used when building the C++ library.)
-@end table
-
-In addition, these optimization, warning, and code generation options
-have meanings only for C++ programs:
-
-@table @code
-@item -fno-default-inline
-Do not assume @samp{inline} for functions defined inside a class scope.
-@xref{Optimize Options,,Options That Control Optimization}. Note that these
-functions will have linkage like inline functions; they just won't be
-inlined by default.
-
-@item -Wctor-dtor-privacy (C++ only)
-Warn when a class seems unusable, because all the constructors or
-destructors in a class are private and the class has no friends or
-public static member functions.
-
-@item -Wnon-virtual-dtor (C++ only)
-Warn when a class declares a non-virtual destructor that should probably
-be virtual, because it looks like the class will be used polymorphically.
-
-@item -Wreorder (C++ only)
-@cindex reordering, warning
-@cindex warning for reordering of member initializers
-Warn when the order of member initializers given in the code does not
-match the order in which they must be executed. For instance:
-
-@smallexample
-struct A @{
- int i;
- int j;
- A(): j (0), i (1) @{ @}
-@};
-@end smallexample
-
-Here the compiler will warn that the member initializers for @samp{i}
-and @samp{j} will be rearranged to match the declaration order of the
-members.
-@end table
-
-The following @samp{-W@dots{}} options are not affected by @samp{-Wall}.
-
-@table @code
-@item -Weffc++ (C++ only)
-Warn about violations of various style guidelines from Scott Meyers'
-@cite{Effective C++} books. If you use this option, you should be aware
-that the standard library headers do not obey all of these guidelines;
-you can use @samp{grep -v} to filter out those warnings.
-
-@item -Wno-non-template-friend (C++ only)
-Disable warnings when non-templatized friend functions are declared
-within a template. With the advent of explicit template specification
-support in g++, if the name of the friend is an unqualified-id (ie,
-@samp{friend foo(int)}), the C++ language specification demands that the
-friend declare or define an ordinary, nontemplate function. (Section
-14.5.3). Before g++ implemented explicit specification, unqualified-ids
-could be interpreted as a particular specialization of a templatized
-function. Because this non-conforming behavior is no longer the default
-behavior for g++, @samp{-Wnon-template-friend} allows the compiler to
-check existing code for potential trouble spots, and is on by default.
-This new compiler behavior can also be turned off with the flag
-@samp{-fguiding-decls}, which activates the older, non-specification
-compiler code, or with @samp{-Wno-non-template-friend} which keeps the
-conformant compiler code but disables the helpful warning.
-
-@item -Wold-style-cast (C++ only)
-Warn if an old-style (C-style) cast is used within a C++ program. The
-new-style casts (@samp{static_cast}, @samp{reinterpret_cast}, and
-@samp{const_cast}) are less vulnerable to unintended effects.
-
-@item -Woverloaded-virtual (C++ only)
-@cindex overloaded virtual fn, warning
-@cindex warning for overloaded virtual fn
-Warn when a derived class function declaration may be an error in
-defining a virtual function. In a derived class, the
-definitions of virtual functions must match the type signature of a
-virtual function declared in the base class. With this option, the
-compiler warns when you define a function with the same name as a
-virtual function, but with a type signature that does not match any
-declarations from the base class.
-
-@item -Wno-pmf-conversions (C++ only)
-Disable the diagnostic for converting a bound pointer to member function
-to a plain pointer.
-
-@item -Wsign-promo (C++ only)
-Warn when overload resolution chooses a promotion from unsigned or
-enumeral type to a signed type over a conversion to an unsigned type of
-the same size. Previous versions of g++ would try to preserve
-unsignedness, but the standard mandates the current behavior.
-
-@item -Wsynth (C++ only)
-@cindex warning for synthesized methods
-@cindex synthesized methods, warning
-Warn when g++'s synthesis behavior does not match that of cfront. For
-instance:
-
-@smallexample
-struct A @{
- operator int ();
- A& operator = (int);
-@};
-
-main ()
-@{
- A a,b;
- a = b;
-@}
-@end smallexample
-
-In this example, g++ will synthesize a default @samp{A& operator =
-(const A&);}, while cfront will use the user-defined @samp{operator =}.
-@end table
-
-@node Warning Options
-@section Options to Request or Suppress Warnings
-@cindex options to control warnings
-@cindex warning messages
-@cindex messages, warning
-@cindex suppressing warnings
-
-Warnings are diagnostic messages that report constructions which
-are not inherently erroneous but which are risky or suggest there
-may have been an error.
-
-You can request many specific warnings with options beginning @samp{-W},
-for example @samp{-Wimplicit} to request warnings on implicit
-declarations. Each of these specific warning options also has a
-negative form beginning @samp{-Wno-} to turn off warnings;
-for example, @samp{-Wno-implicit}. This manual lists only one of the
-two forms, whichever is not the default.
-
-These options control the amount and kinds of warnings produced by GNU
-CC:
-
-@table @code
-@cindex syntax checking
-@item -fsyntax-only
-Check the code for syntax errors, but don't do anything beyond that.
-
-@item -pedantic
-Issue all the warnings demanded by strict ANSI C and ISO C++;
-reject all programs that use forbidden extensions.
-
-Valid ANSI C and ISO C++ programs should compile properly with or without
-this option (though a rare few will require @samp{-ansi}). However,
-without this option, certain GNU extensions and traditional C and C++
-features are supported as well. With this option, they are rejected.
-
-@samp{-pedantic} does not cause warning messages for use of the
-alternate keywords whose names begin and end with @samp{__}. Pedantic
-warnings are also disabled in the expression that follows
-@code{__extension__}. However, only system header files should use
-these escape routes; application programs should avoid them.
-@xref{Alternate Keywords}.
-
-This option is not intended to be @i{useful}; it exists only to satisfy
-pedants who would otherwise claim that GNU CC fails to support the ANSI
-standard.
-
-Some users try to use @samp{-pedantic} to check programs for strict ANSI
-C conformance. They soon find that it does not do quite what they want:
-it finds some non-ANSI practices, but not all---only those for which
-ANSI C @emph{requires} a diagnostic.
-
-A feature to report any failure to conform to ANSI C might be useful in
-some instances, but would require considerable additional work and would
-be quite different from @samp{-pedantic}. We don't have plans to
-support such a feature in the near future.
-
-@item -pedantic-errors
-Like @samp{-pedantic}, except that errors are produced rather than
-warnings.
-
-@item -w
-Inhibit all warning messages.
-
-@item -Wno-import
-Inhibit warning messages about the use of @samp{#import}.
-
-@item -Wchar-subscripts
-Warn if an array subscript has type @code{char}. This is a common cause
-of error, as programmers often forget that this type is signed on some
-machines.
-
-@item -Wcomment
-Warn whenever a comment-start sequence @samp{/*} appears in a @samp{/*}
-comment, or whenever a Backslash-Newline appears in a @samp{//} comment.
-
-@item -Wformat
-Check calls to @code{printf} and @code{scanf}, etc., to make sure that
-the arguments supplied have types appropriate to the format string
-specified.
-
-@item -Wimplicit-int
-Warn when a declaration does not specify a type.
-
-@item -Wimplicit-function-declaration
-@itemx -Werror-implicit-function-declaration
-Give a warning (or error) whenever a function is used before being
-declared.
-
-@item -Wimplicit
-Same as @samp{-Wimplicit-int} and @samp{-Wimplicit-function-}@*
-@samp{declaration}.
-
-@item -Wmain
-Warn if the type of @samp{main} is suspicious. @samp{main} should be a
-function with external linkage, returning int, taking either zero
-arguments, two, or three arguments of appropriate types.
-
-@item -Wmultichar
-Warn if a multicharacter constant (@samp{'FOOF'}) is used. Usually they
-indicate a typo in the user's code, as they have implementation-defined
-values, and should not be used in portable code.
-
-@item -Wparentheses
-Warn if parentheses are omitted in certain contexts, such
-as when there is an assignment in a context where a truth value
-is expected, or when operators are nested whose precedence people
-often get confused about.
-
-Also warn about constructions where there may be confusion to which
-@code{if} statement an @code{else} branch belongs. Here is an example of
-such a case:
-
-@smallexample
-@{
- if (a)
- if (b)
- foo ();
- else
- bar ();
-@}
-@end smallexample
-
-In C, every @code{else} branch belongs to the innermost possible @code{if}
-statement, which in this example is @code{if (b)}. This is often not
-what the programmer expected, as illustrated in the above example by
-indentation the programmer chose. When there is the potential for this
-confusion, GNU C will issue a warning when this flag is specified.
-To eliminate the warning, add explicit braces around the innermost
-@code{if} statement so there is no way the @code{else} could belong to
-the enclosing @code{if}. The resulting code would look like this:
-
-@smallexample
-@{
- if (a)
- @{
- if (b)
- foo ();
- else
- bar ();
- @}
-@}
-@end smallexample
-
-@item -Wreturn-type
-Warn whenever a function is defined with a return-type that defaults
-to @code{int}. Also warn about any @code{return} statement with no
-return-value in a function whose return-type is not @code{void}.
-
-@item -Wswitch
-Warn whenever a @code{switch} statement has an index of enumeral type
-and lacks a @code{case} for one or more of the named codes of that
-enumeration. (The presence of a @code{default} label prevents this
-warning.) @code{case} labels outside the enumeration range also
-provoke warnings when this option is used.
-
-@item -Wtrigraphs
-Warn if any trigraphs are encountered (assuming they are enabled).
-
-@item -Wunused
-Warn whenever a variable is unused aside from its declaration,
-whenever a function is declared static but never defined, whenever a
-label is declared but not used, and whenever a statement computes a
-result that is explicitly not used.
-
-In order to get a warning about an unused function parameter, you must
-specify both @samp{-W} and @samp{-Wunused}.
-
-To suppress this warning for an expression, simply cast it to void. For
-unused variables, parameters and labels, use the @samp{unused} attribute
-(@pxref{Variable Attributes}).
-
-@item -Wuninitialized
-An automatic variable is used without first being initialized.
-
-These warnings are possible only in optimizing compilation,
-because they require data flow information that is computed only
-when optimizing. If you don't specify @samp{-O}, you simply won't
-get these warnings.
-
-These warnings occur only for variables that are candidates for
-register allocation. Therefore, they do not occur for a variable that
-is declared @code{volatile}, or whose address is taken, or whose size
-is other than 1, 2, 4 or 8 bytes. Also, they do not occur for
-structures, unions or arrays, even when they are in registers.
-
-Note that there may be no warning about a variable that is used only
-to compute a value that itself is never used, because such
-computations may be deleted by data flow analysis before the warnings
-are printed.
-
-These warnings are made optional because GNU CC is not smart
-enough to see all the reasons why the code might be correct
-despite appearing to have an error. Here is one example of how
-this can happen:
-
-@smallexample
-@{
- int x;
- switch (y)
- @{
- case 1: x = 1;
- break;
- case 2: x = 4;
- break;
- case 3: x = 5;
- @}
- foo (x);
-@}
-@end smallexample
-
-@noindent
-If the value of @code{y} is always 1, 2 or 3, then @code{x} is
-always initialized, but GNU CC doesn't know this. Here is
-another common case:
-
-@smallexample
-@{
- int save_y;
- if (change_y) save_y = y, y = new_y;
- @dots{}
- if (change_y) y = save_y;
-@}
-@end smallexample
-
-@noindent
-This has no bug because @code{save_y} is used only if it is set.
-
-Some spurious warnings can be avoided if you declare all the functions
-you use that never return as @code{noreturn}. @xref{Function
-Attributes}.
-
-@item -Wunknown-pragmas
-@cindex warning for unknown pragmas
-@cindex unknown pragmas, warning
-@cindex pragmas, warning of unknown
-Warn when a #pragma directive is encountered which is not understood by
-GCC. If this command line option is used, warnings will even be issued
-for unknown pragmas in system header files. This is not the case if
-the warnings were only enabled by the @samp{-Wall} command line option.
-
-@item -Wall
-All of the above @samp{-W} options combined. This enables all the
-warnings about constructions that some users consider questionable, and
-that are easy to avoid (or modify to prevent the warning), even in
-conjunction with macros.
-@end table
-
-The following @samp{-W@dots{}} options are not implied by @samp{-Wall}.
-Some of them warn about constructions that users generally do not
-consider questionable, but which occasionally you might wish to check
-for; others warn about constructions that are necessary or hard to avoid
-in some cases, and there is no simple way to modify the code to suppress
-the warning.
-
-@table @code
-@item -W
-Print extra warning messages for these events:
-
-@itemize @bullet
-@cindex @code{longjmp} warnings
-@item
-A nonvolatile automatic variable might be changed by a call to
-@code{longjmp}. These warnings as well are possible only in
-optimizing compilation.
-
-The compiler sees only the calls to @code{setjmp}. It cannot know
-where @code{longjmp} will be called; in fact, a signal handler could
-call it at any point in the code. As a result, you may get a warning
-even when there is in fact no problem because @code{longjmp} cannot
-in fact be called at the place which would cause a problem.
-
-@item
-A function can return either with or without a value. (Falling
-off the end of the function body is considered returning without
-a value.) For example, this function would evoke such a
-warning:
-
-@smallexample
-@group
-foo (a)
-@{
- if (a > 0)
- return a;
-@}
-@end group
-@end smallexample
-
-@item
-An expression-statement or the left-hand side of a comma expression
-contains no side effects.
-To suppress the warning, cast the unused expression to void.
-For example, an expression such as @samp{x[i,j]} will cause a warning,
-but @samp{x[(void)i,j]} will not.
-
-@item
-An unsigned value is compared against zero with @samp{<} or @samp{<=}.
-
-@item
-A comparison like @samp{x<=y<=z} appears; this is equivalent to
-@samp{(x<=y ? 1 : 0) <= z}, which is a different interpretation from
-that of ordinary mathematical notation.
-
-@item
-Storage-class specifiers like @code{static} are not the first things in
-a declaration. According to the C Standard, this usage is obsolescent.
-
-@item
-If @samp{-Wall} or @samp{-Wunused} is also specified, warn about unused
-arguments.
-
-@item
-A comparison between signed and unsigned values could produce an
-incorrect result when the signed value is converted to unsigned.
-(But don't warn if @samp{-Wno-sign-compare} is also specified.)
-
-@item
-An aggregate has a partly bracketed initializer.
-For example, the following code would evoke such a warning,
-because braces are missing around the initializer for @code{x.h}:
-
-@smallexample
-struct s @{ int f, g; @};
-struct t @{ struct s h; int i; @};
-struct t x = @{ 1, 2, 3 @};
-@end smallexample
-
-@item
-An aggregate has an initializer which does not initialize all members.
-For example, the following code would cause such a warning, because
-@code{x.h} would be implicitly initialized to zero:
-
-@smallexample
-struct s @{ int f, g, h; @};
-struct s x = @{ 3, 4 @};
-@end smallexample
-@end itemize
-
-@item -Wtraditional
-Warn about certain constructs that behave differently in traditional and
-ANSI C.
-
-@itemize @bullet
-@item
-Macro arguments occurring within string constants in the macro body.
-These would substitute the argument in traditional C, but are part of
-the constant in ANSI C.
-
-@item
-A function declared external in one block and then used after the end of
-the block.
-
-@item
-A @code{switch} statement has an operand of type @code{long}.
-@end itemize
-
-@item -Wundef
-Warn if an undefined identifier is evaluated in an @samp{#if} directive.
-
-@item -Wshadow
-Warn whenever a local variable shadows another local variable.
-
-@item -Wid-clash-@var{len}
-Warn whenever two distinct identifiers match in the first @var{len}
-characters. This may helpyou prepare a program that will compile
-with certain obsolete, brain-damaged compilers.
-
-@item -Wlarger-than-@var{len}
-Warn whenever an object of larger than @var{len} bytes is defined.
-
-@item -Wpointer-arith
-Warn about anything that depends on the ``size of'' a function type or
-of @code{void}. GNU C assigns these types a size of 1, for
-convenience in calculations with @code{void *} pointers and pointers
-to functions.
-
-@item -Wbad-function-cast
-Warn whenever a function call is cast to a non-matching type.
-For example, warn if @code{int malloc()} is cast to @code{anything *}.
-
-@item -Wcast-qual
-Warn whenever a pointer is cast so as to remove a type qualifier from
-the target type. For example, warn if a @code{const char *} is cast
-to an ordinary @code{char *}.
-
-@item -Wcast-align
-Warn whenever a pointer is cast such that the required alignment of the
-target is increased. For example, warn if a @code{char *} is cast to
-an @code{int *} on machines where integers can only be accessed at
-two- or four-byte boundaries.
-
-@item -Wwrite-strings
-Give string constants the type @code{const char[@var{length}]} so that
-copying the address of one into a non-@code{const} @code{char *}
-pointer will get a warning. These warnings will help you find at
-compile time code that can try to write into a string constant, but
-only if you have been very careful about using @code{const} in
-declarations and prototypes. Otherwise, it will just be a nuisance;
-this is why we did not make @samp{-Wall} request these warnings.
-
-@item -Wconversion
-Warn if a prototype causes a type conversion that is different from what
-would happen to the same argument in the absence of a prototype. This
-includes conversions of fixed point to floating and vice versa, and
-conversions changing the width or signedness of a fixed point argument
-except when the same as the default promotion.
-
-Also, warn if a negative integer constant expression is implicitly
-converted to an unsigned type. For example, warn about the assignment
-@code{x = -1} if @code{x} is unsigned. But do not warn about explicit
-casts like @code{(unsigned) -1}.
-
-@item -Wsign-compare
-@cindex warning for comparison of signed and unsigned values
-@cindex comparison of signed and unsigned values, warning
-@cindex signed and unsigned values, comparison warning
-Warn when a comparison between signed and unsigned values could produce
-an incorrect result when the signed value is converted to unsigned.
-This warning is also enabled by @samp{-W}; to get the other warnings
-of @samp{-W} without this warning, use @samp{-W -Wno-sign-compare}.
-
-@item -Waggregate-return
-Warn if any functions that return structures or unions are defined or
-called. (In languages where you can return an array, this also elicits
-a warning.)
-
-@item -Wstrict-prototypes
-Warn if a function is declared or defined without specifying the
-argument types. (An old-style function definition is permitted without
-a warning if preceded by a declaration which specifies the argument
-types.)
-
-@item -Wmissing-prototypes
-Warn if a global function is defined without a previous prototype
-declaration. This warning is issued even if the definition itself
-provides a prototype. The aim is to detect global functions that fail
-to be declared in header files.
-
-@item -Wmissing-declarations
-Warn if a global function is defined without a previous declaration.
-Do so even if the definition itself provides a prototype.
-Use this option to detect global functions that are not declared in
-header files.
-
-@item -Wmissing-noreturn
-Warn about functions which might be candidates for attribute @code{noreturn}.
-Note these are only possible candidates, not absolute ones. Care should
-be taken to manually verify functions actually do not ever return before
-adding the @code{noreturn} attribute, otherwise subtle code generation
-bugs could be introduced.
-
-@item -Wredundant-decls
-Warn if anything is declared more than once in the same scope, even in
-cases where multiple declaration is valid and changes nothing.
-
-@item -Wnested-externs
-Warn if an @code{extern} declaration is encountered within an function.
-
-@item -Winline
-Warn if a function can not be inlined, and either it was declared as inline,
-or else the @samp{-finline-functions} option was given.
-
-@item -Wlong-long
-Warn if @samp{long long} type is used. This is default. To inhibit
-the warning messages, use @samp{-Wno-long-long}. Flags
-@samp{-Wlong-long} and @samp{-Wno-long-long} are taken into account
-only when @samp{-pedantic} flag is used.
-
-@item -Werror
-Make all warnings into errors.
-@end table
-
-@node Debugging Options
-@section Options for Debugging Your Program or GNU CC
-@cindex options, debugging
-@cindex debugging information options
-
-GNU CC has various special options that are used for debugging
-either your program or GCC:
-
-@table @code
-@item -g
-Produce debugging information in the operating system's native format
-(stabs, COFF, XCOFF, or DWARF). GDB can work with this debugging
-information.
-
-On most systems that use stabs format, @samp{-g} enables use of extra
-debugging information that only GDB can use; this extra information
-makes debugging work better in GDB but will probably make other debuggers
-crash or
-refuse to read the program. If you want to control for certain whether
-to generate the extra information, use @samp{-gstabs+}, @samp{-gstabs},
-@samp{-gxcoff+}, @samp{-gxcoff}, @samp{-gdwarf-1+}, or @samp{-gdwarf-1}
-(see below).
-
-Unlike most other C compilers, GNU CC allows you to use @samp{-g} with
-@samp{-O}. The shortcuts taken by optimized code may occasionally
-produce surprising results: some variables you declared may not exist
-at all; flow of control may briefly move where you did not expect it;
-some statements may not be executed because they compute constant
-results or their values were already at hand; some statements may
-execute in different places because they were moved out of loops.
-
-Nevertheless it proves possible to debug optimized output. This makes
-it reasonable to use the optimizer for programs that might have bugs.
-
-The following options are useful when GNU CC is generated with the
-capability for more than one debugging format.
-
-@item -ggdb
-Produce debugging information for use by GDB. This means to use the
-most expressive format available (DWARF 2, stabs, or the native format
-if neither of those are supported), including GDB extensions if at all
-possible.
-
-@item -gstabs
-Produce debugging information in stabs format (if that is supported),
-without GDB extensions. This is the format used by DBX on most BSD
-systems. On MIPS, Alpha and System V Release 4 systems this option
-produces stabs debugging output which is not understood by DBX or SDB.
-On System V Release 4 systems this option requires the GNU assembler.
-
-@item -gstabs+
-Produce debugging information in stabs format (if that is supported),
-using GNU extensions understood only by the GNU debugger (GDB). The
-use of these extensions is likely to make other debuggers crash or
-refuse to read the program.
-
-@item -gcoff
-Produce debugging information in COFF format (if that is supported).
-This is the format used by SDB on most System V systems prior to
-System V Release 4.
-
-@item -gxcoff
-Produce debugging information in XCOFF format (if that is supported).
-This is the format used by the DBX debugger on IBM RS/6000 systems.
-
-@item -gxcoff+
-Produce debugging information in XCOFF format (if that is supported),
-using GNU extensions understood only by the GNU debugger (GDB). The
-use of these extensions is likely to make other debuggers crash or
-refuse to read the program, and may cause assemblers other than the GNU
-assembler (GAS) to fail with an error.
-
-@item -gdwarf
-Produce debugging information in DWARF version 1 format (if that is
-supported). This is the format used by SDB on most System V Release 4
-systems.
-
-@item -gdwarf+
-Produce debugging information in DWARF version 1 format (if that is
-supported), using GNU extensions understood only by the GNU debugger
-(GDB). The use of these extensions is likely to make other debuggers
-crash or refuse to read the program.
-
-@item -gdwarf-2
-Produce debugging information in DWARF version 2 format (if that is
-supported). This is the format used by DBX on IRIX 6.
-
-@item -g@var{level}
-@itemx -ggdb@var{level}
-@itemx -gstabs@var{level}
-@itemx -gcoff@var{level}
-@itemx -gxcoff@var{level}
-@itemx -gdwarf@var{level}
-@itemx -gdwarf-2@var{level}
-Request debugging information and also use @var{level} to specify how
-much information. The default level is 2.
-
-Level 1 produces minimal information, enough for making backtraces in
-parts of the program that you don't plan to debug. This includes
-descriptions of functions and external variables, but no information
-about local variables and no line numbers.
-
-Level 3 includes extra information, such as all the macro definitions
-present in the program. Some debuggers support macro expansion when
-you use @samp{-g3}.
-
-@cindex @code{prof}
-@item -p
-Generate extra code to write profile information suitable for the
-analysis program @code{prof}. You must use this option when compiling
-the source files you want data about, and you must also use it when
-linking.
-
-@cindex @code{gprof}
-@item -pg
-Generate extra code to write profile information suitable for the
-analysis program @code{gprof}. You must use this option when compiling
-the source files you want data about, and you must also use it when
-linking.
-
-@cindex @code{tcov}
-@item -a
-Generate extra code to write profile information for basic blocks, which will
-record the number of times each basic block is executed, the basic block start
-address, and the function name containing the basic block. If @samp{-g} is
-used, the line number and filename of the start of the basic block will also be
-recorded. If not overridden by the machine description, the default action is
-to append to the text file @file{bb.out}.
-
-This data could be analyzed by a program like @code{tcov}. Note,
-however, that the format of the data is not what @code{tcov} expects.
-Eventually GNU @code{gprof} should be extended to process this data.
-
-@item -Q
-Makes the compiler print out each function name as it is compiled, and
-print some statistics about each pass when it finishes.
-
-@item -ax
-Generate extra code to profile basic blocks. Your executable will
-produce output that is a superset of that produced when @samp{-a} is
-used. Additional output is the source and target address of the basic
-blocks where a jump takes place, the number of times a jump is executed,
-and (optionally) the complete sequence of basic blocks being executed.
-The output is appended to file @file{bb.out}.
-
-You can examine different profiling aspects without recompilation. Your
-executable will read a list of function names from file @file{bb.in}.
-Profiling starts when a function on the list is entered and stops when
-that invocation is exited. To exclude a function from profiling, prefix
-its name with `-'. If a function name is not unique, you can
-disambiguate it by writing it in the form
-@samp{/path/filename.d:functionname}. Your executable will write the
-available paths and filenames in file @file{bb.out}.
-
-Several function names have a special meaning:
-@table @code
-@item __bb_jumps__
-Write source, target and frequency of jumps to file @file{bb.out}.
-@item __bb_hidecall__
-Exclude function calls from frequency count.
-@item __bb_showret__
-Include function returns in frequency count.
-@item __bb_trace__
-Write the sequence of basic blocks executed to file @file{bbtrace.gz}.
-The file will be compressed using the program @samp{gzip}, which must
-exist in your @code{PATH}. On systems without the @samp{popen}
-function, the file will be named @file{bbtrace} and will not be
-compressed. @strong{Profiling for even a few seconds on these systems
-will produce a very large file.} Note: @code{__bb_hidecall__} and
-@code{__bb_showret__} will not affect the sequence written to
-@file{bbtrace.gz}.
-@end table
-
-Here's a short example using different profiling parameters
-in file @file{bb.in}. Assume function @code{foo} consists of basic blocks
-1 and 2 and is called twice from block 3 of function @code{main}. After
-the calls, block 3 transfers control to block 4 of @code{main}.
-
-With @code{__bb_trace__} and @code{main} contained in file @file{bb.in},
-the following sequence of blocks is written to file @file{bbtrace.gz}:
-0 3 1 2 1 2 4. The return from block 2 to block 3 is not shown, because
-the return is to a point inside the block and not to the top. The
-block address 0 always indicates, that control is transferred
-to the trace from somewhere outside the observed functions. With
-@samp{-foo} added to @file{bb.in}, the blocks of function
-@code{foo} are removed from the trace, so only 0 3 4 remains.
-
-With @code{__bb_jumps__} and @code{main} contained in file @file{bb.in},
-jump frequencies will be written to file @file{bb.out}. The
-frequencies are obtained by constructing a trace of blocks
-and incrementing a counter for every neighbouring pair of blocks
-in the trace. The trace 0 3 1 2 1 2 4 displays the following
-frequencies:
-
-@example
-Jump from block 0x0 to block 0x3 executed 1 time(s)
-Jump from block 0x3 to block 0x1 executed 1 time(s)
-Jump from block 0x1 to block 0x2 executed 2 time(s)
-Jump from block 0x2 to block 0x1 executed 1 time(s)
-Jump from block 0x2 to block 0x4 executed 1 time(s)
-@end example
-
-With @code{__bb_hidecall__}, control transfer due to call instructions
-is removed from the trace, that is the trace is cut into three parts: 0
-3 4, 0 1 2 and 0 1 2. With @code{__bb_showret__}, control transfer due
-to return instructions is added to the trace. The trace becomes: 0 3 1
-2 3 1 2 3 4. Note, that this trace is not the same, as the sequence
-written to @file{bbtrace.gz}. It is solely used for counting jump
-frequencies.
-
-@item -fprofile-arcs
-Instrument @dfn{arcs} during compilation. For each function of your
-program, GNU CC creates a program flow graph, then finds a spanning tree
-for the graph. Only arcs that are not on the spanning tree have to be
-instrumented: the compiler adds code to count the number of times that these
-arcs are executed. When an arc is the only exit or only entrance to a
-block, the instrumentation code can be added to the block; otherwise, a
-new basic block must be created to hold the instrumentation code.
-
-Since not every arc in the program must be instrumented, programs
-compiled with this option run faster than programs compiled with
-@samp{-a}, which adds instrumentation code to every basic block in the
-program. The tradeoff: since @code{gcov} does not have
-execution counts for all branches, it must start with the execution
-counts for the instrumented branches, and then iterate over the program
-flow graph until the entire graph has been solved. Hence, @code{gcov}
-runs a little more slowly than a program which uses information from
-@samp{-a}.
-
-@samp{-fprofile-arcs} also makes it possible to estimate branch
-probabilities, and to calculate basic block execution counts. In
-general, basic block execution counts do not give enough information to
-estimate all branch probabilities. When the compiled program exits, it
-saves the arc execution counts to a file called
-@file{@var{sourcename}.da}. Use the compiler option
-@samp{-fbranch-probabilities} (@pxref{Optimize Options,,Options that
-Control Optimization}) when recompiling, to optimize using estimated
-branch probabilities.
-
-@need 2000
-@item -ftest-coverage
-Create data files for the @code{gcov} code-coverage utility
-(@pxref{Gcov,, @code{gcov}: a GNU CC Test Coverage Program}).
-The data file names begin with the name of your source file:
-
-@table @code
-@item @var{sourcename}.bb
-A mapping from basic blocks to line numbers, which @code{gcov} uses to
-associate basic block execution counts with line numbers.
-
-@item @var{sourcename}.bbg
-A list of all arcs in the program flow graph. This allows @code{gcov}
-to reconstruct the program flow graph, so that it can compute all basic
-block and arc execution counts from the information in the
-@code{@var{sourcename}.da} file (this last file is the output from
-@samp{-fprofile-arcs}).
-@end table
-
-@item -Q
-Makes the compiler print out each function name as it is compiled, and
-print some statistics about each pass when it finishes.
-
-@item -d@var{letters}
-Says to make debugging dumps during compilation at times specified by
-@var{letters}. This is used for debugging the compiler. The file names
-for most of the dumps are made by appending a word to the source file
-name (e.g. @file{foo.c.rtl} or @file{foo.c.jump}). Here are the
-possible letters for use in @var{letters}, and their meanings:
-
-@table @samp
-@item b
-Dump after computing branch probabilities, to @file{@var{file}.bp}.
-@item c
-Dump after instruction combination, to the file @file{@var{file}.combine}.
-@item d
-Dump after delayed branch scheduling, to @file{@var{file}.dbr}.
-@item D
-Dump all macro definitions, at the end of preprocessing, in addition to
-normal output.
-@item y
-Dump debugging information during parsing, to standard error.
-@item r
-Dump after RTL generation, to @file{@var{file}.rtl}.
-@item x
-Just generate RTL for a function instead of compiling it. Usually used
-with @samp{r}.
-@item j
-Dump after first jump optimization, to @file{@var{file}.jump}.
-@item s
-Dump after CSE (including the jump optimization that sometimes
-follows CSE), to @file{@var{file}.cse}.
-@item F
-Dump after purging ADDRESSOF, to @file{@var{file}.addressof}.
-@item f
-Dump after flow analysis, to @file{@var{file}.flow}.
-@item g
-Dump after global register allocation, to @file{@var{file}.greg}.
-@item G
-Dump after GCSE, to @file{@var{file}.gcse}.
-@item j
-Dump after first jump optimization, to @file{@var{file}.jump}.
-@item J
-Dump after last jump optimization, to @file{@var{file}.jump2}.
-@item k
-Dump after conversion from registers to stack, to @file{@var{file}.stack}.
-@item l
-Dump after local register allocation, to @file{@var{file}.lreg}.
-@item L
-Dump after loop optimization, to @file{@var{file}.loop}.
-@item M
-Dump after performing the machine dependent reorganisation pass, to
-@file{@var{file}.mach}.
-@item N
-Dump after the register move pass, to @file{@var{file}.regmove}.
-@item r
-Dump after RTL generation, to @file{@var{file}.rtl}.
-@item R
-Dump after the second instruction scheduling pass, to @file{@var{file}.sched2}.
-@item s
-Dump after CSE (including the jump optimization that sometimes follows
-CSE), to @file{@var{file}.cse}.
-@item S
-Dump after the first instruction scheduling pass, to @file{@var{file}.sched}.
-@item t
-Dump after the second CSE pass (including the jump optimization that
-sometimes follows CSE), to @file{@var{file}.cse2}.
-@item x
-Just generate RTL for a function instead of compiling it. Usually used
-with @samp{r}.
-@item a
-Produce all the dumps listed above.
-@item m
-Print statistics on memory usage, at the end of the run, to
-standard error.
-@item p
-Annotate the assembler output with a comment indicating which
-pattern and alternative was used.
-@item y
-Dump debugging information during parsing, to standard error.
-@item A
-Annotate the assembler output with miscellaneous debugging information.
-@end table
-
-@item -fdump-unnumbered
-When doing debugging dumps (see -d option above), suppress instruction
-numbers and line number note output. This makes it more feasible to
-use diff on debugging dumps for compiler invokations with different
-options, in particular with and without -g.
-
-@item -fpretend-float
-When running a cross-compiler, pretend that the target machine uses the
-same floating point format as the host machine. This causes incorrect
-output of the actual floating constants, but the actual instruction
-sequence will probably be the same as GNU CC would make when running on
-the target machine.
-
-@item -save-temps
-Store the usual ``temporary'' intermediate files permanently; place them
-in the current directory and name them based on the source file. Thus,
-compiling @file{foo.c} with @samp{-c -save-temps} would produce files
-@file{foo.i} and @file{foo.s}, as well as @file{foo.o}.
-
-@item -print-file-name=@var{library}
-Print the full absolute name of the library file @var{library} that
-would be used when linking---and don't do anything else. With this
-option, GNU CC does not compile or link anything; it just prints the
-file name.
-
-@item -print-prog-name=@var{program}
-Like @samp{-print-file-name}, but searches for a program such as @samp{cpp}.
-
-@item -print-libgcc-file-name
-Same as @samp{-print-file-name=libgcc.a}.
-
-This is useful when you use @samp{-nostdlib} or @samp{-nodefaultlibs}
-but you do want to link with @file{libgcc.a}. You can do
-
-@example
-gcc -nostdlib @var{files}@dots{} `gcc -print-libgcc-file-name`
-@end example
-
-@item -print-search-dirs
-Print the name of the configured installation directory and a list of
-program and library directories gcc will search---and don't do anything else.
-
-This is useful when gcc prints the error message
-@samp{installation problem, cannot exec cpp: No such file or directory}.
-To resolve this you either need to put @file{cpp} and the other compiler
-components where gcc expects to find them, or you can set the environment
-variable @code{GCC_EXEC_PREFIX} to the directory where you installed them.
-Don't forget the trailing '/'.
-@xref{Environment Variables}.
-@end table
-
-@node Optimize Options
-@section Options That Control Optimization
-@cindex optimize options
-@cindex options, optimization
-
-These options control various sorts of optimizations:
-
-@table @code
-@item -O
-@itemx -O1
-Optimize. Optimizing compilation takes somewhat more time, and a lot
-more memory for a large function.
-
-Without @samp{-O}, the compiler's goal is to reduce the cost of
-compilation and to make debugging produce the expected results.
-Statements are independent: if you stop the program with a breakpoint
-between statements, you can then assign a new value to any variable or
-change the program counter to any other statement in the function and
-get exactly the results you would expect from the source code.
-
-Without @samp{-O}, the compiler only allocates variables declared
-@code{register} in registers. The resulting compiled code is a little
-worse than produced by PCC without @samp{-O}.
-
-With @samp{-O}, the compiler tries to reduce code size and execution
-time.
-
-When you specify @samp{-O}, the compiler turns on @samp{-fthread-jumps}
-and @samp{-fdefer-pop} on all machines. The compiler turns on
-@samp{-fdelayed-branch} on machines that have delay slots, and
-@samp{-fomit-frame-pointer} on machines that can support debugging even
-without a frame pointer. On some machines the compiler also turns
-on other flags.@refill
-
-@item -O2
-Optimize even more. GNU CC performs nearly all supported optimizations
-that do not involve a space-speed tradeoff. The compiler does not
-perform loop unrolling or function inlining when you specify @samp{-O2}.
-As compared to @samp{-O}, this option increases both compilation time
-and the performance of the generated code.
-
-@samp{-O2} turns on all optional optimizations except for loop unrolling
-and function inlining. It also turns on the @samp{-fforce-mem} option
-on all machines and frame pointer elimination on machines where doing so
-does not interfere with debugging.
-
-@item -O3
-Optimize yet more. @samp{-O3} turns on all optimizations specified by
-@samp{-O2} and also turns on the @samp{inline-functions} option.
-
-@item -O0
-Do not optimize.
-
-@item -Os
-Optimize for size. @samp{-Os} enables all @samp{-O2} optimizations that
-do not typically increase code size. It also performs further
-optimizations designed to reduce code size.
-
-If you use multiple @samp{-O} options, with or without level numbers,
-the last such option is the one that is effective.
-@end table
-
-Options of the form @samp{-f@var{flag}} specify machine-independent
-flags. Most flags have both positive and negative forms; the negative
-form of @samp{-ffoo} would be @samp{-fno-foo}. In the table below,
-only one of the forms is listed---the one which is not the default.
-You can figure out the other form by either removing @samp{no-} or
-adding it.
-
-@table @code
-@item -ffloat-store
-Do not store floating point variables in registers, and inhibit other
-options that might change whether a floating point value is taken from a
-register or memory.
-
-@cindex floating point precision
-This option prevents undesirable excess precision on machines such as
-the 68000 where the floating registers (of the 68881) keep more
-precision than a @code{double} is supposed to have. Similarly for the
-x86 architecture. For most programs, the excess precision does only
-good, but a few programs rely on the precise definition of IEEE floating
-point. Use @samp{-ffloat-store} for such programs, after modifying
-them to store all pertinent intermediate computations into variables.
-
-@item -fno-default-inline
-Do not make member functions inline by default merely because they are
-defined inside the class scope (C++ only). Otherwise, when you specify
-@w{@samp{-O}}, member functions defined inside class scope are compiled
-inline by default; i.e., you don't need to add @samp{inline} in front of
-the member function name.
-
-@item -fno-defer-pop
-Always pop the arguments to each function call as soon as that function
-returns. For machines which must pop arguments after a function call,
-the compiler normally lets arguments accumulate on the stack for several
-function calls and pops them all at once.
-
-@item -fforce-mem
-Force memory operands to be copied into registers before doing
-arithmetic on them. This produces better code by making all memory
-references potential common subexpressions. When they are not common
-subexpressions, instruction combination should eliminate the separate
-register-load. The @samp{-O2} option turns on this option.
-
-@item -fforce-addr
-Force memory address constants to be copied into registers before
-doing arithmetic on them. This may produce better code just as
-@samp{-fforce-mem} may.
-
-@item -fomit-frame-pointer
-Don't keep the frame pointer in a register for functions that
-don't need one. This avoids the instructions to save, set up and
-restore frame pointers; it also makes an extra register available
-in many functions. @strong{It also makes debugging impossible on
-some machines.}
-
-@ifset INTERNALS
-On some machines, such as the Vax, this flag has no effect, because
-the standard calling sequence automatically handles the frame pointer
-and nothing is saved by pretending it doesn't exist. The
-machine-description macro @code{FRAME_POINTER_REQUIRED} controls
-whether a target machine supports this flag. @xref{Registers}.@refill
-@end ifset
-@ifclear INTERNALS
-On some machines, such as the Vax, this flag has no effect, because
-the standard calling sequence automatically handles the frame pointer
-and nothing is saved by pretending it doesn't exist. The
-machine-description macro @code{FRAME_POINTER_REQUIRED} controls
-whether a target machine supports this flag. @xref{Registers,,Register
-Usage, gcc.info, Using and Porting GCC}.@refill
-@end ifclear
-
-@item -fno-inline
-Don't pay attention to the @code{inline} keyword. Normally this option
-is used to keep the compiler from expanding any functions inline.
-Note that if you are not optimizing, no functions can be expanded inline.
-
-@item -finline-functions
-Integrate all simple functions into their callers. The compiler
-heuristically decides which functions are simple enough to be worth
-integrating in this way.
-
-If all calls to a given function are integrated, and the function is
-declared @code{static}, then the function is normally not output as
-assembler code in its own right.
-
-@item -fkeep-inline-functions
-Even if all calls to a given function are integrated, and the function
-is declared @code{static}, nevertheless output a separate run-time
-callable version of the function. This switch does not affect
-@code{extern inline} functions.
-
-@item -fkeep-static-consts
-Emit variables declared @code{static const} when optimization isn't turned
-on, even if the variables aren't referenced.
-
-GNU CC enables this option by default. If you want to force the compiler to
-check if the variable was referenced, regardless of whether or not
-optimization is turned on, use the @samp{-fno-keep-static-consts} option.
-
-@item -fno-function-cse
-Do not put function addresses in registers; make each instruction that
-calls a constant function contain the function's address explicitly.
-
-This option results in less efficient code, but some strange hacks
-that alter the assembler output may be confused by the optimizations
-performed when this option is not used.
-
-@item -ffast-math
-This option allows GCC to violate some ANSI or IEEE rules and/or
-specifications in the interest of optimizing code for speed. For
-example, it allows the compiler to assume arguments to the @code{sqrt}
-function are non-negative numbers and that no floating-point values
-are NaNs.
-
-This option should never be turned on by any @samp{-O} option since
-it can result in incorrect output for programs which depend on
-an exact implementation of IEEE or ANSI rules/specifications for
-math functions.
-@end table
-
-@c following causes underfulls.. they don't look great, but we deal.
-@c --mew 26jan93
-The following options control specific optimizations. The @samp{-O2}
-option turns on all of these optimizations except @samp{-funroll-loops}
-and @samp{-funroll-all-loops}. On most machines, the @samp{-O} option
-turns on the @samp{-fthread-jumps} and @samp{-fdelayed-branch} options,
-but specific machines may handle it differently.
-
-You can use the following flags in the rare cases when ``fine-tuning''
-of optimizations to be performed is desired.
-
-@table @code
-@item -fstrength-reduce
-Perform the optimizations of loop strength reduction and
-elimination of iteration variables.
-
-@item -fthread-jumps
-Perform optimizations where we check to see if a jump branches to a
-location where another comparison subsumed by the first is found. If
-so, the first branch is redirected to either the destination of the
-second branch or a point immediately following it, depending on whether
-the condition is known to be true or false.
-
-@item -fcse-follow-jumps
-In common subexpression elimination, scan through jump instructions
-when the target of the jump is not reached by any other path. For
-example, when CSE encounters an @code{if} statement with an
-@code{else} clause, CSE will follow the jump when the condition
-tested is false.
-
-@item -fcse-skip-blocks
-This is similar to @samp{-fcse-follow-jumps}, but causes CSE to
-follow jumps which conditionally skip over blocks. When CSE
-encounters a simple @code{if} statement with no else clause,
-@samp{-fcse-skip-blocks} causes CSE to follow the jump around the
-body of the @code{if}.
-
-@item -frerun-cse-after-loop
-Re-run common subexpression elimination after loop optimizations has been
-performed.
-
-@item -frerun-loop-opt
-Run the loop optimizer twice.
-
-@item -fgcse
-Perform a global common subexpression elimination pass.
-This pass also performs global constant and copy propagation.
-
-@c CYGNUS LOCAL LRS
-@item -flive-range
-Perform live range splitting of variables at loop boundaries. This option
-is enabled by default at @samp{-O2} optimization and higher for targets which
-use stabs debug symbols.
-@c END CYGNUS LOCAL
-
-@item -fexpensive-optimizations
-Perform a number of minor optimizations that are relatively expensive.
-
-@item -foptimize-register-moves
-@item -fregmove
-Attempt to reassign register numbers in move instructions and as
-operands of other simple instructions in order to maximize the amount of
-register tying. This is especially helpful on machines with two-operand
-instructions. GNU CC enables this optimization by default with @samp{-O2}
-or higher.
-
-Note @code{-fregmove} and @code{-foptimize-register-moves} are the same
-optimization.
-
-@item -fdelayed-branch
-If supported for the target machine, attempt to reorder instructions
-to exploit instruction slots available after delayed branch
-instructions.
-
-@item -fschedule-insns
-If supported for the target machine, attempt to reorder instructions to
-eliminate execution stalls due to required data being unavailable. This
-helps machines that have slow floating point or memory load instructions
-by allowing other instructions to be issued until the result of the load
-or floating point instruction is required.
-
-@item -fschedule-insns2
-Similar to @samp{-fschedule-insns}, but requests an additional pass of
-instruction scheduling after register allocation has been done. This is
-especially useful on machines with a relatively small number of
-registers and where memory load instructions take more than one cycle.
-
-@item -ffunction-sections
-@item -fdata-sections
-Place each function or data item into its own section in the output
-file if the target supports arbitrary sections. The name of the
-function or the name of the data item determines the section's name
-in the output file.
-
-Use these options on systems where the linker can perform optimizations
-to improve locality of reference in the instruction space. HPPA
-processors running HP-UX and Sparc processors running Solaris 2 have
-linkers with such optimizations. Other systems using the ELF object format
-as well as AIX may have these optimizations in the future.
-
-Only use these options when there are significant benefits from doing
-so. When you specify these options, the assembler and linker will
-create larger object and executable files and will also be slower.
-You will not be able to use @code{gprof} on all systems if you
-specify this option and you may have problems with debugging if
-you specify both this option and @samp{-g}.
-
-@item -fcaller-saves
-Enable values to be allocated in registers that will be clobbered by
-function calls, by emitting extra instructions to save and restore the
-registers around such calls. Such allocation is done only when it
-seems to result in better code than would otherwise be produced.
-
-This option is always enabled by default on certain machines, usually
-those which have no call-preserved registers to use instead.
-
-For all machines, optimization level 2 and higher enables this flag by
-default.
-
-@item -funroll-loops
-Perform the optimization of loop unrolling. This is only done for loops
-whose number of iterations can be determined at compile time or run time.
-@samp{-funroll-loop} implies both @samp{-fstrength-reduce} and
-@samp{-frerun-cse-after-loop}.
-
-@item -funroll-all-loops
-Perform the optimization of loop unrolling. This is done for all loops
-and usually makes programs run more slowly. @samp{-funroll-all-loops}
-implies @samp{-fstrength-reduce} as well as @samp{-frerun-cse-after-loop}.
-
-@item -fmove-all-movables
-Forces all invariant computations in loops to be moved
-outside the loop.
-
-@item -freduce-all-givs
-Forces all general-induction variables in loops to be
-strength-reduced.
-
-@emph{Note:} When compiling programs written in Fortran,
-@samp{-fmove-all-moveables} and @samp{-freduce-all-givs} are enabled
-by default when you use the optimizer.
-
-These options may generate better or worse code; results are highly
-dependent on the structure of loops within the source code.
-
-These two options are intended to be removed someday, once
-they have helped determine the efficacy of various
-approaches to improving loop optimizations.
-
-Please let us (@code{egcs@@cygnus.com} and @code{fortran@@gnu.org})
-know how use of these options affects
-the performance of your production code.
-We're very interested in code that runs @emph{slower}
-when these options are @emph{enabled}.
-
-@item -fno-peephole
-Disable any machine-specific peephole optimizations.
-
-@item -fbranch-probabilities
-After running a program compiled with @samp{-fprofile-arcs}
-(@pxref{Debugging Options,, Options for Debugging Your Program or
-@code{gcc}}), you can compile it a second time using
-@samp{-fbranch-probabilities}, to improve optimizations based on
-guessing the path a branch might take.
-
-@ifset INTERNALS
-With @samp{-fbranch-probabilities}, GCC puts a @samp{REG_EXEC_COUNT}
-note on the first instruction of each basic block, and a
-@samp{REG_BR_PROB} note on each @samp{JUMP_INSN} and @samp{CALL_INSN}.
-These can be used to improve optimization. Currently, they are only
-used in one place: in @file{reorg.c}, instead of guessing which path a
-branch is mostly to take, the @samp{REG_BR_PROB} values are used to
-exactly determine which path is taken more often.
-@end ifset
-
-@item -fstrict-aliasing
-Allows the compiler to assume the strictest aliasing rules applicable to
-the language being compiled. For C (and C++), this activates
-optimizations based on the type of expressions. In particular, an
-object of one type is assumed never to reside at the same address as an
-object of a different type, unless the types are almost the same. For
-example, an @code{unsigned int} can alias an @code{int}, but not a
-@code{void*} or a @code{double}. A character type may alias any other
-type.
-
-Pay special attention to code like this:
-@example
-union a_union @{
- int i;
- double d;
-@};
-
-int f() @{
- a_union t;
- t.d = 3.0;
- return t.i;
-@}
-@end example
-The practice of reading from a different union member than the one most
-recently written to (called ``type-punning'') is common. Even with
-@samp{-fstrict-aliasing}, type-punning is allowed, provided the memory
-is accessed through the union type. So, the code above will work as
-expected. However, this code might not:
-@example
-int f() @{
- a_union t;
- int* ip;
- t.d = 3.0;
- ip = &t.i;
- return *ip;
-@}
-@end example
-
-@ifset INTERNALS
-Every language that wishes to perform language-specific alias analysis
-should define a function that computes, given an @code{tree}
-node, an alias set for the node. Nodes in different alias sets are not
-allowed to alias. For an example, see the C front-end function
-@code{c_get_alias_set}.
-@end ifset
-
-@end table
-
-@node Preprocessor Options
-@section Options Controlling the Preprocessor
-@cindex preprocessor options
-@cindex options, preprocessor
-
-These options control the C preprocessor, which is run on each C source
-file before actual compilation.
-
-If you use the @samp{-E} option, nothing is done except preprocessing.
-Some of these options make sense only together with @samp{-E} because
-they cause the preprocessor output to be unsuitable for actual
-compilation.
-
-@table @code
-@item -include @var{file}
-Process @var{file} as input before processing the regular input file.
-In effect, the contents of @var{file} are compiled first. Any @samp{-D}
-and @samp{-U} options on the command line are always processed before
-@samp{-include @var{file}}, regardless of the order in which they are
-written. All the @samp{-include} and @samp{-imacros} options are
-processed in the order in which they are written.
-
-@item -imacros @var{file}
-Process @var{file} as input, discarding the resulting output, before
-processing the regular input file. Because the output generated from
-@var{file} is discarded, the only effect of @samp{-imacros @var{file}}
-is to make the macros defined in @var{file} available for use in the
-main input.
-
-Any @samp{-D} and @samp{-U} options on the command line are always
-processed before @samp{-imacros @var{file}}, regardless of the order in
-which they are written. All the @samp{-include} and @samp{-imacros}
-options are processed in the order in which they are written.
-
-@item -idirafter @var{dir}
-@cindex second include path
-Add the directory @var{dir} to the second include path. The directories
-on the second include path are searched when a header file is not found
-in any of the directories in the main include path (the one that
-@samp{-I} adds to).
-
-@item -iprefix @var{prefix}
-Specify @var{prefix} as the prefix for subsequent @samp{-iwithprefix}
-options.
-
-@item -iwithprefix @var{dir}
-Add a directory to the second include path. The directory's name is
-made by concatenating @var{prefix} and @var{dir}, where @var{prefix} was
-specified previously with @samp{-iprefix}. If you have not specified a
-prefix yet, the directory containing the installed passes of the
-compiler is used as the default.
-
-@item -iwithprefixbefore @var{dir}
-Add a directory to the main include path. The directory's name is made
-by concatenating @var{prefix} and @var{dir}, as in the case of
-@samp{-iwithprefix}.
-
-@item -isystem @var{dir}
-Add a directory to the beginning of the second include path, marking it
-as a system directory, so that it gets the same special treatment as
-is applied to the standard system directories.
-
-@item -isystem-c++ @var{dir}
-Same behavior as with @samp{-isystem}, but do not make headers in @var{dir} be
-implicitly evaluated as if they include the @samp{extern "C"} linkage
-specification.
-
-@item -nostdinc
-Do not search the standard system directories for header files. Only
-the directories you have specified with @samp{-I} options (and the
-current directory, if appropriate) are searched. @xref{Directory
-Options}, for information on @samp{-I}.
-
-By using both @samp{-nostdinc} and @samp{-I-}, you can limit the include-file
-search path to only those directories you specify explicitly.
-
-@item -undef
-Do not predefine any nonstandard macros. (Including architecture flags).
-
-@item -E
-Run only the C preprocessor. Preprocess all the C source files
-specified and output the results to standard output or to the
-specified output file.
-
-@item -C
-Tell the preprocessor not to discard comments. Used with the
-@samp{-E} option.
-
-@item -P
-Tell the preprocessor not to generate @samp{#line} directives.
-Used with the @samp{-E} option.
-
-@cindex make
-@cindex dependencies, make
-@item -M
-Tell the preprocessor to output a rule suitable for @code{make}
-describing the dependencies of each object file. For each source file,
-the preprocessor outputs one @code{make}-rule whose target is the object
-file name for that source file and whose dependencies are all the
-@code{#include} header files it uses. This rule may be a single line or
-may be continued with @samp{\}-newline if it is long. The list of rules
-is printed on standard output instead of the preprocessed C program.
-
-@samp{-M} implies @samp{-E}.
-
-Another way to specify output of a @code{make} rule is by setting
-the environment variable @code{DEPENDENCIES_OUTPUT} (@pxref{Environment
-Variables}).
-
-@item -MM
-Like @samp{-M} but the output mentions only the user header files
-included with @samp{#include "@var{file}"}. System header files
-included with @samp{#include <@var{file}>} are omitted.
-
-@item -MD
-Like @samp{-M} but the dependency information is written to a file made by
-replacing ".c" with ".d" at the end of the input file names.
-This is in addition to compiling the file as specified---@samp{-MD} does
-not inhibit ordinary compilation the way @samp{-M} does.
-
-In Mach, you can use the utility @code{md} to merge multiple dependency
-files into a single dependency file suitable for using with the @samp{make}
-command.
-
-@item -MMD
-Like @samp{-MD} except mention only user header files, not system
-header files.
-
-@item -MG
-Treat missing header files as generated files and assume they live in the
-same directory as the source file. If you specify @samp{-MG}, you
-must also specify either @samp{-M} or @samp{-MM}. @samp{-MG} is not
-supported with @samp{-MD} or @samp{-MMD}.
-
-@item -H
-Print the name of each header file used, in addition to other normal
-activities.
-
-@item -A@var{question}(@var{answer})
-Assert the answer @var{answer} for @var{question}, in case it is tested
-with a preprocessing conditional such as @samp{#if
-#@var{question}(@var{answer})}. @samp{-A-} disables the standard
-assertions that normally describe the target machine.
-
-@item -D@var{macro}
-Define macro @var{macro} with the string @samp{1} as its definition.
-
-@item -D@var{macro}=@var{defn}
-Define macro @var{macro} as @var{defn}. All instances of @samp{-D} on
-the command line are processed before any @samp{-U} options.
-
-@item -U@var{macro}
-Undefine macro @var{macro}. @samp{-U} options are evaluated after all
-@samp{-D} options, but before any @samp{-include} and @samp{-imacros}
-options.
-
-@item -dM
-Tell the preprocessor to output only a list of the macro definitions
-that are in effect at the end of preprocessing. Used with the @samp{-E}
-option.
-
-@item -dD
-Tell the preprocessing to pass all macro definitions into the output, in
-their proper sequence in the rest of the output.
-
-@item -dN
-Like @samp{-dD} except that the macro arguments and contents are omitted.
-Only @samp{#define @var{name}} is included in the output.
-
-@item -trigraphs
-Support ANSI C trigraphs. The @samp{-ansi} option also has this effect.
-
-@item -Wp,@var{option}
-Pass @var{option} as an option to the preprocessor. If @var{option}
-contains commas, it is split into multiple options at the commas.
-@end table
-
-@node Assembler Options
-@section Passing Options to the Assembler
-
-@c prevent bad page break with this line
-You can pass options to the assembler.
-
-@table @code
-@item -Wa,@var{option}
-Pass @var{option} as an option to the assembler. If @var{option}
-contains commas, it is split into multiple options at the commas.
-@end table
-
-@node Link Options
-@section Options for Linking
-@cindex link options
-@cindex options, linking
-
-These options come into play when the compiler links object files into
-an executable output file. They are meaningless if the compiler is
-not doing a link step.
-
-@table @code
-@cindex file names
-@item @var{object-file-name}
-A file name that does not end in a special recognized suffix is
-considered to name an object file or library. (Object files are
-distinguished from libraries by the linker according to the file
-contents.) If linking is done, these object files are used as input
-to the linker.
-
-@item -c
-@itemx -S
-@itemx -E
-If any of these options is used, then the linker is not run, and
-object file names should not be used as arguments. @xref{Overall
-Options}.
-
-@cindex Libraries
-@item -l@var{library}
-Search the library named @var{library} when linking.
-
-It makes a difference where in the command you write this option; the
-linker searches processes libraries and object files in the order they
-are specified. Thus, @samp{foo.o -lz bar.o} searches library @samp{z}
-after file @file{foo.o} but before @file{bar.o}. If @file{bar.o} refers
-to functions in @samp{z}, those functions may not be loaded.
-
-The linker searches a standard list of directories for the library,
-which is actually a file named @file{lib@var{library}.a}. The linker
-then uses this file as if it had been specified precisely by name.
-
-The directories searched include several standard system directories
-plus any that you specify with @samp{-L}.
-
-Normally the files found this way are library files---archive files
-whose members are object files. The linker handles an archive file by
-scanning through it for members which define symbols that have so far
-been referenced but not defined. But if the file that is found is an
-ordinary object file, it is linked in the usual fashion. The only
-difference between using an @samp{-l} option and specifying a file name
-is that @samp{-l} surrounds @var{library} with @samp{lib} and @samp{.a}
-and searches several directories.
-
-@item -lobjc
-You need this special case of the @samp{-l} option in order to
-link an Objective C program.
-
-@item -nostartfiles
-Do not use the standard system startup files when linking.
-The standard system libraries are used normally, unless @code{-nostdlib}
-or @code{-nodefaultlibs} is used.
-
-@item -nodefaultlibs
-Do not use the standard system libraries when linking.
-Only the libraries you specify will be passed to the linker.
-The standard startup files are used normally, unless @code{-nostartfiles}
-is used. The compiler may generate calls to memcmp, memset, and memcpy
-for System V (and ANSI C) environments or to bcopy and bzero for
-BSD environments. These entries are usually resolved by entries in
-libc. These entry points should be supplied through some other
-mechanism when this option is specified.
-
-@item -nostdlib
-Do not use the standard system startup files or libraries when linking.
-No startup files and only the libraries you specify will be passed to
-the linker. The compiler may generate calls to memcmp, memset, and memcpy
-for System V (and ANSI C) environments or to bcopy and bzero for
-BSD environments. These entries are usually resolved by entries in
-libc. These entry points should be supplied through some other
-mechanism when this option is specified.
-
-@cindex @code{-lgcc}, use with @code{-nostdlib}
-@cindex @code{-nostdlib} and unresolved references
-@cindex unresolved references and @code{-nostdlib}
-@cindex @code{-lgcc}, use with @code{-nodefaultlibs}
-@cindex @code{-nodefaultlibs} and unresolved references
-@cindex unresolved references and @code{-nodefaultlibs}
-One of the standard libraries bypassed by @samp{-nostdlib} and
-@samp{-nodefaultlibs} is @file{libgcc.a}, a library of internal subroutines
-that GNU CC uses to overcome shortcomings of particular machines, or special
-needs for some languages.
-@ifset INTERNALS
-(@xref{Interface,,Interfacing to GNU CC Output}, for more discussion of
-@file{libgcc.a}.)
-@end ifset
-@ifclear INTERNALS
-(@xref{Interface,,Interfacing to GNU CC Output,gcc.info,Porting GNU CC},
-for more discussion of @file{libgcc.a}.)
-@end ifclear
-In most cases, you need @file{libgcc.a} even when you want to avoid
-other standard libraries. In other words, when you specify @samp{-nostdlib}
-or @samp{-nodefaultlibs} you should usually specify @samp{-lgcc} as well.
-This ensures that you have no unresolved references to internal GNU CC
-library subroutines. (For example, @samp{__main}, used to ensure C++
-constructors will be called; @pxref{Collect2,,@code{collect2}}.)
-
-@item -s
-Remove all symbol table and relocation information from the executable.
-
-@item -static
-On systems that support dynamic linking, this prevents linking with the shared
-libraries. On other systems, this option has no effect.
-
-@item -shared
-Produce a shared object which can then be linked with other objects to
-form an executable. Not all systems support this option. You must
-also specify @samp{-fpic} or @samp{-fPIC} on some systems when
-you specify this option.
-
-@item -symbolic
-Bind references to global symbols when building a shared object. Warn
-about any unresolved references (unless overridden by the link editor
-option @samp{-Xlinker -z -Xlinker defs}). Only a few systems support
-this option.
-
-@item -Xlinker @var{option}
-Pass @var{option} as an option to the linker. You can use this to
-supply system-specific linker options which GNU CC does not know how to
-recognize.
-
-If you want to pass an option that takes an argument, you must use
-@samp{-Xlinker} twice, once for the option and once for the argument.
-For example, to pass @samp{-assert definitions}, you must write
-@samp{-Xlinker -assert -Xlinker definitions}. It does not work to write
-@samp{-Xlinker "-assert definitions"}, because this passes the entire
-string as a single argument, which is not what the linker expects.
-
-@item -Wl,@var{option}
-Pass @var{option} as an option to the linker. If @var{option} contains
-commas, it is split into multiple options at the commas.
-
-@item -u @var{symbol}
-Pretend the symbol @var{symbol} is undefined, to force linking of
-library modules to define it. You can use @samp{-u} multiple times with
-different symbols to force loading of additional library modules.
-@end table
-
-@node Directory Options
-@section Options for Directory Search
-@cindex directory options
-@cindex options, directory search
-@cindex search path
-
-These options specify directories to search for header files, for
-libraries and for parts of the compiler:
-
-@table @code
-@item -I@var{dir}
-Add the directory @var{dir} to the head of the list of directories to be
-searched for header files. This can be used to override a system header
-file, substituting your own version, since these directories are
-searched before the system header file directories. If you use more
-than one @samp{-I} option, the directories are scanned in left-to-right
-order; the standard system directories come after.
-
-@item -I-
-Any directories you specify with @samp{-I} options before the @samp{-I-}
-option are searched only for the case of @samp{#include "@var{file}"};
-they are not searched for @samp{#include <@var{file}>}.
-
-If additional directories are specified with @samp{-I} options after
-the @samp{-I-}, these directories are searched for all @samp{#include}
-directives. (Ordinarily @emph{all} @samp{-I} directories are used
-this way.)
-
-In addition, the @samp{-I-} option inhibits the use of the current
-directory (where the current input file came from) as the first search
-directory for @samp{#include "@var{file}"}. There is no way to
-override this effect of @samp{-I-}. With @samp{-I.} you can specify
-searching the directory which was current when the compiler was
-invoked. That is not exactly the same as what the preprocessor does
-by default, but it is often satisfactory.
-
-@samp{-I-} does not inhibit the use of the standard system directories
-for header files. Thus, @samp{-I-} and @samp{-nostdinc} are
-independent.
-
-@item -L@var{dir}
-Add directory @var{dir} to the list of directories to be searched
-for @samp{-l}.
-
-@item -B@var{prefix}
-This option specifies where to find the executables, libraries,
-include files, and data files of the compiler itself.
-
-The compiler driver program runs one or more of the subprograms
-@file{cpp}, @file{cc1}, @file{as} and @file{ld}. It tries
-@var{prefix} as a prefix for each program it tries to run, both with and
-without @samp{@var{machine}/@var{version}/} (@pxref{Target Options}).
-
-For each subprogram to be run, the compiler driver first tries the
-@samp{-B} prefix, if any. If that name is not found, or if @samp{-B}
-was not specified, the driver tries two standard prefixes, which are
-@file{/usr/lib/gcc/} and @file{/usr/local/lib/gcc-lib/}. If neither of
-those results in a file name that is found, the unmodified program
-name is searched for using the directories specified in your
-@samp{PATH} environment variable.
-
-@samp{-B} prefixes that effectively specify directory names also apply
-to libraries in the linker, because the compiler translates these
-options into @samp{-L} options for the linker. They also apply to
-includes files in the preprocessor, because the compiler translates these
-options into @samp{-isystem} options for the preprocessor. In this case,
-the compiler appends @samp{include} to the prefix.
-
-The run-time support file @file{libgcc.a} can also be searched for using
-the @samp{-B} prefix, if needed. If it is not found there, the two
-standard prefixes above are tried, and that is all. The file is left
-out of the link if it is not found by those means.
-
-Another way to specify a prefix much like the @samp{-B} prefix is to use
-the environment variable @code{GCC_EXEC_PREFIX}. @xref{Environment
-Variables}.
-
-@item -specs=@var{file}
-Process @var{file} after the compiler reads in the standard @file{specs}
-file, in order to override the defaults that the @file{gcc} driver
-program uses when determining what switches to pass to @file{cc1},
-@file{cc1plus}, @file{as}, @file{ld}, etc. More than one
-@samp{-specs=}@var{file} can be specified on the command line, and they
-are processed in order, from left to right.
-@end table
-
-@node Target Options
-@section Specifying Target Machine and Compiler Version
-@cindex target options
-@cindex cross compiling
-@cindex specifying machine version
-@cindex specifying compiler version and target machine
-@cindex compiler version, specifying
-@cindex target machine, specifying
-
-By default, GNU CC compiles code for the same type of machine that you
-are using. However, it can also be installed as a cross-compiler, to
-compile for some other type of machine. In fact, several different
-configurations of GNU CC, for different target machines, can be
-installed side by side. Then you specify which one to use with the
-@samp{-b} option.
-
-In addition, older and newer versions of GNU CC can be installed side
-by side. One of them (probably the newest) will be the default, but
-you may sometimes wish to use another.
-
-@table @code
-@item -b @var{machine}
-The argument @var{machine} specifies the target machine for compilation.
-This is useful when you have installed GNU CC as a cross-compiler.
-
-The value to use for @var{machine} is the same as was specified as the
-machine type when configuring GNU CC as a cross-compiler. For
-example, if a cross-compiler was configured with @samp{configure
-i386v}, meaning to compile for an 80386 running System V, then you
-would specify @samp{-b i386v} to run that cross compiler.
-
-When you do not specify @samp{-b}, it normally means to compile for
-the same type of machine that you are using.
-
-@item -V @var{version}
-The argument @var{version} specifies which version of GNU CC to run.
-This is useful when multiple versions are installed. For example,
-@var{version} might be @samp{2.0}, meaning to run GNU CC version 2.0.
-
-The default version, when you do not specify @samp{-V}, is the last
-version of GNU CC that you installed.
-@end table
-
-The @samp{-b} and @samp{-V} options actually work by controlling part of
-the file name used for the executable files and libraries used for
-compilation. A given version of GNU CC, for a given target machine, is
-normally kept in the directory @file{/usr/local/lib/gcc-lib/@var{machine}/@var{version}}.@refill
-
-Thus, sites can customize the effect of @samp{-b} or @samp{-V} either by
-changing the names of these directories or adding alternate names (or
-symbolic links). If in directory @file{/usr/local/lib/gcc-lib/} the
-file @file{80386} is a link to the file @file{i386v}, then @samp{-b
-80386} becomes an alias for @samp{-b i386v}.
-
-In one respect, the @samp{-b} or @samp{-V} do not completely change
-to a different compiler: the top-level driver program @code{gcc}
-that you originally invoked continues to run and invoke the other
-executables (preprocessor, compiler per se, assembler and linker)
-that do the real work. However, since no real work is done in the
-driver program, it usually does not matter that the driver program
-in use is not the one for the specified target and version.
-
-The only way that the driver program depends on the target machine is
-in the parsing and handling of special machine-specific options.
-However, this is controlled by a file which is found, along with the
-other executables, in the directory for the specified version and
-target machine. As a result, a single installed driver program adapts
-to any specified target machine and compiler version.
-
-The driver program executable does control one significant thing,
-however: the default version and target machine. Therefore, you can
-install different instances of the driver program, compiled for
-different targets or versions, under different names.
-
-For example, if the driver for version 2.0 is installed as @code{ogcc}
-and that for version 2.1 is installed as @code{gcc}, then the command
-@code{gcc} will use version 2.1 by default, while @code{ogcc} will use
-2.0 by default. However, you can choose either version with either
-command with the @samp{-V} option.
-
-@node Submodel Options
-@section Hardware Models and Configurations
-@cindex submodel options
-@cindex specifying hardware config
-@cindex hardware models and configurations, specifying
-@cindex machine dependent options
-
-Earlier we discussed the standard option @samp{-b} which chooses among
-different installed compilers for completely different target
-machines, such as Vax vs. 68000 vs. 80386.
-
-In addition, each of these target machine types can have its own
-special options, starting with @samp{-m}, to choose among various
-hardware models or configurations---for example, 68010 vs 68020,
-floating coprocessor or none. A single installed version of the
-compiler can compile for any model or configuration, according to the
-options specified.
-
-Some configurations of the compiler also support additional special
-options, usually for compatibility with other compilers on the same
-platform.
-
-@ifset INTERNALS
-These options are defined by the macro @code{TARGET_SWITCHES} in the
-machine description. The default for the options is also defined by
-that macro, which enables you to change the defaults.
-@end ifset
-
-@c CYGNUS LOCAL: z8k docs
-@c CYGNUS LOCAL -- meissner/d10v
-
-@menu
-* M680x0 Options::
-* VAX Options::
-* SPARC Options::
-* Convex Options::
-* AMD29K Options::
-* ARM Options::
-* Thumb Options::
-* MN10200 Options::
-* MN10300 Options::
-* M32R/D/X Options::
-* M88K Options::
-* RS/6000 and PowerPC Options::
-* RT Options::
-* MIPS Options::
-* i386 Options::
-* HPPA Options::
-* Intel 960 Options::
-* DEC Alpha Options::
-* Clipper Options::
-* H8/300 Options::
-* SH Options::
-* System V Options::
-* Z8000 Option::
-* V850 Options::
-* NS32K Options::
-* ARC Options::
-* D10V Options::
-@c CYGNUS LOCAL d30v yes, the blank line is needed.
-
-* D30V Options::
-@c END CYGNUS LOCAL
-
-@end menu
-
-@node M680x0 Options
-@subsection M680x0 Options
-@cindex M680x0 options
-
-These are the @samp{-m} options defined for the 68000 series. The default
-values for these options depends on which style of 68000 was selected when
-the compiler was configured; the defaults for the most common choices are
-given below.
-
-@table @code
-@item -m68000
-@itemx -mc68000
-Generate output for a 68000. This is the default
-when the compiler is configured for 68000-based systems.
-
-Use this option for microcontrollers with a 68000 or EC000 core,
-including the 68008, 68302, 68306, 68307, 68322, 68328 and 68356.
-
-@item -m68020
-@itemx -mc68020
-Generate output for a 68020. This is the default
-when the compiler is configured for 68020-based systems.
-
-@item -m68881
-Generate output containing 68881 instructions for floating point.
-This is the default for most 68020 systems unless @samp{-nfp} was
-specified when the compiler was configured.
-
-@item -m68030
-Generate output for a 68030. This is the default when the compiler is
-configured for 68030-based systems.
-
-@item -m68040
-Generate output for a 68040. This is the default when the compiler is
-configured for 68040-based systems.
-
-This option inhibits the use of 68881/68882 instructions that have to be
-emulated by software on the 68040. Use this option if your 68040 does not
-have code to emulate those instructions.
-
-@item -m68060
-Generate output for a 68060. This is the default when the compiler is
-configured for 68060-based systems.
-
-This option inhibits the use of 68020 and 68881/68882 instructions that
-have to be emulated by software on the 68060. Use this option if your 68060
-does not have code to emulate those instructions.
-
-@item -mcpu32
-Generate output for a CPU32. This is the default
-when the compiler is configured for CPU32-based systems.
-
-Use this option for microcontrollers with a
-CPU32 or CPU32+ core, including the 68330, 68331, 68332, 68333, 68334,
-68336, 68340, 68341, 68349 and 68360.
-
-@item -m5200
-Generate output for a 520X "coldfire" family cpu. This is the default
-when the compiler is configured for 520X-based systems.
-
-Use this option for microcontroller with a 5200 core, including
-the MCF5202, MCF5203, MCF5204 and MCF5202.
-
-
-@item -m68020-40
-Generate output for a 68040, without using any of the new instructions.
-This results in code which can run relatively efficiently on either a
-68020/68881 or a 68030 or a 68040. The generated code does use the
-68881 instructions that are emulated on the 68040.
-
-@item -m68020-60
-Generate output for a 68060, without using any of the new instructions.
-This results in code which can run relatively efficiently on either a
-68020/68881 or a 68030 or a 68040. The generated code does use the
-68881 instructions that are emulated on the 68060.
-
-@item -mfpa
-Generate output containing Sun FPA instructions for floating point.
-
-@item -msoft-float
-Generate output containing library calls for floating point.
-@strong{Warning:} the requisite libraries are not available for all m68k
-targets. Normally the facilities of the machine's usual C compiler are
-used, but this can't be done directly in cross-compilation. You must
-make your own arrangements to provide suitable library functions for
-cross-compilation. The embedded targets @samp{m68k-*-aout} and
-@samp{m68k-*-coff} do provide software floating point support.
-
-@item -mshort
-Consider type @code{int} to be 16 bits wide, like @code{short int}.
-
-@item -mnobitfield
-Do not use the bit-field instructions. The @samp{-m68000}, @samp{-mcpu32}
-and @samp{-m5200} options imply @w{@samp{-mnobitfield}}.
-
-@item -mbitfield
-Do use the bit-field instructions. The @samp{-m68020} option implies
-@samp{-mbitfield}. This is the default if you use a configuration
-designed for a 68020.
-
-@item -mrtd
-Use a different function-calling convention, in which functions
-that take a fixed number of arguments return with the @code{rtd}
-instruction, which pops their arguments while returning. This
-saves one instruction in the caller since there is no need to pop
-the arguments there.
-
-This calling convention is incompatible with the one normally
-used on Unix, so you cannot use it if you need to call libraries
-compiled with the Unix compiler.
-
-Also, you must provide function prototypes for all functions that
-take variable numbers of arguments (including @code{printf});
-otherwise incorrect code will be generated for calls to those
-functions.
-
-In addition, seriously incorrect code will result if you call a
-function with too many arguments. (Normally, extra arguments are
-harmlessly ignored.)
-
-The @code{rtd} instruction is supported by the 68010, 68020, 68030,
-68040, 68060 and CPU32 processors, but not by the 68000 or 5200.
-
-@item -malign-int
-@itemx -mno-align-int
-Control whether GNU CC aligns @code{int}, @code{long}, @code{long long},
-@code{float}, @code{double}, and @code{long double} variables on a 32-bit
-boundary (@samp{-malign-int}) or a 16-bit boundary (@samp{-mno-align-int}).
-Aligning variables on 32-bit boundaries produces code that runs somewhat
-faster on processors with 32-bit busses at the expense of more memory.
-
-@strong{Warning:} if you use the @samp{-malign-int} switch, GNU CC will
-align structures containing the above types differently than
-most published application binary interface specifications for the m68k.
-
-@end table
-
-@node VAX Options
-@subsection VAX Options
-@cindex VAX options
-
-These @samp{-m} options are defined for the Vax:
-
-@table @code
-@item -munix
-Do not output certain jump instructions (@code{aobleq} and so on)
-that the Unix assembler for the Vax cannot handle across long
-ranges.
-
-@item -mgnu
-Do output those jump instructions, on the assumption that you
-will assemble with the GNU assembler.
-
-@item -mg
-Output code for g-format floating point numbers instead of d-format.
-@end table
-
-@node SPARC Options
-@subsection SPARC Options
-@cindex SPARC options
-
-These @samp{-m} switches are supported on the SPARC:
-
-@table @code
-@item -mno-app-regs
-@itemx -mapp-regs
-Specify @samp{-mapp-regs} to generate output using the global registers
-2 through 4, which the SPARC SVR4 ABI reserves for applications. This
-is the default.
-
-To be fully SVR4 ABI compliant at the cost of some performance loss,
-specify @samp{-mno-app-regs}. You should compile libraries and system
-software with this option.
-
-@item -mfpu
-@itemx -mhard-float
-Generate output containing floating point instructions. This is the
-default.
-
-@item -mno-fpu
-@itemx -msoft-float
-Generate output containing library calls for floating point.
-@strong{Warning:} the requisite libraries are not available for all SPARC
-targets. Normally the facilities of the machine's usual C compiler are
-used, but this cannot be done directly in cross-compilation. You must make
-your own arrangements to provide suitable library functions for
-cross-compilation. The embedded targets @samp{sparc-*-aout} and
-@samp{sparclite-*-*} do provide software floating point support.
-
-@samp{-msoft-float} changes the calling convention in the output file;
-therefore, it is only useful if you compile @emph{all} of a program with
-this option. In particular, you need to compile @file{libgcc.a}, the
-library that comes with GNU CC, with @samp{-msoft-float} in order for
-this to work.
-
-@item -mhard-quad-float
-Generate output containing quad-word (long double) floating point
-instructions.
-
-@item -msoft-quad-float
-Generate output containing library calls for quad-word (long double)
-floating point instructions. The functions called are those specified
-in the SPARC ABI. This is the default.
-
-As of this writing, there are no sparc implementations that have hardware
-support for the quad-word floating point instructions. They all invoke
-a trap handler for one of these instructions, and then the trap handler
-emulates the effect of the instruction. Because of the trap handler overhead,
-this is much slower than calling the ABI library routines. Thus the
-@samp{-msoft-quad-float} option is the default.
-
-@item -mno-epilogue
-@itemx -mepilogue
-With @samp{-mepilogue} (the default), the compiler always emits code for
-function exit at the end of each function. Any function exit in
-the middle of the function (such as a return statement in C) will
-generate a jump to the exit code at the end of the function.
-
-With @samp{-mno-epilogue}, the compiler tries to emit exit code inline
-at every function exit.
-
-@item -mno-flat
-@itemx -mflat
-With @samp{-mflat}, the compiler does not generate save/restore instructions
-and will use a "flat" or single register window calling convention.
-This model uses %i7 as the frame pointer and is compatible with the normal
-register window model. Code from either may be intermixed.
-The local registers and the input registers (0-5) are still treated as
-"call saved" registers and will be saved on the stack as necessary.
-
-With @samp{-mno-flat} (the default), the compiler emits save/restore
-instructions (except for leaf functions) and is the normal mode of operation.
-
-@item -mno-unaligned-doubles
-@itemx -munaligned-doubles
-Assume that doubles have 8 byte alignment. This is the default.
-
-With @samp{-munaligned-doubles}, GNU CC assumes that doubles have 8 byte
-alignment only if they are contained in another type, or if they have an
-absolute address. Otherwise, it assumes they have 4 byte alignment.
-Specifying this option avoids some rare compatibility problems with code
-generated by other compilers. It is not the default because it results
-in a performance loss, especially for floating point code.
-
-@item -mv8
-@itemx -msparclite
-These two options select variations on the SPARC architecture.
-
-By default (unless specifically configured for the Fujitsu SPARClite),
-GCC generates code for the v7 variant of the SPARC architecture.
-
-@samp{-mv8} will give you SPARC v8 code. The only difference from v7
-code is that the compiler emits the integer multiply and integer
-divide instructions which exist in SPARC v8 but not in SPARC v7.
-
-@samp{-msparclite} will give you SPARClite code. This adds the integer
-multiply, integer divide step and scan (@code{ffs}) instructions which
-exist in SPARClite but not in SPARC v7.
-
-These options are deprecated and will be deleted in GNU CC 2.9.
-They have been replaced with @samp{-mcpu=xxx}.
-
-@item -mcypress
-@itemx -msupersparc
-These two options select the processor for which the code is optimised.
-
-With @samp{-mcypress} (the default), the compiler optimizes code for the
-Cypress CY7C602 chip, as used in the SparcStation/SparcServer 3xx series.
-This is also appropriate for the older SparcStation 1, 2, IPX etc.
-
-With @samp{-msupersparc} the compiler optimizes code for the SuperSparc cpu, as
-used in the SparcStation 10, 1000 and 2000 series. This flag also enables use
-of the full SPARC v8 instruction set.
-
-These options are deprecated and will be deleted in GNU CC 2.9.
-They have been replaced with @samp{-mcpu=xxx}.
-
-@item -mcpu=@var{cpu_type}
-Set the instruction set, register set, and instruction scheduling parameters
-for machine type @var{cpu_type}. Supported values for @var{cpu_type} are
-@samp{v7}, @samp{cypress}, @samp{v8}, @samp{supersparc}, @samp{sparclite},
-@samp{hypersparc}, @samp{sparclite86x}, @samp{f930}, @samp{f934},
-@samp{sparclet}, @samp{tsc701}, @samp{v9}, and @samp{ultrasparc}.
-
-Default instruction scheduling parameters are used for values that select
-an architecture and not an implementation. These are @samp{v7}, @samp{v8},
-@samp{sparclite}, @samp{sparclet}, @samp{v9}.
-
-Here is a list of each supported architecture and their supported
-implementations.
-
-@smallexample
- v7: cypress
- v8: supersparc, hypersparc
- sparclite: f930, f934, sparclite86x
- sparclet: tsc701
- v9: ultrasparc
-@end smallexample
-
-@item -mtune=@var{cpu_type}
-Set the instruction scheduling parameters for machine type
-@var{cpu_type}, but do not set the instruction set or register set that the
-option @samp{-mcpu=}@var{cpu_type} would.
-
-The same values for @samp{-mcpu=}@var{cpu_type} are used for
-@samp{-mtune=}@*@var{cpu_type}, though the only useful values are those that
-select a particular cpu implementation: @samp{cypress}, @samp{supersparc},
-@samp{hypersparc}, @samp{f930}, @samp{f934}, @samp{sparclite86x},
-@samp{tsc701}, @samp{ultrasparc}.
-
-@item -malign-loops=@var{num}
-Align loops to a 2 raised to a @var{num} byte boundary. If
-@samp{-malign-loops} is not specified, the default is 2.
-
-@item -malign-jumps=@var{num}
-Align instructions that are only jumped to to a 2 raised to a @var{num}
-byte boundary. If @samp{-malign-jumps} is not specified, the default is 2.
-
-@item -malign-functions=@var{num}
-Align the start of functions to a 2 raised to @var{num} byte boundary.
-If @samp{-malign-functions} is not specified, the default is 2 if compiling
-for 32 bit sparc, and 5 if compiling for 64 bit sparc.
-
-@end table
-
-These @samp{-m} switches are supported in addition to the above
-on the SPARCLET processor.
-
-@table @code
-@item -mlittle-endian
-Generate code for a processor running in little-endian mode.
-
-@item -mlive-g0
-Treat register @code{%g0} as a normal register.
-GCC will continue to clobber it as necessary but will not assume
-it always reads as 0.
-
-@item -mbroken-saverestore
-Generate code that does not use non-trivial forms of the @code{save} and
-@code{restore} instructions. Early versions of the SPARCLET processor do
-not correctly handle @code{save} and @code{restore} instructions used with
-arguments. They correctly handle them used without arguments. A @code{save}
-instruction used without arguments increments the current window pointer
-but does not allocate a new stack frame. It is assumed that the window
-overflow trap handler will properly handle this case as will interrupt
-handlers.
-@end table
-
-These @samp{-m} switches are supported in addition to the above
-on SPARC V9 processors in 64 bit environments.
-
-@table @code
-@item -mlittle-endian
-Generate code for a processor running in little-endian mode.
-
-@item -m32
-@itemx -m64
-Generate code for a 32 bit or 64 bit environment.
-The 32 bit environment sets int, long and pointer to 32 bits.
-The 64 bit environment sets int to 32 bits and long and pointer
-to 64 bits.
-
-@item -mcmodel=medlow
-Generate code for the Medium/Low code model: the program must be linked
-in the low 32 bits of the address space. Pointers are 64 bits.
-Programs can be statically or dynamically linked.
-
-@item -mcmodel=medmid
-Generate code for the Medium/Middle code model: the program must be linked
-in the low 44 bits of the address space, the text segment must be less than
-2G bytes, and data segment must be within 2G of the text segment.
-Pointers are 64 bits.
-
-@item -mcmodel=medany
-Generate code for the Medium/Anywhere code model: the program may be linked
-anywhere in the address space, the text segment must be less than
-2G bytes, and data segment must be within 2G of the text segment.
-Pointers are 64 bits.
-
-@item -mcmodel=embmedany
-Generate code for the Medium/Anywhere code model for embedded systems:
-assume a 32 bit text and a 32 bit data segment, both starting anywhere
-(determined at link time). Register %g4 points to the base of the
-data segment. Pointers still 64 bits.
-Programs are statically linked, PIC is not supported.
-
-@item -mstack-bias
-@itemx -mno-stack-bias
-With @samp{-mstack-bias}, GNU CC assumes that the stack pointer, and
-frame pointer if present, are offset by -2047 which must be added back
-when making stack frame references.
-Otherwise, assume no such offset is present.
-@end table
-
-@node Convex Options
-@subsection Convex Options
-@cindex Convex options
-
-These @samp{-m} options are defined for Convex:
-
-@table @code
-@item -mc1
-Generate output for C1. The code will run on any Convex machine.
-The preprocessor symbol @code{__convex__c1__} is defined.
-
-@item -mc2
-Generate output for C2. Uses instructions not available on C1.
-Scheduling and other optimizations are chosen for max performance on C2.
-The preprocessor symbol @code{__convex_c2__} is defined.
-
-@item -mc32
-Generate output for C32xx. Uses instructions not available on C1.
-Scheduling and other optimizations are chosen for max performance on C32.
-The preprocessor symbol @code{__convex_c32__} is defined.
-
-@item -mc34
-Generate output for C34xx. Uses instructions not available on C1.
-Scheduling and other optimizations are chosen for max performance on C34.
-The preprocessor symbol @code{__convex_c34__} is defined.
-
-@item -mc38
-Generate output for C38xx. Uses instructions not available on C1.
-Scheduling and other optimizations are chosen for max performance on C38.
-The preprocessor symbol @code{__convex_c38__} is defined.
-
-@item -margcount
-Generate code which puts an argument count in the word preceding each
-argument list. This is compatible with regular CC, and a few programs
-may need the argument count word. GDB and other source-level debuggers
-do not need it; this info is in the symbol table.
-
-@item -mnoargcount
-Omit the argument count word. This is the default.
-
-@item -mvolatile-cache
-Allow volatile references to be cached. This is the default.
-
-@item -mvolatile-nocache
-Volatile references bypass the data cache, going all the way to memory.
-This is only needed for multi-processor code that does not use standard
-synchronization instructions. Making non-volatile references to volatile
-locations will not necessarily work.
-
-@item -mlong32
-Type long is 32 bits, the same as type int. This is the default.
-
-@item -mlong64
-Type long is 64 bits, the same as type long long. This option is useless,
-because no library support exists for it.
-@end table
-
-@node AMD29K Options
-@subsection AMD29K Options
-@cindex AMD29K options
-
-These @samp{-m} options are defined for the AMD Am29000:
-
-@table @code
-@item -mdw
-@kindex -mdw
-@cindex DW bit (29k)
-Generate code that assumes the @code{DW} bit is set, i.e., that byte and
-halfword operations are directly supported by the hardware. This is the
-default.
-
-@item -mndw
-@kindex -mndw
-Generate code that assumes the @code{DW} bit is not set.
-
-@item -mbw
-@kindex -mbw
-@cindex byte writes (29k)
-Generate code that assumes the system supports byte and halfword write
-operations. This is the default.
-
-@item -mnbw
-@kindex -mnbw
-Generate code that assumes the systems does not support byte and
-halfword write operations. @samp{-mnbw} implies @samp{-mndw}.
-
-@item -msmall
-@kindex -msmall
-@cindex memory model (29k)
-Use a small memory model that assumes that all function addresses are
-either within a single 256 KB segment or at an absolute address of less
-than 256k. This allows the @code{call} instruction to be used instead
-of a @code{const}, @code{consth}, @code{calli} sequence.
-
-@item -mnormal
-@kindex -mnormal
-Use the normal memory model: Generate @code{call} instructions only when
-calling functions in the same file and @code{calli} instructions
-otherwise. This works if each file occupies less than 256 KB but allows
-the entire executable to be larger than 256 KB. This is the default.
-
-@item -mlarge
-Always use @code{calli} instructions. Specify this option if you expect
-a single file to compile into more than 256 KB of code.
-
-@item -m29050
-@kindex -m29050
-@cindex processor selection (29k)
-Generate code for the Am29050.
-
-@item -m29000
-@kindex -m29000
-Generate code for the Am29000. This is the default.
-
-@item -mkernel-registers
-@kindex -mkernel-registers
-@cindex kernel and user registers (29k)
-Generate references to registers @code{gr64-gr95} instead of to
-registers @code{gr96-gr127}. This option can be used when compiling
-kernel code that wants a set of global registers disjoint from that used
-by user-mode code.
-
-Note that when this option is used, register names in @samp{-f} flags
-must use the normal, user-mode, names.
-
-@item -muser-registers
-@kindex -muser-registers
-Use the normal set of global registers, @code{gr96-gr127}. This is the
-default.
-
-@item -mstack-check
-@itemx -mno-stack-check
-@kindex -mstack-check
-@cindex stack checks (29k)
-Insert (or do not insert) a call to @code{__msp_check} after each stack
-adjustment. This is often used for kernel code.
-
-@item -mstorem-bug
-@itemx -mno-storem-bug
-@kindex -mstorem-bug
-@cindex storem bug (29k)
-@samp{-mstorem-bug} handles 29k processors which cannot handle the
-separation of a mtsrim insn and a storem instruction (most 29000 chips
-to date, but not the 29050).
-
-@item -mno-reuse-arg-regs
-@itemx -mreuse-arg-regs
-@kindex -mreuse-arg-regs
-@samp{-mno-reuse-arg-regs} tells the compiler to only use incoming argument
-registers for copying out arguments. This helps detect calling a function
-with fewer arguments than it was declared with.
-
-@item -mno-impure-text
-@itemx -mimpure-text
-@kindex -mimpure-text
-@samp{-mimpure-text}, used in addition to @samp{-shared}, tells the compiler to
-not pass @samp{-assert pure-text} to the linker when linking a shared object.
-
-@item -msoft-float
-@kindex -msoft-float
-Generate output containing library calls for floating point.
-@strong{Warning:} the requisite libraries are not part of GNU CC.
-Normally the facilities of the machine's usual C compiler are used, but
-this can't be done directly in cross-compilation. You must make your
-own arrangements to provide suitable library functions for
-cross-compilation.
-@end table
-
-@node ARM Options
-@subsection ARM Options
-@cindex ARM options
-
-These @samp{-m} options are defined for Advanced RISC Machines (ARM)
-architectures:
-
-@table @code
-@item -mapcs-frame
-@kindex -mapcs-frame
-Generate a stack frame that is compliant with the ARM Procedure Call
-Standard for all functions, even if this is not strictly necessary for
-correct execution of the code. Specifying @samp{-fomit-frame-pointer}
-with this option will cause the stack frames not to be generated for
-leaf functions. The default is @samp{-mno-apcs-frame}.
-
-@item -mapcs
-@kindex -mapcs
-This is a synonym for @samp{-mapcs-frame}.
-
-@item -mapcs-26
-@kindex -mapcs-26
-Generate code for a processor running with a 26-bit program counter,
-and conforming to the function calling standards for the APCS 26-bit
-option. This option replaces the @samp{-m2} and @samp{-m3} options
-of previous releases of the compiler.
-
-@item -mapcs-32
-@kindex -mapcs-32
-Generate code for a processor running with a 32-bit program counter,
-and conforming to the function calling standards for the APCS 32-bit
-option. This option replaces the @samp{-m6} option of previous releases
-of the compiler.
-
-@item -mapcs-stack-check
-@kindex -mapcs-stack-check
-@kindex -mno-apcs-stack-check
-Generate code to check the amount of stack space available upon entry to
-every function (that actually uses some stack space). If there is
-insufficient space available then either the function
-@samp{__rt_stkovf_split_small} or @samp{__rt_stkovf_split_big} will be
-called, depending upon the amount of stack space required. The run time
-system is required to provide these functions. The default is
-@samp{-mno-apcs-stack-check}, since this produces smaller code.
-
-@item -mapcs-float
-@kindex -mapcs-float
-@kindex -mno-apcs-float
-Pass floating point arguments using the float point registers. This is
-one of the variants of the APCS. This option is reccommended if the
-target hardware has a floating point unit or if a lot of floating point
-arithmetic is going to be performed by the code. The default is
-@samp{-mno-apcs-float}, since integer only code is slightly increased in
-size if @samp{-mapcs-float} is used.
-
-@item -mapcs-reentrant
-@kindex -mapcs-reentrant
-@kindex -mno-apcs-reentrant
-Generate reentrant, position independent code. This is the equivalent
-to specifying the @samp{-fpic} option. The default is
-@samp{-mno-apcs-reentrant}.
-
-@item -mthumb-interwork
-@kindex -mthumb-interwork
-@kindex -mno-thumb-interwork
-Generate code which supports calling between the ARM and THUMB
-instruction sets. Without this option the two instruction sets cannot
-be reliably used inside one program. The default is
-@samp{-mno-thumb-interwork}, since slightly larger code is generated
-when @samp{-mthumb-interwork} is specified.
-
-@item -mno-sched-prolog
-@kindex -mno-sched-prolog
-@kindex -msched-prolog
-Prevent the reordering of instructions in the function prolog, or the
-merging of those instruction with the instructions in the function's
-body. This means that all functions will start with a recognisable set
-of instructions (or in fact one of a chioce from a small set of
-different function prologues), and this information can be used to
-locate the start if functions inside an executable piece of code. The
-default is @samp{-msched-prolog}.
-
-@item -mhard-float
-Generate output containing floating point instructions. This is the
-default.
-
-@item -msoft-float
-Generate output containing library calls for floating point.
-@strong{Warning:} the requisite libraries are not available for all ARM
-targets. Normally the facilities of the machine's usual C compiler are
-used, but this cannot be done directly in cross-compilation. You must make
-your own arrangements to provide suitable library functions for
-cross-compilation.
-
-@samp{-msoft-float} changes the calling convention in the output file;
-therefore, it is only useful if you compile @emph{all} of a program with
-this option. In particular, you need to compile @file{libgcc.a}, the
-library that comes with GNU CC, with @samp{-msoft-float} in order for
-this to work.
-
-@item -mlittle-endian
-Generate code for a processor running in little-endian mode. This is
-the default for all standard configurations.
-
-@item -mbig-endian
-Generate code for a processor running in big-endian mode; the default is
-to compile code for a little-endian processor.
-
-@item -mwords-little-endian
-This option only applies when generating code for big-endian processors.
-Generate code for a little-endian word order but a big-endian byte
-order. That is, a byte order of the form @samp{32107654}. Note: this
-option should only be used if you require compatibility with code for
-big-endian ARM processors generated by versions of the compiler prior to
-2.8.
-
-@item -mshort-load-bytes
-@kindex -mshort-load-bytes
-Do not try to load half-words (eg @samp{short}s) by loading a word from
-an unaligned address. For some targets the MMU is configured to trap
-unaligned loads; use this option to generate code that is safe in these
-environments.
-
-@item -mno-short-load-bytes
-@kindex -mno-short-load-bytes
-Use unaligned word loads to load half-words (eg @samp{short}s). This
-option produces more efficient code, but the MMU is sometimes configured
-to trap these instructions.
-
-@item -mshort-load-words
-@kindex -mshort-load-words
-This is a synonym for the @samp{-mno-short-load-bytes}.
-
-@item -mno-short-load-words
-@kindex -mno-short-load-words
-This is a synonym for the @samp{-mshort-load-bytes}.
-
-@item -mbsd
-@kindex -mbsd
-This option only applies to RISC iX. Emulate the native BSD-mode
-compiler. This is the default if @samp{-ansi} is not specified.
-
-@item -mxopen
-@kindex -mxopen
-This option only applies to RISC iX. Emulate the native X/Open-mode
-compiler.
-
-@item -mno-symrename
-@kindex -mno-symrename
-This option only applies to RISC iX. Do not run the assembler
-post-processor, @samp{symrename}, after code has been assembled.
-Normally it is necessary to modify some of the standard symbols in
-preparation for linking with the RISC iX C library; this option
-suppresses this pass. The post-processor is never run when the
-compiler is built for cross-compilation.
-
-@item -mcpu=<name>
-@kindex -mcpu=
-This specifies the name of the target ARM processor. GCC uses this name
-to determine what kind of instructions it can use when generating
-assembly code. Permissable names are: arm2, arm250, arm3, arm6, arm60,
-arm600, arm610, arm620, arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi,
-arm70, arm700, arm700i, arm710, arm710c, arm7100, arm7500, arm7500fe,
-arm7tdmi, arm8, strongarm, strongarm110
-
-@item -march=<name>
-@kindex -march=
-This specifies the name of the target ARM architecture. GCC uses this
-name to determine what kind of instructions it can use when generating
-assembly code. This option can be used in conjunction with or instead
-of the @samp{-mcpu=} option. Permissable names are: armv2, armv2a,
-armv3, armv3m, armv4, armv4t
-
-@item -mfpe=<number>
-@kindex -mfpe=
-This specifes the version of the floating point emulation available on
-the target. Permissable values are 2 and 3.
-
-@item -mstructure-size-boundary=<n>
-@kindex -mstructure-size-boundary
-The size of all structures and unions will be rounded up to a multiple
-of the number of bits set by this option. Permissable values are 8 and
-32. The default value varies for different toolchains. For the COFF
-targeted toolchain the default value is 8. Specifying the larger number
-can produced faster, more efficient code, but can also increase the size
-of the program. The two values are potentially incompatible. Code
-compiled with one value cannot necessarily expect to work with code or
-libraries compiled with the other value, if they exchange information
-using structures or unions. Programmers are encouraged to use the 32
-value as future versions of the toolchain may default to this value.
-
-@item -mabort-on-noreturn
-@kindex -mabort-on-noreturn
-@kindex -mnoabort-on-noreturn
-Generate a call to the function abort at the end of a noreturn function.
-It will be executed if the function tries to return.
-
-@c CYGNUS LOCAL nickc/thumb-pe
-@item -mnop-fun-dllimport
-@kindex -mnop-fun-dllimport
-Disable the support for the @emph{dllimport} attribute.
-
-@c END CYGNUS LOCAL
-
-@end table
-
-
-@node Thumb Options
-@subsection Thumb Options
-@cindex Thumb Options
-
-@table @code
-
-@item -mthumb-interwork
-@kindex -mthumb-interwork
-@kindex -mno-thumb-interwork
-Generate code which supports calling between the THUMB and ARM
-instruction sets. Without this option the two instruction sets cannot
-be reliably used inside one program. The default is
-@samp{-mno-thumb-interwork}, since slightly smaller code is generated
-with this option.
-
-@item -mtpcs-frame
-@kindex -mtpcs-frame
-@kindex -mno-tpcs-frame
-Generate a stack frame that is compliant with the Thumb Procedure Call
-Standard for all non-leaf functions. (A leaf function is one that does
-not call any other functions). The default is @samp{-mno-apcs-frame}.
-
-@item -mtpcs-leaf-frame
-@kindex -mtpcs-leaf-frame
-@kindex -mno-tpcs-leaf-frame
-Generate a stack frame that is compliant with the Thumb Procedure Call
-Standard for all leaf functions. (A leaf function is one that does
-not call any other functions). The default is @samp{-mno-apcs-leaf-frame}.
-
-@item -mlittle-endian
-@kindex -mlittle-endian
-Generate code for a processor running in little-endian mode. This is
-the default for all standard configurations.
-
-@item -mbig-endian
-@kindex -mbig-endian
-Generate code for a processor running in big-endian mode.
-
-@item -mstructure-size-boundary=<n>
-@kindex -mstructure-size-boundary
-The size of all structures and unions will be rounded up to a multiple
-of the number of bits set by this option. Permissable values are 8 and
-32. The default value varies for different toolchains. For the COFF
-targeted toolchain the default value is 8. Specifying the larger number
-can produced faster, more efficient code, but can also increase the size
-of the program. The two values are potentially incompatible. Code
-compiled with one value cannot necessarily expect to work with code or
-libraries compiled with the other value, if they exchange information
-using structures or unions. Programmers are encouraged to use the 32
-value as future versions of the toolchain may default to this value.
-
-@c CYGNUS LOCAL nickc/thumb-pe
-@item -mnop-fun-dllimport
-@kindex -mnop-fun-dllimport
-Disable the support for the @emph{dllimport} attribute.
-
-@item -mcallee-super-interworking
-@kindex -mcallee-super-interworking
-Gives all externally visible functions in the file being compiled an ARM
-instruction set header which switches to Thumb mode before executing the
-rest of the function. This allows these functions to be called from
-non-interworking code.
-
-@item -mcaller-super-interworking
-@kindex -mcaller-super-interworking
-Allows calls via function pointers (including virtual functions) to
-execute correctly regardless of whether the target code has been
-compiled for interworking or not. There is a small overhead in the cost
-of executing a funciton pointer if this option is enabled.
-
-@c END CYGNUS LOCAL
-
-@end table
-
-@node MN10200 Options
-@subsection MN10200 Options
-@cindex MN10200 options
-These @samp{-m} options are defined for Matsushita MN10200 architectures:
-@table @code
-
-@item -mrelax
-Indicate to the linker that it should perform a relaxation optimization pass
-to shorten branches, calls and absolute memory addresses. This option only
-has an effect when used on the command line for the final link step.
-
-This option makes symbolic debugging impossible.
-@end table
-
-@node MN10300 Options
-@subsection MN10300 Options
-@cindex MN10300 options
-These @samp{-m} options are defined for Matsushita MN10300 architectures:
-
-@table @code
-@item -mmult-bug
-Generate code to avoid bugs in the multiply instructions for the MN10300
-processors. This is the default.
-
-@item -mno-mult-bug
-Do not generate code to avoid bugs in the multiply instructions for the
-MN10300 processors.
-
-@item -mrelax
-Indicate to the linker that it should perform a relaxation optimization pass
-to shorten branches, calls and absolute memory addresses. This option only
-has an effect when used on the command line for the final link step.
-
-This option makes symbolic debugging impossible.
-@end table
-
-
-@node M32R/D/X Options
-@subsection M32R/D/X Options
-@cindex M32R/D/X options
-
-These @samp{-m} options are defined for Mitsubishi M32R/D/X architectures:
-
-@table @code
-@item -mcode-model=small
-Assume all objects live in the lower 16MB of memory (so that their addresses
-can be loaded with the @code{ld24} instruction), and assume all subroutines
-are reachable with the @code{bl} instruction.
-This is the default.
-
-The addressability of a particular object can be set with the
-@code{model} attribute.
-
-@item -mcode-model=medium
-Assume objects may be anywhere in the 32 bit address space (the compiler
-will generate @code{seth/add3} instructions to load their addresses), and
-assume all subroutines are reachable with the @code{bl} instruction.
-
-@item -mcode-model=large
-Assume objects may be anywhere in the 32 bit address space (the compiler
-will generate @code{seth/add3} instructions to load their addresses), and
-assume subroutines may not be reachable with the @code{bl} instruction
-(the compiler will generate the much slower @code{seth/add3/jl}
-instruction sequence).
-
-@item -msdata=none
-Disable use of the small data area. Variables will be put into
-one of @samp{.data}, @samp{bss}, or @samp{.rodata} (unless the
-@code{section} attribute has been specified).
-This is the default.
-
-The small data area consists of sections @samp{.sdata} and @samp{.sbss}.
-Objects may be explicitly put in the small data area with the
-@code{section} attribute using one of these sections.
-
-@item -msdata=sdata
-Put small global and static data in the small data area, but do not
-generate special code to reference them.
-
-@item -msdata=use
-Put small global and static data in the small data area, and generate
-special instructions to reference them.
-
-@item -G @var{num}
-@cindex smaller data references
-Put global and static objects less than or equal to @var{num} bytes
-into the small data or bss sections instead of the normal data or bss
-sections. The default value of @var{num} is 8.
-The @samp{-msdata} option must be set to one of @samp{sdata} or @samp{use}
-for this option to have any effect.
-
-All modules should be compiled with the same @samp{-G @var{num}} value.
-Compiling with different values of @var{num} may or may not work; if it
-doesn't the linker will give an error message - incorrect code will not be
-generated.
-
-@item -m32rx
-@cindex m32rx instruction set
-Enable support for the extended m32rx instruction set. If this option
-is given to the compiler then the compile time constant __M32RX__ will
-automatically be defined.
-
-@item -m32r
-@cindex m32r instruction set
-Disable support for the extended m32rx instruction set, and just use the
-ordinary m32r instruction set instead.
-
-@item -mcond-exec=@var{n}
-Specify the maximum number of conditionally executed instructions that
-replace a branch. The default is 4.
-
-
-@end table
-
-@node M88K Options
-@subsection M88K Options
-@cindex M88k options
-
-These @samp{-m} options are defined for Motorola 88k architectures:
-
-@table @code
-@item -m88000
-@kindex -m88000
-Generate code that works well on both the m88100 and the
-m88110.
-
-@item -m88100
-@kindex -m88100
-Generate code that works best for the m88100, but that also
-runs on the m88110.
-
-@item -m88110
-@kindex -m88110
-Generate code that works best for the m88110, and may not run
-on the m88100.
-
-@item -mbig-pic
-@kindex -mbig-pic
-Obsolete option to be removed from the next revision.
-Use @samp{-fPIC}.
-
-@item -midentify-revision
-@kindex -midentify-revision
-@kindex ident
-@cindex identifying source, compiler (88k)
-Include an @code{ident} directive in the assembler output recording the
-source file name, compiler name and version, timestamp, and compilation
-flags used.
-
-@item -mno-underscores
-@kindex -mno-underscores
-@cindex underscores, avoiding (88k)
-In assembler output, emit symbol names without adding an underscore
-character at the beginning of each name. The default is to use an
-underscore as prefix on each name.
-
-@item -mocs-debug-info
-@itemx -mno-ocs-debug-info
-@kindex -mocs-debug-info
-@kindex -mno-ocs-debug-info
-@cindex OCS (88k)
-@cindex debugging, 88k OCS
-Include (or omit) additional debugging information (about registers used
-in each stack frame) as specified in the 88open Object Compatibility
-Standard, ``OCS''. This extra information allows debugging of code that
-has had the frame pointer eliminated. The default for DG/UX, SVr4, and
-Delta 88 SVr3.2 is to include this information; other 88k configurations
-omit this information by default.
-
-@item -mocs-frame-position
-@kindex -mocs-frame-position
-@cindex register positions in frame (88k)
-When emitting COFF debugging information for automatic variables and
-parameters stored on the stack, use the offset from the canonical frame
-address, which is the stack pointer (register 31) on entry to the
-function. The DG/UX, SVr4, Delta88 SVr3.2, and BCS configurations use
-@samp{-mocs-frame-position}; other 88k configurations have the default
-@samp{-mno-ocs-frame-position}.
-
-@item -mno-ocs-frame-position
-@kindex -mno-ocs-frame-position
-@cindex register positions in frame (88k)
-When emitting COFF debugging information for automatic variables and
-parameters stored on the stack, use the offset from the frame pointer
-register (register 30). When this option is in effect, the frame
-pointer is not eliminated when debugging information is selected by the
--g switch.
-
-@item -moptimize-arg-area
-@itemx -mno-optimize-arg-area
-@kindex -moptimize-arg-area
-@kindex -mno-optimize-arg-area
-@cindex arguments in frame (88k)
-Control how function arguments are stored in stack frames.
-@samp{-moptimize-arg-area} saves space by optimizing them, but this
-conflicts with the 88open specifications. The opposite alternative,
-@samp{-mno-optimize-arg-area}, agrees with 88open standards. By default
-GNU CC does not optimize the argument area.
-
-@item -mshort-data-@var{num}
-@kindex -mshort-data-@var{num}
-@cindex smaller data references (88k)
-@cindex r0-relative references (88k)
-Generate smaller data references by making them relative to @code{r0},
-which allows loading a value using a single instruction (rather than the
-usual two). You control which data references are affected by
-specifying @var{num} with this option. For example, if you specify
-@samp{-mshort-data-512}, then the data references affected are those
-involving displacements of less than 512 bytes.
-@samp{-mshort-data-@var{num}} is not effective for @var{num} greater
-than 64k.
-
-@item -mserialize-volatile
-@kindex -mserialize-volatile
-@itemx -mno-serialize-volatile
-@kindex -mno-serialize-volatile
-@cindex sequential consistency on 88k
-Do, or don't, generate code to guarantee sequential consistency
-of volatile memory references. By default, consistency is
-guaranteed.
-
-The order of memory references made by the MC88110 processor does
-not always match the order of the instructions requesting those
-references. In particular, a load instruction may execute before
-a preceding store instruction. Such reordering violates
-sequential consistency of volatile memory references, when there
-are multiple processors. When consistency must be guaranteed,
-GNU C generates special instructions, as needed, to force
-execution in the proper order.
-
-The MC88100 processor does not reorder memory references and so
-always provides sequential consistency. However, by default, GNU
-C generates the special instructions to guarantee consistency
-even when you use @samp{-m88100}, so that the code may be run on an
-MC88110 processor. If you intend to run your code only on the
-MC88100 processor, you may use @samp{-mno-serialize-volatile}.
-
-The extra code generated to guarantee consistency may affect the
-performance of your application. If you know that you can safely
-forgo this guarantee, you may use @samp{-mno-serialize-volatile}.
-
-@item -msvr4
-@itemx -msvr3
-@kindex -msvr4
-@kindex -msvr3
-@cindex assembler syntax, 88k
-@cindex SVr4
-Turn on (@samp{-msvr4}) or off (@samp{-msvr3}) compiler extensions
-related to System V release 4 (SVr4). This controls the following:
-
-@enumerate
-@item
-Which variant of the assembler syntax to emit.
-@item
-@samp{-msvr4} makes the C preprocessor recognize @samp{#pragma weak}
-that is used on System V release 4.
-@item
-@samp{-msvr4} makes GNU CC issue additional declaration directives used in
-SVr4.
-@end enumerate
-
-@samp{-msvr4} is the default for the m88k-motorola-sysv4 and
-m88k-dg-dgux m88k configurations. @samp{-msvr3} is the default for all
-other m88k configurations.
-
-@item -mversion-03.00
-@kindex -mversion-03.00
-This option is obsolete, and is ignored.
-@c ??? which asm syntax better for GAS? option there too?
-
-@item -mno-check-zero-division
-@itemx -mcheck-zero-division
-@kindex -mno-check-zero-division
-@kindex -mcheck-zero-division
-@cindex zero division on 88k
-Do, or don't, generate code to guarantee that integer division by
-zero will be detected. By default, detection is guaranteed.
-
-Some models of the MC88100 processor fail to trap upon integer
-division by zero under certain conditions. By default, when
-compiling code that might be run on such a processor, GNU C
-generates code that explicitly checks for zero-valued divisors
-and traps with exception number 503 when one is detected. Use of
-mno-check-zero-division suppresses such checking for code
-generated to run on an MC88100 processor.
-
-GNU C assumes that the MC88110 processor correctly detects all
-instances of integer division by zero. When @samp{-m88110} is
-specified, both @samp{-mcheck-zero-division} and
-@samp{-mno-check-zero-division} are ignored, and no explicit checks for
-zero-valued divisors are generated.
-
-@item -muse-div-instruction
-@kindex -muse-div-instruction
-@cindex divide instruction, 88k
-Use the div instruction for signed integer division on the
-MC88100 processor. By default, the div instruction is not used.
-
-On the MC88100 processor the signed integer division instruction
-div) traps to the operating system on a negative operand. The
-operating system transparently completes the operation, but at a
-large cost in execution time. By default, when compiling code
-that might be run on an MC88100 processor, GNU C emulates signed
-integer division using the unsigned integer division instruction
-divu), thereby avoiding the large penalty of a trap to the
-operating system. Such emulation has its own, smaller, execution
-cost in both time and space. To the extent that your code's
-important signed integer division operations are performed on two
-nonnegative operands, it may be desirable to use the div
-instruction directly.
-
-On the MC88110 processor the div instruction (also known as the
-divs instruction) processes negative operands without trapping to
-the operating system. When @samp{-m88110} is specified,
-@samp{-muse-div-instruction} is ignored, and the div instruction is used
-for signed integer division.
-
-Note that the result of dividing INT_MIN by -1 is undefined. In
-particular, the behavior of such a division with and without
-@samp{-muse-div-instruction} may differ.
-
-@item -mtrap-large-shift
-@itemx -mhandle-large-shift
-@kindex -mtrap-large-shift
-@kindex -mhandle-large-shift
-@cindex bit shift overflow (88k)
-@cindex large bit shifts (88k)
-Include code to detect bit-shifts of more than 31 bits; respectively,
-trap such shifts or emit code to handle them properly. By default GNU CC
-makes no special provision for large bit shifts.
-
-@item -mwarn-passed-structs
-@kindex -mwarn-passed-structs
-@cindex structure passing (88k)
-Warn when a function passes a struct as an argument or result.
-Structure-passing conventions have changed during the evolution of the C
-language, and are often the source of portability problems. By default,
-GNU CC issues no such warning.
-@end table
-
-@node RS/6000 and PowerPC Options
-@subsection IBM RS/6000 and PowerPC Options
-@cindex RS/6000 and PowerPC Options
-@cindex IBM RS/6000 and PowerPC Options
-
-These @samp{-m} options are defined for the IBM RS/6000 and PowerPC:
-@table @code
-@item -mpower
-@itemx -mno-power
-@itemx -mpower2
-@itemx -mno-power2
-@itemx -mpowerpc
-@itemx -mno-powerpc
-@itemx -mpowerpc-gpopt
-@itemx -mno-powerpc-gpopt
-@itemx -mpowerpc-gfxopt
-@itemx -mno-powerpc-gfxopt
-@itemx -mpowerpc64
-@itemx -mno-powerpc64
-@kindex -mpower
-@kindex -mpower2
-@kindex -mpowerpc
-@kindex -mpowerpc-gpopt
-@kindex -mpowerpc-gfxopt
-@kindex -mpowerpc64
-GNU CC supports two related instruction set architectures for the
-RS/6000 and PowerPC. The @dfn{POWER} instruction set are those
-instructions supported by the @samp{rios} chip set used in the original
-RS/6000 systems and the @dfn{PowerPC} instruction set is the
-architecture of the Motorola MPC5xx, MPC6xx, MPC8xx microprocessors, and
-the IBM 4xx microprocessors.
-
-Neither architecture is a subset of the other. However there is a
-large common subset of instructions supported by both. An MQ
-register is included in processors supporting the POWER architecture.
-
-You use these options to specify which instructions are available on the
-processor you are using. The default value of these options is
-determined when configuring GNU CC. Specifying the
-@samp{-mcpu=@var{cpu_type}} overrides the specification of these
-options. We recommend you use the @samp{-mcpu=@var{cpu_type}} option
-rather than the options listed above.
-
-The @samp{-mpower} option allows GNU CC to generate instructions that
-are found only in the POWER architecture and to use the MQ register.
-Specifying @samp{-mpower2} implies @samp{-power} and also allows GNU CC
-to generate instructions that are present in the POWER2 architecture but
-not the original POWER architecture.
-
-The @samp{-mpowerpc} option allows GNU CC to generate instructions that
-are found only in the 32-bit subset of the PowerPC architecture.
-Specifying @samp{-mpowerpc-gpopt} implies @samp{-mpowerpc} and also allows
-GNU CC to use the optional PowerPC architecture instructions in the
-General Purpose group, including floating-point square root. Specifying
-@samp{-mpowerpc-gfxopt} implies @samp{-mpowerpc} and also allows GNU CC to
-use the optional PowerPC architecture instructions in the Graphics
-group, including floating-point select.
-
-The @samp{-mpowerpc64} option allows GNU CC to generate the additional
-64-bit instructions that are found in the full PowerPC64 architecture
-and to treat GPRs as 64-bit, doubleword quantities. GNU CC defaults to
-@samp{-mno-powerpc64}.
-
-If you specify both @samp{-mno-power} and @samp{-mno-powerpc}, GNU CC
-will use only the instructions in the common subset of both
-architectures plus some special AIX common-mode calls, and will not use
-the MQ register. Specifying both @samp{-mpower} and @samp{-mpowerpc}
-permits GNU CC to use any instruction from either architecture and to
-allow use of the MQ register; specify this for the Motorola MPC601.
-
-@item -mnew-mnemonics
-@itemx -mold-mnemonics
-@kindex -mnew-mnemonics
-@kindex -mold-mnemonics
-Select which mnemonics to use in the generated assembler code.
-@samp{-mnew-mnemonics} requests output that uses the assembler mnemonics
-defined for the PowerPC architecture, while @samp{-mold-mnemonics}
-requests the assembler mnemonics defined for the POWER architecture.
-Instructions defined in only one architecture have only one mnemonic;
-GNU CC uses that mnemonic irrespective of which of these options is
-specified.
-
-GNU CC defaults to the mnemonics appropriate for the architecture in
-use. Specifying @samp{-mcpu=@var{cpu_type}} sometimes overrides the
-value of these option. Unless you are building a cross-compiler, you
-should normally not specify either @samp{-mnew-mnemonics} or
-@samp{-mold-mnemonics}, but should instead accept the default.
-
-@item -mcpu=@var{cpu_type}
-@kindex -mcpu
-Set architecture type, register usage, choice of mnemonics, and
-instruction scheduling parameters for machine type @var{cpu_type}.
-Supported values for @var{cpu_type} are @samp{rs6000}, @samp{rios1},
-@samp{rios2}, @samp{rsc}, @samp{601}, @samp{602}, @samp{603},
-@samp{603e}, @samp{604}, @samp{604e}, @samp{620}, @samp{740},
-@samp{750}, @samp{power}, @samp{power2}, @samp{powerpc}, @samp{403},
-@samp{505}, @samp{801}, @samp{821}, @samp{823}, and @samp{860} and
-@samp{common}. @samp{-mcpu=power}, @samp{-mcpu=power2}, and
-@samp{-mcpu=powerpc} specify generic POWER, POWER2 and pure PowerPC
-(i.e., not MPC601) architecture machine types, with an appropriate,
-generic processor model assumed for scheduling purposes.@refill
-
-@c overfull hbox here --bob 22 jul96
-@c original text between ignore ... end ignore
-@ignore
-Specifying any of the @samp{-mcpu=rios1}, @samp{-mcpu=rios2},
-@samp{-mcpu=rsc}, @samp{-mcpu=power}, or @samp{-mcpu=power2} options
-enables the @samp{-mpower} option and disables the @samp{-mpowerpc}
-option; @samp{-mcpu=601} enables both the @samp{-mpower} and
-@samp{-mpowerpc} options; all of @samp{-mcpu=602}, @samp{-mcpu=603},
-@samp{-mcpu=603e}, @samp{-mcpu=604}, @samp{-mcpu=604e},
-@samp{-mcpu=620}, @samp{-mcpu=403}, @samp{-mcpu=505}, @samp{-mcpu=801},
-@c CYGNUS LOCAL vmakarov
-@samp{-mcpu=740}, @samp{-mcpu=750},
-@c END CYGNUS LOCAL
-@samp{-mcpu=821}, @samp{-mcpu=823}, @samp{-mcpu=860} and
-@samp{-mcpu=powerpc} enable the @samp{-mpowerpc} option and disable the
-@samp{-mpower} option; @samp{-mcpu=common} disables both the
-@samp{-mpower} and @samp{-mpowerpc} options.@refill
-@end ignore
-@c changed paragraph
-Specifying any of the following options:
-@samp{-mcpu=rios1}, @samp{-mcpu=rios2}, @samp{-mcpu=rsc},
-@samp{-mcpu=power}, or @samp{-mcpu=power2}
-enables the @samp{-mpower} option and disables the @samp{-mpowerpc} option;
-@samp{-mcpu=601} enables both the @samp{-mpower} and @samp{-mpowerpc} options.
-All of @samp{-mcpu=602}, @samp{-mcpu=603}, @samp{-mcpu=603e},
-@samp{-mcpu=604}, @samp{-mcpu=620},
-enable the @samp{-mpowerpc} option and disable the @samp{-mpower} option.
-Exactly similarly, all of @samp{-mcpu=403},
-@samp{-mcpu=505}, @samp{-mcpu=821}, @samp{-mcpu=860} and @samp{-mcpu=powerpc}
-enable the @samp{-mpowerpc} option and disable the @samp{-mpower} option.
-@samp{-mcpu=common} disables both the
-@samp{-mpower} and @samp{-mpowerpc} options.@refill
-@c end changes to prevent overfull hboxes
-
-AIX versions 4 or greater selects @samp{-mcpu=common} by default, so
-that code will operate on all members of the RS/6000 and PowerPC
-families. In that case, GNU CC will use only the instructions in the
-common subset of both architectures plus some special AIX common-mode
-calls, and will not use the MQ register. GNU CC assumes a generic
-processor model for scheduling purposes.
-
-Specifying any of the options @samp{-mcpu=rios1}, @samp{-mcpu=rios2},
-@samp{-mcpu=rsc}, @samp{-mcpu=power}, or @samp{-mcpu=power2} also
-disables the @samp{new-mnemonics} option. Specifying @samp{-mcpu=601},
-@samp{-mcpu=602}, @samp{-mcpu=603}, @samp{-mcpu=603e}, @samp{-mcpu=604},
-@samp{620}, @samp{403}, or @samp{-mcpu=powerpc} also enables the
-@samp{new-mnemonics} option.@refill
-
-Specifying @samp{-mcpu=403}, @samp{-mcpu=821}, or @samp{-mcpu=860} also
-enables the @samp{-msoft-float} option.
-
-@item -mtune=@var{cpu_type}
-Set the instruction scheduling parameters for machine type
-@var{cpu_type}, but do not set the architecture type, register usage,
-choice of mnemonics like @samp{-mcpu=}@var{cpu_type} would. The same
-values for @var{cpu_type} are used for @samp{-mtune=}@var{cpu_type} as
-for @samp{-mcpu=}@var{cpu_type}. The @samp{-mtune=}@var{cpu_type}
-option overrides the @samp{-mcpu=}@var{cpu_type} option in terms of
-instruction scheduling parameters.
-
-@item -mfull-toc
-@itemx -mno-fp-in-toc
-@itemx -mno-sum-in-toc
-@itemx -mminimal-toc
-@kindex -mminimal-toc
-Modify generation of the TOC (Table Of Contents), which is created for
-every executable file. The @samp{-mfull-toc} option is selected by
-default. In that case, GNU CC will allocate at least one TOC entry for
-each unique non-automatic variable reference in your program. GNU CC
-will also place floating-point constants in the TOC. However, only
-16,384 entries are available in the TOC.
-
-If you receive a linker error message that saying you have overflowed
-the available TOC space, you can reduce the amount of TOC space used
-with the @samp{-mno-fp-in-toc} and @samp{-mno-sum-in-toc} options.
-@samp{-mno-fp-in-toc} prevents GNU CC from putting floating-point
-constants in the TOC and @samp{-mno-sum-in-toc} forces GNU CC to
-generate code to calculate the sum of an address and a constant at
-run-time instead of putting that sum into the TOC. You may specify one
-or both of these options. Each causes GNU CC to produce very slightly
-slower and larger code at the expense of conserving TOC space.
-
-If you still run out of space in the TOC even when you specify both of
-these options, specify @samp{-mminimal-toc} instead. This option causes
-GNU CC to make only one TOC entry for every file. When you specify this
-option, GNU CC will produce code that is slower and larger but which
-uses extremely little TOC space. You may wish to use this option
-only on files that contain less frequently executed code. @refill
-
-@item -maix64
-@itemx -maix32
-@kindex -maix64
-@kindex -maix32
-Enable AIX 64-bit ABI and calling convention: 64-bit pointers, 64-bit
-@code{long} type, and the infrastructure needed to support them.
-Specifying @samp{-maix64} implies @samp{-mpowerpc64} and
-@samp{-mpowerpc}, while @samp{-maix32} disables the 64-bit ABI and
-implies @samp{-mno-powerpc64}. GNU CC defaults to @samp{-maix32}.
-
-@item -mxl-call
-@itemx -mno-xl-call
-@kindex -mxl-call
-On AIX, pass floating-point arguments to prototyped functions beyond the
-register save area (RSA) on the stack in addition to argument FPRs. The
-AIX calling convention was extended but not initially documented to
-handle an obscure K&R C case of calling a function that takes the
-address of its arguments with fewer arguments than declared. AIX XL
-compilers access floating point arguments which do not fit in the
-RSA from the stack when a subroutine is compiled without
-optimization. Because always storing floating-point arguments on the
-stack is inefficient and rarely needed, this option is not enabled by
-default and only is necessary when calling subroutines compiled by AIX
-XL compilers without optimization.
-
-@item -mthreads
-@kindex -mthreads
-Support @dfn{AIX Threads}. Link an application written to use
-@dfn{pthreads} with special libraries and startup code to enable the
-application to run.
-
-@item -mpe
-@kindex -mpe
-Support @dfn{IBM RS/6000 SP} @dfn{Parallel Environment} (PE). Link an
-application written to use message passing with special startup code to
-enable the application to run. The system must have PE installed in the
-standard location (@file{/usr/lpp/ppe.poe/}), or the @file{specs} file
-must be overridden with the @samp{-specs=} option to specify the
-appropriate directory location. The Parallel Environment does not
-support threads, so the @samp{-mpe} option and the @samp{-mthreads}
-option are incompatible.
-
-@item -msoft-float
-@itemx -mhard-float
-@kindex -msoft-float
-Generate code that does not use (uses) the floating-point register set.
-Software floating point emulation is provided if you use the
-@samp{-msoft-float} option, and pass the option to GNU CC when linking.
-
-@item -mmultiple
-@itemx -mno-multiple
-Generate code that uses (does not use) the load multiple word
-instructions and the store multiple word instructions. These
-instructions are generated by default on POWER systems, and not
-generated on PowerPC systems. Do not use @samp{-mmultiple} on little
-endian PowerPC systems, since those instructions do not work when the
-processor is in little endian mode. The exceptions are PPC740 and
-PPC750 which permit the instructions usage in little endian mode.
-
-@item -mstring
-@itemx -mno-string
-@kindex -mstring
-Generate code that uses (does not use) the load string instructions
-and the store string word instructions to save multiple registers and
-do small block moves. These instructions are generated by default on
-POWER systems, and not generated on PowerPC systems. Do not use
-@samp{-mstring} on little endian PowerPC systems, since those
-instructions do not work when the processor is in little endian mode.
-The exceptions are PPC740 and PPC750 which permit the instructions
-usage in little endian mode.
-
-@item -mupdate
-@itemx -mno-update
-@kindex -mupdate
-Generate code that uses (does not use) the load or store instructions
-that update the base register to the address of the calculated memory
-location. These instructions are generated by default. If you use
-@samp{-mno-update}, there is a small window between the time that the
-stack pointer is updated and the address of the previous frame is
-stored, which means code that walks the stack frame across interrupts or
-signals may get corrupted data.
-
-@item -mfused-madd
-@itemx -mno-fused-madd
-@kindex -mfused-madd
-Generate code that uses (does not use) the floating point multiply and
-accumulate instructions. These instructions are generated by default if
-hardware floating is used.
-
-@item -mno-bit-align
-@itemx -mbit-align
-@kindex -mbit-align
-On System V.4 and embedded PowerPC systems do not (do) force structures
-and unions that contain bit fields to be aligned to the base type of the
-bit field.
-
-For example, by default a structure containing nothing but 8
-@code{unsigned} bitfields of length 1 would be aligned to a 4 byte
-boundary and have a size of 4 bytes. By using @samp{-mno-bit-align},
-the structure would be aligned to a 1 byte boundary and be one byte in
-size.
-
-@c CYGNUS LOCAL vmakarov
-@item -mno-bit-word
-@itemx -mbit-word
-On System V.4 and embedded PowerPC systems do not (do) force structures
-and unions that contain bit fields to align the bit field within the
-structure to the base type of the bitfield. Unlike @samp{-mbit-align}
-and @samp{-mno-bit-align}, the alignment of the structure itself is not
-changed, just the alignment of bitfields within the structure.
-
-For example, by default, the structure:
-
-@smallexample
-struct A @{
- int :0;
- int i2:20;
- int i3:17;
-@};
-@end smallexample
-
-would normally put the field @var{i3} starting at bit 20, and it would
-cross the word boundary. If you use @samp{-mno-bit-word}, the field
-will begin on the next word boundary so that it does not cross a word
-boundary.
-
-@item -mbranch-cost=@var{n}
-Set the value of the internal macro @samp{BRANCH_COST} to be @var{n}.
-Higher values mean branches are more costly, so the compiler will try
-harder to generate code that does not use branches. The default is 3.
-@c END CYGNUS LOCAL
-
-@item -mno-strict-align
-@itemx -mstrict-align
-@kindex -mstrict-align
-On System V.4 and embedded PowerPC systems do not (do) assume that
-unaligned memory references will be handled by the system.
-
-@item -mrelocatable
-@itemx -mno-relocatable
-@kindex -mrelocatable
-On embedded PowerPC systems generate code that allows (does not allow)
-the program to be relocated to a different address at runtime. If you
-use @samp{-mrelocatable} on any module, all objects linked together must
-be compiled with @samp{-mrelocatable} or @samp{-mrelocatable-lib}.
-
-@item -mrelocatable-lib
-@itemx -mno-relocatable-lib
-On embedded PowerPC systems generate code that allows (does not allow)
-the program to be relocated to a different address at runtime. Modules
-compiled with @samp{-mrelocatable-lib} can be linked with either modules
-compiled without @samp{-mrelocatable} and @samp{-mrelocatable-lib} or
-with modules compiled with the @samp{-mrelocatable} options.
-
-@item -mno-toc
-@itemx -mtoc
-On System V.4 and embedded PowerPC systems do not (do) assume that
-register 2 contains a pointer to a global area pointing to the addresses
-used in the program.
-
-@item -mlittle
-@itemx -mlittle-endian
-On System V.4 and embedded PowerPC systems compile code for the
-processor in little endian mode. The @samp{-mlittle-endian} option is
-the same as @samp{-mlittle}.
-
-@item -mbig
-@itemx -mbig-endian
-On System V.4 and embedded PowerPC systems compile code for the
-processor in big endian mode. The @samp{-mbig-endian} option is
-the same as @samp{-mbig}.
-
-@item -mcall-sysv
-On System V.4 and embedded PowerPC systems compile code using calling
-conventions that adheres to the March 1995 draft of the System V
-Application Binary Interface, PowerPC processor supplement. This is the
-default unless you configured GCC using @samp{powerpc-*-eabiaix}.
-
-@item -mcall-sysv-eabi
-Specify both @samp{-mcall-sysv} and @samp{-meabi} options.
-
-@item -mcall-sysv-noeabi
-Specify both @samp{-mcall-sysv} and @samp{-mno-eabi} options.
-
-@item -mcall-aix
-On System V.4 and embedded PowerPC systems compile code using calling
-conventions that are similar to those used on AIX. This is the
-default if you configured GCC using @samp{powerpc-*-eabiaix}.
-
-@item -mcall-solaris
-On System V.4 and embedded PowerPC systems compile code for the Solaris
-operating system.
-
-@item -mcall-linux
-On System V.4 and embedded PowerPC systems compile code for the
-Linux-based GNU system.
-
-@c CYGNUS LOCAL vmakarov
-@item -mcall-i960-old
-On System V.4 and embedded PowerPC systems compile code so that
-structure layout is compatible with the Intel i960 compiler using the
-@samp{-mold-align}, @samp{-mno-strict-align}, and @samp{-mca} switches.
-The @samp{-mcall-i960-old} option sets the @samp{-mlittle},
-@samp{-meabi}, @samp{-mno-bit-word}, and @samp{-mno-strict-align}
-PowerPC options, and also forces the type @code{wchar_t} to be an
-@code{int} instead of @code{long int}.
-@c END CYGNUS LOCAL
-
-@item -mprototype
-@itemx -mno-prototype
-On System V.4 and embedded PowerPC systems assume that all calls to
-variable argument functions are properly prototyped. Otherwise, the
-compiler must insert an instruction before every non prototyped call to
-set or clear bit 6 of the condition code register (@var{CR}) to
-indicate whether floating point values were passed in the floating point
-registers in case the function takes a variable arguments. With
-@samp{-mprototype}, only calls to prototyped variable argument functions
-will set or clear the bit.
-
-@c CYGNUS LOCAL -- vmakarov/prolog-epilog instruction scheduling
-@item -msched-epilog
-@itemx -mno-sched-epilog
-Generate RTL instructions for function epilogue which permits to make
-epilogue instruction scheduling for @samp{eabi}. By default assembler
-code is generated and epilogue instruction scheduling is not possible.
-
-@item -msched-prolog
-@itemx -mno-sched-prolog
-Generate RTL instructions for function prologue which permits to make
-prologue instruction scheduling for @samp{eabi}. By default assembler
-code is generated and prologue instruction scheduling is not possible.
-@c END CYGNUS LOCAL
-
-@item -msim
-On embedded PowerPC systems, assume that the startup module is called
-@file{sim-crt0.o} and that the standard C libraries are @file{libsim.a} and
-@file{libc.a}. This is the default for @samp{powerpc-*-eabisim}.
-configurations.
-
-@item -mmvme
-On embedded PowerPC systems, assume that the startup module is called
-@file{crt0.o} and the standard C libraries are @file{libmvme.a} and
-@file{libc.a}.
-
-@item -mads
-On embedded PowerPC systems, assume that the startup module is called
-@file{crt0.o} and the standard C libraries are @file{libads.a} and
-@file{libc.a}.
-
-@item -myellowknife
-On embedded PowerPC systems, assume that the startup module is called
-@file{crt0.o} and the standard C libraries are @file{libyk.a} and
-@file{libc.a}.
-
-@item -memb
-On embedded PowerPC systems, set the @var{PPC_EMB} bit in the ELF flags
-header to indicate that @samp{eabi} extended relocations are used.
-
-@item -meabi
-@itemx -mno-eabi
-On System V.4 and embedded PowerPC systems do (do not) adhere to the
-Embedded Applications Binary Interface (eabi) which is a set of
-modifications to the System V.4 specifications. Selecting @code{-meabi}
-means that the stack is aligned to an 8 byte boundary, a function
-@code{__eabi} is called to from @code{main} to set up the eabi
-environment, and the @samp{-msdata} option can use both @code{r2} and
-@code{r13} to point to two separate small data areas. Selecting
-@code{-mno-eabi} means that the stack is aligned to a 16 byte boundary,
-do not call an initialization function from @code{main}, and the
-@samp{-msdata} option will only use @code{r13} to point to a single
-small data area. The @samp{-meabi} option is on by default if you
-configured GCC using one of the @samp{powerpc*-*-eabi*} options.
-
-@item -msdata=eabi
-On System V.4 and embedded PowerPC systems, put small initialized
-@code{const} global and static data in the @samp{.sdata2} section, which
-is pointed to by register @code{r2}. Put small initialized
-non-@code{const} global and static data in the @samp{.sdata} section,
-which is pointed to by register @code{r13}. Put small uninitialized
-global and static data in the @samp{.sbss} section, which is adjacent to
-the @samp{.sdata} section. The @samp{-msdata=eabi} option is
-incompatible with the @samp{-mrelocatable} option. The
-@samp{-msdata=eabi} option also sets the @samp{-memb} option.
-
-@item -msdata=sysv
-On System V.4 and embedded PowerPC systems, put small global and static
-data in the @samp{.sdata} section, which is pointed to by register
-@code{r13}. Put small uninitialized global and static data in the
-@samp{.sbss} section, which is adjacent to the @samp{.sdata} section.
-The @samp{-msdata=sysv} option is incompatible with the
-@samp{-mrelocatable} option.
-
-@item -msdata=default
-@itemx -msdata
-On System V.4 and embedded PowerPC systems, if @samp{-meabi} is used,
-compile code the same as @samp{-msdata=eabi}, otherwise compile code the
-same as @samp{-msdata=sysv}.
-
-@item -msdata-data
-On System V.4 and embedded PowerPC systems, put small global and static
-data in the @samp{.sdata} section. Put small uninitialized global and
-static data in the @samp{.sbss} section. Do not use register @code{r13}
-to address small data however. This is the default behavior unless
-other @samp{-msdata} options are used.
-
-@item -msdata=none
-@itemx -mno-sdata
-On embedded PowerPC systems, put all initialized global and static data
-in the @samp{.data} section, and all uninitialized data in the
-@samp{.bss} section.
-
-@item -G @var{num}
-@cindex smaller data references (PowerPC)
-@cindex .sdata/.sdata2 references (PowerPC)
-On embedded PowerPC systems, put global and static items less than or
-equal to @var{num} bytes into the small data or bss sections instead of
-the normal data or bss section. By default, @var{num} is 8. The
-@samp{-G @var{num}} switch is also passed to the linker.
-All modules should be compiled with the same @samp{-G @var{num}} value.
-
-@item -mregnames
-@itemx -mno-regnames
-On System V.4 and embedded PowerPC systems do (do not) emit register
-names in the assembly language output using symbolic forms.
-
-@c CYGNUS LOCAL vmakarov
-@item -mvxworks
-On System V.4 and embedded PowerPC systems, specify that you are
-compiling for a VxWorks system.
-@c END CYGNUS LOCAL
-@c CYGNUS LOCAL jlemke
-
-@item -mmpc860c0[=@var{num}]
-@kindex mmpc860c0
-This option is only applicable to MPC860 chips when producing ELF
-executables with the GNU linker. It does not cause any changes to
-the .o files but causes the linker to perform a check for
-"problematic" conditional branches and implement a work around.
-
-The problem is that some chips may treat the target instruction
-as a no-op, given the following conditions:
-
-@smallexample
-1/ The processor is an MPC860, version C0 or earlier.
-2/ A forward conditional branch is executed.
-3/ The branch is predicted as not taken.
-4/ The branch is taken.
-5/ The branch is located in the last 5 words of a page.
-6/ The branch target is located on a subsequent page.
-@end smallexample
-
-The optional argument is the number of words that are checked
-at the end of each text page. It may be any value from 1 to 10
-and defaults to 5.
-@c END CYGNUS LOCAL
-@end table
-@node RT Options
-@subsection IBM RT Options
-@cindex RT options
-@cindex IBM RT options
-
-These @samp{-m} options are defined for the IBM RT PC:
-
-@table @code
-@item -min-line-mul
-Use an in-line code sequence for integer multiplies. This is the
-default.
-
-@item -mcall-lib-mul
-Call @code{lmul$$} for integer multiples.
-
-@item -mfull-fp-blocks
-Generate full-size floating point data blocks, including the minimum
-amount of scratch space recommended by IBM. This is the default.
-
-@item -mminimum-fp-blocks
-Do not include extra scratch space in floating point data blocks. This
-results in smaller code, but slower execution, since scratch space must
-be allocated dynamically.
-
-@cindex @file{varargs.h} and RT PC
-@cindex @file{stdarg.h} and RT PC
-@item -mfp-arg-in-fpregs
-Use a calling sequence incompatible with the IBM calling convention in
-which floating point arguments are passed in floating point registers.
-Note that @code{varargs.h} and @code{stdargs.h} will not work with
-floating point operands if this option is specified.
-
-@item -mfp-arg-in-gregs
-Use the normal calling convention for floating point arguments. This is
-the default.
-
-@item -mhc-struct-return
-Return structures of more than one word in memory, rather than in a
-register. This provides compatibility with the MetaWare HighC (hc)
-compiler. Use the option @samp{-fpcc-struct-return} for compatibility
-with the Portable C Compiler (pcc).
-
-@item -mnohc-struct-return
-Return some structures of more than one word in registers, when
-convenient. This is the default. For compatibility with the
-IBM-supplied compilers, use the option @samp{-fpcc-struct-return} or the
-option @samp{-mhc-struct-return}.
-@end table
-
-@node MIPS Options
-@subsection MIPS Options
-@cindex MIPS options
-
-These @samp{-m} options are defined for the MIPS family of computers:
-
-@table @code
-@item -mcpu=@var{cpu type}
-Assume the defaults for the machine type @var{cpu type} when scheduling
-instructions. The choices for @var{cpu type} are @samp{r2000}, @samp{r3000},
-@samp{r4000}, @samp{r4400}, @samp{r4600}, and @samp{r6000}. While picking a
-specific @var{cpu type} will schedule things appropriately for that
-particular chip, the compiler will not generate any code that does not
-meet level 1 of the MIPS ISA (instruction set architecture) without
-the @samp{-mips2} or @samp{-mips3} switches being used.
-
-@item -mips1
-Issue instructions from level 1 of the MIPS ISA. This is the default.
-@samp{r3000} is the default @var{cpu type} at this ISA level.
-
-@item -mips2
-Issue instructions from level 2 of the MIPS ISA (branch likely, square
-root instructions). @samp{r6000} is the default @var{cpu type} at this
-ISA level.
-
-@item -mips3
-Issue instructions from level 3 of the MIPS ISA (64 bit instructions).
-@samp{r4000} is the default @var{cpu type} at this ISA level.
-This option does not change the sizes of any of the C data types.
-
-@item -mips4
-Issue instructions from level 4 of the MIPS ISA. @samp{r8000} is the
-default @var{cpu type} at this ISA level.
-
-@item -mfp32
-Assume that 32 32-bit floating point registers are available. This is
-the default.
-
-@item -mfp64
-Assume that 32 64-bit floating point registers are available. This is
-the default when the @samp{-mips3} option is used.
-
-@item -mgp32
-Assume that 32 32-bit general purpose registers are available. This is
-the default.
-
-@item -mgp64
-Assume that 32 64-bit general purpose registers are available. This is
-the default when the @samp{-mips3} option is used.
-
-@item -mint64
-Types long, int, and pointer are 64 bits. This works only if @samp{-mips3}
-is also specified.
-
-@item -mlong64
-Types long and pointer are 64 bits, and type int is 32 bits.
-This works only if @samp{-mips3} is also specified.
-
-@itemx -mabi=32
-@itemx -mabi=n32
-@itemx -mabi=64
-@itemx -mabi=eabi
-Generate code for the indicated ABI.
-
-@item -mmips-as
-Generate code for the MIPS assembler, and invoke @file{mips-tfile} to
-add normal debug information. This is the default for all
-platforms except for the OSF/1 reference platform, using the OSF/rose
-object format. If the either of the @samp{-gstabs} or @samp{-gstabs+}
-switches are used, the @file{mips-tfile} program will encapsulate the
-stabs within MIPS ECOFF.
-
-@item -mgas
-Generate code for the GNU assembler. This is the default on the OSF/1
-reference platform, using the OSF/rose object format. Also, this is
-the default if the configure option @samp{--with-gnu-as} is used.
-
-@item -msplit-addresses
-@itemx -mno-split-addresses
-Generate code to load the high and low parts of address constants separately.
-This allows @code{gcc} to optimize away redundant loads of the high order
-bits of addresses. This optimization requires GNU as and GNU ld.
-This optimization is enabled by default for some embedded targets where
-GNU as and GNU ld are standard.
-
-@item -mrnames
-@itemx -mno-rnames
-The @samp{-mrnames} switch says to output code using the MIPS software
-names for the registers, instead of the hardware names (ie, @var{a0}
-instead of @var{$4}). The only known assembler that supports this option
-is the Algorithmics assembler.
-
-@item -mgpopt
-@itemx -mno-gpopt
-The @samp{-mgpopt} switch says to write all of the data declarations
-before the instructions in the text section, this allows the MIPS
-assembler to generate one word memory references instead of using two
-words for short global or static data items. This is on by default if
-optimization is selected.
-
-@item -mstats
-@itemx -mno-stats
-For each non-inline function processed, the @samp{-mstats} switch
-causes the compiler to emit one line to the standard error file to
-print statistics about the program (number of registers saved, stack
-size, etc.).
-
-@item -mmemcpy
-@itemx -mno-memcpy
-The @samp{-mmemcpy} switch makes all block moves call the appropriate
-string function (@samp{memcpy} or @samp{bcopy}) instead of possibly
-generating inline code.
-
-@item -mmips-tfile
-@itemx -mno-mips-tfile
-The @samp{-mno-mips-tfile} switch causes the compiler not
-postprocess the object file with the @file{mips-tfile} program,
-after the MIPS assembler has generated it to add debug support. If
-@file{mips-tfile} is not run, then no local variables will be
-available to the debugger. In addition, @file{stage2} and
-@file{stage3} objects will have the temporary file names passed to the
-assembler embedded in the object file, which means the objects will
-not compare the same. The @samp{-mno-mips-tfile} switch should only
-be used when there are bugs in the @file{mips-tfile} program that
-prevents compilation.
-
-@item -msoft-float
-Generate output containing library calls for floating point.
-@strong{Warning:} the requisite libraries are not part of GNU CC.
-Normally the facilities of the machine's usual C compiler are used, but
-this can't be done directly in cross-compilation. You must make your
-own arrangements to provide suitable library functions for
-cross-compilation.
-
-@item -mhard-float
-Generate output containing floating point instructions. This is the
-default if you use the unmodified sources.
-
-@item -mabicalls
-@itemx -mno-abicalls
-Emit (or do not emit) the pseudo operations @samp{.abicalls},
-@samp{.cpload}, and @samp{.cprestore} that some System V.4 ports use for
-position independent code.
-
-@item -mlong-calls
-@itemx -mno-long-calls
-Do all calls with the @samp{JALR} instruction, which requires
-loading up a function's address into a register before the call.
-You need to use this switch, if you call outside of the current
-512 megabyte segment to functions that are not through pointers.
-
-@item -mhalf-pic
-@itemx -mno-half-pic
-Put pointers to extern references into the data section and load them
-up, rather than put the references in the text section.
-
-@item -membedded-pic
-@itemx -mno-embedded-pic
-Generate PIC code suitable for some embedded systems. All calls are
-made using PC relative address, and all data is addressed using the $gp
-register. No more than 65536 bytes of global data may be used. This
-requires GNU as and GNU ld which do most of the work. This currently
-only works on targets which use ECOFF; it does not work with ELF.
-
-@item -membedded-data
-@itemx -mno-embedded-data
-Allocate variables to the read-only data section first if possible, then
-next in the small data section if possible, otherwise in data. This gives
-slightly slower code than the default, but reduces the amount of RAM required
-when executing, and thus may be preferred for some embedded systems.
-
-@item -msingle-float
-@itemx -mdouble-float
-The @samp{-msingle-float} switch tells gcc to assume that the floating
-point coprocessor only supports single precision operations, as on the
-@samp{r4650} chip. The @samp{-mdouble-float} switch permits gcc to use
-double precision operations. This is the default.
-
-@item -mmad
-@itemx -mno-mad
-Permit use of the @samp{mad}, @samp{madu} and @samp{mul} instructions,
-as on the @samp{r4650} chip.
-
-@item -m4650
-Turns on @samp{-msingle-float}, @samp{-mmad}, and, at least for now,
-@samp{-mcpu=r4650}.
-
-@item -EL
-Compile code for the processor in little endian mode.
-The requisite libraries are assumed to exist.
-
-@item -EB
-Compile code for the processor in big endian mode.
-The requisite libraries are assumed to exist.
-
-@item -G @var{num}
-@cindex smaller data references (MIPS)
-@cindex gp-relative references (MIPS)
-Put global and static items less than or equal to @var{num} bytes into
-the small data or bss sections instead of the normal data or bss
-section. This allows the assembler to emit one word memory reference
-instructions based on the global pointer (@var{gp} or @var{$28}),
-instead of the normal two words used. By default, @var{num} is 8 when
-the MIPS assembler is used, and 0 when the GNU assembler is used. The
-@samp{-G @var{num}} switch is also passed to the assembler and linker.
-All modules should be compiled with the same @samp{-G @var{num}}
-value.
-
-@item -nocpp
-Tell the MIPS assembler to not run its preprocessor over user
-assembler files (with a @samp{.s} suffix) when assembling them.
-
-@c CYGNUS LOCAL law
-@item -malign-loops=@var{num}
-Align loops to a 2 raised to a @var{num} byte boundary. If
-@samp{-malign-loops} is not specified, the default is 2. Note specific
-MIPS targets may override the default value.
-
-@item -malign-jumps=@var{num}
-Align instructions that are only jumped to to a 2 raised to a @var{num}
-byte boundary. If @samp{-malign-jumps} is not specified, the default is 2.
-Note specific MIPS targets may override the default value.
-
-@item -malign-functions=@var{num}
-Align the start of functions to a 2 raised to @var{num} byte boundary.
-If @samp{-malign-functions} is not specified, the default is 2.
-Note specific MIPS targets may override the default value.
-
-@item -mmax-skip-loops=@var{num}
-Maximum number of padding bytes allowed to satisfy a loop alignment
-request. The default value is zero which specifies no limit on the number
-of padding bytes.
-Note specific MIPS targets may override the default value.
-
-@item -mmax-skip-jumps=@var{num}
-Maximum number of padding bytes allowed to satisfy a loop alignment
-request. The default value is zero which specifies no limit on the number
-of padding bytes.
-Note specific MIPS targets may override the default value.
-
-@item -mmax-skip-functions=@var{num}
-Maximum number of padding bytes allowed to satisfy a loop alignment
-request. The default value is zero which specifies no limit on the number
-of padding bytes. This option may have no effect when combined with other
-options such as @samp{-ffunction-sections}.
-Note specific MIPS targets may override the default value.
-@c END CYGNUS LOCAL
-@end table
-
-@ifset INTERNALS
-These options are defined by the macro
-@code{TARGET_SWITCHES} in the machine description. The default for the
-options is also defined by that macro, which enables you to change the
-defaults.
-@end ifset
-
-@node i386 Options
-@subsection Intel 386 Options
-@cindex i386 Options
-@cindex Intel 386 Options
-
-These @samp{-m} options are defined for the i386 family of computers:
-
-@table @code
-@item -mcpu=@var{cpu type}
-Assume the defaults for the machine type @var{cpu type} when scheduling
-instructions. The choices for @var{cpu type} are: @samp{i386},
-@samp{i486}, @samp{i586} (@samp{pentium}), @samp{pentium}, @samp{i686}
-(@samp{pentiumpro}) and @samp{pentiumpro}. While picking a specific
-@var{cpu type} will schedule things appropriately for that particular
-chip, the compiler will not generate any code that does not run on the
-i386 without the @samp{-march=@var{cpu type}} option being used.
-
-@item -march=@var{cpu type}
-Generate instructions for the machine type @var{cpu type}. The choices
-for @var{cpu type} are: @samp{i386}, @samp{i486}, @samp{pentium}, and
-@samp{pentiumpro}. Specifying @samp{-march=@var{cpu type}} implies
-@samp{-mcpu=@var{cpu type}}.
-
-@item -m386
-@itemx -m486
-@itemx -mpentium
-@itemx -mpentiumpro
-Synonyms for -mcpu=i386, -mcpu=i486, -mcpu=pentium, and -mcpu=pentiumpro
-respectively.
-
-@item -mieee-fp
-@itemx -mno-ieee-fp
-Control whether or not the compiler uses IEEE floating point
-comparisons. These handle correctly the case where the result of a
-comparison is unordered.
-
-@item -msoft-float
-Generate output containing library calls for floating point.
-@strong{Warning:} the requisite libraries are not part of GNU CC.
-Normally the facilities of the machine's usual C compiler are used, but
-this can't be done directly in cross-compilation. You must make your
-own arrangements to provide suitable library functions for
-cross-compilation.
-
-On machines where a function returns floating point results in the 80387
-register stack, some floating point opcodes may be emitted even if
-@samp{-msoft-float} is used.
-
-@item -mno-fp-ret-in-387
-Do not use the FPU registers for return values of functions.
-
-The usual calling convention has functions return values of types
-@code{float} and @code{double} in an FPU register, even if there
-is no FPU. The idea is that the operating system should emulate
-an FPU.
-
-The option @samp{-mno-fp-ret-in-387} causes such values to be returned
-in ordinary CPU registers instead.
-
-@item -mno-fancy-math-387
-Some 387 emulators do not support the @code{sin}, @code{cos} and
-@code{sqrt} instructions for the 387. Specify this option to avoid
-generating those instructions. This option is the default on FreeBSD.
-As of revision 2.6.1, these instructions are not generated unless you
-also use the @samp{-ffast-math} switch.
-
-@item -malign-double
-@itemx -mno-align-double
-Control whether GNU CC aligns @code{double}, @code{long double}, and
-@code{long long} variables on a two word boundary or a one word
-boundary. Aligning @code{double} variables on a two word boundary will
-produce code that runs somewhat faster on a @samp{Pentium} at the
-expense of more memory.
-
-@strong{Warning:} if you use the @samp{-malign-double} switch,
-structures containing the above types will be aligned differently than
-the published application binary interface specifications for the 386.
-
-@item -msvr3-shlib
-@itemx -mno-svr3-shlib
-Control whether GNU CC places uninitialized locals into @code{bss} or
-@code{data}. @samp{-msvr3-shlib} places these locals into @code{bss}.
-These options are meaningful only on System V Release 3.
-
-@item -mno-wide-multiply
-@itemx -mwide-multiply
-Control whether GNU CC uses the @code{mul} and @code{imul} that produce
-64 bit results in @code{eax:edx} from 32 bit operands to do @code{long
-long} multiplies and 32-bit division by constants.
-
-@item -mrtd
-Use a different function-calling convention, in which functions that
-take a fixed number of arguments return with the @code{ret} @var{num}
-instruction, which pops their arguments while returning. This saves one
-instruction in the caller since there is no need to pop the arguments
-there.
-
-You can specify that an individual function is called with this calling
-sequence with the function attribute @samp{stdcall}. You can also
-override the @samp{-mrtd} option by using the function attribute
-@samp{cdecl}. @xref{Function Attributes}
-
-@strong{Warning:} this calling convention is incompatible with the one
-normally used on Unix, so you cannot use it if you need to call
-libraries compiled with the Unix compiler.
-
-Also, you must provide function prototypes for all functions that
-take variable numbers of arguments (including @code{printf});
-otherwise incorrect code will be generated for calls to those
-functions.
-
-In addition, seriously incorrect code will result if you call a
-function with too many arguments. (Normally, extra arguments are
-harmlessly ignored.)
-
-@item -mreg-alloc=@var{regs}
-Control the default allocation order of integer registers. The
-string @var{regs} is a series of letters specifying a register. The
-supported letters are: @code{a} allocate EAX; @code{b} allocate EBX;
-@code{c} allocate ECX; @code{d} allocate EDX; @code{S} allocate ESI;
-@code{D} allocate EDI; @code{B} allocate EBP.
-
-@item -mregparm=@var{num}
-Control how many registers are used to pass integer arguments. By
-default, no registers are used to pass arguments, and at most 3
-registers can be used. You can control this behavior for a specific
-function by using the function attribute @samp{regparm}. @xref{Function Attributes}
-
-@strong{Warning:} if you use this switch, and
-@var{num} is nonzero, then you must build all modules with the same
-value, including any libraries. This includes the system libraries and
-startup modules.
-
-@item -malign-loops=@var{num}
-Align loops to a 2 raised to a @var{num} byte boundary. If
-@samp{-malign-loops} is not specified, the default is 2 unless
-gas 2.8 (or later) is being used in which case the default is
-to align the loop on a 16 byte boundary if it is less than 8
-bytes away.
-
-@item -malign-jumps=@var{num}
-Align instructions that are only jumped to to a 2 raised to a @var{num}
-byte boundary. If @samp{-malign-jumps} is not specified, the default is
-2 if optimizing for a 386, and 4 if optimizing for a 486 unless
-gas 2.8 (or later) is being used in which case the default is
-to align the instruction on a 16 byte boundary if it is less
-than 8 bytes away.
-
-@item -malign-functions=@var{num}
-Align the start of functions to a 2 raised to @var{num} byte boundary.
-If @samp{-malign-functions} is not specified, the default is 2 if optimizing
-for a 386, and 4 if optimizing for a 486.
-@end table
-
-@node HPPA Options
-@subsection HPPA Options
-@cindex HPPA Options
-
-These @samp{-m} options are defined for the HPPA family of computers:
-
-@table @code
-@item -mpa-risc-1-0
-Generate code for a PA 1.0 processor.
-
-@item -mpa-risc-1-1
-Generate code for a PA 1.1 processor.
-
-@item -mbig-switch
-Generate code suitable for big switch tables. Use this option only if
-the assembler/linker complain about out of range branches within a switch
-table.
-
-@item -mjump-in-delay
-Fill delay slots of function calls with unconditional jump instructions
-by modifying the return pointer for the function call to be the target
-of the conditional jump.
-
-@item -mdisable-fpregs
-Prevent floating point registers from being used in any manner. This is
-necessary for compiling kernels which perform lazy context switching of
-floating point registers. If you use this option and attempt to perform
-floating point operations, the compiler will abort.
-
-@item -mdisable-indexing
-Prevent the compiler from using indexing address modes. This avoids some
-rather obscure problems when compiling MIG generated code under MACH.
-
-@item -mno-space-regs
-Generate code that assumes the target has no space registers. This allows
-GCC to generate faster indirect calls and use unscaled index address modes.
-
-Such code is suitable for level 0 PA systems and kernels.
-
-@item -mfast-indirect-calls
-Generate code that assumes calls never cross space boundaries. This
-allows GCC to emit code which performs faster indirect calls.
-
-This option will not work in the presense of shared libraries or nested
-functions.
-
-@item -mspace
-Optimize for space rather than execution time. Currently this only
-enables out of line function prologues and epilogues. This option is
-incompatible with PIC code generation and profiling.
-
-@item -mlong-load-store
-Generate 3-instruction load and store sequences as sometimes required by
-the HP-UX 10 linker. This is equivalent to the @samp{+k} option to
-the HP compilers.
-
-@item -mportable-runtime
-Use the portable calling conventions proposed by HP for ELF systems.
-
-@item -mgas
-Enable the use of assembler directives only GAS understands.
-
-@item -mschedule=@var{cpu type}
-Schedule code according to the constraints for the machine type
-@var{cpu type}. The choices for @var{cpu type} are @samp{700} for
-7@var{n}0 machines, @samp{7100} for 7@var{n}5 machines, and @samp{7100LC}
-for 7@var{n}2 machines. @samp{7100} is the default for @var{cpu type}.
-
-Note the @samp{7100LC} scheduling information is incomplete and using
-@samp{7100LC} often leads to bad schedules. For now it's probably best
-to use @samp{7100} instead of @samp{7100LC} for the 7@var{n}2 machines.
-
-@item -mlinker-opt
-Enable the optimization pass in the HPUX linker. Note this makes symbolic
-debugging impossible. It also triggers a bug in the HPUX 8 and HPUX 9 linkers
-in which they give bogus error messages when linking some programs.
-
-@item -msoft-float
-Generate output containing library calls for floating point.
-@strong{Warning:} the requisite libraries are not available for all HPPA
-targets. Normally the facilities of the machine's usual C compiler are
-used, but this cannot be done directly in cross-compilation. You must make
-your own arrangements to provide suitable library functions for
-cross-compilation. The embedded target @samp{hppa1.1-*-pro}
-does provide software floating point support.
-
-@samp{-msoft-float} changes the calling convention in the output file;
-therefore, it is only useful if you compile @emph{all} of a program with
-this option. In particular, you need to compile @file{libgcc.a}, the
-library that comes with GNU CC, with @samp{-msoft-float} in order for
-this to work.
-@end table
-
-@node Intel 960 Options
-@subsection Intel 960 Options
-
-These @samp{-m} options are defined for the Intel 960 implementations:
-
-@table @code
-@item -m@var{cpu type}
-Assume the defaults for the machine type @var{cpu type} for some of
-the other options, including instruction scheduling, floating point
-support, and addressing modes. The choices for @var{cpu type} are
-@samp{ka}, @samp{kb}, @samp{mc}, @samp{ca}, @samp{cf},
-@samp{sa}, and @samp{sb}.
-The default is
-@samp{kb}.
-
-@item -mnumerics
-@itemx -msoft-float
-The @samp{-mnumerics} option indicates that the processor does support
-floating-point instructions. The @samp{-msoft-float} option indicates
-that floating-point support should not be assumed.
-
-@item -mleaf-procedures
-@itemx -mno-leaf-procedures
-Do (or do not) attempt to alter leaf procedures to be callable with the
-@code{bal} instruction as well as @code{call}. This will result in more
-efficient code for explicit calls when the @code{bal} instruction can be
-substituted by the assembler or linker, but less efficient code in other
-cases, such as calls via function pointers, or using a linker that doesn't
-support this optimization.
-
-@item -mtail-call
-@itemx -mno-tail-call
-Do (or do not) make additional attempts (beyond those of the
-machine-independent portions of the compiler) to optimize tail-recursive
-calls into branches. You may not want to do this because the detection of
-cases where this is not valid is not totally complete. The default is
-@samp{-mno-tail-call}.
-
-@item -mcomplex-addr
-@itemx -mno-complex-addr
-Assume (or do not assume) that the use of a complex addressing mode is a
-win on this implementation of the i960. Complex addressing modes may not
-be worthwhile on the K-series, but they definitely are on the C-series.
-The default is currently @samp{-mcomplex-addr} for all processors except
-the CB and CC.
-
-@item -mcode-align
-@itemx -mno-code-align
-Align code to 8-byte boundaries for faster fetching (or don't bother).
-Currently turned on by default for C-series implementations only.
-
-@ignore
-@item -mclean-linkage
-@itemx -mno-clean-linkage
-These options are not fully implemented.
-@end ignore
-
-@item -mic-compat
-@itemx -mic2.0-compat
-@itemx -mic3.0-compat
-Enable compatibility with iC960 v2.0 or v3.0.
-
-@item -masm-compat
-@itemx -mintel-asm
-Enable compatibility with the iC960 assembler.
-
-@item -mstrict-align
-@itemx -mno-strict-align
-Do not permit (do permit) unaligned accesses.
-
-@item -mold-align
-Enable structure-alignment compatibility with Intel's gcc release version
-1.3 (based on gcc 1.37). This option implies @samp{-mstrict-align}.
-
-@item -mlong-double-64
-Implement type @samp{long double} as 64-bit floating point numbers.
-Without the option @samp{long double} is implemented by 80-bit
-floating point numbers. The only reason we have it because there is
-no 128-bit @samp{long double} support in @samp{fp-bit.c} yet. So it
-is only useful for people using soft-float targets. Otherwise, we
-should recommend against use of it.
-
-@c CYGNUS LOCAL move coalescence
-@item -mmove-coalescence
-@itemx -mno-move-coalescence
-Enable (or disable) coalescing several move instructions in one move
-instruction. This optimization is on only when unaligned access is
-permitted. By default the optimization is off.
-@c END CYGNUS LOCAL move coalescence
-@end table
-
-@node DEC Alpha Options
-@subsection DEC Alpha Options
-
-These @samp{-m} options are defined for the DEC Alpha implementations:
-
-@table @code
-@item -mno-soft-float
-@itemx -msoft-float
-Use (do not use) the hardware floating-point instructions for
-floating-point operations. When @code{-msoft-float} is specified,
-functions in @file{libgcc1.c} will be used to perform floating-point
-operations. Unless they are replaced by routines that emulate the
-floating-point operations, or compiled in such a way as to call such
-emulations routines, these routines will issue floating-point
-operations. If you are compiling for an Alpha without floating-point
-operations, you must ensure that the library is built so as not to call
-them.
-
-Note that Alpha implementations without floating-point operations are
-required to have floating-point registers.
-
-@item -mfp-reg
-@itemx -mno-fp-regs
-Generate code that uses (does not use) the floating-point register set.
-@code{-mno-fp-regs} implies @code{-msoft-float}. If the floating-point
-register set is not used, floating point operands are passed in integer
-registers as if they were integers and floating-point results are passed
-in $0 instead of $f0. This is a non-standard calling sequence, so any
-function with a floating-point argument or return value called by code
-compiled with @code{-mno-fp-regs} must also be compiled with that
-option.
-
-A typical use of this option is building a kernel that does not use,
-and hence need not save and restore, any floating-point registers.
-
-@item -mieee
-The Alpha architecture implements floating-point hardware optimized for
-maximum performance. It is mostly compliant with the IEEE floating
-point standard. However, for full compliance, software assistance is
-required. This option generates code fully IEEE compliant code
-@emph{except} that the @var{inexact flag} is not maintained (see below).
-If this option is turned on, the CPP macro @code{_IEEE_FP} is defined
-during compilation. The option is a shorthand for: @samp{-D_IEEE_FP
--mfp-trap-mode=su -mtrap-precision=i -mieee-conformant}. The resulting
-code is less efficient but is able to correctly support denormalized
-numbers and exceptional IEEE values such as not-a-number and plus/minus
-infinity. Other Alpha compilers call this option
-@code{-ieee_with_no_inexact}.
-
-@item -mieee-with-inexact
-@c overfull hbox here --bob 22 jul96
-@c original text between ignore ... end ignore
-@ignore
-This is like @samp{-mieee} except the generated code also maintains the
-IEEE @var{inexact flag}. Turning on this option causes the generated
-code to implement fully-compliant IEEE math. The option is a shorthand
-for @samp{-D_IEEE_FP -D_IEEE_FP_INEXACT} plus @samp{-mieee-conformant},
-@samp{-mfp-trap-mode=sui}, and @samp{-mtrap-precision=i}. On some Alpha
-implementations the resulting code may execute significantly slower than
-the code generated by default. Since there is very little code that
-depends on the @var{inexact flag}, you should normally not specify this
-option. Other Alpha compilers call this option
-@samp{-ieee_with_inexact}.
-@end ignore
-@c changed paragraph
-This is like @samp{-mieee} except the generated code also maintains the
-IEEE @var{inexact flag}. Turning on this option causes the generated
-code to implement fully-compliant IEEE math. The option is a shorthand
-for @samp{-D_IEEE_FP -D_IEEE_FP_INEXACT} plus the three following:
-@samp{-mieee-conformant},
-@samp{-mfp-trap-mode=sui},
-and @samp{-mtrap-precision=i}.
-On some Alpha implementations the resulting code may execute
-significantly slower than the code generated by default. Since there
-is very little code that depends on the @var{inexact flag}, you should
-normally not specify this option. Other Alpha compilers call this
-option @samp{-ieee_with_inexact}.
-@c end changes to prevent overfull hboxes
-
-@item -mfp-trap-mode=@var{trap mode}
-This option controls what floating-point related traps are enabled.
-Other Alpha compilers call this option @samp{-fptm }@var{trap mode}.
-The trap mode can be set to one of four values:
-
-@table @samp
-@item n
-This is the default (normal) setting. The only traps that are enabled
-are the ones that cannot be disabled in software (e.g., division by zero
-trap).
-
-@item u
-In addition to the traps enabled by @samp{n}, underflow traps are enabled
-as well.
-
-@item su
-Like @samp{su}, but the instructions are marked to be safe for software
-completion (see Alpha architecture manual for details).
-
-@item sui
-Like @samp{su}, but inexact traps are enabled as well.
-@end table
-
-@item -mfp-rounding-mode=@var{rounding mode}
-Selects the IEEE rounding mode. Other Alpha compilers call this option
-@samp{-fprm }@var{rounding mode}. The @var{rounding mode} can be one
-of:
-
-@table @samp
-@item n
-Normal IEEE rounding mode. Floating point numbers are rounded towards
-the nearest machine number or towards the even machine number in case
-of a tie.
-
-@item m
-Round towards minus infinity.
-
-@item c
-Chopped rounding mode. Floating point numbers are rounded towards zero.
-
-@item d
-Dynamic rounding mode. A field in the floating point control register
-(@var{fpcr}, see Alpha architecture reference manual) controls the
-rounding mode in effect. The C library initializes this register for
-rounding towards plus infinity. Thus, unless your program modifies the
-@var{fpcr}, @samp{d} corresponds to round towards plus infinity.@end table
-
-@item -mtrap-precision=@var{trap precision}
-In the Alpha architecture, floating point traps are imprecise. This
-means without software assistance it is impossible to recover from a
-floating trap and program execution normally needs to be terminated.
-GNU CC can generate code that can assist operating system trap handlers
-in determining the exact location that caused a floating point trap.
-Depending on the requirements of an application, different levels of
-precisions can be selected:
-
-@table @samp
-@item p
-Program precision. This option is the default and means a trap handler
-can only identify which program caused a floating point exception.
-
-@item f
-Function precision. The trap handler can determine the function that
-caused a floating point exception.
-
-@item i
-Instruction precision. The trap handler can determine the exact
-instruction that caused a floating point exception.
-@end table
-
-Other Alpha compilers provide the equivalent options called
-@samp{-scope_safe} and @samp{-resumption_safe}.
-
-@item -mieee-conformant
-This option marks the generated code as IEEE conformant. You must not
-use this option unless you also specify @samp{-mtrap-precision=i} and either
-@samp{-mfp-trap-mode=su} or @samp{-mfp-trap-mode=sui}. Its only effect
-is to emit the line @samp{.eflag 48} in the function prologue of the
-generated assembly file. Under DEC Unix, this has the effect that
-IEEE-conformant math library routines will be linked in.
-
-@item -mbuild-constants
-Normally GNU CC examines a 32- or 64-bit integer constant to
-see if it can construct it from smaller constants in two or three
-instructions. If it cannot, it will output the constant as a literal and
-generate code to load it from the data segment at runtime.
-
-Use this option to require GNU CC to construct @emph{all} integer constants
-using code, even if it takes more instructions (the maximum is six).
-
-You would typically use this option to build a shared library dynamic
-loader. Itself a shared library, it must relocate itself in memory
-before it can find the variables and constants in its own data segment.
-
-@item -malpha-as
-@itemx -mgas
-Select whether to generate code to be assembled by the vendor-supplied
-assembler (@samp{-malpha-as}) or by the GNU assembler @samp{-mgas}.
-
-@item -mbwx
-@itemx -mno-bwx
-@itemx -mcix
-@itemx -mno-cix
-@itemx -mmax
-@itemx -mno-max
-Indicate whether GNU CC should generate code to use the optional BWX,
-CIX, and MAX instruction sets. The default is to use the instruction sets
-supported by the CPU type specified via @samp{-mcpu=} option or that
-of the CPU on which GNU CC was built if none was specified.
-
-@item -mcpu=@var{cpu_type}
-Set the instruction set, register set, and instruction scheduling
-parameters for machine type @var{cpu_type}. You can specify either the
-@samp{EV} style name or the corresponding chip number. GNU CC
-supports scheduling parameters for the EV4 and EV5 family of processors
-and will choose the default values for the instruction set from
-the processor you specify. If you do not specify a processor type,
-GNU CC will default to the processor on which the compiler was built.
-
-Supported values for @var{cpu_type} are
-
-@table @samp
-@item ev4
-@itemx 21064
-Schedules as an EV4 and has no instruction set extensions.
-
-@item ev5
-@itemx 21164
-Schedules as an EV5 and has no instruction set extensions.
-
-@item ev56
-@itemx 21164a
-Schedules as an EV5 and supports the BWX extension.
-
-@item pca56
-@itemx 21164pc
-@itemx 21164PC
-Schedules as an EV5 and supports the BWX and MAX extensions.
-
-@item ev6
-@itemx 21264
-Schedules as an EV5 (until Digital releases the scheduling parameters
-for the EV6) and supports the BWX, CIX, and MAX extensions.
-@end table
-
-@item -mmemory-latency=@var{time}
-Sets the latency the scheduler should assume for typical memory
-references as seen by the application. This number is highly
-dependant on the memory access patterns used by the application
-and the size of the external cache on the machine.
-
-Valid options for @var{time} are
-
-@table @samp
-@item @var{number}
-A decimal number representing clock cycles.
-
-@item L1
-@itemx L2
-@itemx L3
-@itemx main
-The compiler contains estimates of the number of clock cycles for
-``typical'' EV4 & EV5 hardware for the Level 1, 2 & 3 caches
-(also called Dcache, Scache, and Bcache), as well as to main memory.
-Note that L3 is only valid for EV5.
-
-@end table
-@end table
-
-@node Clipper Options
-@subsection Clipper Options
-
-These @samp{-m} options are defined for the Clipper implementations:
-
-@table @code
-@item -mc300
-Produce code for a C300 Clipper processor. This is the default.
-
-@itemx -mc400
-Produce code for a C400 Clipper processor i.e. use floating point
-registers f8..f15.
-@end table
-
-@node H8/300 Options
-@subsection H8/300 Options
-
-These @samp{-m} options are defined for the H8/300 implementations:
-
-@table @code
-@item -mrelax
-Shorten some address references at link time, when possible; uses the
-linker option @samp{-relax}. @xref{H8/300,, @code{ld} and the H8/300,
-ld.info, Using ld}, for a fuller description.
-
-@item -mh
-Generate code for the H8/300H.
-
-@item -ms
-Generate code for the H8/S.
-
-@item -mint32
-Make @code{int} data 32 bits by default.
-
-@item -malign-300
-On the h8/300h, use the same alignment rules as for the h8/300.
-The default for the h8/300h is to align longs and floats on 4 byte boundaries.
-@samp{-malign-300} causes them to be aligned on 2 byte boundaries.
-This option has no effect on the h8/300.
-@end table
-
-@node SH Options
-@subsection SH Options
-
-These @samp{-m} options are defined for the SH implementations:
-
-@table @code
-@item -m1
-Generate code for the SH1.
-
-@item -m2
-Generate code for the SH2.
-
-@item -m3
-Generate code for the SH3.
-
-@item -m3e
-Generate code for the SH3e.
-
-@item -mb
-Compile code for the processor in big endian mode.
-
-@item -ml
-Compile code for the processor in little endian mode.
-
-@item -mdalign
-Align doubles at 64 bit boundaries. Note that this changes the calling
-conventions, and thus some functions from the standard C library will
-not work unless you recompile it first with -mdalign.
-
-@item -mrelax
-Shorten some address references at link time, when possible; uses the
-linker option @samp{-relax}.
-@end table
-
-@node System V Options
-@subsection Options for System V
-
-These additional options are available on System V Release 4 for
-compatibility with other compilers on those systems:
-
-@table @code
-@item -G
-Create a shared object.
-It is recommended that @samp{-symbolic} or @samp{-shared} be used instead.
-
-@item -Qy
-Identify the versions of each tool used by the compiler, in a
-@code{.ident} assembler directive in the output.
-
-@item -Qn
-Refrain from adding @code{.ident} directives to the output file (this is
-the default).
-
-@item -YP,@var{dirs}
-Search the directories @var{dirs}, and no others, for libraries
-specified with @samp{-l}.
-
-@item -Ym,@var{dir}
-Look in the directory @var{dir} to find the M4 preprocessor.
-The assembler uses this option.
-@c This is supposed to go with a -Yd for predefined M4 macro files, but
-@c the generic assembler that comes with Solaris takes just -Ym.
-@end table
-
-@c CYGNUS LOCAL: z8k docs
-@c (not yet submitted to FSF)
-@node Z8000 Option
-@subsection Zilog Z8000 Option
-
-GNU CC recognizes one special option when configured to generate
-code for the Z8000 family:
-
-@table @code
-@item -mz8001
-Generate code for the segmented variant of the Z8000 architecture.
-(Without this option, @code{gcc} generates unsegmented Z8000 code;
-suitable, for example, for the Z8002.)
-@end table
-@c END CYGNUS LOCAL
-
-@node V850 Options
-@subsection V850 Options
-@cindex V850 Options
-
-These @samp{-m} options are defined for V850 implementations:
-
-@table @code
-@item -mlong-calls
-@itemx -mno-long-calls
-Treat all calls as being far away (near). If calls are assumed to be
-far away, the compiler will always load the functions address up into a
-register, and call indirect through the pointer.
-
-@item -mno-ep
-@itemx -mep
-Do not optimize (do optimize) basic blocks that use the same index
-pointer 4 or more times to copy pointer into the @code{ep} register, and
-use the shorter @code{sld} and @code{sst} instructions. The @samp{-mep}
-option is on by default if you optimize.
-
-@item -mno-prolog-function
-@itemx -mprolog-function
-Do not use (do use) external functions to save and restore registers at
-the prolog and epilog of a function. The external functions are slower,
-but use less code space if more than one function saves the same number
-of registers. The @samp{-mprolog-function} option is on by default if
-you optimize.
-
-@item -mspace
-Try to make the code as small as possible. At present, this just turns
-on the @samp{-mep} and @samp{-mprolog-function} options.
-
-@item -mtda=@var{n}
-Put static or global variables whose size is @var{n} bytes or less into
-the tiny data area that register @code{ep} points to. The tiny data
-area can hold up to 256 bytes in total (128 bytes for byte references).
-
-@item -msda=@var{n}
-Put static or global variables whose size is @var{n} bytes or less into
-the small data area that register @code{gp} points to. The small data
-area can hold up to 64 kilobytes.
-
-@item -mzda=@var{n}
-Put static or global variables whose size is @var{n} bytes or less into
-the first 32 kilobytes of memory.
-
-@item -mv850
-Specify that the target processor is the V850.
-
-@item -mbig-switch
-Generate code suitable for big switch tables. Use this option only if
-the assembler/linker complain about out of range branches within a switch
-table.
-
-@item -mapp-regs
-This option will cause r2 and r5 to be used in the code generated by
-the compiler. This setting is the default.
-
-@item -mno-app-regs
-This option will cause r2 and r5 to be treated as fixed registers.
-
-@c CYGNUS LOCAL v850e
-@item -mv850e
-Specify that the target processor is the V850E. The preprocessor
-constant @samp{__v850e__} will be defined if this option is used.
-
-If neither @samp{-mv850} nor @samp{-mv850e} are defined
-then a default target processor will be chosen and the relevant
-@samp{__v850*__} preprocessor constant will be defined.
-
-The preprocessor constants @samp{__v850} and @samp{__v851__} are always
-defined, regardless of which processor variant is the target.
-
-@item -mdisable-callt
-This option will suppress generation of the CALLT instruction for the
-v850e flavors of the v850 architecture. The default is
-@samp{-mno-disable-callt} which allows the CALLT instruction to be used.
-
-@c END CYGNUS LOCAL
-
-@end table
-
-@node ARC Options
-@subsection ARC Options
-@cindex ARC Options
-
-These options are defined for ARC implementations:
-
-@table @code
-@item -EL
-Compile code for little endian mode. This is the default.
-
-@item -EB
-Compile code for big endian mode.
-
-@item -mmangle-cpu
-Prepend the name of the cpu to all public symbol names.
-In multiple-processor systems, there are many ARC variants with different
-instruction and register set characteristics. This flag prevents code
-compiled for one cpu to be linked with code compiled for another.
-No facility exists for handling variants that are "almost identical".
-This is an all or nothing option.
-
-@item -mcpu=@var{cpu}
-Compile code for ARC variant @var{cpu}.
-Which variants are supported depend on the configuration.
-All variants support @samp{-mcpu=base}, this is the default.
-
-@item -mtext=@var{text section}
-@item -mdata=@var{data section}
-@item -mrodata=@var{readonly data section}
-Put functions, data, and readonly data in @var{text section},
-@var{data section}, and @var{readonly data section} respectively
-by default. This can be overridden with the @code{section} attribute.
-@xref{Variable Attributes}
-
-@end table
-
-@c CYGNUS LOCAL -- meissner/d10v
-@node D10V Options
-@subsection D10V Options
-@cindex D10V Options
-
-These @samp{-m} options are defined for D10V implementations:
-
-@table @code
-@item -mint32
-@itemx -mint16
-Make @code{int} data 32 (or 16) bits by default. The default is
-@samp{-mint16}.
-
-@item -mdouble64
-@itemx -mdouble32
-Make @code{double} data 64 (or 32) bits by default. The default is
-@samp{-mdouble32}.
-
-@item -maddac3
-@itemx -mno-addac3
-Enable (disable) the use of @code{addac3} and @code{subac3}
-instructions. The @samp{-maddac3} instruction also enables the
-@samp{-maccum} instruction.
-
-@item -maccum
-@itemx -mno-accum
-Enable (disable) the use of the 32-bit accumulators in compiler generated
-code.
-
-@item -mno-asm-optimize
-@itemx -masm-optimize
-Disable (enable) passing @samp{-O} to the assembler when optimizing.
-The assembler uses the @samp{-O} option to automatically parallelize
-adjacent short instructions where possible.
-
-@item -mno-small-insns
-@itemx -msmall-insns
-Disable (enable) converting some long instructions into two short
-instructions, which can eliminate some nops and enable more code to be
-conditionally executed.
-
-@item -mno-cond-move
-@itemx -mcond-move
-Disable (enable) conditional move instructions, which eliminates short
-branches.
-
-@item -mbranch-cost=@var{n}
-Increase the internal costs of branches to @var{n}. Higher costs means
-that the compiler will issue more instructions to avoid doing a branch.
-The default is 1.
-
-@item -mcond-exec=@var{n}
-Specify the maximum number of conditionally executed instructions that
-replace a branch. The default is 4.
-@end table
-@c END CYGNUS LOCAL -- meissner/d10v
-
-@c CYGNUS LOCAL d30v
-@node D30V Options
-@subsection D30V Options
-@cindex D30V Options
-
-These @samp{-m} options are defined for D30V implementations:
-
-@table @code
-@item -mextmem
-Link the @samp{.text}, @samp{.data}, @samp{.bss}, @samp{.strings},
-@samp{.rodata}, @samp{.rodata1}, @samp{.data1} sections into external
-memory, which starts at location @code{0x80000000}.
-
-@item -mextmemory
-Same as the @samp{-mextmem} switch.
-
-@item -monchip
-Link the @samp{.text} section into onchip text memory, which starts at
-location @code{0x0}. Also link @samp{.data}, @samp{.bss},
-@samp{.strings}, @samp{.rodata}, @samp{.rodata1}, @samp{.data1} sections
-into onchip data memory, which starts at location @code{0x20000000}.
-
-@item -mno-asm-optimize
-@itemx -masm-optimize
-Disable (enable) passing @samp{-O} to the assembler when optimizing.
-The assembler uses the @samp{-O} option to automatically parallelize
-adjacent short instructions where possible.
-
-@item -mbranch-cost=@var{n}
-Increase the internal costs of branches to @var{n}. Higher costs means
-that the compiler will issue more instructions to avoid doing a branch.
-The default is 2.
-
-@item -mcond-exec=@var{n}
-Specify the maximum number of conditionally executed instructions that
-replace a branch. The default is 4.
-@end table
-@c END CYGNUS LOCAL d30v
-
-@node NS32K Options
-@subsection NS32K Options
-@cindex NS32K options
-
-These are the @samp{-m} options defined for the 32000 series. The default
-values for these options depends on which style of 32000 was selected when
-the compiler was configured; the defaults for the most common choices are
-given below.
-
-@table @code
-@item -m32032
-@itemx -m32032
-Generate output for a 32032. This is the default
-when the compiler is configured for 32032 and 32016 based systems.
-
-@item -m32332
-@itemx -m32332
-Generate output for a 32332. This is the default
-when the compiler is configured for 32332-based systems.
-
-@item -m32532
-@itemx -m32532
-Generate output for a 32532. This is the default
-when the compiler is configured for 32532-based systems.
-
-@item -m32081
-Generate output containing 32081 instructions for floating point.
-This is the default for all systems.
-
-@item -m32381
-Generate output containing 32381 instructions for floating point. This
-also implies @samp{-m32081}. The 32381 is only compatible with the 32332
-and 32532 cpus. This is the default for the pc532-netbsd configuration.
-
-@item -mmulti-add
-Try and generate multiply-add floating point instructions @code{polyF}
-and @code{dotF}. This option is only available if the @samp{-m32381}
-option is in effect. Using these instructions requires changes to to
-register allocation which generally has a negative impact on
-performance. This option should only be enabled when compiling code
-particularly likely to make heavy use of multiply-add instructions.
-
-@item -mnomulti-add
-Do not try and generate multiply-add floating point instructions
-@code{polyF} and @code{dotF}. This is the default on all platforms.
-
-@item -msoft-float
-Generate output containing library calls for floating point.
-@strong{Warning:} the requisite libraries may not be available.
-
-@item -mnobitfield
-Do not use the bit-field instructions. On some machines it is faster to
-use shifting and masking operations. This is the default for the pc532.
-
-@item -mbitfield
-Do use the bit-field instructions. This is the default for all platforms
-except the pc532.
-
-@item -mrtd
-Use a different function-calling convention, in which functions
-that take a fixed number of arguments return pop their
-arguments on return with the @code{ret} instruction.
-
-This calling convention is incompatible with the one normally
-used on Unix, so you cannot use it if you need to call libraries
-compiled with the Unix compiler.
-
-Also, you must provide function prototypes for all functions that
-take variable numbers of arguments (including @code{printf});
-otherwise incorrect code will be generated for calls to those
-functions.
-
-In addition, seriously incorrect code will result if you call a
-function with too many arguments. (Normally, extra arguments are
-harmlessly ignored.)
-
-This option takes its name from the 680x0 @code{rtd} instruction.
-
-
-@item -mregparam
-Use a different function-calling convention where the first two arguments
-are passed in registers.
-
-This calling convention is incompatible with the one normally
-used on Unix, so you cannot use it if you need to call libraries
-compiled with the Unix compiler.
-
-@item -mnoregparam
-Do not pass any arguments in registers. This is the default for all
-targets.
-
-@item -msb
-It is OK to use the sb as an index register which is always loaded with
-zero. This is the default for the pc532-netbsd target.
-
-@item -mnosb
-The sb register is not available for use or has not been initialized to
-zero by the run time system. This is the default for all targets except
-the pc532-netbsd. It is also implied whenever @samp{-mhimem} or
-@samp{-fpic} is set.
-
-@item -mhimem
-Many ns32000 series addressing modes use displacements of up to 512MB.
-If an address is above 512MB then displacements from zero can not be used.
-This option causes code to be generated which can be loaded above 512MB.
-This may be useful for operating systems or ROM code.
-
-@item -mnohimem
-Assume code will be loaded in the first 512MB of virtual address space.
-This is the default for all platforms.
-
-
-@end table
-
-
-
-@node Code Gen Options
-@section Options for Code Generation Conventions
-@cindex code generation conventions
-@cindex options, code generation
-@cindex run-time options
-
-These machine-independent options control the interface conventions
-used in code generation.
-
-Most of them have both positive and negative forms; the negative form
-of @samp{-ffoo} would be @samp{-fno-foo}. In the table below, only
-one of the forms is listed---the one which is not the default. You
-can figure out the other form by either removing @samp{no-} or adding
-it.
-
-@table @code
-@item -fexceptions
-Enable exception handling. Generates extra code needed to propagate
-exceptions. For some targets, this implies generation of frame unwind
-information for all functions. This can produce significant data size
-overhead, although it does not affect execution.
-If you do not specify this option, it is enabled by
-default for languages like C++ which normally require exception handling,
-and disabled for languages like C that do not normally require it.
-However, when compiling C code that needs to interoperate properly with
-exception handlers written in C++, you may need to enable this option.
-You may also wish to disable this option is you are compiling older C++
-programs that don't use exception handling.
-
-@item -fpcc-struct-return
-Return ``short'' @code{struct} and @code{union} values in memory like
-longer ones, rather than in registers. This convention is less
-efficient, but it has the advantage of allowing intercallability between
-GNU CC-compiled files and files compiled with other compilers.
-
-The precise convention for returning structures in memory depends
-on the target configuration macros.
-
-Short structures and unions are those whose size and alignment match
-that of some integer type.
-
-@item -freg-struct-return
-Use the convention that @code{struct} and @code{union} values are
-returned in registers when possible. This is more efficient for small
-structures than @samp{-fpcc-struct-return}.
-
-If you specify neither @samp{-fpcc-struct-return} nor its contrary
-@samp{-freg-struct-return}, GNU CC defaults to whichever convention is
-standard for the target. If there is no standard convention, GNU CC
-defaults to @samp{-fpcc-struct-return}, except on targets where GNU CC
-is the principal compiler. In those cases, we can choose the standard,
-and we chose the more efficient register return alternative.
-
-@item -fshort-enums
-Allocate to an @code{enum} type only as many bytes as it needs for the
-declared range of possible values. Specifically, the @code{enum} type
-will be equivalent to the smallest integer type which has enough room.
-
-@item -fshort-double
-Use the same size for @code{double} as for @code{float}.
-
-@item -fshared-data
-Requests that the data and non-@code{const} variables of this
-compilation be shared data rather than private data. The distinction
-makes sense only on certain operating systems, where shared data is
-shared between processes running the same program, while private data
-exists in one copy per process.
-
-@item -fno-common
-Allocate even uninitialized global variables in the bss section of the
-object file, rather than generating them as common blocks. This has the
-effect that if the same variable is declared (without @code{extern}) in
-two different compilations, you will get an error when you link them.
-The only reason this might be useful is if you wish to verify that the
-program will work on other systems which always work this way.
-
-@item -fno-ident
-Ignore the @samp{#ident} directive.
-
-@item -fno-gnu-linker
-Do not output global initializations (such as C++ constructors and
-destructors) in the form used by the GNU linker (on systems where the GNU
-linker is the standard method of handling them). Use this option when
-you want to use a non-GNU linker, which also requires using the
-@code{collect2} program to make sure the system linker includes
-constructors and destructors. (@code{collect2} is included in the GNU CC
-distribution.) For systems which @emph{must} use @code{collect2}, the
-compiler driver @code{gcc} is configured to do this automatically.
-
-@item -finhibit-size-directive
-Don't output a @code{.size} assembler directive, or anything else that
-would cause trouble if the function is split in the middle, and the
-two halves are placed at locations far apart in memory. This option is
-used when compiling @file{crtstuff.c}; you should not need to use it
-for anything else.
-
-@item -fverbose-asm
-Put extra commentary information in the generated assembly code to
-make it more readable. This option is generally only of use to those
-who actually need to read the generated assembly code (perhaps while
-debugging the compiler itself).
-
-@samp{-fno-verbose-asm}, the default, causes the
-extra information to be omitted and is useful when comparing two assembler
-files.
-
-@item -fvolatile
-Consider all memory references through pointers to be volatile.
-
-@item -fvolatile-global
-Consider all memory references to extern and global data items to
-be volatile.
-
-@item -fpic
-@cindex global offset table
-@cindex PIC
-Generate position-independent code (PIC) suitable for use in a shared
-library, if supported for the target machine. Such code accesses all
-constant addresses through a global offset table (GOT). The dynamic
-loader resolves the GOT entries when the program starts (the dynamic
-loader is not part of GNU CC; it is part of the operating system). If
-the GOT size for the linked executable exceeds a machine-specific
-maximum size, you get an error message from the linker indicating that
-@samp{-fpic} does not work; in that case, recompile with @samp{-fPIC}
-instead. (These maximums are 16k on the m88k, 8k on the Sparc, and 32k
-on the m68k and RS/6000. The 386 has no such limit.)
-
-Position-independent code requires special support, and therefore works
-only on certain machines. For the 386, GNU CC supports PIC for System V
-but not for the Sun 386i. Code generated for the IBM RS/6000 is always
-position-independent.
-
-@item -fPIC
-If supported for the target machine, emit position-independent code,
-suitable for dynamic linking and avoiding any limit on the size of the
-global offset table. This option makes a difference on the m68k, m88k,
-and the Sparc.
-
-Position-independent code requires special support, and therefore works
-only on certain machines.
-
-@item -ffixed-@var{reg}
-Treat the register named @var{reg} as a fixed register; generated code
-should never refer to it (except perhaps as a stack pointer, frame
-pointer or in some other fixed role).
-
-@var{reg} must be the name of a register. The register names accepted
-are machine-specific and are defined in the @code{REGISTER_NAMES}
-macro in the machine description macro file.
-
-This flag does not have a negative form, because it specifies a
-three-way choice.
-
-@item -fcall-used-@var{reg}
-Treat the register named @var{reg} as an allocable register that is
-clobbered by function calls. It may be allocated for temporaries or
-variables that do not live across a call. Functions compiled this way
-will not save and restore the register @var{reg}.
-
-It is an error to used this flag with the frame pointer or stack pointer.
-Use of this flag for other registers that have fixed pervasive roles in
-the machine's execution model will produce disastrous results.
-
-This flag does not have a negative form, because it specifies a
-three-way choice.
-
-@item -fcall-saved-@var{reg}
-Treat the register named @var{reg} as an allocable register saved by
-functions. It may be allocated even for temporaries or variables that
-live across a call. Functions compiled this way will save and restore
-the register @var{reg} if they use it.
-
-It is an error to used this flag with the frame pointer or stack pointer.
-Use of this flag for other registers that have fixed pervasive roles in
-the machine's execution model will produce disastrous results.
-
-A different sort of disaster will result from the use of this flag for
-a register in which function values may be returned.
-
-This flag does not have a negative form, because it specifies a
-three-way choice.
-
-@item -fpack-struct
-Pack all structure members together without holes. Usually you would
-not want to use this option, since it makes the code suboptimal, and
-the offsets of structure members won't agree with system libraries.
-
-@item -fcheck-memory-usage
-Generate extra code to check each memory access. GNU CC will generate
-code that is suitable for a detector of bad memory accesses such as
-@file{Checker}.
-
-You must also specify this option when you compile functions you call that
-have side effects. If you do not, you may get erroneous messages from
-the detector. Normally, you should compile all your code with this option.
-If you use functions from a library that have side-effects (such as
-@code{read}), you may not be able to recompile the library and
-specify this option. In that case, you can enable the
-@samp{-fprefix-function-name} option, which requests GNU CC to encapsulate
-your code and make other functions look as if they were compiled with
-@samp{-fcheck-memory-usage}. This is done by calling ``stubs'',
-which are provided by the detector. If you cannot find or build
-stubs for every function you call, you may have to specify
-@samp{-fcheck-memory-usage} without @samp{-fprefix-function-name}.
-
-If you specify this option, you can not use the @code{asm} or
-@code{__asm__} keywords in functions with memory checking enabled. The
-compiler cannot understand what the @code{asm} statement will do, and
-therefore cannot generate the appropriate code, so it is rejected.
-However, the function attribute @code{no_check_memory_usage} will
-disable memory checking within a function, and @code{asm} statements can
-be put inside such functions. Inline expansion of a non-checked
-function within a checked function is permitted; the inline function's
-memory accesses won't be checked, but the rest will.
-
-If you move your @code{asm} statements to non-checked inline functions,
-but they do access memory, you can add calls to the support code in your
-inline function, to indicate any reads, writes, or copies being done.
-These calls would be similar to those done in the stubs described above.
-
-@c FIXME: The support-routine interface is defined by the compiler and
-@c should be documented!
-
-@item -fprefix-function-name
-Request GNU CC to add a prefix to the symbols generated for function names.
-GNU CC adds a prefix to the names of functions defined as well as
-functions called. Code compiled with this option and code compiled
-without the option can't be linked together, unless or stubs are used.
-
-If you compile the following code with @samp{-fprefix-function-name}
-@example
-extern void bar (int);
-void
-foo (int a)
-@{
- return bar (a + 5);
-
-@}
-@end example
-
-@noindent
-GNU CC will compile the code as if it was written:
-@example
-extern void prefix_bar (int);
-void
-prefix_foo (int a)
-@{
- return prefix_bar (a + 5);
-@}
-@end example
-This option is designed to be used with @samp{-fcheck-memory-usage}.
-
-@item -finstrument-functions
-Generate instrumentation calls for entry and exit to functions. Just
-after function entry and just before function exit, the following
-profiling functions will be called with the address of the current
-function and its call site. (On some platforms,
-@code{__builtin_return_address} does not work beyond the current
-function, so the call site information may not be available to the
-profiling functions otherwise.)
-
-@example
-void __cyg_profile_func_enter (void *this_fn, void *call_site);
-void __cyg_profile_func_exit (void *this_fn, void *call_site);
-@end example
-
-The first argument is the address of the start of the current function,
-which may be looked up exactly in the symbol table.
-
-This instrumentation is also done for functions expanded inline in other
-functions. The profiling calls will indicate where, conceptually, the
-inline function is entered and exited. This means that addressable
-versions of such functions must be available. If all your uses of a
-function are expanded inline, this may mean an additional expansion of
-code size. If you use @samp{extern inline} in your C code, an
-addressable version of such functions must be provided. (This is
-normally the case anyways, but if you get lucky and the optimizer always
-expands the functions inline, you might have gotten away without
-providing static copies.)
-
-A function may be given the attribute @code{no_instrument_function}, in
-which case this instrumentation will not be done. This can be used, for
-example, for the profiling functions listed above, high-priority
-interrupt routines, and any functions from which the profiling functions
-cannot safely be called (perhaps signal handlers, if the profiling
-routines generate output or allocate memory).
-
-@item -fstack-check
-Generate code to verify that you do not go beyond the boundary of the
-stack. You should specify this flag if you are running in an
-environment with multiple threads, but only rarely need to specify it in
-a single-threaded environment since stack overflow is automatically
-detected on nearly all systems if there is only one stack.
-
-@c CYGNUS LOCAL unaligned-pointers
-@item -funaligned-pointers
-Assume that all pointers contain unaligned addresses. On machines where
-unaligned memory accesses trap, this will result in much larger and slower
-code for all pointer dereferences, but the code will work even if addresses
-are unaligned.
-@c END CYGNUS LOCAL
-
-@c CYGNUS LOCAL unaligned-struct-hack
-@item -funaligned-struct-hack
-Always access structure fields using loads and stores of the declared size.
-This option is useful for code that derefences pointers to unaligned
-structures, but only accesses fields that are themselves aligned. Without
-this option, gcc may try to use a memory access larger than the field.
-This might give an unaligned access fault on some hardware.
-
-This option makes some invalid code work at the expense of disabling
-some optimizations. It is strongly recommended that this option not be
-used.
-@c END CYGNUS LOCAL
-
-@c CYGNUS LOCAL -- meissner/nortel
-@item -foptimize-comparisons
-Optimize multiple comparisons better within @code{&&} and @code{||}
-expressions. This is an experimental option. In some cases it can
-result in worse code. It depends on many factors. Now it is known
-only that the optimization works well for PPC740 and PPC750. This
-option switches on the following transformations:
-@example
- (a != 0 || b != 0) => ((a | b) != 0)
- (a == 0 && b == 0) => ((a | b) == 0)
- (a != b || c != d) => (((a ^ b) | (c ^ d)) != 0)
- (a == b && c == d) => (((a ^ b) | (c ^ d)) == 0)
- (a != 0 && b != 0) => (((a | -a) & (b | -b)) < 0)
- (a != b && c != d) => x = a ^ b; y = c ^ d; (((x | -x) & (y | -y)) < 0)
- (a < 0 || b < 0) => ((a | b) < 0)
- (a < 0 && b < 0) => ((a & b) < 0)
- (a >= 0 || b >= 0) => ((a & b) >= 0)
- (a >= 0 && b >= 0) => ((a | b) >= 0)
- (a < 0 || b >= 0) => ((a | ~b) < 0)
- (a < 0 && b >= 0) => ((a & ~b) < 0)
- (a >= 0 || b < 0) => ((~a | b) < 0)
- (a >= 0 && b < 0) => ((~a & b) < 0)
- (a != 0 && b < 0) => (((a | -a) & b) < 0)
- (a != 0 && b >= 0) => (((a | -a) & ~b) < 0)
- (a < 0 && b != 0) => (((b | -b) & a) < 0)
- (a >= 0 && b != 0) => (((b | -b) & ~a) < 0)
-@end example
-@c END CYGNUS LOCAL -- meissner/nortel
-@end table
-
-@c CYGNUS LOCAL v850/law
-@node Offset info Option
-@section Offset info Option
-
-@code{-offset-info output-file}
-
-This option simplifys access to C struct's from assembler.
-For each member of each structure the compiler
-will output a @code{.equ} directive to associate a symbol
-with the member's offset in bytes into the structure. The
-symbol itself is the concatenation of the structure's tag name and
-the member's name, separated by an underscore.
-
-This option will output to the specified @code{output-file} an
-assembler @code{.equ} directive for each member of each structure
-found in each compilation. The @code{.equ} directives for the
-structures in a single header file can be obtained as follows:
-
-@example
-gcc -fsyntax-only -offset-info m.s -x c m.h
-@end example
-
-@noindent
-Where @code{m.h} is the header containing the structures, and
-@code{m.s} is where the directives are output.
-
-The following is a short example of output produced by
-@code{-offset-info}.
-
-@example
-input file (for example m.h):
-
- struct W @{
- double d;
- int i;
- @};
-
- struct X @{
- int a;
- int b;
-
- struct Y @{
- int a;
- int b;
- @};
-
- struct Y y;
- struct Y yy[10];
- struct Y* p;
- @};
-
-output file (for example m.s):
- .equ W_d,0
- .equ W_i,8
- .equ Y_a,0
- .equ Y_b,4
- .equ X_a,0
- .equ X_b,4
- .equ X_y,8
- .equ X_yy,16
- .equ X_p,96
-@end example
-
-@noindent
-The @code{-offset-info} option has the following caveats:
-
-@table @bullet
-@item
-No directives are output for bit-field members.
-
-@item
-No directives are output for members who's offsets
-(as measured in bits) is greater than the word size of the host.
-
-@item
-No directives are output for members who's offsets are not
-constants. This can happened only in structures which use some
-gcc specific extensions which allow for variable sized members.
-
-@end table
-@c END CYGNUS LOCAL
-
-@cindex aliasing of parameters
-@cindex parameters, aliased
-@table @code
-@item -fargument-alias
-@itemx -fargument-noalias
-@itemx -fargument-noalias-global
-Specify the possible relationships among parameters and between
-parameters and global data.
-
-@samp{-fargument-alias} specifies that arguments (parameters) may
-alias each other and may alias global storage.
-@samp{-fargument-noalias} specifies that arguments do not alias
-each other, but may alias global storage.
-@samp{-fargument-noalias-global} specifies that arguments do not
-alias each other and do not alias global storage.
-
-Each language will automatically use whatever option is required by
-the language standard. You should not need to use these options yourself.
-
-@item -fleading-underscore
-This option and its counterpart, -fno-leading-underscore, forcibly
-change the way C symbols are represented in the object file. One use
-is to help link with legacy assembly code.
-
-Be warned that you should know what you are doing when invoking this
-option, and that not all targets provide complete support for it.
-@end table
-
-@node Environment Variables
-@section Environment Variables Affecting GNU CC
-@cindex environment variables
-
-This section describes several environment variables that affect how GNU
-CC operates. Some of them work by specifying directories or prefixes to use
-when searching for various kinds of files. Some are used to specify other
-aspects of the compilation environment.
-
-@ifclear INTERNALS
-Note that you can also specify places to search using options such as
-@samp{-B}, @samp{-I} and @samp{-L} (@pxref{Directory Options}). These
-take precedence over places specified using environment variables, which
-in turn take precedence over those specified by the configuration of GNU
-CC.
-@end ifclear
-@ifset INTERNALS
-Note that you can also specify places to search using options such as
-@samp{-B}, @samp{-I} and @samp{-L} (@pxref{Directory Options}). These
-take precedence over places specified using environment variables, which
-in turn take precedence over those specified by the configuration of GNU
-CC. @xref{Driver}.
-@end ifset
-
-@table @code
-@item TMPDIR
-@findex TMPDIR
-If @code{TMPDIR} is set, it specifies the directory to use for temporary
-files. GNU CC uses temporary files to hold the output of one stage of
-compilation which is to be used as input to the next stage: for example,
-the output of the preprocessor, which is the input to the compiler
-proper.
-
-@item GCC_EXEC_PREFIX
-@findex GCC_EXEC_PREFIX
-If @code{GCC_EXEC_PREFIX} is set, it specifies a prefix to use in the
-names of the subprograms executed by the compiler. No slash is added
-when this prefix is combined with the name of a subprogram, but you can
-specify a prefix that ends with a slash if you wish.
-
-@c CYGNUS LOCAL -- meissner/relative pathnames
-If @code{GCC_EXEC_PREFIX} is not set, GNU CC will attempt to figure out
-an appropriate prefix to use based on the pathname it was invoked with.
-@c END CYGNUS LOCAL -- meissner/relative pathnames
-
-If GNU CC cannot find the subprogram using the specified prefix, it
-tries looking in the usual places for the subprogram.
-
-The default value of @code{GCC_EXEC_PREFIX} is
-@file{@var{prefix}/lib/gcc-lib/} where @var{prefix} is the value
-of @code{prefix} when you ran the @file{configure} script.
-
-Other prefixes specified with @samp{-B} take precedence over this prefix.
-
-This prefix is also used for finding files such as @file{crt0.o} that are
-used for linking.
-
-In addition, the prefix is used in an unusual way in finding the
-directories to search for header files. For each of the standard
-directories whose name normally begins with @samp{/usr/local/lib/gcc-lib}
-(more precisely, with the value of @code{GCC_INCLUDE_DIR}), GNU CC tries
-replacing that beginning with the specified prefix to produce an
-alternate directory name. Thus, with @samp{-Bfoo/}, GNU CC will search
-@file{foo/bar} where it would normally search @file{/usr/local/lib/bar}.
-These alternate directories are searched first; the standard directories
-come next.
-
-@item COMPILER_PATH
-@findex COMPILER_PATH
-The value of @code{COMPILER_PATH} is a colon-separated list of
-directories, much like @code{PATH}. GNU CC tries the directories thus
-specified when searching for subprograms, if it can't find the
-subprograms using @code{GCC_EXEC_PREFIX}.
-
-@item LIBRARY_PATH
-@findex LIBRARY_PATH
-The value of @code{LIBRARY_PATH} is a colon-separated list of
-directories, much like @code{PATH}. When configured as a native compiler,
-GNU CC tries the directories thus specified when searching for special
-linker files, if it can't find them using @code{GCC_EXEC_PREFIX}. Linking
-using GNU CC also uses these directories when searching for ordinary
-libraries for the @samp{-l} option (but directories specified with
-@samp{-L} come first).
-
-@item C_INCLUDE_PATH
-@itemx CPLUS_INCLUDE_PATH
-@itemx OBJC_INCLUDE_PATH
-@findex C_INCLUDE_PATH
-@findex CPLUS_INCLUDE_PATH
-@findex OBJC_INCLUDE_PATH
-@c @itemx OBJCPLUS_INCLUDE_PATH
-These environment variables pertain to particular languages. Each
-variable's value is a colon-separated list of directories, much like
-@code{PATH}. When GNU CC searches for header files, it tries the
-directories listed in the variable for the language you are using, after
-the directories specified with @samp{-I} but before the standard header
-file directories.
-
-@item DEPENDENCIES_OUTPUT
-@findex DEPENDENCIES_OUTPUT
-@cindex dependencies for make as output
-If this variable is set, its value specifies how to output dependencies
-for Make based on the header files processed by the compiler. This
-output looks much like the output from the @samp{-M} option
-(@pxref{Preprocessor Options}), but it goes to a separate file, and is
-in addition to the usual results of compilation.
-
-The value of @code{DEPENDENCIES_OUTPUT} can be just a file name, in
-which case the Make rules are written to that file, guessing the target
-name from the source file name. Or the value can have the form
-@samp{@var{file} @var{target}}, in which case the rules are written to
-file @var{file} using @var{target} as the target name.
-
-@item LANG
-@findex LANG
-@cindex locale definition
-This variable is used to pass locale information to the compiler. One way in
-which this information is used is to determine the character set to be used
-when character literals, string literals and comments are parsed in C and C++.
-When the compiler is configured to allow multibyte characters,
-the following values for @code{LANG} are recognized:
-
-@table @code
-@item C-JIS
-Recognize JIS characters.
-@item C-SJIS
-Recognize SJIS characters.
-@item C-EUCJP
-Recognize EUCJP characters.
-@end table
-
-If @code{LANG} is not defined, or if it has some other value, then the
-compiler will use mblen and mbtowc as defined by the default locale to
-recognize and translate multibyte characters.
-@end table
-
-@node Running Protoize
-@section Running Protoize
-
-The program @code{protoize} is an optional part of GNU C. You can use
-it to add prototypes to a program, thus converting the program to ANSI
-C in one respect. The companion program @code{unprotoize} does the
-reverse: it removes argument types from any prototypes that are found.
-
-When you run these programs, you must specify a set of source files as
-command line arguments. The conversion programs start out by compiling
-these files to see what functions they define. The information gathered
-about a file @var{foo} is saved in a file named @file{@var{foo}.X}.
-
-After scanning comes actual conversion. The specified files are all
-eligible to be converted; any files they include (whether sources or
-just headers) are eligible as well.
-
-But not all the eligible files are converted. By default,
-@code{protoize} and @code{unprotoize} convert only source and header
-files in the current directory. You can specify additional directories
-whose files should be converted with the @samp{-d @var{directory}}
-option. You can also specify particular files to exclude with the
-@samp{-x @var{file}} option. A file is converted if it is eligible, its
-directory name matches one of the specified directory names, and its
-name within the directory has not been excluded.
-
-Basic conversion with @code{protoize} consists of rewriting most
-function definitions and function declarations to specify the types of
-the arguments. The only ones not rewritten are those for varargs
-functions.
-
-@code{protoize} optionally inserts prototype declarations at the
-beginning of the source file, to make them available for any calls that
-precede the function's definition. Or it can insert prototype
-declarations with block scope in the blocks where undeclared functions
-are called.
-
-Basic conversion with @code{unprotoize} consists of rewriting most
-function declarations to remove any argument types, and rewriting
-function definitions to the old-style pre-ANSI form.
-
-Both conversion programs print a warning for any function declaration or
-definition that they can't convert. You can suppress these warnings
-with @samp{-q}.
-
-The output from @code{protoize} or @code{unprotoize} replaces the
-original source file. The original file is renamed to a name ending
-with @samp{.save}. If the @samp{.save} file already exists, then
-the source file is simply discarded.
-
-@code{protoize} and @code{unprotoize} both depend on GNU CC itself to
-scan the program and collect information about the functions it uses.
-So neither of these programs will work until GNU CC is installed.
-
-Here is a table of the options you can use with @code{protoize} and
-@code{unprotoize}. Each option works with both programs unless
-otherwise stated.
-
-@table @code
-@item -B @var{directory}
-Look for the file @file{SYSCALLS.c.X} in @var{directory}, instead of the
-usual directory (normally @file{/usr/local/lib}). This file contains
-prototype information about standard system functions. This option
-applies only to @code{protoize}.
-
-@item -c @var{compilation-options}
-Use @var{compilation-options} as the options when running @code{gcc} to
-produce the @samp{.X} files. The special option @samp{-aux-info} is
-always passed in addition, to tell @code{gcc} to write a @samp{.X} file.
-
-Note that the compilation options must be given as a single argument to
-@code{protoize} or @code{unprotoize}. If you want to specify several
-@code{gcc} options, you must quote the entire set of compilation options
-to make them a single word in the shell.
-
-There are certain @code{gcc} arguments that you cannot use, because they
-would produce the wrong kind of output. These include @samp{-g},
-@samp{-O}, @samp{-c}, @samp{-S}, and @samp{-o} If you include these in
-the @var{compilation-options}, they are ignored.
-
-@item -C
-Rename files to end in @samp{.C} instead of @samp{.c}.
-This is convenient if you are converting a C program to C++.
-This option applies only to @code{protoize}.
-
-@item -g
-Add explicit global declarations. This means inserting explicit
-declarations at the beginning of each source file for each function
-that is called in the file and was not declared. These declarations
-precede the first function definition that contains a call to an
-undeclared function. This option applies only to @code{protoize}.
-
-@item -i @var{string}
-Indent old-style parameter declarations with the string @var{string}.
-This option applies only to @code{protoize}.
-
-@code{unprotoize} converts prototyped function definitions to old-style
-function definitions, where the arguments are declared between the
-argument list and the initial @samp{@{}. By default, @code{unprotoize}
-uses five spaces as the indentation. If you want to indent with just
-one space instead, use @samp{-i " "}.
-
-@item -k
-Keep the @samp{.X} files. Normally, they are deleted after conversion
-is finished.
-
-@item -l
-Add explicit local declarations. @code{protoize} with @samp{-l} inserts
-a prototype declaration for each function in each block which calls the
-function without any declaration. This option applies only to
-@code{protoize}.
-
-@item -n
-Make no real changes. This mode just prints information about the conversions
-that would have been done without @samp{-n}.
-
-@item -N
-Make no @samp{.save} files. The original files are simply deleted.
-Use this option with caution.
-
-@item -p @var{program}
-Use the program @var{program} as the compiler. Normally, the name
-@file{gcc} is used.
-
-@item -q
-Work quietly. Most warnings are suppressed.
-
-@item -v
-Print the version number, just like @samp{-v} for @code{gcc}.
-@end table
-
-If you need special compiler options to compile one of your program's
-source files, then you should generate that file's @samp{.X} file
-specially, by running @code{gcc} on that source file with the
-appropriate options and the option @samp{-aux-info}. Then run
-@code{protoize} on the entire set of files. @code{protoize} will use
-the existing @samp{.X} file because it is newer than the source file.
-For example:
-
-@example
-gcc -Dfoo=bar file1.c -aux-info
-protoize *.c
-@end example
-
-@noindent
-You need to include the special files along with the rest in the
-@code{protoize} command, even though their @samp{.X} files already
-exist, because otherwise they won't get converted.
-
-@xref{Protoize Caveats}, for more information on how to use
-@code{protoize} successfully.
-
diff --git a/gcc/listing b/gcc/listing
deleted file mode 100755
index dc989f6..0000000
--- a/gcc/listing
+++ /dev/null
@@ -1,227 +0,0 @@
-#!/bin/sh -f
-# Generate a source code listing for C or C++ code with assembler code. The
-# listing is always written to stdout.
-# Author: Igor Metz <metz@iam.unibe.ch>
-
-# Revision 1.4 94/08/26 13:58:27 coxs <coxs@dg-rtp.dg.com>
-# lister now guesses how to should be configured. Added elf and coff support.
-#
-# Revision 1.3 89/12/18 13:58:27 metz
-# lister must now be configured before it can be used. This is done in the
-# /bin/sh part of the code.
-#
-#
-# Revision 1.2 89/08/16 17:35:02 metz
-# Support for SPARC added.
-#
-# Revision 1.1 89/08/16 16:49:22 metz
-# Initial revision
-#
-
-# Requires: gawk (may be it works also with nawk)
-
-# usage: lister filename [compiler-options]
-
-# Method:
-# compile the source with -g option to assembler code, then merge the
-# generated assembler code with the source code. Compiler options
-# can be supplied on the command line (for example -O)
-
-# To install lister, assign one of the supported values to the variable MYSYS:
-# mc68020 for Motorola 68020 (Sun-3, ..)
-# mc68030 for Motorola 68030 (Sun-3, ..)
-# sparc for SPARC (SUN-4, ..)
-# i386 for i386 (Sun i386, ...)
-# i386-gnu-linux for i386 (GNU/Linux, ...)
-
-# Guess what kind of objects we are creating and thus what type of assembler
-# symbols to look for
-
-ex /tmp/$$.c <<END >/dev/null
-a
-main (){}
-.
-w
-q
-END
-WD=`pwd`
-cd /tmp
-gcc -c $$.c
-case "`file $$.o`" in
-*ELF*) MYSYS=elf ;;
-*COFF*|*BCS*) MYSYS=coff ;;
-*mc68k*|*M68000*) MYSYS=mc68030 ;;
-*SPARC*) MYSYS=sparc ;;
-*386*) MYSYS=i386 ;;
-esac
-rm $$.c $$.o
-cd $WD
-
-# uncomment the line you need if the above guesses incorrectly:
-# MYSYS=mc68020
-# MYSYS=mc68030
-# MYSYS=sparc
-# MYSYS=i386
-# MYSYS=i386-gnu-linux
-# MYSYS=`mach` # this will work on Suns with SunOS > 4.0.0
-# MYSYS=elf
-# MYSYS=coff
-
-WHOAMI=$0
-if [ $# -gt 0 ] ; then
-FILENAME=$1
-shift
-fi
-
-exec gawk -v whoami=$WHOAMI -vsys=$MYSYS -voptions="$*" '
-# commandline arguments:
-# ARGV[0] = "gawk"
-# ARGV[1] = processid
-# ARGV[2] = filename
-BEGIN {
- if (ARGC != 3) {
- usage()
- exit 1
- }
-
- # Declaration of global variables
- c_filename = ""
- asm_filename = ""
- cmdline = ""
- asm_code = ""
- c_code = ""
- c_lineno = 0
- oldlineno = 0
- newlineno = 0
- ignore_stabd = 0
- num_of_fields = 0
-
- # check processor architecture and set sourcecode line_hint accordingly
- if (sys == "sparc" || sys == "i386") {
- line_hint = "^[ \t]*\.stabn.*"
- line_field = 3;
- line_delimiter = ",";
- line_offset = 0;
- }
- else if (sys == "mc68020" || sys == "mc68030" || sys == "i386-gnu-linux") {
- line_hint = "^[ \t]*\.stabd.*"
- line_field = 3;
- line_delimiter = ",";
- line_offset = 0;
- }
- else if (sys == "elf") {
- line_hint = "section.*\.line"
- line_field = 3;
- line_delimiter = "\t";
- line_offset = 0;
- }
- else if (sys == "coff") {
- line_hint = "^[ \t]*ln"
- line_field = 3;
- line_delimiter = "\t";
- }
- else {
- error("Processor type " sys " is not supported yet, sorry")
- }
-
- parse_cmdline()
-
- printf("compiling %s to asm code\n", c_filename ) > "/dev/stderr"
-
- if (system(cmdline) != 0 ) {
- error("Compilation of " c_filename " failed")
- }
-
- printf("generating listing\n") > "/dev/stderr"
-
-
- while ( getline asm_code < asm_filename > 0 ) {
- if ( (ignore_stabd==0) && (asm_code ~ line_hint)) {
- while ( sys == "elf" && (asm_code !~ "word" && asm_code !~ "byte") &&
- getline asm_code < asm_filename > 0);
- # source line hint found. Split the line into fields separated by commas.
- # num_of_fields is 4 for sparc, 3 for m68k
- num_of_fields = split(asm_code, fields, line_delimiter)
- newlineno = fields[line_field] + line_offset;
-
- if (newlineno > oldlineno) {
- while ( newlineno > c_lineno && getline c_code < c_filename > 0) {
- c_lineno++
- printf("%4d %s\n", c_lineno, c_code)
- }
- oldlineno = newlineno
- }
- }
- else if ( asm_code ~ ".*Ltext[ \t]*$" ) {
- # filename hint found
- if ( match(asm_code, c_filename)) {
- ignore_stabd = 0
- }
- else {
- ignore_stabd = 1
- }
- }
- else if ( sys == "elf" && asm_code ~ "section.*\.debug" ) {
- while ( asm_code !~ "^[ \t]*[.]*previous" &&
- asm_code !~ "\.popsection" &&
- getline asm_code < asm_filename > 0 );
- if ( ! (getline asm_code < asm_filename > 0)) break;
- }
- else if ( sys == "coff" && asm_code ~ "^[ \t]*sdef" ) {
- if ( asm_code ~ "\.bf" ) {
- while ( asm_code !~ "^[ \t]*line" &&
- getline asm_code < asm_filename > 0 ) {
- num_of_fields = split(asm_code, fields, "\t")
- line_offset = fields[line_field] - 1;
- }
- }
- while ( asm_code !~ "^[ \t]*endef" &&
- getline asm_code < asm_filename > 0 ) {
- }
- if ( ! (getline asm_code < asm_filename > 0)) break;
- }
- printf("\t\t\t%s\n", asm_code)
- }
-
- # general cleanup
- system("/bin/rm " asm_filename)
-}
-
-function usage() {
- printf("usage: %s filename compiler-options\n", whoami) > "/dev/stderr"
-}
-
-function error(s) {
- printf("error: %s\n", s) > "/dev/stderr"
- exit 1
-}
-
-function parse_cmdline( i) {
- # construct filenames to use
- asm_filename = "/tmp/lister" ARGV[1] ".s"
- ARGV[1] = ""
- c_filename = ARGV[2]
- ARGV[2] = ""
-
- # construct commandline to use
- if ( match(c_filename, ".C") || match(c_filename, ".cc") ) {
- cmdline = "g++"
- }
- else if (match(c_filename, ".c") || match(c_filename, ".i")) {
- cmdline = "gcc"
- }
- else {
- error("unknown extension for file " c_filename)
- }
-
- cmdline = cmdline " -g -S -o " asm_filename
-
- # now we append the compiler options specified by the user
- cmdline = cmdline " " options
-
- # last but not least: the name of the file to compile
- cmdline = cmdline " " c_filename
-}
-
-' $$ $FILENAME
-
diff --git a/gcc/mbchar.c b/gcc/mbchar.c
deleted file mode 100755
index a22e52b..0000000
--- a/gcc/mbchar.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/* Multibyte Character Functions.
- Copyright (C) 1998 Free Software Foundation, Inc.
-
-This file is part of GNU CC.
-
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-/* These functions are used to manipulate multibyte characters. */
-
-/* Note regarding cross compilation:
-
- In general translation of multibyte characters to wide characters can
- only work in a native compiler since the translation function (mbtowc)
- needs to know about both the source and target character encoding. However,
- this particular implementation for JIS, SJIS and EUCJP source characters
- will work for any compiler with a newlib target. Other targets may also
- work provided that their wchar_t implementation is 2 bytes and the encoding
- leaves the source character values unchanged (except for removing the
- state shifting markers). */
-
-#ifdef MULTIBYTE_CHARS
-#include "config.h"
-#include "system.h"
-#include "mbchar.h"
-#include <locale.h>
-
-typedef enum
-{
- ESCAPE, DOLLAR, BRACKET, AT, B, J, NUL, JIS_CHAR, OTHER, JIS_C_NUM
-} JIS_CHAR_TYPE;
-
-typedef enum
-{
- ASCII, A_ESC, A_ESC_DL, JIS, JIS_1, JIS_2, J_ESC, J_ESC_BR,
- J2_ESC, J2_ESC_BR, INV, JIS_S_NUM
-} JIS_STATE;
-
-typedef enum
-{
- COPYA, COPYJ, COPYJ2, MAKE_A, MAKE_J, NOOP, EMPTY, ERROR
-} JIS_ACTION;
-
-/*****************************************************************************
- * state/action tables for processing JIS encoding
- * Where possible, switches to JIS are grouped with proceding JIS characters
- * and switches to ASCII are grouped with preceding JIS characters.
- * Thus, maximum returned length is:
- * 2 (switch to JIS) + 2 (JIS characters) + 2 (switch back to ASCII) = 6.
- *****************************************************************************/
-static JIS_STATE JIS_state_table[JIS_S_NUM][JIS_C_NUM] = {
-/* ESCAPE DOLLAR BRACKET AT B J NUL JIS_CHAR OTHER*/
-/*ASCII*/ { A_ESC, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII,ASCII,ASCII},
-/*A_ESC*/ { ASCII, A_ESC_DL,ASCII, ASCII, ASCII, ASCII, ASCII,ASCII,ASCII},
-/*A_ESC_DL*/{ ASCII, ASCII, ASCII, JIS, JIS, ASCII, ASCII,ASCII,ASCII},
-/*JIS*/ { J_ESC, JIS_1, JIS_1, JIS_1, JIS_1, JIS_1, INV, JIS_1,INV },
-/*JIS_1*/ { INV, JIS_2, JIS_2, JIS_2, JIS_2, JIS_2, INV, JIS_2,INV },
-/*JIS_2*/ { J2_ESC,JIS, JIS, JIS, JIS, JIS, INV, JIS, JIS },
-/*J_ESC*/ { INV, INV, J_ESC_BR, INV, INV, INV, INV, INV, INV },
-/*J_ESC_BR*/{ INV, INV, INV, INV, ASCII, ASCII, INV, INV, INV },
-/*J2_ESC*/ { INV, INV, J2_ESC_BR,INV, INV, INV, INV, INV, INV },
-/*J2_ESC_BR*/{INV, INV, INV, INV, ASCII, ASCII, INV, INV, INV },
-};
-
-static JIS_ACTION JIS_action_table[JIS_S_NUM][JIS_C_NUM] = {
-/* ESCAPE DOLLAR BRACKET AT B J NUL JIS_CHAR OTHER */
-/*ASCII */ {NOOP, COPYA, COPYA, COPYA, COPYA, COPYA, EMPTY, COPYA, COPYA},
-/*A_ESC */ {COPYA, NOOP, COPYA, COPYA, COPYA, COPYA, COPYA, COPYA, COPYA},
-/*A_ESC_DL */{COPYA, COPYA, COPYA, MAKE_J, MAKE_J, COPYA, COPYA, COPYA, COPYA},
-/*JIS */ {NOOP, NOOP, NOOP, NOOP, NOOP, NOOP, ERROR, NOOP, ERROR },
-/*JIS_1 */ {ERROR, NOOP, NOOP, NOOP, NOOP, NOOP, ERROR, NOOP, ERROR },
-/*JIS_2 */ {NOOP, COPYJ2,COPYJ2,COPYJ2, COPYJ2, COPYJ2,ERROR, COPYJ2,COPYJ2},
-/*J_ESC */ {ERROR, ERROR, NOOP, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR },
-/*J_ESC_BR */{ERROR, ERROR, ERROR, ERROR, NOOP, NOOP, ERROR, ERROR, ERROR },
-/*J2_ESC */ {ERROR, ERROR, NOOP, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR },
-/*J2_ESC_BR*/{ERROR, ERROR, ERROR, ERROR, COPYJ, COPYJ, ERROR, ERROR, ERROR },
-};
-
-
-char *literal_codeset = NULL;
-
-int
-local_mbtowc (pwc, s, n)
- wchar_t *pwc;
- const char *s;
- size_t n;
-{
- static JIS_STATE save_state = ASCII;
- JIS_STATE curr_state = save_state;
- unsigned char *t = (unsigned char *)s;
-
- if (s != NULL && n == 0)
- return -1;
-
- if (literal_codeset == NULL || strlen (literal_codeset) <= 1)
- {
- /* This must be the "C" locale or unknown locale -- fall thru */
- }
- else if (! strcmp (literal_codeset, "C-SJIS"))
- {
- int char1;
- if (s == NULL)
- return 0; /* not state-dependent */
- char1 = *t;
- if (ISSJIS1 (char1))
- {
- int char2 = t[1];
- if (n <= 1)
- return -1;
- if (ISSJIS2 (char2))
- {
- if (pwc != NULL)
- *pwc = (((wchar_t)*t) << 8) + (wchar_t)(*(t+1));
- return 2;
- }
- return -1;
- }
- if (pwc != NULL)
- *pwc = (wchar_t)*t;
- if (*t == '\0')
- return 0;
- return 1;
- }
- else if (! strcmp (literal_codeset, "C-EUCJP"))
- {
- int char1;
- if (s == NULL)
- return 0; /* not state-dependent */
- char1 = *t;
- if (ISEUCJP (char1))
- {
- int char2 = t[1];
- if (n <= 1)
- return -1;
- if (ISEUCJP (char2))
- {
- if (pwc != NULL)
- *pwc = (((wchar_t)*t) << 8) + (wchar_t)(*(t+1));
- return 2;
- }
- return -1;
- }
- if (pwc != NULL)
- *pwc = (wchar_t)*t;
- if (*t == '\0')
- return 0;
- return 1;
- }
- else if (! strcmp (literal_codeset, "C-JIS"))
- {
- JIS_ACTION action;
- JIS_CHAR_TYPE ch;
- unsigned char *ptr;
- int i, curr_ch;
-
- if (s == NULL)
- {
- save_state = ASCII;
- return 1; /* state-dependent */
- }
-
- ptr = t;
-
- for (i = 0; i < n; ++i)
- {
- curr_ch = t[i];
- switch (curr_ch)
- {
- case JIS_ESC_CHAR:
- ch = ESCAPE;
- break;
- case '$':
- ch = DOLLAR;
- break;
- case '@':
- ch = AT;
- break;
- case '(':
- ch = BRACKET;
- break;
- case 'B':
- ch = B;
- break;
- case 'J':
- ch = J;
- break;
- case '\0':
- ch = NUL;
- break;
- default:
- if (ISJIS (curr_ch))
- ch = JIS_CHAR;
- else
- ch = OTHER;
- }
-
- action = JIS_action_table[curr_state][ch];
- curr_state = JIS_state_table[curr_state][ch];
-
- switch (action)
- {
- case NOOP:
- break;
- case EMPTY:
- if (pwc != NULL)
- *pwc = (wchar_t)0;
- save_state = curr_state;
- return i;
- case COPYA:
- if (pwc != NULL)
- *pwc = (wchar_t)*ptr;
- save_state = curr_state;
- return (i + 1);
- case COPYJ:
- if (pwc != NULL)
- *pwc = (((wchar_t)*ptr) << 8) + (wchar_t)(*(ptr+1));
- save_state = curr_state;
- return (i + 1);
- case COPYJ2:
- if (pwc != NULL)
- *pwc = (((wchar_t)*ptr) << 8) + (wchar_t)(*(ptr+1));
- save_state = curr_state;
- return (ptr - t) + 2;
- case MAKE_A:
- case MAKE_J:
- ptr = (char *)(t + i + 1);
- break;
- case ERROR:
- default:
- return -1;
- }
- }
-
- return -1; /* n < bytes needed */
- }
-
-#ifdef CROSS_COMPILE
- if (s == NULL)
- return 0; /* not state-dependent */
- if (pwc != NULL)
- *pwc = *s;
- return 1;
-#else
- /* This must be the "C" locale or unknown locale. */
- return mbtowc (pwc, s, n);
-#endif
-}
-
-int
-local_mblen (s, n)
- const char *s;
- size_t n;
-{
- return local_mbtowc (NULL, s, n);
-}
-
-int
-local_mb_cur_max ()
-{
- if (literal_codeset == NULL || strlen (literal_codeset) <= 1)
- ;
- else if (! strcmp (literal_codeset, "C-SJIS"))
- return 2;
- else if (! strcmp (literal_codeset, "C-EUCJP"))
- return 2;
- else if (! strcmp (literal_codeset, "C-JIS"))
- return 8; /* 3 + 2 + 3 */
-
-#ifdef CROSS_COMPILE
- return 1;
-#else
- if (MB_CUR_MAX > 0)
- return MB_CUR_MAX;
-
- return 1; /* default */
-#endif
-}
-#endif /* MULTIBYTE_CHARS */
diff --git a/gcc/mbchar.h b/gcc/mbchar.h
deleted file mode 100755
index d53ebeb..0000000
--- a/gcc/mbchar.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* mbchar.h - Various declarations for functions found in mbchar.c
- Copyright (C) 1998 Free Software Foundation, Inc.
-
-This file is part of GNU CC.
-
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-#ifndef __GCC_MBCHAR_H__
-#define __GCC_MBCHAR_H__
-
-#ifdef MULTIBYTE_CHARS
-/* escape character used for JIS encoding */
-#define JIS_ESC_CHAR 0x1b
-
-#define ISSJIS1(c) ((c) >= 0x81 && (c) <= 0x9f || (c) >= 0xe0 && (c) <= 0xef)
-#define ISSJIS2(c) ((c) >= 0x40 && (c) <= 0x7e || (c) >= 0x80 && (c) <= 0xfc)
-#define ISEUCJP(c) ((c) >= 0xa1 && (c) <= 0xfe)
-#define ISJIS(c) ((c) >= 0x21 && (c) <= 0x7e)
-
-int local_mbtowc (wchar_t *, const char *, size_t);
-int local_mblen (const char *, size_t);
-int local_mb_cur_max (void);
-
-/* The locale being used for multibyte characters in string/char literals. */
-extern char *literal_codeset;
-#endif /* MULTIBYTE_CHARS */
-
-#endif /* __GCC_MBCHAR_H__ */
diff --git a/gcc/md.texi b/gcc/md.texi
deleted file mode 100755
index 6177ac2..0000000
--- a/gcc/md.texi
+++ /dev/null
@@ -1,4217 +0,0 @@
-@c Copyright (C) 1988, 89, 92, 93, 94, 96, 1998 Free Software Foundation, Inc.
-@c This is part of the GCC manual.
-@c For copying conditions, see the file gcc.texi.
-
-@ifset INTERNALS
-@node Machine Desc
-@chapter Machine Descriptions
-@cindex machine descriptions
-
-A machine description has two parts: a file of instruction patterns
-(@file{.md} file) and a C header file of macro definitions.
-
-The @file{.md} file for a target machine contains a pattern for each
-instruction that the target machine supports (or at least each instruction
-that is worth telling the compiler about). It may also contain comments.
-A semicolon causes the rest of the line to be a comment, unless the semicolon
-is inside a quoted string.
-
-See the next chapter for information on the C header file.
-
-@menu
-* Patterns:: How to write instruction patterns.
-* Example:: An explained example of a @code{define_insn} pattern.
-* RTL Template:: The RTL template defines what insns match a pattern.
-* Output Template:: The output template says how to make assembler code
- from such an insn.
-* Output Statement:: For more generality, write C code to output
- the assembler code.
-* Constraints:: When not all operands are general operands.
-* Standard Names:: Names mark patterns to use for code generation.
-* Pattern Ordering:: When the order of patterns makes a difference.
-* Dependent Patterns:: Having one pattern may make you need another.
-* Jump Patterns:: Special considerations for patterns for jump insns.
-* Insn Canonicalizations::Canonicalization of Instructions
-* Peephole Definitions::Defining machine-specific peephole optimizations.
-* Expander Definitions::Generating a sequence of several RTL insns
- for a standard operation.
-* Insn Splitting:: Splitting Instructions into Multiple Instructions
-* Insn Attributes:: Specifying the value of attributes for generated insns.
-@end menu
-
-@node Patterns
-@section Everything about Instruction Patterns
-@cindex patterns
-@cindex instruction patterns
-
-@findex define_insn
-Each instruction pattern contains an incomplete RTL expression, with pieces
-to be filled in later, operand constraints that restrict how the pieces can
-be filled in, and an output pattern or C code to generate the assembler
-output, all wrapped up in a @code{define_insn} expression.
-
-A @code{define_insn} is an RTL expression containing four or five operands:
-
-@enumerate
-@item
-An optional name. The presence of a name indicate that this instruction
-pattern can perform a certain standard job for the RTL-generation
-pass of the compiler. This pass knows certain names and will use
-the instruction patterns with those names, if the names are defined
-in the machine description.
-
-The absence of a name is indicated by writing an empty string
-where the name should go. Nameless instruction patterns are never
-used for generating RTL code, but they may permit several simpler insns
-to be combined later on.
-
-Names that are not thus known and used in RTL-generation have no
-effect; they are equivalent to no name at all.
-
-@item
-The @dfn{RTL template} (@pxref{RTL Template}) is a vector of incomplete
-RTL expressions which show what the instruction should look like. It is
-incomplete because it may contain @code{match_operand},
-@code{match_operator}, and @code{match_dup} expressions that stand for
-operands of the instruction.
-
-If the vector has only one element, that element is the template for the
-instruction pattern. If the vector has multiple elements, then the
-instruction pattern is a @code{parallel} expression containing the
-elements described.
-
-@item
-@cindex pattern conditions
-@cindex conditions, in patterns
-A condition. This is a string which contains a C expression that is
-the final test to decide whether an insn body matches this pattern.
-
-@cindex named patterns and conditions
-For a named pattern, the condition (if present) may not depend on
-the data in the insn being matched, but only the target-machine-type
-flags. The compiler needs to test these conditions during
-initialization in order to learn exactly which named instructions are
-available in a particular run.
-
-@findex operands
-For nameless patterns, the condition is applied only when matching an
-individual insn, and only after the insn has matched the pattern's
-recognition template. The insn's operands may be found in the vector
-@code{operands}.
-
-@item
-The @dfn{output template}: a string that says how to output matching
-insns as assembler code. @samp{%} in this string specifies where
-to substitute the value of an operand. @xref{Output Template}.
-
-When simple substitution isn't general enough, you can specify a piece
-of C code to compute the output. @xref{Output Statement}.
-
-@item
-Optionally, a vector containing the values of attributes for insns matching
-this pattern. @xref{Insn Attributes}.
-@end enumerate
-
-@node Example
-@section Example of @code{define_insn}
-@cindex @code{define_insn} example
-
-Here is an actual example of an instruction pattern, for the 68000/68020.
-
-@example
-(define_insn "tstsi"
- [(set (cc0)
- (match_operand:SI 0 "general_operand" "rm"))]
- ""
- "*
-@{ if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
- return \"tstl %0\";
- return \"cmpl #0,%0\"; @}")
-@end example
-
-This is an instruction that sets the condition codes based on the value of
-a general operand. It has no condition, so any insn whose RTL description
-has the form shown may be handled according to this pattern. The name
-@samp{tstsi} means ``test a @code{SImode} value'' and tells the RTL generation
-pass that, when it is necessary to test such a value, an insn to do so
-can be constructed using this pattern.
-
-The output control string is a piece of C code which chooses which
-output template to return based on the kind of operand and the specific
-type of CPU for which code is being generated.
-
-@samp{"rm"} is an operand constraint. Its meaning is explained below.
-
-@node RTL Template
-@section RTL Template
-@cindex RTL insn template
-@cindex generating insns
-@cindex insns, generating
-@cindex recognizing insns
-@cindex insns, recognizing
-
-The RTL template is used to define which insns match the particular pattern
-and how to find their operands. For named patterns, the RTL template also
-says how to construct an insn from specified operands.
-
-Construction involves substituting specified operands into a copy of the
-template. Matching involves determining the values that serve as the
-operands in the insn being matched. Both of these activities are
-controlled by special expression types that direct matching and
-substitution of the operands.
-
-@table @code
-@findex match_operand
-@item (match_operand:@var{m} @var{n} @var{predicate} @var{constraint})
-This expression is a placeholder for operand number @var{n} of
-the insn. When constructing an insn, operand number @var{n}
-will be substituted at this point. When matching an insn, whatever
-appears at this position in the insn will be taken as operand
-number @var{n}; but it must satisfy @var{predicate} or this instruction
-pattern will not match at all.
-
-Operand numbers must be chosen consecutively counting from zero in
-each instruction pattern. There may be only one @code{match_operand}
-expression in the pattern for each operand number. Usually operands
-are numbered in the order of appearance in @code{match_operand}
-expressions. In the case of a @code{define_expand}, any operand numbers
-used only in @code{match_dup} expressions have higher values than all
-other operand numbers.
-
-@var{predicate} is a string that is the name of a C function that accepts two
-arguments, an expression and a machine mode. During matching, the
-function will be called with the putative operand as the expression and
-@var{m} as the mode argument (if @var{m} is not specified,
-@code{VOIDmode} will be used, which normally causes @var{predicate} to accept
-any mode). If it returns zero, this instruction pattern fails to match.
-@var{predicate} may be an empty string; then it means no test is to be done
-on the operand, so anything which occurs in this position is valid.
-
-Most of the time, @var{predicate} will reject modes other than @var{m}---but
-not always. For example, the predicate @code{address_operand} uses
-@var{m} as the mode of memory ref that the address should be valid for.
-Many predicates accept @code{const_int} nodes even though their mode is
-@code{VOIDmode}.
-
-@var{constraint} controls reloading and the choice of the best register
-class to use for a value, as explained later (@pxref{Constraints}).
-
-People are often unclear on the difference between the constraint and the
-predicate. The predicate helps decide whether a given insn matches the
-pattern. The constraint plays no role in this decision; instead, it
-controls various decisions in the case of an insn which does match.
-
-@findex general_operand
-On CISC machines, the most common @var{predicate} is
-@code{"general_operand"}. This function checks that the putative
-operand is either a constant, a register or a memory reference, and that
-it is valid for mode @var{m}.
-
-@findex register_operand
-For an operand that must be a register, @var{predicate} should be
-@code{"register_operand"}. Using @code{"general_operand"} would be
-valid, since the reload pass would copy any non-register operands
-through registers, but this would make GNU CC do extra work, it would
-prevent invariant operands (such as constant) from being removed from
-loops, and it would prevent the register allocator from doing the best
-possible job. On RISC machines, it is usually most efficient to allow
-@var{predicate} to accept only objects that the constraints allow.
-
-@findex immediate_operand
-For an operand that must be a constant, you must be sure to either use
-@code{"immediate_operand"} for @var{predicate}, or make the instruction
-pattern's extra condition require a constant, or both. You cannot
-expect the constraints to do this work! If the constraints allow only
-constants, but the predicate allows something else, the compiler will
-crash when that case arises.
-
-@findex match_scratch
-@item (match_scratch:@var{m} @var{n} @var{constraint})
-This expression is also a placeholder for operand number @var{n}
-and indicates that operand must be a @code{scratch} or @code{reg}
-expression.
-
-When matching patterns, this is equivalent to
-
-@smallexample
-(match_operand:@var{m} @var{n} "scratch_operand" @var{pred})
-@end smallexample
-
-but, when generating RTL, it produces a (@code{scratch}:@var{m})
-expression.
-
-If the last few expressions in a @code{parallel} are @code{clobber}
-expressions whose operands are either a hard register or
-@code{match_scratch}, the combiner can add or delete them when
-necessary. @xref{Side Effects}.
-
-@findex match_dup
-@item (match_dup @var{n})
-This expression is also a placeholder for operand number @var{n}.
-It is used when the operand needs to appear more than once in the
-insn.
-
-In construction, @code{match_dup} acts just like @code{match_operand}:
-the operand is substituted into the insn being constructed. But in
-matching, @code{match_dup} behaves differently. It assumes that operand
-number @var{n} has already been determined by a @code{match_operand}
-appearing earlier in the recognition template, and it matches only an
-identical-looking expression.
-
-@findex match_operator
-@item (match_operator:@var{m} @var{n} @var{predicate} [@var{operands}@dots{}])
-This pattern is a kind of placeholder for a variable RTL expression
-code.
-
-When constructing an insn, it stands for an RTL expression whose
-expression code is taken from that of operand @var{n}, and whose
-operands are constructed from the patterns @var{operands}.
-
-When matching an expression, it matches an expression if the function
-@var{predicate} returns nonzero on that expression @emph{and} the
-patterns @var{operands} match the operands of the expression.
-
-Suppose that the function @code{commutative_operator} is defined as
-follows, to match any expression whose operator is one of the
-commutative arithmetic operators of RTL and whose mode is @var{mode}:
-
-@smallexample
-int
-commutative_operator (x, mode)
- rtx x;
- enum machine_mode mode;
-@{
- enum rtx_code code = GET_CODE (x);
- if (GET_MODE (x) != mode)
- return 0;
- return (GET_RTX_CLASS (code) == 'c'
- || code == EQ || code == NE);
-@}
-@end smallexample
-
-Then the following pattern will match any RTL expression consisting
-of a commutative operator applied to two general operands:
-
-@smallexample
-(match_operator:SI 3 "commutative_operator"
- [(match_operand:SI 1 "general_operand" "g")
- (match_operand:SI 2 "general_operand" "g")])
-@end smallexample
-
-Here the vector @code{[@var{operands}@dots{}]} contains two patterns
-because the expressions to be matched all contain two operands.
-
-When this pattern does match, the two operands of the commutative
-operator are recorded as operands 1 and 2 of the insn. (This is done
-by the two instances of @code{match_operand}.) Operand 3 of the insn
-will be the entire commutative expression: use @code{GET_CODE
-(operands[3])} to see which commutative operator was used.
-
-The machine mode @var{m} of @code{match_operator} works like that of
-@code{match_operand}: it is passed as the second argument to the
-predicate function, and that function is solely responsible for
-deciding whether the expression to be matched ``has'' that mode.
-
-When constructing an insn, argument 3 of the gen-function will specify
-the operation (i.e. the expression code) for the expression to be
-made. It should be an RTL expression, whose expression code is copied
-into a new expression whose operands are arguments 1 and 2 of the
-gen-function. The subexpressions of argument 3 are not used;
-only its expression code matters.
-
-When @code{match_operator} is used in a pattern for matching an insn,
-it usually best if the operand number of the @code{match_operator}
-is higher than that of the actual operands of the insn. This improves
-register allocation because the register allocator often looks at
-operands 1 and 2 of insns to see if it can do register tying.
-
-There is no way to specify constraints in @code{match_operator}. The
-operand of the insn which corresponds to the @code{match_operator}
-never has any constraints because it is never reloaded as a whole.
-However, if parts of its @var{operands} are matched by
-@code{match_operand} patterns, those parts may have constraints of
-their own.
-
-@findex match_op_dup
-@item (match_op_dup:@var{m} @var{n}[@var{operands}@dots{}])
-Like @code{match_dup}, except that it applies to operators instead of
-operands. When constructing an insn, operand number @var{n} will be
-substituted at this point. But in matching, @code{match_op_dup} behaves
-differently. It assumes that operand number @var{n} has already been
-determined by a @code{match_operator} appearing earlier in the
-recognition template, and it matches only an identical-looking
-expression.
-
-@findex match_parallel
-@item (match_parallel @var{n} @var{predicate} [@var{subpat}@dots{}])
-This pattern is a placeholder for an insn that consists of a
-@code{parallel} expression with a variable number of elements. This
-expression should only appear at the top level of an insn pattern.
-
-When constructing an insn, operand number @var{n} will be substituted at
-this point. When matching an insn, it matches if the body of the insn
-is a @code{parallel} expression with at least as many elements as the
-vector of @var{subpat} expressions in the @code{match_parallel}, if each
-@var{subpat} matches the corresponding element of the @code{parallel},
-@emph{and} the function @var{predicate} returns nonzero on the
-@code{parallel} that is the body of the insn. It is the responsibility
-of the predicate to validate elements of the @code{parallel} beyond
-those listed in the @code{match_parallel}.@refill
-
-A typical use of @code{match_parallel} is to match load and store
-multiple expressions, which can contain a variable number of elements
-in a @code{parallel}. For example,
-@c the following is *still* going over. need to change the code.
-@c also need to work on grouping of this example. --mew 1feb93
-
-@smallexample
-(define_insn ""
- [(match_parallel 0 "load_multiple_operation"
- [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
- (match_operand:SI 2 "memory_operand" "m"))
- (use (reg:SI 179))
- (clobber (reg:SI 179))])]
- ""
- "loadm 0,0,%1,%2")
-@end smallexample
-
-This example comes from @file{a29k.md}. The function
-@code{load_multiple_operations} is defined in @file{a29k.c} and checks
-that subsequent elements in the @code{parallel} are the same as the
-@code{set} in the pattern, except that they are referencing subsequent
-registers and memory locations.
-
-An insn that matches this pattern might look like:
-
-@smallexample
-(parallel
- [(set (reg:SI 20) (mem:SI (reg:SI 100)))
- (use (reg:SI 179))
- (clobber (reg:SI 179))
- (set (reg:SI 21)
- (mem:SI (plus:SI (reg:SI 100)
- (const_int 4))))
- (set (reg:SI 22)
- (mem:SI (plus:SI (reg:SI 100)
- (const_int 8))))])
-@end smallexample
-
-@findex match_par_dup
-@item (match_par_dup @var{n} [@var{subpat}@dots{}])
-Like @code{match_op_dup}, but for @code{match_parallel} instead of
-@code{match_operator}.
-
-@findex match_insn
-@item (match_insn @var{predicate})
-Match a complete insn. Unlike the other @code{match_*} recognizers,
-@code{match_insn} does not take an operand number.
-
-The machine mode @var{m} of @code{match_insn} works like that of
-@code{match_operand}: it is passed as the second argument to the
-predicate function, and that function is solely responsible for
-deciding whether the expression to be matched ``has'' that mode.
-
-@findex match_insn2
-@item (match_insn2 @var{n} @var{predicate})
-Match a complete insn.
-
-The machine mode @var{m} of @code{match_insn2} works like that of
-@code{match_operand}: it is passed as the second argument to the
-predicate function, and that function is solely responsible for
-deciding whether the expression to be matched ``has'' that mode.
-
-@findex address
-@item (address (match_operand:@var{m} @var{n} "address_operand" ""))
-This complex of expressions is a placeholder for an operand number
-@var{n} in a ``load address'' instruction: an operand which specifies
-a memory location in the usual way, but for which the actual operand
-value used is the address of the location, not the contents of the
-location.
-
-@code{address} expressions never appear in RTL code, only in machine
-descriptions. And they are used only in machine descriptions that do
-not use the operand constraint feature. When operand constraints are
-in use, the letter @samp{p} in the constraint serves this purpose.
-
-@var{m} is the machine mode of the @emph{memory location being
-addressed}, not the machine mode of the address itself. That mode is
-always the same on a given target machine (it is @code{Pmode}, which
-normally is @code{SImode}), so there is no point in mentioning it;
-thus, no machine mode is written in the @code{address} expression. If
-some day support is added for machines in which addresses of different
-kinds of objects appear differently or are used differently (such as
-the PDP-10), different formats would perhaps need different machine
-modes and these modes might be written in the @code{address}
-expression.
-@end table
-
-@node Output Template
-@section Output Templates and Operand Substitution
-@cindex output templates
-@cindex operand substitution
-
-@cindex @samp{%} in template
-@cindex percent sign
-The @dfn{output template} is a string which specifies how to output the
-assembler code for an instruction pattern. Most of the template is a
-fixed string which is output literally. The character @samp{%} is used
-to specify where to substitute an operand; it can also be used to
-identify places where different variants of the assembler require
-different syntax.
-
-In the simplest case, a @samp{%} followed by a digit @var{n} says to output
-operand @var{n} at that point in the string.
-
-@samp{%} followed by a letter and a digit says to output an operand in an
-alternate fashion. Four letters have standard, built-in meanings described
-below. The machine description macro @code{PRINT_OPERAND} can define
-additional letters with nonstandard meanings.
-
-@samp{%c@var{digit}} can be used to substitute an operand that is a
-constant value without the syntax that normally indicates an immediate
-operand.
-
-@samp{%n@var{digit}} is like @samp{%c@var{digit}} except that the value of
-the constant is negated before printing.
-
-@samp{%a@var{digit}} can be used to substitute an operand as if it were a
-memory reference, with the actual operand treated as the address. This may
-be useful when outputting a ``load address'' instruction, because often the
-assembler syntax for such an instruction requires you to write the operand
-as if it were a memory reference.
-
-@samp{%l@var{digit}} is used to substitute a @code{label_ref} into a jump
-instruction.
-
-@samp{%=} outputs a number which is unique to each instruction in the
-entire compilation. This is useful for making local labels to be
-referred to more than once in a single template that generates multiple
-assembler instructions.
-
-@samp{%} followed by a punctuation character specifies a substitution that
-does not use an operand. Only one case is standard: @samp{%%} outputs a
-@samp{%} into the assembler code. Other nonstandard cases can be
-defined in the @code{PRINT_OPERAND} macro. You must also define
-which punctuation characters are valid with the
-@code{PRINT_OPERAND_PUNCT_VALID_P} macro.
-
-@cindex \
-@cindex backslash
-The template may generate multiple assembler instructions. Write the text
-for the instructions, with @samp{\;} between them.
-
-@cindex matching operands
-When the RTL contains two operands which are required by constraint to match
-each other, the output template must refer only to the lower-numbered operand.
-Matching operands are not always identical, and the rest of the compiler
-arranges to put the proper RTL expression for printing into the lower-numbered
-operand.
-
-One use of nonstandard letters or punctuation following @samp{%} is to
-distinguish between different assembler languages for the same machine; for
-example, Motorola syntax versus MIT syntax for the 68000. Motorola syntax
-requires periods in most opcode names, while MIT syntax does not. For
-example, the opcode @samp{movel} in MIT syntax is @samp{move.l} in Motorola
-syntax. The same file of patterns is used for both kinds of output syntax,
-but the character sequence @samp{%.} is used in each place where Motorola
-syntax wants a period. The @code{PRINT_OPERAND} macro for Motorola syntax
-defines the sequence to output a period; the macro for MIT syntax defines
-it to do nothing.
-
-@cindex @code{#} in template
-As a special case, a template consisting of the single character @code{#}
-instructs the compiler to first split the insn, and then output the
-resulting instructions separately. This helps eliminate redundancy in the
-output templates. If you have a @code{define_insn} that needs to emit
-multiple assembler instructions, and there is an matching @code{define_split}
-already defined, then you can simply use @code{#} as the output template
-instead of writing an output template that emits the multiple assembler
-instructions.
-
-If the macro @code{ASSEMBLER_DIALECT} is defined, you can use construct
-of the form @samp{@{option0|option1|option2@}} in the templates. These
-describe multiple variants of assembler language syntax.
-@xref{Instruction Output}.
-
-@node Output Statement
-@section C Statements for Assembler Output
-@cindex output statements
-@cindex C statements for assembler output
-@cindex generating assembler output
-
-Often a single fixed template string cannot produce correct and efficient
-assembler code for all the cases that are recognized by a single
-instruction pattern. For example, the opcodes may depend on the kinds of
-operands; or some unfortunate combinations of operands may require extra
-machine instructions.
-
-If the output control string starts with a @samp{@@}, then it is actually
-a series of templates, each on a separate line. (Blank lines and
-leading spaces and tabs are ignored.) The templates correspond to the
-pattern's constraint alternatives (@pxref{Multi-Alternative}). For example,
-if a target machine has a two-address add instruction @samp{addr} to add
-into a register and another @samp{addm} to add a register to memory, you
-might write this pattern:
-
-@smallexample
-(define_insn "addsi3"
- [(set (match_operand:SI 0 "general_operand" "=r,m")
- (plus:SI (match_operand:SI 1 "general_operand" "0,0")
- (match_operand:SI 2 "general_operand" "g,r")))]
- ""
- "@@
- addr %2,%0
- addm %2,%0")
-@end smallexample
-
-@cindex @code{*} in template
-@cindex asterisk in template
-If the output control string starts with a @samp{*}, then it is not an
-output template but rather a piece of C program that should compute a
-template. It should execute a @code{return} statement to return the
-template-string you want. Most such templates use C string literals, which
-require doublequote characters to delimit them. To include these
-doublequote characters in the string, prefix each one with @samp{\}.
-
-The operands may be found in the array @code{operands}, whose C data type
-is @code{rtx []}.
-
-It is very common to select different ways of generating assembler code
-based on whether an immediate operand is within a certain range. Be
-careful when doing this, because the result of @code{INTVAL} is an
-integer on the host machine. If the host machine has more bits in an
-@code{int} than the target machine has in the mode in which the constant
-will be used, then some of the bits you get from @code{INTVAL} will be
-superfluous. For proper results, you must carefully disregard the
-values of those bits.
-
-@findex output_asm_insn
-It is possible to output an assembler instruction and then go on to output
-or compute more of them, using the subroutine @code{output_asm_insn}. This
-receives two arguments: a template-string and a vector of operands. The
-vector may be @code{operands}, or it may be another array of @code{rtx}
-that you declare locally and initialize yourself.
-
-@findex which_alternative
-When an insn pattern has multiple alternatives in its constraints, often
-the appearance of the assembler code is determined mostly by which alternative
-was matched. When this is so, the C code can test the variable
-@code{which_alternative}, which is the ordinal number of the alternative
-that was actually satisfied (0 for the first, 1 for the second alternative,
-etc.).
-
-For example, suppose there are two opcodes for storing zero, @samp{clrreg}
-for registers and @samp{clrmem} for memory locations. Here is how
-a pattern could use @code{which_alternative} to choose between them:
-
-@smallexample
-(define_insn ""
- [(set (match_operand:SI 0 "general_operand" "=r,m")
- (const_int 0))]
- ""
- "*
- return (which_alternative == 0
- ? \"clrreg %0\" : \"clrmem %0\");
- ")
-@end smallexample
-
-The example above, where the assembler code to generate was
-@emph{solely} determined by the alternative, could also have been specified
-as follows, having the output control string start with a @samp{@@}:
-
-@smallexample
-@group
-(define_insn ""
- [(set (match_operand:SI 0 "general_operand" "=r,m")
- (const_int 0))]
- ""
- "@@
- clrreg %0
- clrmem %0")
-@end group
-@end smallexample
-@end ifset
-
-@c Most of this node appears by itself (in a different place) even
-@c when the INTERNALS flag is clear. Passages that require the full
-@c manual's context are conditionalized to appear only in the full manual.
-@ifset INTERNALS
-@node Constraints
-@section Operand Constraints
-@cindex operand constraints
-@cindex constraints
-
-Each @code{match_operand} in an instruction pattern can specify a
-constraint for the type of operands allowed.
-@end ifset
-@ifclear INTERNALS
-@node Constraints
-@section Constraints for @code{asm} Operands
-@cindex operand constraints, @code{asm}
-@cindex constraints, @code{asm}
-@cindex @code{asm} constraints
-
-Here are specific details on what constraint letters you can use with
-@code{asm} operands.
-@end ifclear
-Constraints can say whether
-an operand may be in a register, and which kinds of register; whether the
-operand can be a memory reference, and which kinds of address; whether the
-operand may be an immediate constant, and which possible values it may
-have. Constraints can also require two operands to match.
-
-@ifset INTERNALS
-@menu
-* Simple Constraints:: Basic use of constraints.
-* Multi-Alternative:: When an insn has two alternative constraint-patterns.
-* Class Preferences:: Constraints guide which hard register to put things in.
-* Modifiers:: More precise control over effects of constraints.
-* Machine Constraints:: Existing constraints for some particular machines.
-* No Constraints:: Describing a clean machine without constraints.
-@end menu
-@end ifset
-
-@ifclear INTERNALS
-@menu
-* Simple Constraints:: Basic use of constraints.
-* Multi-Alternative:: When an insn has two alternative constraint-patterns.
-* Modifiers:: More precise control over effects of constraints.
-* Machine Constraints:: Special constraints for some particular machines.
-@end menu
-@end ifclear
-
-@node Simple Constraints
-@subsection Simple Constraints
-@cindex simple constraints
-
-The simplest kind of constraint is a string full of letters, each of
-which describes one kind of operand that is permitted. Here are
-the letters that are allowed:
-
-@table @asis
-@cindex @samp{m} in constraint
-@cindex memory references in constraints
-@item @samp{m}
-A memory operand is allowed, with any kind of address that the machine
-supports in general.
-
-@cindex offsettable address
-@cindex @samp{o} in constraint
-@item @samp{o}
-A memory operand is allowed, but only if the address is
-@dfn{offsettable}. This means that adding a small integer (actually,
-the width in bytes of the operand, as determined by its machine mode)
-may be added to the address and the result is also a valid memory
-address.
-
-@cindex autoincrement/decrement addressing
-For example, an address which is constant is offsettable; so is an
-address that is the sum of a register and a constant (as long as a
-slightly larger constant is also within the range of address-offsets
-supported by the machine); but an autoincrement or autodecrement
-address is not offsettable. More complicated indirect/indexed
-addresses may or may not be offsettable depending on the other
-addressing modes that the machine supports.
-
-Note that in an output operand which can be matched by another
-operand, the constraint letter @samp{o} is valid only when accompanied
-by both @samp{<} (if the target machine has predecrement addressing)
-and @samp{>} (if the target machine has preincrement addressing).
-
-@cindex @samp{V} in constraint
-@item @samp{V}
-A memory operand that is not offsettable. In other words, anything that
-would fit the @samp{m} constraint but not the @samp{o} constraint.
-
-@cindex @samp{<} in constraint
-@item @samp{<}
-A memory operand with autodecrement addressing (either predecrement or
-postdecrement) is allowed.
-
-@cindex @samp{>} in constraint
-@item @samp{>}
-A memory operand with autoincrement addressing (either preincrement or
-postincrement) is allowed.
-
-@cindex @samp{r} in constraint
-@cindex registers in constraints
-@item @samp{r}
-A register operand is allowed provided that it is in a general
-register.
-
-@cindex @samp{d} in constraint
-@item @samp{d}, @samp{a}, @samp{f}, @dots{}
-Other letters can be defined in machine-dependent fashion to stand for
-particular classes of registers. @samp{d}, @samp{a} and @samp{f} are
-defined on the 68000/68020 to stand for data, address and floating
-point registers.
-
-@cindex constants in constraints
-@cindex @samp{i} in constraint
-@item @samp{i}
-An immediate integer operand (one with constant value) is allowed.
-This includes symbolic constants whose values will be known only at
-assembly time.
-
-@cindex @samp{n} in constraint
-@item @samp{n}
-An immediate integer operand with a known numeric value is allowed.
-Many systems cannot support assembly-time constants for operands less
-than a word wide. Constraints for these operands should use @samp{n}
-rather than @samp{i}.
-
-@cindex @samp{I} in constraint
-@item @samp{I}, @samp{J}, @samp{K}, @dots{} @samp{P}
-Other letters in the range @samp{I} through @samp{P} may be defined in
-a machine-dependent fashion to permit immediate integer operands with
-explicit integer values in specified ranges. For example, on the
-68000, @samp{I} is defined to stand for the range of values 1 to 8.
-This is the range permitted as a shift count in the shift
-instructions.
-
-@cindex @samp{E} in constraint
-@item @samp{E}
-An immediate floating operand (expression code @code{const_double}) is
-allowed, but only if the target floating point format is the same as
-that of the host machine (on which the compiler is running).
-
-@cindex @samp{F} in constraint
-@item @samp{F}
-An immediate floating operand (expression code @code{const_double}) is
-allowed.
-
-@cindex @samp{G} in constraint
-@cindex @samp{H} in constraint
-@item @samp{G}, @samp{H}
-@samp{G} and @samp{H} may be defined in a machine-dependent fashion to
-permit immediate floating operands in particular ranges of values.
-
-@cindex @samp{s} in constraint
-@item @samp{s}
-An immediate integer operand whose value is not an explicit integer is
-allowed.
-
-This might appear strange; if an insn allows a constant operand with a
-value not known at compile time, it certainly must allow any known
-value. So why use @samp{s} instead of @samp{i}? Sometimes it allows
-better code to be generated.
-
-For example, on the 68000 in a fullword instruction it is possible to
-use an immediate operand; but if the immediate value is between -128
-and 127, better code results from loading the value into a register and
-using the register. This is because the load into the register can be
-done with a @samp{moveq} instruction. We arrange for this to happen
-by defining the letter @samp{K} to mean ``any integer outside the
-range -128 to 127'', and then specifying @samp{Ks} in the operand
-constraints.
-
-@cindex @samp{g} in constraint
-@item @samp{g}
-Any register, memory or immediate integer operand is allowed, except for
-registers that are not general registers.
-
-@cindex @samp{X} in constraint
-@item @samp{X}
-@ifset INTERNALS
-Any operand whatsoever is allowed, even if it does not satisfy
-@code{general_operand}. This is normally used in the constraint of
-a @code{match_scratch} when certain alternatives will not actually
-require a scratch register.
-@end ifset
-@ifclear INTERNALS
-Any operand whatsoever is allowed.
-@end ifclear
-
-@cindex @samp{0} in constraint
-@cindex digits in constraint
-@item @samp{0}, @samp{1}, @samp{2}, @dots{} @samp{9}
-An operand that matches the specified operand number is allowed. If a
-digit is used together with letters within the same alternative, the
-digit should come last.
-
-@cindex matching constraint
-@cindex constraint, matching
-This is called a @dfn{matching constraint} and what it really means is
-that the assembler has only a single operand that fills two roles
-@ifset INTERNALS
-considered separate in the RTL insn. For example, an add insn has two
-input operands and one output operand in the RTL, but on most CISC
-@end ifset
-@ifclear INTERNALS
-which @code{asm} distinguishes. For example, an add instruction uses
-two input operands and an output operand, but on most CISC
-@end ifclear
-machines an add instruction really has only two operands, one of them an
-input-output operand:
-
-@smallexample
-addl #35,r12
-@end smallexample
-
-Matching constraints are used in these circumstances.
-More precisely, the two operands that match must include one input-only
-operand and one output-only operand. Moreover, the digit must be a
-smaller number than the number of the operand that uses it in the
-constraint.
-
-@ifset INTERNALS
-For operands to match in a particular case usually means that they
-are identical-looking RTL expressions. But in a few special cases
-specific kinds of dissimilarity are allowed. For example, @code{*x}
-as an input operand will match @code{*x++} as an output operand.
-For proper results in such cases, the output template should always
-use the output-operand's number when printing the operand.
-@end ifset
-
-@cindex load address instruction
-@cindex push address instruction
-@cindex address constraints
-@cindex @samp{p} in constraint
-@item @samp{p}
-An operand that is a valid memory address is allowed. This is
-for ``load address'' and ``push address'' instructions.
-
-@findex address_operand
-@samp{p} in the constraint must be accompanied by @code{address_operand}
-as the predicate in the @code{match_operand}. This predicate interprets
-the mode specified in the @code{match_operand} as the mode of the memory
-reference for which the address would be valid.
-
-@cindex extensible constraints
-@cindex @samp{Q}, in constraint
-@item @samp{Q}, @samp{R}, @samp{S}, @dots{} @samp{U}
-Letters in the range @samp{Q} through @samp{U} may be defined in a
-machine-dependent fashion to stand for arbitrary operand types.
-@ifset INTERNALS
-The machine description macro @code{EXTRA_CONSTRAINT} is passed the
-operand as its first argument and the constraint letter as its
-second operand.
-
-A typical use for this would be to distinguish certain types of
-memory references that affect other insn operands.
-
-Do not define these constraint letters to accept register references
-(@code{reg}); the reload pass does not expect this and would not handle
-it properly.
-@end ifset
-@end table
-
-@ifset INTERNALS
-In order to have valid assembler code, each operand must satisfy
-its constraint. But a failure to do so does not prevent the pattern
-from applying to an insn. Instead, it directs the compiler to modify
-the code so that the constraint will be satisfied. Usually this is
-done by copying an operand into a register.
-
-Contrast, therefore, the two instruction patterns that follow:
-
-@smallexample
-(define_insn ""
- [(set (match_operand:SI 0 "general_operand" "=r")
- (plus:SI (match_dup 0)
- (match_operand:SI 1 "general_operand" "r")))]
- ""
- "@dots{}")
-@end smallexample
-
-@noindent
-which has two operands, one of which must appear in two places, and
-
-@smallexample
-(define_insn ""
- [(set (match_operand:SI 0 "general_operand" "=r")
- (plus:SI (match_operand:SI 1 "general_operand" "0")
- (match_operand:SI 2 "general_operand" "r")))]
- ""
- "@dots{}")
-@end smallexample
-
-@noindent
-which has three operands, two of which are required by a constraint to be
-identical. If we are considering an insn of the form
-
-@smallexample
-(insn @var{n} @var{prev} @var{next}
- (set (reg:SI 3)
- (plus:SI (reg:SI 6) (reg:SI 109)))
- @dots{})
-@end smallexample
-
-@noindent
-the first pattern would not apply at all, because this insn does not
-contain two identical subexpressions in the right place. The pattern would
-say, ``That does not look like an add instruction; try other patterns.''
-The second pattern would say, ``Yes, that's an add instruction, but there
-is something wrong with it.'' It would direct the reload pass of the
-compiler to generate additional insns to make the constraint true. The
-results might look like this:
-
-@smallexample
-(insn @var{n2} @var{prev} @var{n}
- (set (reg:SI 3) (reg:SI 6))
- @dots{})
-
-(insn @var{n} @var{n2} @var{next}
- (set (reg:SI 3)
- (plus:SI (reg:SI 3) (reg:SI 109)))
- @dots{})
-@end smallexample
-
-It is up to you to make sure that each operand, in each pattern, has
-constraints that can handle any RTL expression that could be present for
-that operand. (When multiple alternatives are in use, each pattern must,
-for each possible combination of operand expressions, have at least one
-alternative which can handle that combination of operands.) The
-constraints don't need to @emph{allow} any possible operand---when this is
-the case, they do not constrain---but they must at least point the way to
-reloading any possible operand so that it will fit.
-
-@itemize @bullet
-@item
-If the constraint accepts whatever operands the predicate permits,
-there is no problem: reloading is never necessary for this operand.
-
-For example, an operand whose constraints permit everything except
-registers is safe provided its predicate rejects registers.
-
-An operand whose predicate accepts only constant values is safe
-provided its constraints include the letter @samp{i}. If any possible
-constant value is accepted, then nothing less than @samp{i} will do;
-if the predicate is more selective, then the constraints may also be
-more selective.
-
-@item
-Any operand expression can be reloaded by copying it into a register.
-So if an operand's constraints allow some kind of register, it is
-certain to be safe. It need not permit all classes of registers; the
-compiler knows how to copy a register into another register of the
-proper class in order to make an instruction valid.
-
-@cindex nonoffsettable memory reference
-@cindex memory reference, nonoffsettable
-@item
-A nonoffsettable memory reference can be reloaded by copying the
-address into a register. So if the constraint uses the letter
-@samp{o}, all memory references are taken care of.
-
-@item
-A constant operand can be reloaded by allocating space in memory to
-hold it as preinitialized data. Then the memory reference can be used
-in place of the constant. So if the constraint uses the letters
-@samp{o} or @samp{m}, constant operands are not a problem.
-
-@item
-If the constraint permits a constant and a pseudo register used in an insn
-was not allocated to a hard register and is equivalent to a constant,
-the register will be replaced with the constant. If the predicate does
-not permit a constant and the insn is re-recognized for some reason, the
-compiler will crash. Thus the predicate must always recognize any
-objects allowed by the constraint.
-@end itemize
-
-If the operand's predicate can recognize registers, but the constraint does
-not permit them, it can make the compiler crash. When this operand happens
-to be a register, the reload pass will be stymied, because it does not know
-how to copy a register temporarily into memory.
-
-If the predicate accepts a unary operator, the constraint applies to the
-operand. For example, the MIPS processor at ISA level 3 supports an
-instruction which adds two registers in @code{SImode} to produce a
-@code{DImode} result, but only if the registers are correctly sign
-extended. This predicate for the input operands accepts a
-@code{sign_extend} of an @code{SImode} register. Write the constraint
-to indicate the type of register that is required for the operand of the
-@code{sign_extend}.
-@end ifset
-
-@node Multi-Alternative
-@subsection Multiple Alternative Constraints
-@cindex multiple alternative constraints
-
-Sometimes a single instruction has multiple alternative sets of possible
-operands. For example, on the 68000, a logical-or instruction can combine
-register or an immediate value into memory, or it can combine any kind of
-operand into a register; but it cannot combine one memory location into
-another.
-
-These constraints are represented as multiple alternatives. An alternative
-can be described by a series of letters for each operand. The overall
-constraint for an operand is made from the letters for this operand
-from the first alternative, a comma, the letters for this operand from
-the second alternative, a comma, and so on until the last alternative.
-@ifset INTERNALS
-Here is how it is done for fullword logical-or on the 68000:
-
-@smallexample
-(define_insn "iorsi3"
- [(set (match_operand:SI 0 "general_operand" "=m,d")
- (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
- (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
- @dots{})
-@end smallexample
-
-The first alternative has @samp{m} (memory) for operand 0, @samp{0} for
-operand 1 (meaning it must match operand 0), and @samp{dKs} for operand
-2. The second alternative has @samp{d} (data register) for operand 0,
-@samp{0} for operand 1, and @samp{dmKs} for operand 2. The @samp{=} and
-@samp{%} in the constraints apply to all the alternatives; their
-meaning is explained in the next section (@pxref{Class Preferences}).
-@end ifset
-
-@c FIXME Is this ? and ! stuff of use in asm()? If not, hide unless INTERNAL
-If all the operands fit any one alternative, the instruction is valid.
-Otherwise, for each alternative, the compiler counts how many instructions
-must be added to copy the operands so that that alternative applies.
-The alternative requiring the least copying is chosen. If two alternatives
-need the same amount of copying, the one that comes first is chosen.
-These choices can be altered with the @samp{?} and @samp{!} characters:
-
-@table @code
-@cindex @samp{?} in constraint
-@cindex question mark
-@item ?
-Disparage slightly the alternative that the @samp{?} appears in,
-as a choice when no alternative applies exactly. The compiler regards
-this alternative as one unit more costly for each @samp{?} that appears
-in it.
-
-@cindex @samp{!} in constraint
-@cindex exclamation point
-@item !
-Disparage severely the alternative that the @samp{!} appears in.
-This alternative can still be used if it fits without reloading,
-but if reloading is needed, some other alternative will be used.
-@end table
-
-@ifset INTERNALS
-When an insn pattern has multiple alternatives in its constraints, often
-the appearance of the assembler code is determined mostly by which
-alternative was matched. When this is so, the C code for writing the
-assembler code can use the variable @code{which_alternative}, which is
-the ordinal number of the alternative that was actually satisfied (0 for
-the first, 1 for the second alternative, etc.). @xref{Output Statement}.
-@end ifset
-
-@ifset INTERNALS
-@node Class Preferences
-@subsection Register Class Preferences
-@cindex class preference constraints
-@cindex register class preference constraints
-
-@cindex voting between constraint alternatives
-The operand constraints have another function: they enable the compiler
-to decide which kind of hardware register a pseudo register is best
-allocated to. The compiler examines the constraints that apply to the
-insns that use the pseudo register, looking for the machine-dependent
-letters such as @samp{d} and @samp{a} that specify classes of registers.
-The pseudo register is put in whichever class gets the most ``votes''.
-The constraint letters @samp{g} and @samp{r} also vote: they vote in
-favor of a general register. The machine description says which registers
-are considered general.
-
-Of course, on some machines all registers are equivalent, and no register
-classes are defined. Then none of this complexity is relevant.
-@end ifset
-
-@node Modifiers
-@subsection Constraint Modifier Characters
-@cindex modifiers in constraints
-@cindex constraint modifier characters
-
-@c prevent bad page break with this line
-Here are constraint modifier characters.
-
-@table @samp
-@cindex @samp{=} in constraint
-@item =
-Means that this operand is write-only for this instruction: the previous
-value is discarded and replaced by output data.
-
-@cindex @samp{+} in constraint
-@item +
-Means that this operand is both read and written by the instruction.
-
-When the compiler fixes up the operands to satisfy the constraints,
-it needs to know which operands are inputs to the instruction and
-which are outputs from it. @samp{=} identifies an output; @samp{+}
-identifies an operand that is both input and output; all other operands
-are assumed to be input only.
-
-@cindex @samp{&} in constraint
-@cindex earlyclobber operand
-@item &
-Means (in a particular alternative) that this operand is an
-@dfn{earlyclobber} operand, which is modified before the instruction is
-finished using the input operands. Therefore, this operand may not lie
-in a register that is used as an input operand or as part of any memory
-address.
-
-@samp{&} applies only to the alternative in which it is written. In
-constraints with multiple alternatives, sometimes one alternative
-requires @samp{&} while others do not. See, for example, the
-@samp{movdf} insn of the 68000.
-
-An input operand can be tied to an earlyclobber operand if its only
-use as an input occurs before the early result is written. Adding
-alternatives of this form often allows GCC to produce better code
-when only some of the inputs can be affected by the earlyclobber.
-See, for example, the @samp{mulsi3} insn of the ARM.
-
-@samp{&} does not obviate the need to write @samp{=}.
-
-@cindex @samp{%} in constraint
-@item %
-Declares the instruction to be commutative for this operand and the
-following operand. This means that the compiler may interchange the
-two operands if that is the cheapest way to make all operands fit the
-constraints.
-@ifset INTERNALS
-This is often used in patterns for addition instructions
-that really have only two operands: the result must go in one of the
-arguments. Here for example, is how the 68000 halfword-add
-instruction is defined:
-
-@smallexample
-(define_insn "addhi3"
- [(set (match_operand:HI 0 "general_operand" "=m,r")
- (plus:HI (match_operand:HI 1 "general_operand" "%0,0")
- (match_operand:HI 2 "general_operand" "di,g")))]
- @dots{})
-@end smallexample
-@end ifset
-
-@cindex @samp{#} in constraint
-@item #
-Says that all following characters, up to the next comma, are to be
-ignored as a constraint. They are significant only for choosing
-register preferences.
-
-@ifset INTERNALS
-@cindex @samp{*} in constraint
-@item *
-Says that the following character should be ignored when choosing
-register preferences. @samp{*} has no effect on the meaning of the
-constraint as a constraint, and no effect on reloading.
-
-Here is an example: the 68000 has an instruction to sign-extend a
-halfword in a data register, and can also sign-extend a value by
-copying it into an address register. While either kind of register is
-acceptable, the constraints on an address-register destination are
-less strict, so it is best if register allocation makes an address
-register its goal. Therefore, @samp{*} is used so that the @samp{d}
-constraint letter (for data register) is ignored when computing
-register preferences.
-
-@smallexample
-(define_insn "extendhisi2"
- [(set (match_operand:SI 0 "general_operand" "=*d,a")
- (sign_extend:SI
- (match_operand:HI 1 "general_operand" "0,g")))]
- @dots{})
-@end smallexample
-@end ifset
-@end table
-
-@node Machine Constraints
-@subsection Constraints for Particular Machines
-@cindex machine specific constraints
-@cindex constraints, machine specific
-
-Whenever possible, you should use the general-purpose constraint letters
-in @code{asm} arguments, since they will convey meaning more readily to
-people reading your code. Failing that, use the constraint letters
-that usually have very similar meanings across architectures. The most
-commonly used constraints are @samp{m} and @samp{r} (for memory and
-general-purpose registers respectively; @pxref{Simple Constraints}), and
-@samp{I}, usually the letter indicating the most common
-immediate-constant format.
-
-For each machine architecture, the @file{config/@var{machine}.h} file
-defines additional constraints. These constraints are used by the
-compiler itself for instruction generation, as well as for @code{asm}
-statements; therefore, some of the constraints are not particularly
-interesting for @code{asm}. The constraints are defined through these
-macros:
-
-@table @code
-@item REG_CLASS_FROM_LETTER
-Register class constraints (usually lower case).
-
-@item CONST_OK_FOR_LETTER_P
-Immediate constant constraints, for non-floating point constants of
-word size or smaller precision (usually upper case).
-
-@item CONST_DOUBLE_OK_FOR_LETTER_P
-Immediate constant constraints, for all floating point constants and for
-constants of greater than word size precision (usually upper case).
-
-@item EXTRA_CONSTRAINT
-Special cases of registers or memory. This macro is not required, and
-is only defined for some machines.
-@end table
-
-Inspecting these macro definitions in the compiler source for your
-machine is the best way to be certain you have the right constraints.
-However, here is a summary of the machine-dependent constraints
-available on some particular machines.
-
-@table @emph
-@item ARM family---@file{arm.h}
-@table @code
-@item f
-Floating-point register
-
-@item F
-One of the floating-point constants 0.0, 0.5, 1.0, 2.0, 3.0, 4.0, 5.0
-or 10.0
-
-@item G
-Floating-point constant that would satisfy the constraint @samp{F} if it
-were negated
-
-@item I
-Integer that is valid as an immediate operand in a data processing
-instruction. That is, an integer in the range 0 to 255 rotated by a
-multiple of 2
-
-@item J
-Integer in the range -4095 to 4095
-
-@item K
-Integer that satisfies constraint @samp{I} when inverted (ones complement)
-
-@item L
-Integer that satisfies constraint @samp{I} when negated (twos complement)
-
-@item M
-Integer in the range 0 to 32
-
-@item Q
-A memory reference where the exact address is in a single register
-(`@samp{m}' is preferable for @code{asm} statements)
-
-@item R
-An item in the constant pool
-
-@item S
-A symbol in the text segment of the current file
-@end table
-
-@item AMD 29000 family---@file{a29k.h}
-@table @code
-@item l
-Local register 0
-
-@item b
-Byte Pointer (@samp{BP}) register
-
-@item q
-@samp{Q} register
-
-@item h
-Special purpose register
-
-@item A
-First accumulator register
-
-@item a
-Other accumulator register
-
-@item f
-Floating point register
-
-@item I
-Constant greater than 0, less than 0x100
-
-@item J
-Constant greater than 0, less than 0x10000
-
-@item K
-Constant whose high 24 bits are on (1)
-
-@item L
-16 bit constant whose high 8 bits are on (1)
-
-@item M
-32 bit constant whose high 16 bits are on (1)
-
-@item N
-32 bit negative constant that fits in 8 bits
-
-@item O
-The constant 0x80000000 or, on the 29050, any 32 bit constant
-whose low 16 bits are 0.
-
-@item P
-16 bit negative constant that fits in 8 bits
-
-@item G
-@itemx H
-A floating point constant (in @code{asm} statements, use the machine
-independent @samp{E} or @samp{F} instead)
-@end table
-
-@item IBM RS6000---@file{rs6000.h}
-@table @code
-@item b
-Address base register
-
-@item f
-Floating point register
-
-@item h
-@samp{MQ}, @samp{CTR}, or @samp{LINK} register
-
-@item q
-@samp{MQ} register
-
-@item c
-@samp{CTR} register
-
-@item l
-@samp{LINK} register
-
-@item x
-@samp{CR} register (condition register) number 0
-
-@item y
-@samp{CR} register (condition register)
-
-@item z
-@samp{FPMEM} stack memory for FPR-GPR transfers
-
-@item I
-Signed 16 bit constant
-
-@item J
-Constant whose low 16 bits are 0
-
-@item K
-Constant whose high 16 bits are 0
-
-@item L
-Constant suitable as a mask operand
-
-@item M
-Constant larger than 31
-
-@item N
-Exact power of 2
-
-@item O
-Zero
-
-@item P
-Constant whose negation is a signed 16 bit constant
-
-@item G
-Floating point constant that can be loaded into a register with one
-instruction per word
-
-@item Q
-Memory operand that is an offset from a register (@samp{m} is preferable
-for @code{asm} statements)
-
-@item R
-AIX TOC entry
-
-@item S
-Constant suitable as a 64-bit mask operand
-
-@item U
-System V Release 4 small data area reference
-@end table
-
-@item Intel 386---@file{i386.h}
-@table @code
-@item q
-@samp{a}, @code{b}, @code{c}, or @code{d} register
-
-@item A
-@samp{a}, or @code{d} register (for 64-bit ints)
-
-@item f
-Floating point register
-
-@item t
-First (top of stack) floating point register
-
-@item u
-Second floating point register
-
-@item a
-@samp{a} register
-
-@item b
-@samp{b} register
-
-@item c
-@samp{c} register
-
-@item d
-@samp{d} register
-
-@item D
-@samp{di} register
-
-@item S
-@samp{si} register
-
-@item I
-Constant in range 0 to 31 (for 32 bit shifts)
-
-@item J
-Constant in range 0 to 63 (for 64 bit shifts)
-
-@item K
-@samp{0xff}
-
-@item L
-@samp{0xffff}
-
-@item M
-0, 1, 2, or 3 (shifts for @code{lea} instruction)
-
-@item N
-Constant in range 0 to 255 (for @code{out} instruction)
-
-@item G
-Standard 80387 floating point constant
-@end table
-
-@item Intel 960---@file{i960.h}
-@table @code
-@item f
-Floating point register (@code{fp0} to @code{fp3})
-
-@item l
-Local register (@code{r0} to @code{r15})
-
-@item b
-Global register (@code{g0} to @code{g15})
-
-@item d
-Any local or global register
-
-@item I
-Integers from 0 to 31
-
-@item J
-0
-
-@item K
-Integers from -31 to 0
-
-@item G
-Floating point 0
-
-@item H
-Floating point 1
-@end table
-
-@item MIPS---@file{mips.h}
-@table @code
-@item d
-General-purpose integer register
-
-@item f
-Floating-point register (if available)
-
-@item h
-@samp{Hi} register
-
-@item l
-@samp{Lo} register
-
-@item x
-@samp{Hi} or @samp{Lo} register
-
-@item y
-General-purpose integer register
-
-@item z
-Floating-point status register
-
-@item I
-Signed 16 bit constant (for arithmetic instructions)
-
-@item J
-Zero
-
-@item K
-Zero-extended 16-bit constant (for logic instructions)
-
-@item L
-Constant with low 16 bits zero (can be loaded with @code{lui})
-
-@item M
-32 bit constant which requires two instructions to load (a constant
-which is not @samp{I}, @samp{K}, or @samp{L})
-
-@item N
-Negative 16 bit constant
-
-@item O
-Exact power of two
-
-@item P
-Positive 16 bit constant
-
-@item G
-Floating point zero
-
-@item Q
-Memory reference that can be loaded with more than one instruction
-(@samp{m} is preferable for @code{asm} statements)
-
-@item R
-Memory reference that can be loaded with one instruction
-(@samp{m} is preferable for @code{asm} statements)
-
-@item S
-Memory reference in external OSF/rose PIC format
-(@samp{m} is preferable for @code{asm} statements)
-@end table
-
-@item Motorola 680x0---@file{m68k.h}
-@table @code
-@item a
-Address register
-
-@item d
-Data register
-
-@item f
-68881 floating-point register, if available
-
-@item x
-Sun FPA (floating-point) register, if available
-
-@item y
-First 16 Sun FPA registers, if available
-
-@item I
-Integer in the range 1 to 8
-
-@item J
-16 bit signed number
-
-@item K
-Signed number whose magnitude is greater than 0x80
-
-@item L
-Integer in the range -8 to -1
-
-@item M
-Signed number whose magnitude is greater than 0x100
-
-@item G
-Floating point constant that is not a 68881 constant
-
-@item H
-Floating point constant that can be used by Sun FPA
-@end table
-
-@need 1000
-@item SPARC---@file{sparc.h}
-@table @code
-@item f
-Floating-point register that can hold 32 or 64 bit values.
-
-@item e
-Floating-point register that can hold 64 or 128 bit values.
-
-@item I
-Signed 13 bit constant
-
-@item J
-Zero
-
-@item K
-32 bit constant with the low 12 bits clear (a constant that can be
-loaded with the @code{sethi} instruction)
-
-@item G
-Floating-point zero
-
-@item H
-Signed 13 bit constant, sign-extended to 32 or 64 bits
-
-@item Q
-Memory reference that can be loaded with one instruction (@samp{m} is
-more appropriate for @code{asm} statements)
-
-@item S
-Constant, or memory address
-
-@item T
-Memory address aligned to an 8-byte boundary
-
-@item U
-Even register
-@end table
-@end table
-
-@ifset INTERNALS
-@node No Constraints
-@subsection Not Using Constraints
-@cindex no constraints
-@cindex not using constraints
-
-Some machines are so clean that operand constraints are not required. For
-example, on the Vax, an operand valid in one context is valid in any other
-context. On such a machine, every operand constraint would be @samp{g},
-excepting only operands of ``load address'' instructions which are
-written as if they referred to a memory location's contents but actual
-refer to its address. They would have constraint @samp{p}.
-
-@cindex empty constraints
-For such machines, instead of writing @samp{g} and @samp{p} for all
-the constraints, you can choose to write a description with empty constraints.
-Then you write @samp{""} for the constraint in every @code{match_operand}.
-Address operands are identified by writing an @code{address} expression
-around the @code{match_operand}, not by their constraints.
-
-When the machine description has just empty constraints, certain parts
-of compilation are skipped, making the compiler faster. However,
-few machines actually do not need constraints; all machine descriptions
-now in existence use constraints.
-@end ifset
-
-@ifset INTERNALS
-@node Standard Names
-@section Standard Pattern Names For Generation
-@cindex standard pattern names
-@cindex pattern names
-@cindex names, pattern
-
-Here is a table of the instruction names that are meaningful in the RTL
-generation pass of the compiler. Giving one of these names to an
-instruction pattern tells the RTL generation pass that it can use the
-pattern to accomplish a certain task.
-
-@table @asis
-@cindex @code{mov@var{m}} instruction pattern
-@item @samp{mov@var{m}}
-Here @var{m} stands for a two-letter machine mode name, in lower case.
-This instruction pattern moves data with that machine mode from operand
-1 to operand 0. For example, @samp{movsi} moves full-word data.
-
-If operand 0 is a @code{subreg} with mode @var{m} of a register whose
-own mode is wider than @var{m}, the effect of this instruction is
-to store the specified value in the part of the register that corresponds
-to mode @var{m}. The effect on the rest of the register is undefined.
-
-This class of patterns is special in several ways. First of all, each
-of these names @emph{must} be defined, because there is no other way
-to copy a datum from one place to another.
-
-Second, these patterns are not used solely in the RTL generation pass.
-Even the reload pass can generate move insns to copy values from stack
-slots into temporary registers. When it does so, one of the operands is
-a hard register and the other is an operand that can need to be reloaded
-into a register.
-
-@findex force_reg
-Therefore, when given such a pair of operands, the pattern must generate
-RTL which needs no reloading and needs no temporary registers---no
-registers other than the operands. For example, if you support the
-pattern with a @code{define_expand}, then in such a case the
-@code{define_expand} mustn't call @code{force_reg} or any other such
-function which might generate new pseudo registers.
-
-This requirement exists even for subword modes on a RISC machine where
-fetching those modes from memory normally requires several insns and
-some temporary registers. Look in @file{spur.md} to see how the
-requirement can be satisfied.
-
-@findex change_address
-During reload a memory reference with an invalid address may be passed
-as an operand. Such an address will be replaced with a valid address
-later in the reload pass. In this case, nothing may be done with the
-address except to use it as it stands. If it is copied, it will not be
-replaced with a valid address. No attempt should be made to make such
-an address into a valid address and no routine (such as
-@code{change_address}) that will do so may be called. Note that
-@code{general_operand} will fail when applied to such an address.
-
-@findex reload_in_progress
-The global variable @code{reload_in_progress} (which must be explicitly
-declared if required) can be used to determine whether such special
-handling is required.
-
-The variety of operands that have reloads depends on the rest of the
-machine description, but typically on a RISC machine these can only be
-pseudo registers that did not get hard registers, while on other
-machines explicit memory references will get optional reloads.
-
-If a scratch register is required to move an object to or from memory,
-it can be allocated using @code{gen_reg_rtx} prior to life analysis.
-
-If there are cases needing
-scratch registers after reload, you must define
-@code{SECONDARY_INPUT_RELOAD_CLASS} and perhaps also
-@code{SECONDARY_OUTPUT_RELOAD_CLASS} to detect them, and provide
-patterns @samp{reload_in@var{m}} or @samp{reload_out@var{m}} to handle
-them. @xref{Register Classes}.
-
-@findex no_new_pseudos
-The global variable @code{no_new_pseudos} can be used to determine if it
-is unsafe to create new pseudo registers. If this variable is nonzero, then
-it is unsafe to call @code{gen_reg_rtx} to allocate a new pseudo.
-
-The constraints on a @samp{mov@var{m}} must permit moving any hard
-register to any other hard register provided that
-@code{HARD_REGNO_MODE_OK} permits mode @var{m} in both registers and
-@code{REGISTER_MOVE_COST} applied to their classes returns a value of 2.
-
-It is obligatory to support floating point @samp{mov@var{m}}
-instructions into and out of any registers that can hold fixed point
-values, because unions and structures (which have modes @code{SImode} or
-@code{DImode}) can be in those registers and they may have floating
-point members.
-
-There may also be a need to support fixed point @samp{mov@var{m}}
-instructions in and out of floating point registers. Unfortunately, I
-have forgotten why this was so, and I don't know whether it is still
-true. If @code{HARD_REGNO_MODE_OK} rejects fixed point values in
-floating point registers, then the constraints of the fixed point
-@samp{mov@var{m}} instructions must be designed to avoid ever trying to
-reload into a floating point register.
-
-@cindex @code{reload_in} instruction pattern
-@cindex @code{reload_out} instruction pattern
-@item @samp{reload_in@var{m}}
-@itemx @samp{reload_out@var{m}}
-Like @samp{mov@var{m}}, but used when a scratch register is required to
-move between operand 0 and operand 1. Operand 2 describes the scratch
-register. See the discussion of the @code{SECONDARY_RELOAD_CLASS}
-macro in @pxref{Register Classes}.
-
-@cindex @code{movstrict@var{m}} instruction pattern
-@item @samp{movstrict@var{m}}
-Like @samp{mov@var{m}} except that if operand 0 is a @code{subreg}
-with mode @var{m} of a register whose natural mode is wider,
-the @samp{movstrict@var{m}} instruction is guaranteed not to alter
-any of the register except the part which belongs to mode @var{m}.
-
-@cindex @code{load_multiple} instruction pattern
-@item @samp{load_multiple}
-Load several consecutive memory locations into consecutive registers.
-Operand 0 is the first of the consecutive registers, operand 1
-is the first memory location, and operand 2 is a constant: the
-number of consecutive registers.
-
-Define this only if the target machine really has such an instruction;
-do not define this if the most efficient way of loading consecutive
-registers from memory is to do them one at a time.
-
-On some machines, there are restrictions as to which consecutive
-registers can be stored into memory, such as particular starting or
-ending register numbers or only a range of valid counts. For those
-machines, use a @code{define_expand} (@pxref{Expander Definitions})
-and make the pattern fail if the restrictions are not met.
-
-Write the generated insn as a @code{parallel} with elements being a
-@code{set} of one register from the appropriate memory location (you may
-also need @code{use} or @code{clobber} elements). Use a
-@code{match_parallel} (@pxref{RTL Template}) to recognize the insn. See
-@file{a29k.md} and @file{rs6000.md} for examples of the use of this insn
-pattern.
-
-@cindex @samp{store_multiple} instruction pattern
-@item @samp{store_multiple}
-Similar to @samp{load_multiple}, but store several consecutive registers
-into consecutive memory locations. Operand 0 is the first of the
-consecutive memory locations, operand 1 is the first register, and
-operand 2 is a constant: the number of consecutive registers.
-
-@cindex @code{add@var{m}3} instruction pattern
-@item @samp{add@var{m}3}
-Add operand 2 and operand 1, storing the result in operand 0. All operands
-must have mode @var{m}. This can be used even on two-address machines, by
-means of constraints requiring operands 1 and 0 to be the same location.
-
-@cindex @code{sub@var{m}3} instruction pattern
-@cindex @code{mul@var{m}3} instruction pattern
-@cindex @code{div@var{m}3} instruction pattern
-@cindex @code{udiv@var{m}3} instruction pattern
-@cindex @code{mod@var{m}3} instruction pattern
-@cindex @code{umod@var{m}3} instruction pattern
-@cindex @code{smin@var{m}3} instruction pattern
-@cindex @code{smax@var{m}3} instruction pattern
-@cindex @code{umin@var{m}3} instruction pattern
-@cindex @code{umax@var{m}3} instruction pattern
-@cindex @code{and@var{m}3} instruction pattern
-@cindex @code{ior@var{m}3} instruction pattern
-@cindex @code{xor@var{m}3} instruction pattern
-@item @samp{sub@var{m}3}, @samp{mul@var{m}3}
-@itemx @samp{div@var{m}3}, @samp{udiv@var{m}3}, @samp{mod@var{m}3}, @samp{umod@var{m}3}
-@itemx @samp{smin@var{m}3}, @samp{smax@var{m}3}, @samp{umin@var{m}3}, @samp{umax@var{m}3}
-@itemx @samp{and@var{m}3}, @samp{ior@var{m}3}, @samp{xor@var{m}3}
-Similar, for other arithmetic operations.
-
-@cindex @code{mulhisi3} instruction pattern
-@item @samp{mulhisi3}
-Multiply operands 1 and 2, which have mode @code{HImode}, and store
-a @code{SImode} product in operand 0.
-
-@cindex @code{mulqihi3} instruction pattern
-@cindex @code{mulsidi3} instruction pattern
-@item @samp{mulqihi3}, @samp{mulsidi3}
-Similar widening-multiplication instructions of other widths.
-
-@cindex @code{umulqihi3} instruction pattern
-@cindex @code{umulhisi3} instruction pattern
-@cindex @code{umulsidi3} instruction pattern
-@item @samp{umulqihi3}, @samp{umulhisi3}, @samp{umulsidi3}
-Similar widening-multiplication instructions that do unsigned
-multiplication.
-
-@cindex @code{smul@var{m}3_highpart} instruction pattern
-@item @samp{mul@var{m}3_highpart}
-Perform a signed multiplication of operands 1 and 2, which have mode
-@var{m}, and store the most significant half of the product in operand 0.
-The least significant half of the product is discarded.
-
-@cindex @code{umul@var{m}3_highpart} instruction pattern
-@item @samp{umul@var{m}3_highpart}
-Similar, but the multiplication is unsigned.
-
-@cindex @code{divmod@var{m}4} instruction pattern
-@item @samp{divmod@var{m}4}
-Signed division that produces both a quotient and a remainder.
-Operand 1 is divided by operand 2 to produce a quotient stored
-in operand 0 and a remainder stored in operand 3.
-
-For machines with an instruction that produces both a quotient and a
-remainder, provide a pattern for @samp{divmod@var{m}4} but do not
-provide patterns for @samp{div@var{m}3} and @samp{mod@var{m}3}. This
-allows optimization in the relatively common case when both the quotient
-and remainder are computed.
-
-If an instruction that just produces a quotient or just a remainder
-exists and is more efficient than the instruction that produces both,
-write the output routine of @samp{divmod@var{m}4} to call
-@code{find_reg_note} and look for a @code{REG_UNUSED} note on the
-quotient or remainder and generate the appropriate instruction.
-
-@cindex @code{udivmod@var{m}4} instruction pattern
-@item @samp{udivmod@var{m}4}
-Similar, but does unsigned division.
-
-@cindex @code{ashl@var{m}3} instruction pattern
-@item @samp{ashl@var{m}3}
-Arithmetic-shift operand 1 left by a number of bits specified by operand
-2, and store the result in operand 0. Here @var{m} is the mode of
-operand 0 and operand 1; operand 2's mode is specified by the
-instruction pattern, and the compiler will convert the operand to that
-mode before generating the instruction.
-
-@cindex @code{ashr@var{m}3} instruction pattern
-@cindex @code{lshr@var{m}3} instruction pattern
-@cindex @code{rotl@var{m}3} instruction pattern
-@cindex @code{rotr@var{m}3} instruction pattern
-@item @samp{ashr@var{m}3}, @samp{lshr@var{m}3}, @samp{rotl@var{m}3}, @samp{rotr@var{m}3}
-Other shift and rotate instructions, analogous to the
-@code{ashl@var{m}3} instructions.
-
-@cindex @code{neg@var{m}2} instruction pattern
-@item @samp{neg@var{m}2}
-Negate operand 1 and store the result in operand 0.
-
-@cindex @code{abs@var{m}2} instruction pattern
-@item @samp{abs@var{m}2}
-Store the absolute value of operand 1 into operand 0.
-
-@cindex @code{sqrt@var{m}2} instruction pattern
-@item @samp{sqrt@var{m}2}
-Store the square root of operand 1 into operand 0.
-
-The @code{sqrt} built-in function of C always uses the mode which
-corresponds to the C data type @code{double}.
-
-@cindex @code{ffs@var{m}2} instruction pattern
-@item @samp{ffs@var{m}2}
-Store into operand 0 one plus the index of the least significant 1-bit
-of operand 1. If operand 1 is zero, store zero. @var{m} is the mode
-of operand 0; operand 1's mode is specified by the instruction
-pattern, and the compiler will convert the operand to that mode before
-generating the instruction.
-
-The @code{ffs} built-in function of C always uses the mode which
-corresponds to the C data type @code{int}.
-
-@cindex @code{one_cmpl@var{m}2} instruction pattern
-@item @samp{one_cmpl@var{m}2}
-Store the bitwise-complement of operand 1 into operand 0.
-
-@cindex @code{cmp@var{m}} instruction pattern
-@item @samp{cmp@var{m}}
-Compare operand 0 and operand 1, and set the condition codes.
-The RTL pattern should look like this:
-
-@smallexample
-(set (cc0) (compare (match_operand:@var{m} 0 @dots{})
- (match_operand:@var{m} 1 @dots{})))
-@end smallexample
-
-@cindex @code{tst@var{m}} instruction pattern
-@item @samp{tst@var{m}}
-Compare operand 0 against zero, and set the condition codes.
-The RTL pattern should look like this:
-
-@smallexample
-(set (cc0) (match_operand:@var{m} 0 @dots{}))
-@end smallexample
-
-@samp{tst@var{m}} patterns should not be defined for machines that do
-not use @code{(cc0)}. Doing so would confuse the optimizer since it
-would no longer be clear which @code{set} operations were comparisons.
-The @samp{cmp@var{m}} patterns should be used instead.
-
-@cindex @code{movstr@var{m}} instruction pattern
-@item @samp{movstr@var{m}}
-Block move instruction. The addresses of the destination and source
-strings are the first two operands, and both are in mode @code{Pmode}.
-
-The number of bytes to move is the third operand, in mode @var{m}.
-Usually, you specify @code{word_mode} for @var{m}. However, if you can
-generate better code knowing the range of valid lengths is smaller than
-those representable in a full word, you should provide a pattern with a
-mode corresponding to the range of values you can handle efficiently
-(e.g., @code{QImode} for values in the range 0--127; note we avoid numbers
-that appear negative) and also a pattern with @code{word_mode}.
-
-The fourth operand is the known shared alignment of the source and
-destination, in the form of a @code{const_int} rtx. Thus, if the
-compiler knows that both source and destination are word-aligned,
-it may provide the value 4 for this operand.
-
-Descriptions of multiple @code{movstr@var{m}} patterns can only be
-beneficial if the patterns for smaller modes have fewer restrictions
-on their first, second and fourth operands. Note that the mode @var{m}
-in @code{movstr@var{m}} does not impose any restriction on the mode of
-individually moved data units in the block.
-
-These patterns need not give special consideration to the possibility
-that the source and destination strings might overlap.
-
-@cindex @code{clrstr@var{m}} instruction pattern
-@item @samp{clrstr@var{m}}
-Block clear instruction. The addresses of the destination string is the
-first operand, in mode @code{Pmode}. The number of bytes to clear is
-the second operand, in mode @var{m}. See @samp{movstr@var{m}} for
-a discussion of the choice of mode.
-
-The third operand is the known alignment of the destination, in the form
-of a @code{const_int} rtx. Thus, if the compiler knows that the
-destination is word-aligned, it may provide the value 4 for this
-operand.
-
-The use for multiple @code{clrstr@var{m}} is as for @code{movstr@var{m}}.
-
-@cindex @code{cmpstr@var{m}} instruction pattern
-@item @samp{cmpstr@var{m}}
-Block compare instruction, with five operands. Operand 0 is the output;
-it has mode @var{m}. The remaining four operands are like the operands
-of @samp{movstr@var{m}}. The two memory blocks specified are compared
-byte by byte in lexicographic order. The effect of the instruction is
-to store a value in operand 0 whose sign indicates the result of the
-comparison.
-
-@cindex @code{strlen@var{m}} instruction pattern
-@item @samp{strlen@var{m}}
-Compute the length of a string, with three operands.
-Operand 0 is the result (of mode @var{m}), operand 1 is
-a @code{mem} referring to the first character of the string,
-operand 2 is the character to search for (normally zero),
-and operand 3 is a constant describing the known alignment
-of the beginning of the string.
-
-@cindex @code{float@var{mn}2} instruction pattern
-@item @samp{float@var{m}@var{n}2}
-Convert signed integer operand 1 (valid for fixed point mode @var{m}) to
-floating point mode @var{n} and store in operand 0 (which has mode
-@var{n}).
-
-@cindex @code{floatuns@var{mn}2} instruction pattern
-@item @samp{floatuns@var{m}@var{n}2}
-Convert unsigned integer operand 1 (valid for fixed point mode @var{m})
-to floating point mode @var{n} and store in operand 0 (which has mode
-@var{n}).
-
-@cindex @code{fix@var{mn}2} instruction pattern
-@item @samp{fix@var{m}@var{n}2}
-Convert operand 1 (valid for floating point mode @var{m}) to fixed
-point mode @var{n} as a signed number and store in operand 0 (which
-has mode @var{n}). This instruction's result is defined only when
-the value of operand 1 is an integer.
-
-@cindex @code{fixuns@var{mn}2} instruction pattern
-@item @samp{fixuns@var{m}@var{n}2}
-Convert operand 1 (valid for floating point mode @var{m}) to fixed
-point mode @var{n} as an unsigned number and store in operand 0 (which
-has mode @var{n}). This instruction's result is defined only when the
-value of operand 1 is an integer.
-
-@cindex @code{ftrunc@var{m}2} instruction pattern
-@item @samp{ftrunc@var{m}2}
-Convert operand 1 (valid for floating point mode @var{m}) to an
-integer value, still represented in floating point mode @var{m}, and
-store it in operand 0 (valid for floating point mode @var{m}).
-
-@cindex @code{fix_trunc@var{mn}2} instruction pattern
-@item @samp{fix_trunc@var{m}@var{n}2}
-Like @samp{fix@var{m}@var{n}2} but works for any floating point value
-of mode @var{m} by converting the value to an integer.
-
-@cindex @code{fixuns_trunc@var{mn}2} instruction pattern
-@item @samp{fixuns_trunc@var{m}@var{n}2}
-Like @samp{fixuns@var{m}@var{n}2} but works for any floating point
-value of mode @var{m} by converting the value to an integer.
-
-@cindex @code{trunc@var{mn}2} instruction pattern
-@item @samp{trunc@var{m}@var{n}2}
-Truncate operand 1 (valid for mode @var{m}) to mode @var{n} and
-store in operand 0 (which has mode @var{n}). Both modes must be fixed
-point or both floating point.
-
-@cindex @code{extend@var{mn}2} instruction pattern
-@item @samp{extend@var{m}@var{n}2}
-Sign-extend operand 1 (valid for mode @var{m}) to mode @var{n} and
-store in operand 0 (which has mode @var{n}). Both modes must be fixed
-point or both floating point.
-
-@cindex @code{zero_extend@var{mn}2} instruction pattern
-@item @samp{zero_extend@var{m}@var{n}2}
-Zero-extend operand 1 (valid for mode @var{m}) to mode @var{n} and
-store in operand 0 (which has mode @var{n}). Both modes must be fixed
-point.
-
-@cindex @code{extv} instruction pattern
-@item @samp{extv}
-Extract a bit field from operand 1 (a register or memory operand), where
-operand 2 specifies the width in bits and operand 3 the starting bit,
-and store it in operand 0. Operand 0 must have mode @code{word_mode}.
-Operand 1 may have mode @code{byte_mode} or @code{word_mode}; often
-@code{word_mode} is allowed only for registers. Operands 2 and 3 must
-be valid for @code{word_mode}.
-
-The RTL generation pass generates this instruction only with constants
-for operands 2 and 3.
-
-The bit-field value is sign-extended to a full word integer
-before it is stored in operand 0.
-
-@cindex @code{extzv} instruction pattern
-@item @samp{extzv}
-Like @samp{extv} except that the bit-field value is zero-extended.
-
-@cindex @code{insv} instruction pattern
-@item @samp{insv}
-Store operand 3 (which must be valid for @code{word_mode}) into a bit
-field in operand 0, where operand 1 specifies the width in bits and
-operand 2 the starting bit. Operand 0 may have mode @code{byte_mode} or
-@code{word_mode}; often @code{word_mode} is allowed only for registers.
-Operands 1 and 2 must be valid for @code{word_mode}.
-
-The RTL generation pass generates this instruction only with constants
-for operands 1 and 2.
-
-@cindex @code{mov@var{mode}cc} instruction pattern
-@item @samp{mov@var{mode}cc}
-Conditionally move operand 2 or operand 3 into operand 0 according to the
-comparison in operand 1. If the comparison is true, operand 2 is moved
-into operand 0, otherwise operand 3 is moved.
-
-The mode of the operands being compared need not be the same as the operands
-being moved. Some machines, sparc64 for example, have instructions that
-conditionally move an integer value based on the floating point condition
-codes and vice versa.
-
-If the machine does not have conditional move instructions, do not
-define these patterns.
-
-@cindex @code{s@var{cond}} instruction pattern
-@item @samp{s@var{cond}}
-Store zero or nonzero in the operand according to the condition codes.
-Value stored is nonzero iff the condition @var{cond} is true.
-@var{cond} is the name of a comparison operation expression code, such
-as @code{eq}, @code{lt} or @code{leu}.
-
-You specify the mode that the operand must have when you write the
-@code{match_operand} expression. The compiler automatically sees
-which mode you have used and supplies an operand of that mode.
-
-The value stored for a true condition must have 1 as its low bit, or
-else must be negative. Otherwise the instruction is not suitable and
-you should omit it from the machine description. You describe to the
-compiler exactly which value is stored by defining the macro
-@code{STORE_FLAG_VALUE} (@pxref{Misc}). If a description cannot be
-found that can be used for all the @samp{s@var{cond}} patterns, you
-should omit those operations from the machine description.
-
-These operations may fail, but should do so only in relatively
-uncommon cases; if they would fail for common cases involving
-integer comparisons, it is best to omit these patterns.
-
-If these operations are omitted, the compiler will usually generate code
-that copies the constant one to the target and branches around an
-assignment of zero to the target. If this code is more efficient than
-the potential instructions used for the @samp{s@var{cond}} pattern
-followed by those required to convert the result into a 1 or a zero in
-@code{SImode}, you should omit the @samp{s@var{cond}} operations from
-the machine description.
-
-@cindex @code{b@var{cond}} instruction pattern
-@item @samp{b@var{cond}}
-Conditional branch instruction. Operand 0 is a @code{label_ref} that
-refers to the label to jump to. Jump if the condition codes meet
-condition @var{cond}.
-
-Some machines do not follow the model assumed here where a comparison
-instruction is followed by a conditional branch instruction. In that
-case, the @samp{cmp@var{m}} (and @samp{tst@var{m}}) patterns should
-simply store the operands away and generate all the required insns in a
-@code{define_expand} (@pxref{Expander Definitions}) for the conditional
-branch operations. All calls to expand @samp{b@var{cond}} patterns are
-immediately preceded by calls to expand either a @samp{cmp@var{m}}
-pattern or a @samp{tst@var{m}} pattern.
-
-Machines that use a pseudo register for the condition code value, or
-where the mode used for the comparison depends on the condition being
-tested, should also use the above mechanism. @xref{Jump Patterns}
-
-The above discussion also applies to the @samp{mov@var{mode}cc} and
-@samp{s@var{cond}} patterns.
-
-@cindex @code{call} instruction pattern
-@item @samp{call}
-Subroutine call instruction returning no value. Operand 0 is the
-function to call; operand 1 is the number of bytes of arguments pushed
-as a @code{const_int}; operand 2 is the number of registers used as
-operands.
-
-On most machines, operand 2 is not actually stored into the RTL
-pattern. It is supplied for the sake of some RISC machines which need
-to put this information into the assembler code; they can put it in
-the RTL instead of operand 1.
-
-Operand 0 should be a @code{mem} RTX whose address is the address of the
-function. Note, however, that this address can be a @code{symbol_ref}
-expression even if it would not be a legitimate memory address on the
-target machine. If it is also not a valid argument for a call
-instruction, the pattern for this operation should be a
-@code{define_expand} (@pxref{Expander Definitions}) that places the
-address into a register and uses that register in the call instruction.
-
-@cindex @code{call_value} instruction pattern
-@item @samp{call_value}
-Subroutine call instruction returning a value. Operand 0 is the hard
-register in which the value is returned. There are three more
-operands, the same as the three operands of the @samp{call}
-instruction (but with numbers increased by one).
-
-Subroutines that return @code{BLKmode} objects use the @samp{call}
-insn.
-
-@cindex @code{call_pop} instruction pattern
-@cindex @code{call_value_pop} instruction pattern
-@item @samp{call_pop}, @samp{call_value_pop}
-Similar to @samp{call} and @samp{call_value}, except used if defined and
-if @code{RETURN_POPS_ARGS} is non-zero. They should emit a @code{parallel}
-that contains both the function call and a @code{set} to indicate the
-adjustment made to the frame pointer.
-
-For machines where @code{RETURN_POPS_ARGS} can be non-zero, the use of these
-patterns increases the number of functions for which the frame pointer
-can be eliminated, if desired.
-
-@cindex @code{untyped_call} instruction pattern
-@item @samp{untyped_call}
-Subroutine call instruction returning a value of any type. Operand 0 is
-the function to call; operand 1 is a memory location where the result of
-calling the function is to be stored; operand 2 is a @code{parallel}
-expression where each element is a @code{set} expression that indicates
-the saving of a function return value into the result block.
-
-This instruction pattern should be defined to support
-@code{__builtin_apply} on machines where special instructions are needed
-to call a subroutine with arbitrary arguments or to save the value
-returned. This instruction pattern is required on machines that have
-multiple registers that can hold a return value (i.e.
-@code{FUNCTION_VALUE_REGNO_P} is true for more than one register).
-
-@cindex @code{return} instruction pattern
-@item @samp{return}
-Subroutine return instruction. This instruction pattern name should be
-defined only if a single instruction can do all the work of returning
-from a function.
-
-Like the @samp{mov@var{m}} patterns, this pattern is also used after the
-RTL generation phase. In this case it is to support machines where
-multiple instructions are usually needed to return from a function, but
-some class of functions only requires one instruction to implement a
-return. Normally, the applicable functions are those which do not need
-to save any registers or allocate stack space.
-
-@findex reload_completed
-@findex leaf_function_p
-For such machines, the condition specified in this pattern should only
-be true when @code{reload_completed} is non-zero and the function's
-epilogue would only be a single instruction. For machines with register
-windows, the routine @code{leaf_function_p} may be used to determine if
-a register window push is required.
-
-Machines that have conditional return instructions should define patterns
-such as
-
-@smallexample
-(define_insn ""
- [(set (pc)
- (if_then_else (match_operator
- 0 "comparison_operator"
- [(cc0) (const_int 0)])
- (return)
- (pc)))]
- "@var{condition}"
- "@dots{}")
-@end smallexample
-
-where @var{condition} would normally be the same condition specified on the
-named @samp{return} pattern.
-
-@cindex @code{untyped_return} instruction pattern
-@item @samp{untyped_return}
-Untyped subroutine return instruction. This instruction pattern should
-be defined to support @code{__builtin_return} on machines where special
-instructions are needed to return a value of any type.
-
-Operand 0 is a memory location where the result of calling a function
-with @code{__builtin_apply} is stored; operand 1 is a @code{parallel}
-expression where each element is a @code{set} expression that indicates
-the restoring of a function return value from the result block.
-
-@cindex @code{nop} instruction pattern
-@item @samp{nop}
-No-op instruction. This instruction pattern name should always be defined
-to output a no-op in assembler code. @code{(const_int 0)} will do as an
-RTL pattern.
-
-@cindex @code{indirect_jump} instruction pattern
-@item @samp{indirect_jump}
-An instruction to jump to an address which is operand zero.
-This pattern name is mandatory on all machines.
-
-@cindex @code{casesi} instruction pattern
-@item @samp{casesi}
-Instruction to jump through a dispatch table, including bounds checking.
-This instruction takes five operands:
-
-@enumerate
-@item
-The index to dispatch on, which has mode @code{SImode}.
-
-@item
-The lower bound for indices in the table, an integer constant.
-
-@item
-The total range of indices in the table---the largest index
-minus the smallest one (both inclusive).
-
-@item
-A label that precedes the table itself.
-
-@item
-A label to jump to if the index has a value outside the bounds.
-(If the machine-description macro @code{CASE_DROPS_THROUGH} is defined,
-then an out-of-bounds index drops through to the code following
-the jump table instead of jumping to this label. In that case,
-this label is not actually used by the @samp{casesi} instruction,
-but it is always provided as an operand.)
-@end enumerate
-
-The table is a @code{addr_vec} or @code{addr_diff_vec} inside of a
-@code{jump_insn}. The number of elements in the table is one plus the
-difference between the upper bound and the lower bound.
-
-@cindex @code{tablejump} instruction pattern
-@item @samp{tablejump}
-Instruction to jump to a variable address. This is a low-level
-capability which can be used to implement a dispatch table when there
-is no @samp{casesi} pattern.
-
-This pattern requires two operands: the address or offset, and a label
-which should immediately precede the jump table. If the macro
-@code{CASE_VECTOR_PC_RELATIVE} evaluates to a nonzero value then the first
-operand is an offset which counts from the address of the table; otherwise,
-it is an absolute address to jump to. In either case, the first operand has
-mode @code{Pmode}.
-
-The @samp{tablejump} insn is always the last insn before the jump
-table it uses. Its assembler code normally has no need to use the
-second operand, but you should incorporate it in the RTL pattern so
-that the jump optimizer will not delete the table as unreachable code.
-
-@cindex @code{canonicalize_funcptr_for_compare} instruction pattern
-@item @samp{canonicalize_funcptr_for_compare}
-Canonicalize the function pointer in operand 1 and store the result
-into operand 0.
-
-Operand 0 is always a @code{reg} and has mode @code{Pmode}; operand 1
-may be a @code{reg}, @code{mem}, @code{symbol_ref}, @code{const_int}, etc
-and also has mode @code{Pmode}.
-
-Canonicalization of a function pointer usually involves computing
-the address of the function which would be called if the function
-pointer were used in an indirect call.
-
-Only define this pattern if function pointers on the target machine
-can have different values but still call the same function when
-used in an indirect call.
-
-@cindex @code{save_stack_block} instruction pattern
-@cindex @code{save_stack_function} instruction pattern
-@cindex @code{save_stack_nonlocal} instruction pattern
-@cindex @code{restore_stack_block} instruction pattern
-@cindex @code{restore_stack_function} instruction pattern
-@cindex @code{restore_stack_nonlocal} instruction pattern
-@item @samp{save_stack_block}
-@itemx @samp{save_stack_function}
-@itemx @samp{save_stack_nonlocal}
-@itemx @samp{restore_stack_block}
-@itemx @samp{restore_stack_function}
-@itemx @samp{restore_stack_nonlocal}
-Most machines save and restore the stack pointer by copying it to or
-from an object of mode @code{Pmode}. Do not define these patterns on
-such machines.
-
-Some machines require special handling for stack pointer saves and
-restores. On those machines, define the patterns corresponding to the
-non-standard cases by using a @code{define_expand} (@pxref{Expander
-Definitions}) that produces the required insns. The three types of
-saves and restores are:
-
-@enumerate
-@item
-@samp{save_stack_block} saves the stack pointer at the start of a block
-that allocates a variable-sized object, and @samp{restore_stack_block}
-restores the stack pointer when the block is exited.
-
-@item
-@samp{save_stack_function} and @samp{restore_stack_function} do a
-similar job for the outermost block of a function and are used when the
-function allocates variable-sized objects or calls @code{alloca}. Only
-the epilogue uses the restored stack pointer, allowing a simpler save or
-restore sequence on some machines.
-
-@item
-@samp{save_stack_nonlocal} is used in functions that contain labels
-branched to by nested functions. It saves the stack pointer in such a
-way that the inner function can use @samp{restore_stack_nonlocal} to
-restore the stack pointer. The compiler generates code to restore the
-frame and argument pointer registers, but some machines require saving
-and restoring additional data such as register window information or
-stack backchains. Place insns in these patterns to save and restore any
-such required data.
-@end enumerate
-
-When saving the stack pointer, operand 0 is the save area and operand 1
-is the stack pointer. The mode used to allocate the save area defaults
-to @code{Pmode} but you can override that choice by defining the
-@code{STACK_SAVEAREA_MODE} macro (@pxref{Storage Layout}). You must
-specify an integral mode, or @code{VOIDmode} if no save area is needed
-for a particular type of save (either because no save is needed or
-because a machine-specific save area can be used). Operand 0 is the
-stack pointer and operand 1 is the save area for restore operations. If
-@samp{save_stack_block} is defined, operand 0 must not be
-@code{VOIDmode} since these saves can be arbitrarily nested.
-
-A save area is a @code{mem} that is at a constant offset from
-@code{virtual_stack_vars_rtx} when the stack pointer is saved for use by
-nonlocal gotos and a @code{reg} in the other two cases.
-
-@cindex @code{allocate_stack} instruction pattern
-@item @samp{allocate_stack}
-Subtract (or add if @code{STACK_GROWS_DOWNWARD} is undefined) operand 1 from
-the stack pointer to create space for dynamically allocated data.
-
-Store the resultant pointer to this space into operand 0. If you
-are allocating space from the main stack, do this by emitting a
-move insn to copy @code{virtual_stack_dynamic_rtx} to operand 0.
-If you are allocating the space elsewhere, generate code to copy the
-location of the space to operand 0. In the latter case, you must
-ensure this space gets freed when the corresponding space on the main
-stack is free.
-
-Do not define this pattern if all that must be done is the subtraction.
-Some machines require other operations such as stack probes or
-maintaining the back chain. Define this pattern to emit those
-operations in addition to updating the stack pointer.
-
-@cindex @code{probe} instruction pattern
-@item @samp{probe}
-Some machines require instructions to be executed after space is
-allocated from the stack, for example to generate a reference at
-the bottom of the stack.
-
-If you need to emit instructions before the stack has been adjusted,
-put them into the @samp{allocate_stack} pattern. Otherwise, define
-this pattern to emit the required instructions.
-
-No operands are provided.
-
-@cindex @code{check_stack} instruction pattern
-@item @samp{check_stack}
-If stack checking cannot be done on your system by probing the stack with
-a load or store instruction (@pxref{Stack Checking}), define this pattern
-to perform the needed check and signaling an error if the stack
-has overflowed. The single operand is the location in the stack furthest
-from the current stack pointer that you need to validate. Normally,
-on machines where this pattern is needed, you would obtain the stack
-limit from a global or thread-specific variable or register.
-
-@cindex @code{nonlocal_goto} instruction pattern
-@item @samp{nonlocal_goto}
-Emit code to generate a non-local goto, e.g., a jump from one function
-to a label in an outer function. This pattern has four arguments,
-each representing a value to be used in the jump. The first
-argument is to be loaded into the frame pointer, the second is
-the address to branch to (code to dispatch to the actual label),
-the third is the address of a location where the stack is saved,
-and the last is the address of the label, to be placed in the
-location for the incoming static chain.
-
-On most machines you need not define this pattern, since GNU CC will
-already generate the correct code, which is to load the frame pointer
-and static chain, restore the stack (using the
-@samp{restore_stack_nonlocal} pattern, if defined), and jump indirectly
-to the dispatcher. You need only define this pattern if this code will
-not work on your machine.
-
-@cindex @code{nonlocal_goto_receiver} instruction pattern
-@item @samp{nonlocal_goto_receiver}
-This pattern, if defined, contains code needed at the target of a
-nonlocal goto after the code already generated by GNU CC. You will not
-normally need to define this pattern. A typical reason why you might
-need this pattern is if some value, such as a pointer to a global table,
-must be restored when the frame pointer is restored. Note that a nonlocal
-goto only ocurrs within a unit-of-translation, so a global table pointer
-that is shared by all functions of a given module need not be restored.
-There are no arguments.
-
-@cindex @code{exception_receiver} instruction pattern
-@item @samp{exception_receiver}
-This pattern, if defined, contains code needed at the site of an
-exception handler that isn't needed at the site of a nonlocal goto. You
-will not normally need to define this pattern. A typical reason why you
-might need this pattern is if some value, such as a pointer to a global
-table, must be restored after control flow is branched to the handler of
-an exception. There are no arguments.
-
-@cindex @code{builtin_setjmp_setup} instruction pattern
-@item @samp{builtin_setjmp_setup}
-This pattern, if defined, contains additional code needed to initialize
-the @code{jmp_buf}. You will not normally need to define this pattern.
-A typical reason why you might need this pattern is if some value, such
-as a pointer to a global table, must be restored. Though it is
-preferred that the pointer value be recalculated if possible (given the
-address of a label for instance). The single argument is a pointer to
-the @code{jmp_buf}. Note that the buffer is five words long and that
-the first three are normally used by the generic mechanism.
-
-@cindex @code{builtin_setjmp_receiver} instruction pattern
-@item @samp{builtin_setjmp_receiver}
-This pattern, if defined, contains code needed at the site of an
-builtin setjmp that isn't needed at the site of a nonlocal goto. You
-will not normally need to define this pattern. A typical reason why you
-might need this pattern is if some value, such as a pointer to a global
-table, must be restored. It takes one argument, which is the label
-to which builtin_longjmp transfered control; this pattern may be emitted
-at a small offset from that label.
-
-@cindex @code{builtin_longjmp} instruction pattern
-@item @samp{builtin_longjmp}
-This pattern, if defined, performs the entire action of the longjmp.
-You will not normally need to define this pattern unless you also define
-@code{builtin_setjmp_setup}. The single argument is a pointer to the
-@code{jmp_buf}.
-
-@cindex @code{eh_epilogue} instruction pattern
-@item @samp{eh_epilogue}
-This pattern, if defined, affects the way @code{__builtin_eh_return},
-and thence @code{__throw} are built. It is intended to allow communication
-between the exception handling machinery and the normal epilogue code
-for the target.
-
-The pattern takes three arguments. The first is the exception context
-pointer. This will have already been copied to the function return
-register appropriate for a pointer; normally this can be ignored. The
-second argument is an offset to be added to the stack pointer. It will
-have been copied to some arbitrary call-clobbered hard reg so that it
-will survive until after reload to when the normal epilogue is generated.
-The final argument is the address of the exception handler to which
-the function should return. This will normally need to copied by the
-pattern to some special register.
-
-This pattern must be defined if @code{RETURN_ADDR_RTX} does not yield
-something that can be reliably and permanently modified, i.e. a fixed
-hard register or a stack memory reference.
-@end table
-
-@node Pattern Ordering
-@section When the Order of Patterns Matters
-@cindex Pattern Ordering
-@cindex Ordering of Patterns
-
-Sometimes an insn can match more than one instruction pattern. Then the
-pattern that appears first in the machine description is the one used.
-Therefore, more specific patterns (patterns that will match fewer things)
-and faster instructions (those that will produce better code when they
-do match) should usually go first in the description.
-
-In some cases the effect of ordering the patterns can be used to hide
-a pattern when it is not valid. For example, the 68000 has an
-instruction for converting a fullword to floating point and another
-for converting a byte to floating point. An instruction converting
-an integer to floating point could match either one. We put the
-pattern to convert the fullword first to make sure that one will
-be used rather than the other. (Otherwise a large integer might
-be generated as a single-byte immediate quantity, which would not work.)
-Instead of using this pattern ordering it would be possible to make the
-pattern for convert-a-byte smart enough to deal properly with any
-constant value.
-
-@node Dependent Patterns
-@section Interdependence of Patterns
-@cindex Dependent Patterns
-@cindex Interdependence of Patterns
-
-Every machine description must have a named pattern for each of the
-conditional branch names @samp{b@var{cond}}. The recognition template
-must always have the form
-
-@example
-(set (pc)
- (if_then_else (@var{cond} (cc0) (const_int 0))
- (label_ref (match_operand 0 "" ""))
- (pc)))
-@end example
-
-@noindent
-In addition, every machine description must have an anonymous pattern
-for each of the possible reverse-conditional branches. Their templates
-look like
-
-@example
-(set (pc)
- (if_then_else (@var{cond} (cc0) (const_int 0))
- (pc)
- (label_ref (match_operand 0 "" ""))))
-@end example
-
-@noindent
-They are necessary because jump optimization can turn direct-conditional
-branches into reverse-conditional branches.
-
-It is often convenient to use the @code{match_operator} construct to
-reduce the number of patterns that must be specified for branches. For
-example,
-
-@example
-(define_insn ""
- [(set (pc)
- (if_then_else (match_operator 0 "comparison_operator"
- [(cc0) (const_int 0)])
- (pc)
- (label_ref (match_operand 1 "" ""))))]
- "@var{condition}"
- "@dots{}")
-@end example
-
-In some cases machines support instructions identical except for the
-machine mode of one or more operands. For example, there may be
-``sign-extend halfword'' and ``sign-extend byte'' instructions whose
-patterns are
-
-@example
-(set (match_operand:SI 0 @dots{})
- (extend:SI (match_operand:HI 1 @dots{})))
-
-(set (match_operand:SI 0 @dots{})
- (extend:SI (match_operand:QI 1 @dots{})))
-@end example
-
-@noindent
-Constant integers do not specify a machine mode, so an instruction to
-extend a constant value could match either pattern. The pattern it
-actually will match is the one that appears first in the file. For correct
-results, this must be the one for the widest possible mode (@code{HImode},
-here). If the pattern matches the @code{QImode} instruction, the results
-will be incorrect if the constant value does not actually fit that mode.
-
-Such instructions to extend constants are rarely generated because they are
-optimized away, but they do occasionally happen in nonoptimized
-compilations.
-
-If a constraint in a pattern allows a constant, the reload pass may
-replace a register with a constant permitted by the constraint in some
-cases. Similarly for memory references. Because of this substitution,
-you should not provide separate patterns for increment and decrement
-instructions. Instead, they should be generated from the same pattern
-that supports register-register add insns by examining the operands and
-generating the appropriate machine instruction.
-
-@node Jump Patterns
-@section Defining Jump Instruction Patterns
-@cindex jump instruction patterns
-@cindex defining jump instruction patterns
-
-For most machines, GNU CC assumes that the machine has a condition code.
-A comparison insn sets the condition code, recording the results of both
-signed and unsigned comparison of the given operands. A separate branch
-insn tests the condition code and branches or not according its value.
-The branch insns come in distinct signed and unsigned flavors. Many
-common machines, such as the Vax, the 68000 and the 32000, work this
-way.
-
-Some machines have distinct signed and unsigned compare instructions, and
-only one set of conditional branch instructions. The easiest way to handle
-these machines is to treat them just like the others until the final stage
-where assembly code is written. At this time, when outputting code for the
-compare instruction, peek ahead at the following branch using
-@code{next_cc0_user (insn)}. (The variable @code{insn} refers to the insn
-being output, in the output-writing code in an instruction pattern.) If
-the RTL says that is an unsigned branch, output an unsigned compare;
-otherwise output a signed compare. When the branch itself is output, you
-can treat signed and unsigned branches identically.
-
-The reason you can do this is that GNU CC always generates a pair of
-consecutive RTL insns, possibly separated by @code{note} insns, one to
-set the condition code and one to test it, and keeps the pair inviolate
-until the end.
-
-To go with this technique, you must define the machine-description macro
-@code{NOTICE_UPDATE_CC} to do @code{CC_STATUS_INIT}; in other words, no
-compare instruction is superfluous.
-
-Some machines have compare-and-branch instructions and no condition code.
-A similar technique works for them. When it is time to ``output'' a
-compare instruction, record its operands in two static variables. When
-outputting the branch-on-condition-code instruction that follows, actually
-output a compare-and-branch instruction that uses the remembered operands.
-
-It also works to define patterns for compare-and-branch instructions.
-In optimizing compilation, the pair of compare and branch instructions
-will be combined according to these patterns. But this does not happen
-if optimization is not requested. So you must use one of the solutions
-above in addition to any special patterns you define.
-
-In many RISC machines, most instructions do not affect the condition
-code and there may not even be a separate condition code register. On
-these machines, the restriction that the definition and use of the
-condition code be adjacent insns is not necessary and can prevent
-important optimizations. For example, on the IBM RS/6000, there is a
-delay for taken branches unless the condition code register is set three
-instructions earlier than the conditional branch. The instruction
-scheduler cannot perform this optimization if it is not permitted to
-separate the definition and use of the condition code register.
-
-On these machines, do not use @code{(cc0)}, but instead use a register
-to represent the condition code. If there is a specific condition code
-register in the machine, use a hard register. If the condition code or
-comparison result can be placed in any general register, or if there are
-multiple condition registers, use a pseudo register.
-
-@findex prev_cc0_setter
-@findex next_cc0_user
-On some machines, the type of branch instruction generated may depend on
-the way the condition code was produced; for example, on the 68k and
-Sparc, setting the condition code directly from an add or subtract
-instruction does not clear the overflow bit the way that a test
-instruction does, so a different branch instruction must be used for
-some conditional branches. For machines that use @code{(cc0)}, the set
-and use of the condition code must be adjacent (separated only by
-@code{note} insns) allowing flags in @code{cc_status} to be used.
-(@xref{Condition Code}.) Also, the comparison and branch insns can be
-located from each other by using the functions @code{prev_cc0_setter}
-and @code{next_cc0_user}.
-
-However, this is not true on machines that do not use @code{(cc0)}. On
-those machines, no assumptions can be made about the adjacency of the
-compare and branch insns and the above methods cannot be used. Instead,
-we use the machine mode of the condition code register to record
-different formats of the condition code register.
-
-Registers used to store the condition code value should have a mode that
-is in class @code{MODE_CC}. Normally, it will be @code{CCmode}. If
-additional modes are required (as for the add example mentioned above in
-the Sparc), define the macro @code{EXTRA_CC_MODES} to list the
-additional modes required (@pxref{Condition Code}). Also define
-@code{EXTRA_CC_NAMES} to list the names of those modes and
-@code{SELECT_CC_MODE} to choose a mode given an operand of a compare.
-
-If it is known during RTL generation that a different mode will be
-required (for example, if the machine has separate compare instructions
-for signed and unsigned quantities, like most IBM processors), they can
-be specified at that time.
-
-If the cases that require different modes would be made by instruction
-combination, the macro @code{SELECT_CC_MODE} determines which machine
-mode should be used for the comparison result. The patterns should be
-written using that mode. To support the case of the add on the Sparc
-discussed above, we have the pattern
-
-@smallexample
-(define_insn ""
- [(set (reg:CC_NOOV 0)
- (compare:CC_NOOV
- (plus:SI (match_operand:SI 0 "register_operand" "%r")
- (match_operand:SI 1 "arith_operand" "rI"))
- (const_int 0)))]
- ""
- "@dots{}")
-@end smallexample
-
-The @code{SELECT_CC_MODE} macro on the Sparc returns @code{CC_NOOVmode}
-for comparisons whose argument is a @code{plus}.
-
-@node Insn Canonicalizations
-@section Canonicalization of Instructions
-@cindex canonicalization of instructions
-@cindex insn canonicalization
-
-There are often cases where multiple RTL expressions could represent an
-operation performed by a single machine instruction. This situation is
-most commonly encountered with logical, branch, and multiply-accumulate
-instructions. In such cases, the compiler attempts to convert these
-multiple RTL expressions into a single canonical form to reduce the
-number of insn patterns required.
-
-In addition to algebraic simplifications, following canonicalizations
-are performed:
-
-@itemize @bullet
-@item
-For commutative and comparison operators, a constant is always made the
-second operand. If a machine only supports a constant as the second
-operand, only patterns that match a constant in the second operand need
-be supplied.
-
-@cindex @code{neg}, canonicalization of
-@cindex @code{not}, canonicalization of
-@cindex @code{mult}, canonicalization of
-@cindex @code{plus}, canonicalization of
-@cindex @code{minus}, canonicalization of
-For these operators, if only one operand is a @code{neg}, @code{not},
-@code{mult}, @code{plus}, or @code{minus} expression, it will be the
-first operand.
-
-@cindex @code{compare}, canonicalization of
-@item
-For the @code{compare} operator, a constant is always the second operand
-on machines where @code{cc0} is used (@pxref{Jump Patterns}). On other
-machines, there are rare cases where the compiler might want to construct
-a @code{compare} with a constant as the first operand. However, these
-cases are not common enough for it to be worthwhile to provide a pattern
-matching a constant as the first operand unless the machine actually has
-such an instruction.
-
-An operand of @code{neg}, @code{not}, @code{mult}, @code{plus}, or
-@code{minus} is made the first operand under the same conditions as
-above.
-
-@item
-@code{(minus @var{x} (const_int @var{n}))} is converted to
-@code{(plus @var{x} (const_int @var{-n}))}.
-
-@item
-Within address computations (i.e., inside @code{mem}), a left shift is
-converted into the appropriate multiplication by a power of two.
-
-@cindex @code{ior}, canonicalization of
-@cindex @code{and}, canonicalization of
-@cindex De Morgan's law
-@item
-De`Morgan's Law is used to move bitwise negation inside a bitwise
-logical-and or logical-or operation. If this results in only one
-operand being a @code{not} expression, it will be the first one.
-
-A machine that has an instruction that performs a bitwise logical-and of one
-operand with the bitwise negation of the other should specify the pattern
-for that instruction as
-
-@example
-(define_insn ""
- [(set (match_operand:@var{m} 0 @dots{})
- (and:@var{m} (not:@var{m} (match_operand:@var{m} 1 @dots{}))
- (match_operand:@var{m} 2 @dots{})))]
- "@dots{}"
- "@dots{}")
-@end example
-
-@noindent
-Similarly, a pattern for a ``NAND'' instruction should be written
-
-@example
-(define_insn ""
- [(set (match_operand:@var{m} 0 @dots{})
- (ior:@var{m} (not:@var{m} (match_operand:@var{m} 1 @dots{}))
- (not:@var{m} (match_operand:@var{m} 2 @dots{}))))]
- "@dots{}"
- "@dots{}")
-@end example
-
-In both cases, it is not necessary to include patterns for the many
-logically equivalent RTL expressions.
-
-@cindex @code{xor}, canonicalization of
-@item
-The only possible RTL expressions involving both bitwise exclusive-or
-and bitwise negation are @code{(xor:@var{m} @var{x} @var{y})}
-and @code{(not:@var{m} (xor:@var{m} @var{x} @var{y}))}.@refill
-
-@item
-The sum of three items, one of which is a constant, will only appear in
-the form
-
-@example
-(plus:@var{m} (plus:@var{m} @var{x} @var{y}) @var{constant})
-@end example
-
-@item
-On machines that do not use @code{cc0},
-@code{(compare @var{x} (const_int 0))} will be converted to
-@var{x}.@refill
-
-@cindex @code{zero_extract}, canonicalization of
-@cindex @code{sign_extract}, canonicalization of
-@item
-Equality comparisons of a group of bits (usually a single bit) with zero
-will be written using @code{zero_extract} rather than the equivalent
-@code{and} or @code{sign_extract} operations.
-
-@end itemize
-
-@node Peephole Definitions
-@section Machine-Specific Peephole Optimizers
-@cindex peephole optimizer definitions
-@cindex defining peephole optimizers
-
-In addition to instruction patterns the @file{md} file may contain
-definitions of machine-specific peephole optimizations.
-
-The combiner does not notice certain peephole optimizations when the data
-flow in the program does not suggest that it should try them. For example,
-sometimes two consecutive insns related in purpose can be combined even
-though the second one does not appear to use a register computed in the
-first one. A machine-specific peephole optimizer can detect such
-opportunities.
-
-@need 1000
-A definition looks like this:
-
-@smallexample
-(define_peephole
- [@var{insn-pattern-1}
- @var{insn-pattern-2}
- @dots{}]
- "@var{condition}"
- "@var{template}"
- "@var{optional insn-attributes}")
-@end smallexample
-
-@noindent
-The last string operand may be omitted if you are not using any
-machine-specific information in this machine description. If present,
-it must obey the same rules as in a @code{define_insn}.
-
-In this skeleton, @var{insn-pattern-1} and so on are patterns to match
-consecutive insns. The optimization applies to a sequence of insns when
-@var{insn-pattern-1} matches the first one, @var{insn-pattern-2} matches
-the next, and so on.@refill
-
-Each of the insns matched by a peephole must also match a
-@code{define_insn}. Peepholes are checked only at the last stage just
-before code generation, and only optionally. Therefore, any insn which
-would match a peephole but no @code{define_insn} will cause a crash in code
-generation in an unoptimized compilation, or at various optimization
-stages.
-
-The operands of the insns are matched with @code{match_operands},
-@code{match_operator}, and @code{match_dup}, as usual. What is not
-usual is that the operand numbers apply to all the insn patterns in the
-definition. So, you can check for identical operands in two insns by
-using @code{match_operand} in one insn and @code{match_dup} in the
-other.
-
-The operand constraints used in @code{match_operand} patterns do not have
-any direct effect on the applicability of the peephole, but they will
-be validated afterward, so make sure your constraints are general enough
-to apply whenever the peephole matches. If the peephole matches
-but the constraints are not satisfied, the compiler will crash.
-
-It is safe to omit constraints in all the operands of the peephole; or
-you can write constraints which serve as a double-check on the criteria
-previously tested.
-
-Once a sequence of insns matches the patterns, the @var{condition} is
-checked. This is a C expression which makes the final decision whether to
-perform the optimization (we do so if the expression is nonzero). If
-@var{condition} is omitted (in other words, the string is empty) then the
-optimization is applied to every sequence of insns that matches the
-patterns.
-
-The defined peephole optimizations are applied after register allocation
-is complete. Therefore, the peephole definition can check which
-operands have ended up in which kinds of registers, just by looking at
-the operands.
-
-@findex prev_active_insn
-The way to refer to the operands in @var{condition} is to write
-@code{operands[@var{i}]} for operand number @var{i} (as matched by
-@code{(match_operand @var{i} @dots{})}). Use the variable @code{insn}
-to refer to the last of the insns being matched; use
-@code{prev_active_insn} to find the preceding insns.
-
-@findex dead_or_set_p
-When optimizing computations with intermediate results, you can use
-@var{condition} to match only when the intermediate results are not used
-elsewhere. Use the C expression @code{dead_or_set_p (@var{insn},
-@var{op})}, where @var{insn} is the insn in which you expect the value
-to be used for the last time (from the value of @code{insn}, together
-with use of @code{prev_nonnote_insn}), and @var{op} is the intermediate
-value (from @code{operands[@var{i}]}).@refill
-
-Applying the optimization means replacing the sequence of insns with one
-new insn. The @var{template} controls ultimate output of assembler code
-for this combined insn. It works exactly like the template of a
-@code{define_insn}. Operand numbers in this template are the same ones
-used in matching the original sequence of insns.
-
-The result of a defined peephole optimizer does not need to match any of
-the insn patterns in the machine description; it does not even have an
-opportunity to match them. The peephole optimizer definition itself serves
-as the insn pattern to control how the insn is output.
-
-Defined peephole optimizers are run as assembler code is being output,
-so the insns they produce are never combined or rearranged in any way.
-
-Here is an example, taken from the 68000 machine description:
-
-@smallexample
-(define_peephole
- [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4)))
- (set (match_operand:DF 0 "register_operand" "=f")
- (match_operand:DF 1 "register_operand" "ad"))]
- "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])"
- "*
-@{
- rtx xoperands[2];
- xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
-#ifdef MOTOROLA
- output_asm_insn (\"move.l %1,(sp)\", xoperands);
- output_asm_insn (\"move.l %1,-(sp)\", operands);
- return \"fmove.d (sp)+,%0\";
-#else
- output_asm_insn (\"movel %1,sp@@\", xoperands);
- output_asm_insn (\"movel %1,sp@@-\", operands);
- return \"fmoved sp@@+,%0\";
-#endif
-@}
-")
-@end smallexample
-
-@need 1000
-The effect of this optimization is to change
-
-@smallexample
-@group
-jbsr _foobar
-addql #4,sp
-movel d1,sp@@-
-movel d0,sp@@-
-fmoved sp@@+,fp0
-@end group
-@end smallexample
-
-@noindent
-into
-
-@smallexample
-@group
-jbsr _foobar
-movel d1,sp@@
-movel d0,sp@@-
-fmoved sp@@+,fp0
-@end group
-@end smallexample
-
-@ignore
-@findex CC_REVERSED
-If a peephole matches a sequence including one or more jump insns, you must
-take account of the flags such as @code{CC_REVERSED} which specify that the
-condition codes are represented in an unusual manner. The compiler
-automatically alters any ordinary conditional jumps which occur in such
-situations, but the compiler cannot alter jumps which have been replaced by
-peephole optimizations. So it is up to you to alter the assembler code
-that the peephole produces. Supply C code to write the assembler output,
-and in this C code check the condition code status flags and change the
-assembler code as appropriate.
-@end ignore
-
-@var{insn-pattern-1} and so on look @emph{almost} like the second
-operand of @code{define_insn}. There is one important difference: the
-second operand of @code{define_insn} consists of one or more RTX's
-enclosed in square brackets. Usually, there is only one: then the same
-action can be written as an element of a @code{define_peephole}. But
-when there are multiple actions in a @code{define_insn}, they are
-implicitly enclosed in a @code{parallel}. Then you must explicitly
-write the @code{parallel}, and the square brackets within it, in the
-@code{define_peephole}. Thus, if an insn pattern looks like this,
-
-@smallexample
-(define_insn "divmodsi4"
- [(set (match_operand:SI 0 "general_operand" "=d")
- (div:SI (match_operand:SI 1 "general_operand" "0")
- (match_operand:SI 2 "general_operand" "dmsK")))
- (set (match_operand:SI 3 "general_operand" "=d")
- (mod:SI (match_dup 1) (match_dup 2)))]
- "TARGET_68020"
- "divsl%.l %2,%3:%0")
-@end smallexample
-
-@noindent
-then the way to mention this insn in a peephole is as follows:
-
-@smallexample
-(define_peephole
- [@dots{}
- (parallel
- [(set (match_operand:SI 0 "general_operand" "=d")
- (div:SI (match_operand:SI 1 "general_operand" "0")
- (match_operand:SI 2 "general_operand" "dmsK")))
- (set (match_operand:SI 3 "general_operand" "=d")
- (mod:SI (match_dup 1) (match_dup 2)))])
- @dots{}]
- @dots{})
-@end smallexample
-
-@node Expander Definitions
-@section Defining RTL Sequences for Code Generation
-@cindex expander definitions
-@cindex code generation RTL sequences
-@cindex defining RTL sequences for code generation
-
-On some target machines, some standard pattern names for RTL generation
-cannot be handled with single insn, but a sequence of RTL insns can
-represent them. For these target machines, you can write a
-@code{define_expand} to specify how to generate the sequence of RTL.
-
-@findex define_expand
-A @code{define_expand} is an RTL expression that looks almost like a
-@code{define_insn}; but, unlike the latter, a @code{define_expand} is used
-only for RTL generation and it can produce more than one RTL insn.
-
-A @code{define_expand} RTX has four operands:
-
-@itemize @bullet
-@item
-The name. Each @code{define_expand} must have a name, since the only
-use for it is to refer to it by name.
-
-@findex define_peephole
-@item
-The RTL template. This is just like the RTL template for a
-@code{define_peephole} in that it is a vector of RTL expressions
-each being one insn.
-
-@item
-The condition, a string containing a C expression. This expression is
-used to express how the availability of this pattern depends on
-subclasses of target machine, selected by command-line options when GNU
-CC is run. This is just like the condition of a @code{define_insn} that
-has a standard name. Therefore, the condition (if present) may not
-depend on the data in the insn being matched, but only the
-target-machine-type flags. The compiler needs to test these conditions
-during initialization in order to learn exactly which named instructions
-are available in a particular run.
-
-@item
-The preparation statements, a string containing zero or more C
-statements which are to be executed before RTL code is generated from
-the RTL template.
-
-Usually these statements prepare temporary registers for use as
-internal operands in the RTL template, but they can also generate RTL
-insns directly by calling routines such as @code{emit_insn}, etc.
-Any such insns precede the ones that come from the RTL template.
-@end itemize
-
-Every RTL insn emitted by a @code{define_expand} must match some
-@code{define_insn} in the machine description. Otherwise, the compiler
-will crash when trying to generate code for the insn or trying to optimize
-it.
-
-The RTL template, in addition to controlling generation of RTL insns,
-also describes the operands that need to be specified when this pattern
-is used. In particular, it gives a predicate for each operand.
-
-A true operand, which needs to be specified in order to generate RTL from
-the pattern, should be described with a @code{match_operand} in its first
-occurrence in the RTL template. This enters information on the operand's
-predicate into the tables that record such things. GNU CC uses the
-information to preload the operand into a register if that is required for
-valid RTL code. If the operand is referred to more than once, subsequent
-references should use @code{match_dup}.
-
-The RTL template may also refer to internal ``operands'' which are
-temporary registers or labels used only within the sequence made by the
-@code{define_expand}. Internal operands are substituted into the RTL
-template with @code{match_dup}, never with @code{match_operand}. The
-values of the internal operands are not passed in as arguments by the
-compiler when it requests use of this pattern. Instead, they are computed
-within the pattern, in the preparation statements. These statements
-compute the values and store them into the appropriate elements of
-@code{operands} so that @code{match_dup} can find them.
-
-There are two special macros defined for use in the preparation statements:
-@code{DONE} and @code{FAIL}. Use them with a following semicolon,
-as a statement.
-
-@table @code
-
-@findex DONE
-@item DONE
-Use the @code{DONE} macro to end RTL generation for the pattern. The
-only RTL insns resulting from the pattern on this occasion will be
-those already emitted by explicit calls to @code{emit_insn} within the
-preparation statements; the RTL template will not be generated.
-
-@findex FAIL
-@item FAIL
-Make the pattern fail on this occasion. When a pattern fails, it means
-that the pattern was not truly available. The calling routines in the
-compiler will try other strategies for code generation using other patterns.
-
-Failure is currently supported only for binary (addition, multiplication,
-shifting, etc.) and bitfield (@code{extv}, @code{extzv}, and @code{insv})
-operations.
-@end table
-
-Here is an example, the definition of left-shift for the SPUR chip:
-
-@smallexample
-@group
-(define_expand "ashlsi3"
- [(set (match_operand:SI 0 "register_operand" "")
- (ashift:SI
-@end group
-@group
- (match_operand:SI 1 "register_operand" "")
- (match_operand:SI 2 "nonmemory_operand" "")))]
- ""
- "
-@end group
-@end smallexample
-
-@smallexample
-@group
-@{
- if (GET_CODE (operands[2]) != CONST_INT
- || (unsigned) INTVAL (operands[2]) > 3)
- FAIL;
-@}")
-@end group
-@end smallexample
-
-@noindent
-This example uses @code{define_expand} so that it can generate an RTL insn
-for shifting when the shift-count is in the supported range of 0 to 3 but
-fail in other cases where machine insns aren't available. When it fails,
-the compiler tries another strategy using different patterns (such as, a
-library call).
-
-If the compiler were able to handle nontrivial condition-strings in
-patterns with names, then it would be possible to use a
-@code{define_insn} in that case. Here is another case (zero-extension
-on the 68000) which makes more use of the power of @code{define_expand}:
-
-@smallexample
-(define_expand "zero_extendhisi2"
- [(set (match_operand:SI 0 "general_operand" "")
- (const_int 0))
- (set (strict_low_part
- (subreg:HI
- (match_dup 0)
- 0))
- (match_operand:HI 1 "general_operand" ""))]
- ""
- "operands[1] = make_safe_from (operands[1], operands[0]);")
-@end smallexample
-
-@noindent
-@findex make_safe_from
-Here two RTL insns are generated, one to clear the entire output operand
-and the other to copy the input operand into its low half. This sequence
-is incorrect if the input operand refers to [the old value of] the output
-operand, so the preparation statement makes sure this isn't so. The
-function @code{make_safe_from} copies the @code{operands[1]} into a
-temporary register if it refers to @code{operands[0]}. It does this
-by emitting another RTL insn.
-
-Finally, a third example shows the use of an internal operand.
-Zero-extension on the SPUR chip is done by @code{and}-ing the result
-against a halfword mask. But this mask cannot be represented by a
-@code{const_int} because the constant value is too large to be legitimate
-on this machine. So it must be copied into a register with
-@code{force_reg} and then the register used in the @code{and}.
-
-@smallexample
-(define_expand "zero_extendhisi2"
- [(set (match_operand:SI 0 "register_operand" "")
- (and:SI (subreg:SI
- (match_operand:HI 1 "register_operand" "")
- 0)
- (match_dup 2)))]
- ""
- "operands[2]
- = force_reg (SImode, GEN_INT (65535)); ")
-@end smallexample
-
-@strong{Note:} If the @code{define_expand} is used to serve a
-standard binary or unary arithmetic operation or a bitfield operation,
-then the last insn it generates must not be a @code{code_label},
-@code{barrier} or @code{note}. It must be an @code{insn},
-@code{jump_insn} or @code{call_insn}. If you don't need a real insn
-at the end, emit an insn to copy the result of the operation into
-itself. Such an insn will generate no code, but it can avoid problems
-in the compiler.@refill
-
-@node Insn Splitting
-@section Defining How to Split Instructions
-@cindex insn splitting
-@cindex instruction splitting
-@cindex splitting instructions
-
-There are two cases where you should specify how to split a pattern into
-multiple insns. On machines that have instructions requiring delay
-slots (@pxref{Delay Slots}) or that have instructions whose output is
-not available for multiple cycles (@pxref{Function Units}), the compiler
-phases that optimize these cases need to be able to move insns into
-one-instruction delay slots. However, some insns may generate more than one
-machine instruction. These insns cannot be placed into a delay slot.
-
-Often you can rewrite the single insn as a list of individual insns,
-each corresponding to one machine instruction. The disadvantage of
-doing so is that it will cause the compilation to be slower and require
-more space. If the resulting insns are too complex, it may also
-suppress some optimizations. The compiler splits the insn if there is a
-reason to believe that it might improve instruction or delay slot
-scheduling.
-
-The insn combiner phase also splits putative insns. If three insns are
-merged into one insn with a complex expression that cannot be matched by
-some @code{define_insn} pattern, the combiner phase attempts to split
-the complex pattern into two insns that are recognized. Usually it can
-break the complex pattern into two patterns by splitting out some
-subexpression. However, in some other cases, such as performing an
-addition of a large constant in two insns on a RISC machine, the way to
-split the addition into two insns is machine-dependent.
-
-@cindex define_split
-The @code{define_split} definition tells the compiler how to split a
-complex insn into several simpler insns. It looks like this:
-
-@smallexample
-(define_split
- [@var{insn-pattern}]
- "@var{condition}"
- [@var{new-insn-pattern-1}
- @var{new-insn-pattern-2}
- @dots{}]
- "@var{preparation statements}")
-@end smallexample
-
-@var{insn-pattern} is a pattern that needs to be split and
-@var{condition} is the final condition to be tested, as in a
-@code{define_insn}. When an insn matching @var{insn-pattern} and
-satisfying @var{condition} is found, it is replaced in the insn list
-with the insns given by @var{new-insn-pattern-1},
-@var{new-insn-pattern-2}, etc.
-
-The @var{preparation statements} are similar to those statements that
-are specified for @code{define_expand} (@pxref{Expander Definitions})
-and are executed before the new RTL is generated to prepare for the
-generated code or emit some insns whose pattern is not fixed. Unlike
-those in @code{define_expand}, however, these statements must not
-generate any new pseudo-registers. Once reload has completed, they also
-must not allocate any space in the stack frame.
-
-Patterns are matched against @var{insn-pattern} in two different
-circumstances. If an insn needs to be split for delay slot scheduling
-or insn scheduling, the insn is already known to be valid, which means
-that it must have been matched by some @code{define_insn} and, if
-@code{reload_completed} is non-zero, is known to satisfy the constraints
-of that @code{define_insn}. In that case, the new insn patterns must
-also be insns that are matched by some @code{define_insn} and, if
-@code{reload_completed} is non-zero, must also satisfy the constraints
-of those definitions.
-
-As an example of this usage of @code{define_split}, consider the following
-example from @file{a29k.md}, which splits a @code{sign_extend} from
-@code{HImode} to @code{SImode} into a pair of shift insns:
-
-@smallexample
-(define_split
- [(set (match_operand:SI 0 "gen_reg_operand" "")
- (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))]
- ""
- [(set (match_dup 0)
- (ashift:SI (match_dup 1)
- (const_int 16)))
- (set (match_dup 0)
- (ashiftrt:SI (match_dup 0)
- (const_int 16)))]
- "
-@{ operands[1] = gen_lowpart (SImode, operands[1]); @}")
-@end smallexample
-
-When the combiner phase tries to split an insn pattern, it is always the
-case that the pattern is @emph{not} matched by any @code{define_insn}.
-The combiner pass first tries to split a single @code{set} expression
-and then the same @code{set} expression inside a @code{parallel}, but
-followed by a @code{clobber} of a pseudo-reg to use as a scratch
-register. In these cases, the combiner expects exactly two new insn
-patterns to be generated. It will verify that these patterns match some
-@code{define_insn} definitions, so you need not do this test in the
-@code{define_split} (of course, there is no point in writing a
-@code{define_split} that will never produce insns that match).
-
-Here is an example of this use of @code{define_split}, taken from
-@file{rs6000.md}:
-
-@smallexample
-(define_split
- [(set (match_operand:SI 0 "gen_reg_operand" "")
- (plus:SI (match_operand:SI 1 "gen_reg_operand" "")
- (match_operand:SI 2 "non_add_cint_operand" "")))]
- ""
- [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3)))
- (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
-"
-@{
- int low = INTVAL (operands[2]) & 0xffff;
- int high = (unsigned) INTVAL (operands[2]) >> 16;
-
- if (low & 0x8000)
- high++, low |= 0xffff0000;
-
- operands[3] = GEN_INT (high << 16);
- operands[4] = GEN_INT (low);
-@}")
-@end smallexample
-
-Here the predicate @code{non_add_cint_operand} matches any
-@code{const_int} that is @emph{not} a valid operand of a single add
-insn. The add with the smaller displacement is written so that it
-can be substituted into the address of a subsequent operation.
-
-An example that uses a scratch register, from the same file, generates
-an equality comparison of a register and a large constant:
-
-@smallexample
-(define_split
- [(set (match_operand:CC 0 "cc_reg_operand" "")
- (compare:CC (match_operand:SI 1 "gen_reg_operand" "")
- (match_operand:SI 2 "non_short_cint_operand" "")))
- (clobber (match_operand:SI 3 "gen_reg_operand" ""))]
- "find_single_use (operands[0], insn, 0)
- && (GET_CODE (*find_single_use (operands[0], insn, 0)) == EQ
- || GET_CODE (*find_single_use (operands[0], insn, 0)) == NE)"
- [(set (match_dup 3) (xor:SI (match_dup 1) (match_dup 4)))
- (set (match_dup 0) (compare:CC (match_dup 3) (match_dup 5)))]
- "
-@{
- /* Get the constant we are comparing against, C, and see what it
- looks like sign-extended to 16 bits. Then see what constant
- could be XOR'ed with C to get the sign-extended value. */
-
- int c = INTVAL (operands[2]);
- int sextc = (c << 16) >> 16;
- int xorv = c ^ sextc;
-
- operands[4] = GEN_INT (xorv);
- operands[5] = GEN_INT (sextc);
-@}")
-@end smallexample
-
-To avoid confusion, don't write a single @code{define_split} that
-accepts some insns that match some @code{define_insn} as well as some
-insns that don't. Instead, write two separate @code{define_split}
-definitions, one for the insns that are valid and one for the insns that
-are not valid.
-
-@node Insn Attributes
-@section Instruction Attributes
-@cindex insn attributes
-@cindex instruction attributes
-
-In addition to describing the instruction supported by the target machine,
-the @file{md} file also defines a group of @dfn{attributes} and a set of
-values for each. Every generated insn is assigned a value for each attribute.
-One possible attribute would be the effect that the insn has on the machine's
-condition code. This attribute can then be used by @code{NOTICE_UPDATE_CC}
-to track the condition codes.
-
-@menu
-* Defining Attributes:: Specifying attributes and their values.
-* Expressions:: Valid expressions for attribute values.
-* Tagging Insns:: Assigning attribute values to insns.
-* Attr Example:: An example of assigning attributes.
-* Insn Lengths:: Computing the length of insns.
-* Constant Attributes:: Defining attributes that are constant.
-* Delay Slots:: Defining delay slots required for a machine.
-* Function Units:: Specifying information for insn scheduling.
-@end menu
-
-@node Defining Attributes
-@subsection Defining Attributes and their Values
-@cindex defining attributes and their values
-@cindex attributes, defining
-
-@findex define_attr
-The @code{define_attr} expression is used to define each attribute required
-by the target machine. It looks like:
-
-@smallexample
-(define_attr @var{name} @var{list-of-values} @var{default})
-@end smallexample
-
-@var{name} is a string specifying the name of the attribute being defined.
-
-@var{list-of-values} is either a string that specifies a comma-separated
-list of values that can be assigned to the attribute, or a null string to
-indicate that the attribute takes numeric values.
-
-@var{default} is an attribute expression that gives the value of this
-attribute for insns that match patterns whose definition does not include
-an explicit value for this attribute. @xref{Attr Example}, for more
-information on the handling of defaults. @xref{Constant Attributes},
-for information on attributes that do not depend on any particular insn.
-
-@findex insn-attr.h
-For each defined attribute, a number of definitions are written to the
-@file{insn-attr.h} file. For cases where an explicit set of values is
-specified for an attribute, the following are defined:
-
-@itemize @bullet
-@item
-A @samp{#define} is written for the symbol @samp{HAVE_ATTR_@var{name}}.
-
-@item
-An enumeral class is defined for @samp{attr_@var{name}} with
-elements of the form @samp{@var{upper-name}_@var{upper-value}} where
-the attribute name and value are first converted to upper case.
-
-@item
-A function @samp{get_attr_@var{name}} is defined that is passed an insn and
-returns the attribute value for that insn.
-@end itemize
-
-For example, if the following is present in the @file{md} file:
-
-@smallexample
-(define_attr "type" "branch,fp,load,store,arith" @dots{})
-@end smallexample
-
-@noindent
-the following lines will be written to the file @file{insn-attr.h}.
-
-@smallexample
-#define HAVE_ATTR_type
-enum attr_type @{TYPE_BRANCH, TYPE_FP, TYPE_LOAD,
- TYPE_STORE, TYPE_ARITH@};
-extern enum attr_type get_attr_type ();
-@end smallexample
-
-If the attribute takes numeric values, no @code{enum} type will be
-defined and the function to obtain the attribute's value will return
-@code{int}.
-
-@node Expressions
-@subsection Attribute Expressions
-@cindex attribute expressions
-
-RTL expressions used to define attributes use the codes described above
-plus a few specific to attribute definitions, to be discussed below.
-Attribute value expressions must have one of the following forms:
-
-@table @code
-@cindex @code{const_int} and attributes
-@item (const_int @var{i})
-The integer @var{i} specifies the value of a numeric attribute. @var{i}
-must be non-negative.
-
-The value of a numeric attribute can be specified either with a
-@code{const_int} or as an integer represented as a string in
-@code{const_string}, @code{eq_attr} (see below), and @code{set_attr}
-(@pxref{Tagging Insns}) expressions.
-
-@cindex @code{const_string} and attributes
-@item (const_string @var{value})
-The string @var{value} specifies a constant attribute value.
-If @var{value} is specified as @samp{"*"}, it means that the default value of
-the attribute is to be used for the insn containing this expression.
-@samp{"*"} obviously cannot be used in the @var{default} expression
-of a @code{define_attr}.@refill
-
-If the attribute whose value is being specified is numeric, @var{value}
-must be a string containing a non-negative integer (normally
-@code{const_int} would be used in this case). Otherwise, it must
-contain one of the valid values for the attribute.
-
-@cindex @code{if_then_else} and attributes
-@item (if_then_else @var{test} @var{true-value} @var{false-value})
-@var{test} specifies an attribute test, whose format is defined below.
-The value of this expression is @var{true-value} if @var{test} is true,
-otherwise it is @var{false-value}.
-
-@cindex @code{cond} and attributes
-@item (cond [@var{test1} @var{value1} @dots{}] @var{default})
-The first operand of this expression is a vector containing an even
-number of expressions and consisting of pairs of @var{test} and @var{value}
-expressions. The value of the @code{cond} expression is that of the
-@var{value} corresponding to the first true @var{test} expression. If
-none of the @var{test} expressions are true, the value of the @code{cond}
-expression is that of the @var{default} expression.
-@end table
-
-@var{test} expressions can have one of the following forms:
-
-@table @code
-@cindex @code{const_int} and attribute tests
-@item (const_int @var{i})
-This test is true if @var{i} is non-zero and false otherwise.
-
-@cindex @code{not} and attributes
-@cindex @code{ior} and attributes
-@cindex @code{and} and attributes
-@item (not @var{test})
-@itemx (ior @var{test1} @var{test2})
-@itemx (and @var{test1} @var{test2})
-These tests are true if the indicated logical function is true.
-
-@cindex @code{match_operand} and attributes
-@item (match_operand:@var{m} @var{n} @var{pred} @var{constraints})
-This test is true if operand @var{n} of the insn whose attribute value
-is being determined has mode @var{m} (this part of the test is ignored
-if @var{m} is @code{VOIDmode}) and the function specified by the string
-@var{pred} returns a non-zero value when passed operand @var{n} and mode
-@var{m} (this part of the test is ignored if @var{pred} is the null
-string).
-
-The @var{constraints} operand is ignored and should be the null string.
-
-@cindex @code{le} and attributes
-@cindex @code{leu} and attributes
-@cindex @code{lt} and attributes
-@cindex @code{gt} and attributes
-@cindex @code{gtu} and attributes
-@cindex @code{ge} and attributes
-@cindex @code{geu} and attributes
-@cindex @code{ne} and attributes
-@cindex @code{eq} and attributes
-@cindex @code{plus} and attributes
-@cindex @code{minus} and attributes
-@cindex @code{mult} and attributes
-@cindex @code{div} and attributes
-@cindex @code{mod} and attributes
-@cindex @code{abs} and attributes
-@cindex @code{neg} and attributes
-@cindex @code{ashift} and attributes
-@cindex @code{lshiftrt} and attributes
-@cindex @code{ashiftrt} and attributes
-@item (le @var{arith1} @var{arith2})
-@itemx (leu @var{arith1} @var{arith2})
-@itemx (lt @var{arith1} @var{arith2})
-@itemx (ltu @var{arith1} @var{arith2})
-@itemx (gt @var{arith1} @var{arith2})
-@itemx (gtu @var{arith1} @var{arith2})
-@itemx (ge @var{arith1} @var{arith2})
-@itemx (geu @var{arith1} @var{arith2})
-@itemx (ne @var{arith1} @var{arith2})
-@itemx (eq @var{arith1} @var{arith2})
-These tests are true if the indicated comparison of the two arithmetic
-expressions is true. Arithmetic expressions are formed with
-@code{plus}, @code{minus}, @code{mult}, @code{div}, @code{mod},
-@code{abs}, @code{neg}, @code{and}, @code{ior}, @code{xor}, @code{not},
-@code{ashift}, @code{lshiftrt}, and @code{ashiftrt} expressions.@refill
-
-@findex get_attr
-@code{const_int} and @code{symbol_ref} are always valid terms (@pxref{Insn
-Lengths},for additional forms). @code{symbol_ref} is a string
-denoting a C expression that yields an @code{int} when evaluated by the
-@samp{get_attr_@dots{}} routine. It should normally be a global
-variable.@refill
-
-@findex eq_attr
-@item (eq_attr @var{name} @var{value})
-@var{name} is a string specifying the name of an attribute.
-
-@var{value} is a string that is either a valid value for attribute
-@var{name}, a comma-separated list of values, or @samp{!} followed by a
-value or list. If @var{value} does not begin with a @samp{!}, this
-test is true if the value of the @var{name} attribute of the current
-insn is in the list specified by @var{value}. If @var{value} begins
-with a @samp{!}, this test is true if the attribute's value is
-@emph{not} in the specified list.
-
-For example,
-
-@smallexample
-(eq_attr "type" "load,store")
-@end smallexample
-
-@noindent
-is equivalent to
-
-@smallexample
-(ior (eq_attr "type" "load") (eq_attr "type" "store"))
-@end smallexample
-
-If @var{name} specifies an attribute of @samp{alternative}, it refers to the
-value of the compiler variable @code{which_alternative}
-(@pxref{Output Statement}) and the values must be small integers. For
-example,@refill
-
-@smallexample
-(eq_attr "alternative" "2,3")
-@end smallexample
-
-@noindent
-is equivalent to
-
-@smallexample
-(ior (eq (symbol_ref "which_alternative") (const_int 2))
- (eq (symbol_ref "which_alternative") (const_int 3)))
-@end smallexample
-
-Note that, for most attributes, an @code{eq_attr} test is simplified in cases
-where the value of the attribute being tested is known for all insns matching
-a particular pattern. This is by far the most common case.@refill
-
-@findex attr_flag
-@item (attr_flag @var{name})
-The value of an @code{attr_flag} expression is true if the flag
-specified by @var{name} is true for the @code{insn} currently being
-scheduled.
-
-@var{name} is a string specifying one of a fixed set of flags to test.
-Test the flags @code{forward} and @code{backward} to determine the
-direction of a conditional branch. Test the flags @code{very_likely},
-@code{likely}, @code{very_unlikely}, and @code{unlikely} to determine
-if a conditional branch is expected to be taken.
-
-If the @code{very_likely} flag is true, then the @code{likely} flag is also
-true. Likewise for the @code{very_unlikely} and @code{unlikely} flags.
-
-This example describes a conditional branch delay slot which
-can be nullified for forward branches that are taken (annul-true) or
-for backward branches which are not taken (annul-false).
-
-@smallexample
-(define_delay (eq_attr "type" "cbranch")
- [(eq_attr "in_branch_delay" "true")
- (and (eq_attr "in_branch_delay" "true")
- (attr_flag "forward"))
- (and (eq_attr "in_branch_delay" "true")
- (attr_flag "backward"))])
-@end smallexample
-
-The @code{forward} and @code{backward} flags are false if the current
-@code{insn} being scheduled is not a conditional branch.
-
-The @code{very_likely} and @code{likely} flags are true if the
-@code{insn} being scheduled is not a conditional branch.
-The @code{very_unlikely} and @code{unlikely} flags are false if the
-@code{insn} being scheduled is not a conditional branch.
-
-@code{attr_flag} is only used during delay slot scheduling and has no
-meaning to other passes of the compiler.
-@end table
-
-@node Tagging Insns
-@subsection Assigning Attribute Values to Insns
-@cindex tagging insns
-@cindex assigning attribute values to insns
-
-The value assigned to an attribute of an insn is primarily determined by
-which pattern is matched by that insn (or which @code{define_peephole}
-generated it). Every @code{define_insn} and @code{define_peephole} can
-have an optional last argument to specify the values of attributes for
-matching insns. The value of any attribute not specified in a particular
-insn is set to the default value for that attribute, as specified in its
-@code{define_attr}. Extensive use of default values for attributes
-permits the specification of the values for only one or two attributes
-in the definition of most insn patterns, as seen in the example in the
-next section.@refill
-
-The optional last argument of @code{define_insn} and
-@code{define_peephole} is a vector of expressions, each of which defines
-the value for a single attribute. The most general way of assigning an
-attribute's value is to use a @code{set} expression whose first operand is an
-@code{attr} expression giving the name of the attribute being set. The
-second operand of the @code{set} is an attribute expression
-(@pxref{Expressions}) giving the value of the attribute.@refill
-
-When the attribute value depends on the @samp{alternative} attribute
-(i.e., which is the applicable alternative in the constraint of the
-insn), the @code{set_attr_alternative} expression can be used. It
-allows the specification of a vector of attribute expressions, one for
-each alternative.
-
-@findex set_attr
-When the generality of arbitrary attribute expressions is not required,
-the simpler @code{set_attr} expression can be used, which allows
-specifying a string giving either a single attribute value or a list
-of attribute values, one for each alternative.
-
-The form of each of the above specifications is shown below. In each case,
-@var{name} is a string specifying the attribute to be set.
-
-@table @code
-@item (set_attr @var{name} @var{value-string})
-@var{value-string} is either a string giving the desired attribute value,
-or a string containing a comma-separated list giving the values for
-succeeding alternatives. The number of elements must match the number
-of alternatives in the constraint of the insn pattern.
-
-Note that it may be useful to specify @samp{*} for some alternative, in
-which case the attribute will assume its default value for insns matching
-that alternative.
-
-@findex set_attr_alternative
-@item (set_attr_alternative @var{name} [@var{value1} @var{value2} @dots{}])
-Depending on the alternative of the insn, the value will be one of the
-specified values. This is a shorthand for using a @code{cond} with
-tests on the @samp{alternative} attribute.
-
-@findex attr
-@item (set (attr @var{name}) @var{value})
-The first operand of this @code{set} must be the special RTL expression
-@code{attr}, whose sole operand is a string giving the name of the
-attribute being set. @var{value} is the value of the attribute.
-@end table
-
-The following shows three different ways of representing the same
-attribute value specification:
-
-@smallexample
-(set_attr "type" "load,store,arith")
-
-(set_attr_alternative "type"
- [(const_string "load") (const_string "store")
- (const_string "arith")])
-
-(set (attr "type")
- (cond [(eq_attr "alternative" "1") (const_string "load")
- (eq_attr "alternative" "2") (const_string "store")]
- (const_string "arith")))
-@end smallexample
-
-@need 1000
-@findex define_asm_attributes
-The @code{define_asm_attributes} expression provides a mechanism to
-specify the attributes assigned to insns produced from an @code{asm}
-statement. It has the form:
-
-@smallexample
-(define_asm_attributes [@var{attr-sets}])
-@end smallexample
-
-@noindent
-where @var{attr-sets} is specified the same as for both the
-@code{define_insn} and the @code{define_peephole} expressions.
-
-These values will typically be the ``worst case'' attribute values. For
-example, they might indicate that the condition code will be clobbered.
-
-A specification for a @code{length} attribute is handled specially. The
-way to compute the length of an @code{asm} insn is to multiply the
-length specified in the expression @code{define_asm_attributes} by the
-number of machine instructions specified in the @code{asm} statement,
-determined by counting the number of semicolons and newlines in the
-string. Therefore, the value of the @code{length} attribute specified
-in a @code{define_asm_attributes} should be the maximum possible length
-of a single machine instruction.
-
-@node Attr Example
-@subsection Example of Attribute Specifications
-@cindex attribute specifications example
-@cindex attribute specifications
-
-The judicious use of defaulting is important in the efficient use of
-insn attributes. Typically, insns are divided into @dfn{types} and an
-attribute, customarily called @code{type}, is used to represent this
-value. This attribute is normally used only to define the default value
-for other attributes. An example will clarify this usage.
-
-Assume we have a RISC machine with a condition code and in which only
-full-word operations are performed in registers. Let us assume that we
-can divide all insns into loads, stores, (integer) arithmetic
-operations, floating point operations, and branches.
-
-Here we will concern ourselves with determining the effect of an insn on
-the condition code and will limit ourselves to the following possible
-effects: The condition code can be set unpredictably (clobbered), not
-be changed, be set to agree with the results of the operation, or only
-changed if the item previously set into the condition code has been
-modified.
-
-Here is part of a sample @file{md} file for such a machine:
-
-@smallexample
-(define_attr "type" "load,store,arith,fp,branch" (const_string "arith"))
-
-(define_attr "cc" "clobber,unchanged,set,change0"
- (cond [(eq_attr "type" "load")
- (const_string "change0")
- (eq_attr "type" "store,branch")
- (const_string "unchanged")
- (eq_attr "type" "arith")
- (if_then_else (match_operand:SI 0 "" "")
- (const_string "set")
- (const_string "clobber"))]
- (const_string "clobber")))
-
-(define_insn ""
- [(set (match_operand:SI 0 "general_operand" "=r,r,m")
- (match_operand:SI 1 "general_operand" "r,m,r"))]
- ""
- "@@
- move %0,%1
- load %0,%1
- store %0,%1"
- [(set_attr "type" "arith,load,store")])
-@end smallexample
-
-Note that we assume in the above example that arithmetic operations
-performed on quantities smaller than a machine word clobber the condition
-code since they will set the condition code to a value corresponding to the
-full-word result.
-
-@node Insn Lengths
-@subsection Computing the Length of an Insn
-@cindex insn lengths, computing
-@cindex computing the length of an insn
-
-For many machines, multiple types of branch instructions are provided, each
-for different length branch displacements. In most cases, the assembler
-will choose the correct instruction to use. However, when the assembler
-cannot do so, GCC can when a special attribute, the @samp{length}
-attribute, is defined. This attribute must be defined to have numeric
-values by specifying a null string in its @code{define_attr}.
-
-In the case of the @samp{length} attribute, two additional forms of
-arithmetic terms are allowed in test expressions:
-
-@table @code
-@cindex @code{match_dup} and attributes
-@item (match_dup @var{n})
-This refers to the address of operand @var{n} of the current insn, which
-must be a @code{label_ref}.
-
-@cindex @code{pc} and attributes
-@item (pc)
-This refers to the address of the @emph{current} insn. It might have
-been more consistent with other usage to make this the address of the
-@emph{next} insn but this would be confusing because the length of the
-current insn is to be computed.
-@end table
-
-@cindex @code{addr_vec}, length of
-@cindex @code{addr_diff_vec}, length of
-For normal insns, the length will be determined by value of the
-@samp{length} attribute. In the case of @code{addr_vec} and
-@code{addr_diff_vec} insn patterns, the length is computed as
-the number of vectors multiplied by the size of each vector.
-
-Lengths are measured in addressable storage units (bytes).
-
-The following macros can be used to refine the length computation:
-
-@table @code
-@findex FIRST_INSN_ADDRESS
-@item FIRST_INSN_ADDRESS
-When the @code{length} insn attribute is used, this macro specifies the
-value to be assigned to the address of the first insn in a function. If
-not specified, 0 is used.
-
-@findex ADJUST_INSN_LENGTH
-@item ADJUST_INSN_LENGTH (@var{insn}, @var{length})
-If defined, modifies the length assigned to instruction @var{insn} as a
-function of the context in which it is used. @var{length} is an lvalue
-that contains the initially computed length of the insn and should be
-updated with the correct length of the insn.
-
-This macro will normally not be required. A case in which it is
-required is the ROMP. On this machine, the size of an @code{addr_vec}
-insn must be increased by two to compensate for the fact that alignment
-may be required.
-@end table
-
-@findex get_attr_length
-The routine that returns @code{get_attr_length} (the value of the
-@code{length} attribute) can be used by the output routine to
-determine the form of the branch instruction to be written, as the
-example below illustrates.
-
-As an example of the specification of variable-length branches, consider
-the IBM 360. If we adopt the convention that a register will be set to
-the starting address of a function, we can jump to labels within 4k of
-the start using a four-byte instruction. Otherwise, we need a six-byte
-sequence to load the address from memory and then branch to it.
-
-On such a machine, a pattern for a branch instruction might be specified
-as follows:
-
-@smallexample
-(define_insn "jump"
- [(set (pc)
- (label_ref (match_operand 0 "" "")))]
- ""
- "*
-@{
- return (get_attr_length (insn) == 4
- ? \"b %l0\" : \"l r15,=a(%l0); br r15\");
-@}"
- [(set (attr "length") (if_then_else (lt (match_dup 0) (const_int 4096))
- (const_int 4)
- (const_int 6)))])
-@end smallexample
-
-@node Constant Attributes
-@subsection Constant Attributes
-@cindex constant attributes
-
-A special form of @code{define_attr}, where the expression for the
-default value is a @code{const} expression, indicates an attribute that
-is constant for a given run of the compiler. Constant attributes may be
-used to specify which variety of processor is used. For example,
-
-@smallexample
-(define_attr "cpu" "m88100,m88110,m88000"
- (const
- (cond [(symbol_ref "TARGET_88100") (const_string "m88100")
- (symbol_ref "TARGET_88110") (const_string "m88110")]
- (const_string "m88000"))))
-
-(define_attr "memory" "fast,slow"
- (const
- (if_then_else (symbol_ref "TARGET_FAST_MEM")
- (const_string "fast")
- (const_string "slow"))))
-@end smallexample
-
-The routine generated for constant attributes has no parameters as it
-does not depend on any particular insn. RTL expressions used to define
-the value of a constant attribute may use the @code{symbol_ref} form,
-but may not use either the @code{match_operand} form or @code{eq_attr}
-forms involving insn attributes.
-
-@node Delay Slots
-@subsection Delay Slot Scheduling
-@cindex delay slots, defining
-
-The insn attribute mechanism can be used to specify the requirements for
-delay slots, if any, on a target machine. An instruction is said to
-require a @dfn{delay slot} if some instructions that are physically
-after the instruction are executed as if they were located before it.
-Classic examples are branch and call instructions, which often execute
-the following instruction before the branch or call is performed.
-
-On some machines, conditional branch instructions can optionally
-@dfn{annul} instructions in the delay slot. This means that the
-instruction will not be executed for certain branch outcomes. Both
-instructions that annul if the branch is true and instructions that
-annul if the branch is false are supported.
-
-Delay slot scheduling differs from instruction scheduling in that
-determining whether an instruction needs a delay slot is dependent only
-on the type of instruction being generated, not on data flow between the
-instructions. See the next section for a discussion of data-dependent
-instruction scheduling.
-
-@findex define_delay
-The requirement of an insn needing one or more delay slots is indicated
-via the @code{define_delay} expression. It has the following form:
-
-@smallexample
-(define_delay @var{test}
- [@var{delay-1} @var{annul-true-1} @var{annul-false-1}
- @var{delay-2} @var{annul-true-2} @var{annul-false-2}
- @dots{}])
-@end smallexample
-
-@var{test} is an attribute test that indicates whether this
-@code{define_delay} applies to a particular insn. If so, the number of
-required delay slots is determined by the length of the vector specified
-as the second argument. An insn placed in delay slot @var{n} must
-satisfy attribute test @var{delay-n}. @var{annul-true-n} is an
-attribute test that specifies which insns may be annulled if the branch
-is true. Similarly, @var{annul-false-n} specifies which insns in the
-delay slot may be annulled if the branch is false. If annulling is not
-supported for that delay slot, @code{(nil)} should be coded.@refill
-
-For example, in the common case where branch and call insns require
-a single delay slot, which may contain any insn other than a branch or
-call, the following would be placed in the @file{md} file:
-
-@smallexample
-(define_delay (eq_attr "type" "branch,call")
- [(eq_attr "type" "!branch,call") (nil) (nil)])
-@end smallexample
-
-Multiple @code{define_delay} expressions may be specified. In this
-case, each such expression specifies different delay slot requirements
-and there must be no insn for which tests in two @code{define_delay}
-expressions are both true.
-
-For example, if we have a machine that requires one delay slot for branches
-but two for calls, no delay slot can contain a branch or call insn,
-and any valid insn in the delay slot for the branch can be annulled if the
-branch is true, we might represent this as follows:
-
-@smallexample
-(define_delay (eq_attr "type" "branch")
- [(eq_attr "type" "!branch,call")
- (eq_attr "type" "!branch,call")
- (nil)])
-
-(define_delay (eq_attr "type" "call")
- [(eq_attr "type" "!branch,call") (nil) (nil)
- (eq_attr "type" "!branch,call") (nil) (nil)])
-@end smallexample
-@c the above is *still* too long. --mew 4feb93
-
-@node Function Units
-@subsection Specifying Function Units
-@cindex function units, for scheduling
-
-On most RISC machines, there are instructions whose results are not
-available for a specific number of cycles. Common cases are instructions
-that load data from memory. On many machines, a pipeline stall will result
-if the data is referenced too soon after the load instruction.
-
-In addition, many newer microprocessors have multiple function units, usually
-one for integer and one for floating point, and often will incur pipeline
-stalls when a result that is needed is not yet ready.
-
-The descriptions in this section allow the specification of how much
-time must elapse between the execution of an instruction and the time
-when its result is used. It also allows specification of when the
-execution of an instruction will delay execution of similar instructions
-due to function unit conflicts.
-
-For the purposes of the specifications in this section, a machine is
-divided into @dfn{function units}, each of which execute a specific
-class of instructions in first-in-first-out order. Function units that
-accept one instruction each cycle and allow a result to be used in the
-succeeding instruction (usually via forwarding) need not be specified.
-Classic RISC microprocessors will normally have a single function unit,
-which we can call @samp{memory}. The newer ``superscalar'' processors
-will often have function units for floating point operations, usually at
-least a floating point adder and multiplier.
-
-@findex define_function_unit
-Each usage of a function units by a class of insns is specified with a
-@code{define_function_unit} expression, which looks like this:
-
-@smallexample
-(define_function_unit @var{name} @var{multiplicity} @var{simultaneity}
- @var{test} @var{ready-delay} @var{issue-delay}
- [@var{conflict-list}])
-@end smallexample
-
-@var{name} is a string giving the name of the function unit.
-
-@var{multiplicity} is an integer specifying the number of identical
-units in the processor. If more than one unit is specified, they will
-be scheduled independently. Only truly independent units should be
-counted; a pipelined unit should be specified as a single unit. (The
-only common example of a machine that has multiple function units for a
-single instruction class that are truly independent and not pipelined
-are the two multiply and two increment units of the CDC 6600.)
-
-@var{simultaneity} specifies the maximum number of insns that can be
-executing in each instance of the function unit simultaneously or zero
-if the unit is pipelined and has no limit.
-
-All @code{define_function_unit} definitions referring to function unit
-@var{name} must have the same name and values for @var{multiplicity} and
-@var{simultaneity}.
-
-@var{test} is an attribute test that selects the insns we are describing
-in this definition. Note that an insn may use more than one function
-unit and a function unit may be specified in more than one
-@code{define_function_unit}.
-
-@var{ready-delay} is an integer that specifies the number of cycles
-after which the result of the instruction can be used without
-introducing any stalls.
-
-@var{issue-delay} is an integer that specifies the number of cycles
-after the instruction matching the @var{test} expression begins using
-this unit until a subsequent instruction can begin. A cost of @var{N}
-indicates an @var{N-1} cycle delay. A subsequent instruction may also
-be delayed if an earlier instruction has a longer @var{ready-delay}
-value. This blocking effect is computed using the @var{simultaneity},
-@var{ready-delay}, @var{issue-delay}, and @var{conflict-list} terms.
-For a normal non-pipelined function unit, @var{simultaneity} is one, the
-unit is taken to block for the @var{ready-delay} cycles of the executing
-insn, and smaller values of @var{issue-delay} are ignored.
-
-@var{conflict-list} is an optional list giving detailed conflict costs
-for this unit. If specified, it is a list of condition test expressions
-to be applied to insns chosen to execute in @var{name} following the
-particular insn matching @var{test} that is already executing in
-@var{name}. For each insn in the list, @var{issue-delay} specifies the
-conflict cost; for insns not in the list, the cost is zero. If not
-specified, @var{conflict-list} defaults to all instructions that use the
-function unit.
-
-Typical uses of this vector are where a floating point function unit can
-pipeline either single- or double-precision operations, but not both, or
-where a memory unit can pipeline loads, but not stores, etc.
-
-As an example, consider a classic RISC machine where the result of a
-load instruction is not available for two cycles (a single ``delay''
-instruction is required) and where only one load instruction can be executed
-simultaneously. This would be specified as:
-
-@smallexample
-(define_function_unit "memory" 1 1 (eq_attr "type" "load") 2 0)
-@end smallexample
-
-For the case of a floating point function unit that can pipeline either
-single or double precision, but not both, the following could be specified:
-
-@smallexample
-(define_function_unit
- "fp" 1 0 (eq_attr "type" "sp_fp") 4 4 [(eq_attr "type" "dp_fp")])
-(define_function_unit
- "fp" 1 0 (eq_attr "type" "dp_fp") 4 4 [(eq_attr "type" "sp_fp")])
-@end smallexample
-
-@strong{Note:} The scheduler attempts to avoid function unit conflicts
-and uses all the specifications in the @code{define_function_unit}
-expression. It has recently come to our attention that these
-specifications may not allow modeling of some of the newer
-``superscalar'' processors that have insns using multiple pipelined
-units. These insns will cause a potential conflict for the second unit
-used during their execution and there is no way of representing that
-conflict. We welcome any examples of how function unit conflicts work
-in such processors and suggestions for their representation.
-@end ifset
diff --git a/gcc/mkinstalldirs b/gcc/mkinstalldirs
deleted file mode 100755
index a038528..0000000
--- a/gcc/mkinstalldirs
+++ /dev/null
@@ -1,40 +0,0 @@
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-# Author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain
-
-# $Id: mkinstalldirs,v 1.1.1.1 1999/01/13 23:06:47 law Exp $
-
-errstatus=0
-
-for file
-do
- set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
- shift
-
- pathcomp=
- for d
- do
- pathcomp="$pathcomp$d"
- case "$pathcomp" in
- -* ) pathcomp=./$pathcomp ;;
- esac
-
- if test ! -d "$pathcomp"; then
- echo "mkdir $pathcomp" 1>&2
-
- mkdir "$pathcomp" || lasterr=$?
-
- if test ! -d "$pathcomp"; then
- errstatus=$lasterr
- fi
- fi
-
- pathcomp="$pathcomp/"
- done
-done
-
-exit $errstatus
-
-# mkinstalldirs ends here
diff --git a/gcc/obstack.c b/gcc/obstack.c
new file mode 100755
index 0000000..408fa19
--- /dev/null
+++ b/gcc/obstack.c
@@ -0,0 +1,427 @@
+/* obstack.c - subroutines used implicitly by object stack macros
+ Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "obstack.h"
+
+
+#if defined (__STDC__) && __STDC__
+#define POINTER void *
+#else
+#define POINTER char *
+#endif
+
+/* Determine default alignment. */
+struct fooalign {char x; double d;};
+#define DEFAULT_ALIGNMENT \
+ ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
+/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
+ But in fact it might be less smart and round addresses to as much as
+ DEFAULT_ROUNDING. So we prepare for it to do that. */
+union fooround {long x; double d;};
+#define DEFAULT_ROUNDING (sizeof (union fooround))
+
+/* When we copy a long block of data, this is the unit to do it with.
+ On some machines, copying successive ints does not work;
+ in such a case, redefine COPYING_UNIT to `long' (if that works)
+ or `char' as a last resort. */
+#ifndef COPYING_UNIT
+#define COPYING_UNIT int
+#endif
+
+
+/* The functions allocating more room by calling `obstack_chunk_alloc'
+ jump to the handler pointed to by `obstack_alloc_failed_handler'.
+ This variable by default points to the internal function
+ `print_and_abort'. */
+#if defined (__STDC__) && __STDC__
+static void print_and_abort (void);
+void (*obstack_alloc_failed_handler) (void) = print_and_abort;
+#else
+static void print_and_abort ();
+void (*obstack_alloc_failed_handler) () = print_and_abort;
+#endif
+
+/* Exit value used when `print_and_abort' is used. */
+#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+int obstack_exit_failure = EXIT_FAILURE;
+
+/* The non-GNU-C macros copy the obstack into this global variable
+ to avoid multiple evaluation. */
+
+struct obstack *_obstack;
+
+/* Define a macro that either calls functions with the traditional malloc/free
+ calling interface, or calls functions with the mmalloc/mfree interface
+ (that adds an extra first argument), based on the state of use_extra_arg.
+ For free, do not use ?:, since some compilers, like the MIPS compilers,
+ do not allow (expr) ? void : void. */
+
+#if defined (__STDC__) && __STDC__
+#define CALL_CHUNKFUN(h, size) \
+ (((h) -> use_extra_arg) \
+ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
+ : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
+
+#define CALL_FREEFUN(h, old_chunk) \
+ do { \
+ if ((h) -> use_extra_arg) \
+ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
+ else \
+ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
+ } while (0)
+#else
+#define CALL_CHUNKFUN(h, size) \
+ (((h) -> use_extra_arg) \
+ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
+ : (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size)))
+
+#define CALL_FREEFUN(h, old_chunk) \
+ do { \
+ if ((h) -> use_extra_arg) \
+ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
+ else \
+ (*(void (*) ()) (h)->freefun) ((old_chunk)); \
+ } while (0)
+#endif
+
+
+/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default).
+ Objects start on multiples of ALIGNMENT (0 means use default).
+ CHUNKFUN is the function to use to allocate chunks,
+ and FREEFUN the function to free them.
+
+ Return nonzero if successful, zero if out of memory.
+ To recover from an out of memory error,
+ free up some memory, then call this again. */
+
+int
+_obstack_begin (h, size, alignment, chunkfun, freefun)
+ struct obstack *h;
+ int size;
+ int alignment;
+#if defined (__STDC__) && __STDC__
+ POINTER (*chunkfun) (long);
+ void (*freefun) (void *);
+#else
+ POINTER (*chunkfun) ();
+ void (*freefun) ();
+#endif
+{
+ register struct _obstack_chunk *chunk; /* points to new chunk */
+
+ if (alignment == 0)
+ alignment = (int) DEFAULT_ALIGNMENT;
+ if (size == 0)
+ /* Default size is what GNU malloc can fit in a 4096-byte block. */
+ {
+ /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
+ Use the values for range checking, because if range checking is off,
+ the extra bytes won't be missed terribly, but if range checking is on
+ and we used a larger request, a whole extra 4096 bytes would be
+ allocated.
+
+ These number are irrelevant to the new GNU malloc. I suspect it is
+ less sensitive to the size of the request. */
+ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
+ + 4 + DEFAULT_ROUNDING - 1)
+ & ~(DEFAULT_ROUNDING - 1));
+ size = 4096 - extra;
+ }
+
+#if defined (__STDC__) && __STDC__
+ h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
+ h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
+#else
+ h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
+ h->freefun = freefun;
+#endif
+ h->chunk_size = size;
+ h->alignment_mask = alignment - 1;
+ h->use_extra_arg = 0;
+
+ chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
+ if (!chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->next_free = h->object_base = chunk->contents;
+ h->chunk_limit = chunk->limit
+ = (char *) chunk + h->chunk_size;
+ chunk->prev = 0;
+ /* The initial chunk now contains no empty object. */
+ h->maybe_empty_object = 0;
+ h->alloc_failed = 0;
+ return 1;
+}
+
+int
+_obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
+ struct obstack *h;
+ int size;
+ int alignment;
+#if defined (__STDC__) && __STDC__
+ POINTER (*chunkfun) (POINTER, long);
+ void (*freefun) (POINTER, POINTER);
+#else
+ POINTER (*chunkfun) ();
+ void (*freefun) ();
+#endif
+ POINTER arg;
+{
+ register struct _obstack_chunk *chunk; /* points to new chunk */
+
+ if (alignment == 0)
+ alignment = (int) DEFAULT_ALIGNMENT;
+ if (size == 0)
+ /* Default size is what GNU malloc can fit in a 4096-byte block. */
+ {
+ /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
+ Use the values for range checking, because if range checking is off,
+ the extra bytes won't be missed terribly, but if range checking is on
+ and we used a larger request, a whole extra 4096 bytes would be
+ allocated.
+
+ These number are irrelevant to the new GNU malloc. I suspect it is
+ less sensitive to the size of the request. */
+ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
+ + 4 + DEFAULT_ROUNDING - 1)
+ & ~(DEFAULT_ROUNDING - 1));
+ size = 4096 - extra;
+ }
+
+#if defined(__STDC__) && __STDC__
+ h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
+ h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
+#else
+ h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
+ h->freefun = freefun;
+#endif
+ h->chunk_size = size;
+ h->alignment_mask = alignment - 1;
+ h->extra_arg = arg;
+ h->use_extra_arg = 1;
+
+ chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
+ if (!chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->next_free = h->object_base = chunk->contents;
+ h->chunk_limit = chunk->limit
+ = (char *) chunk + h->chunk_size;
+ chunk->prev = 0;
+ /* The initial chunk now contains no empty object. */
+ h->maybe_empty_object = 0;
+ h->alloc_failed = 0;
+ return 1;
+}
+
+/* Allocate a new current chunk for the obstack *H
+ on the assumption that LENGTH bytes need to be added
+ to the current object, or a new object of length LENGTH allocated.
+ Copies any partial object from the end of the old chunk
+ to the beginning of the new one. */
+
+void
+_obstack_newchunk (h, length)
+ struct obstack *h;
+ int length;
+{
+ register struct _obstack_chunk *old_chunk = h->chunk;
+ register struct _obstack_chunk *new_chunk;
+ register long new_size;
+ register long obj_size = h->next_free - h->object_base;
+ register long i;
+ long already;
+
+ /* Compute size for new chunk. */
+ new_size = (obj_size + length) + (obj_size >> 3) + 100;
+ if (new_size < h->chunk_size)
+ new_size = h->chunk_size;
+
+ /* Allocate and initialize the new chunk. */
+ new_chunk = CALL_CHUNKFUN (h, new_size);
+ if (!new_chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->chunk = new_chunk;
+ new_chunk->prev = old_chunk;
+ new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
+
+ /* Move the existing object to the new chunk.
+ Word at a time is fast and is safe if the object
+ is sufficiently aligned. */
+ if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
+ {
+ for (i = obj_size / sizeof (COPYING_UNIT) - 1;
+ i >= 0; i--)
+ ((COPYING_UNIT *)new_chunk->contents)[i]
+ = ((COPYING_UNIT *)h->object_base)[i];
+ /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT,
+ but that can cross a page boundary on a machine
+ which does not do strict alignment for COPYING_UNITS. */
+ already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
+ }
+ else
+ already = 0;
+ /* Copy remaining bytes one by one. */
+ for (i = already; i < obj_size; i++)
+ new_chunk->contents[i] = h->object_base[i];
+
+ /* If the object just copied was the only data in OLD_CHUNK,
+ free that chunk and remove it from the chain.
+ But not if that chunk might contain an empty object. */
+ if (h->object_base == old_chunk->contents && ! h->maybe_empty_object)
+ {
+ new_chunk->prev = old_chunk->prev;
+ CALL_FREEFUN (h, old_chunk);
+ }
+
+ h->object_base = new_chunk->contents;
+ h->next_free = h->object_base + obj_size;
+ /* The new chunk certainly contains no empty object yet. */
+ h->maybe_empty_object = 0;
+}
+
+/* Return nonzero if object OBJ has been allocated from obstack H.
+ This is here for debugging.
+ If you use it in a program, you are probably losing. */
+
+#if defined (__STDC__) && __STDC__
+/* Suppress -Wmissing-prototypes warning. We don't want to declare this in
+ obstack.h because it is just for debugging. */
+int _obstack_allocated_p (struct obstack *h, POINTER obj);
+#endif
+
+int
+_obstack_allocated_p (h, obj)
+ struct obstack *h;
+ POINTER obj;
+{
+ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
+ register struct _obstack_chunk *plp; /* point to previous chunk if any */
+
+ lp = (h)->chunk;
+ /* We use >= rather than > since the object cannot be exactly at
+ the beginning of the chunk but might be an empty object exactly
+ at the end of an adjacent chunk. */
+ while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
+ {
+ plp = lp->prev;
+ lp = plp;
+ }
+ return lp != 0;
+}
+
+/* Free objects in obstack H, including OBJ and everything allocate
+ more recently than OBJ. If OBJ is zero, free everything in H. */
+
+#undef obstack_free
+
+/* This function has two names with identical definitions.
+ This is the first one, called from non-ANSI code. */
+
+void
+_obstack_free (h, obj)
+ struct obstack *h;
+ POINTER obj;
+{
+ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
+ register struct _obstack_chunk *plp; /* point to previous chunk if any */
+
+ lp = h->chunk;
+ /* We use >= because there cannot be an object at the beginning of a chunk.
+ But there can be an empty object at that address
+ at the end of another chunk. */
+ while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
+ {
+ plp = lp->prev;
+ CALL_FREEFUN (h, lp);
+ lp = plp;
+ /* If we switch chunks, we can't tell whether the new current
+ chunk contains an empty object, so assume that it may. */
+ h->maybe_empty_object = 1;
+ }
+ if (lp)
+ {
+ h->object_base = h->next_free = (char *) (obj);
+ h->chunk_limit = lp->limit;
+ h->chunk = lp;
+ }
+ else if (obj != 0)
+ /* obj is not in any of the chunks! */
+ abort ();
+}
+
+/* This function is used from ANSI code. */
+
+void
+obstack_free (h, obj)
+ struct obstack *h;
+ POINTER obj;
+{
+ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
+ register struct _obstack_chunk *plp; /* point to previous chunk if any */
+
+ lp = h->chunk;
+ /* We use >= because there cannot be an object at the beginning of a chunk.
+ But there can be an empty object at that address
+ at the end of another chunk. */
+ while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
+ {
+ plp = lp->prev;
+ CALL_FREEFUN (h, lp);
+ lp = plp;
+ /* If we switch chunks, we can't tell whether the new current
+ chunk contains an empty object, so assume that it may. */
+ h->maybe_empty_object = 1;
+ }
+ if (lp)
+ {
+ h->object_base = h->next_free = (char *) (obj);
+ h->chunk_limit = lp->limit;
+ h->chunk = lp;
+ }
+ else if (obj != 0)
+ /* obj is not in any of the chunks! */
+ abort ();
+}
+
+int
+_obstack_memory_used (h)
+ struct obstack *h;
+{
+ register struct _obstack_chunk* lp;
+ register int nbytes = 0;
+
+ for (lp = h->chunk; lp != 0; lp = lp->prev)
+ {
+ nbytes += lp->limit - (char *) lp;
+ }
+ return nbytes;
+}
+
+/* Define the error handler. */
+static void
+print_and_abort ()
+{
+ fputs ("memory exhausted\n", stderr);
+ exit (obstack_exit_failure);
+}
diff --git a/gcc/obstack.h b/gcc/obstack.h
new file mode 100755
index 0000000..09f1422
--- /dev/null
+++ b/gcc/obstack.h
@@ -0,0 +1,594 @@
+/* obstack.h - object stack macros
+ Copyright (C) 1988,89,90,91,92,93,94,96,97,98 Free Software Foundation, Inc.
+
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@gnu.org.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* Summary:
+
+All the apparent functions defined here are macros. The idea
+is that you would use these pre-tested macros to solve a
+very specific set of problems, and they would run fast.
+Caution: no side-effects in arguments please!! They may be
+evaluated MANY times!!
+
+These macros operate a stack of objects. Each object starts life
+small, and may grow to maturity. (Consider building a word syllable
+by syllable.) An object can move while it is growing. Once it has
+been "finished" it never changes address again. So the "top of the
+stack" is typically an immature growing object, while the rest of the
+stack is of mature, fixed size and fixed address objects.
+
+These routines grab large chunks of memory, using a function you
+supply, called `obstack_chunk_alloc'. On occasion, they free chunks,
+by calling `obstack_chunk_free'. You must define them and declare
+them before using any obstack macros.
+
+Each independent stack is represented by a `struct obstack'.
+Each of the obstack macros expects a pointer to such a structure
+as the first argument.
+
+One motivation for this package is the problem of growing char strings
+in symbol tables. Unless you are "fascist pig with a read-only mind"
+--Gosper's immortal quote from HAKMEM item 154, out of context--you
+would not like to put any arbitrary upper limit on the length of your
+symbols.
+
+In practice this often means you will build many short symbols and a
+few long symbols. At the time you are reading a symbol you don't know
+how long it is. One traditional method is to read a symbol into a
+buffer, realloc()ating the buffer every time you try to read a symbol
+that is longer than the buffer. This is beaut, but you still will
+want to copy the symbol from the buffer to a more permanent
+symbol-table entry say about half the time.
+
+With obstacks, you can work differently. Use one obstack for all symbol
+names. As you read a symbol, grow the name in the obstack gradually.
+When the name is complete, finalize it. Then, if the symbol exists already,
+free the newly read name.
+
+The way we do this is to take a large chunk, allocating memory from
+low addresses. When you want to build a symbol in the chunk you just
+add chars above the current "high water mark" in the chunk. When you
+have finished adding chars, because you got to the end of the symbol,
+you know how long the chars are, and you can create a new object.
+Mostly the chars will not burst over the highest address of the chunk,
+because you would typically expect a chunk to be (say) 100 times as
+long as an average object.
+
+In case that isn't clear, when we have enough chars to make up
+the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
+so we just point to it where it lies. No moving of chars is
+needed and this is the second win: potentially long strings need
+never be explicitly shuffled. Once an object is formed, it does not
+change its address during its lifetime.
+
+When the chars burst over a chunk boundary, we allocate a larger
+chunk, and then copy the partly formed object from the end of the old
+chunk to the beginning of the new larger chunk. We then carry on
+accreting characters to the end of the object as we normally would.
+
+A special macro is provided to add a single char at a time to a
+growing object. This allows the use of register variables, which
+break the ordinary 'growth' macro.
+
+Summary:
+ We allocate large chunks.
+ We carve out one object at a time from the current chunk.
+ Once carved, an object never moves.
+ We are free to append data of any size to the currently
+ growing object.
+ Exactly one object is growing in an obstack at any one time.
+ You can run one obstack per control block.
+ You may have as many control blocks as you dare.
+ Because of the way we do it, you can `unwind' an obstack
+ back to a previous state. (You may remove objects much
+ as you would with a stack.)
+*/
+
+
+/* Don't do the contents of this file more than once. */
+
+#ifndef _OBSTACK_H
+#define _OBSTACK_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* We use subtraction of (char *) 0 instead of casting to int
+ because on word-addressable machines a simple cast to int
+ may ignore the byte-within-word field of the pointer. */
+
+#ifndef __PTR_TO_INT
+# define __PTR_TO_INT(P) ((P) - (char *) 0)
+#endif
+
+#ifndef __INT_TO_PTR
+# define __INT_TO_PTR(P) ((P) + (char *) 0)
+#endif
+
+/* We need the type of the resulting object. If __PTRDIFF_TYPE__ is
+ defined, as with GNU C, use that; that way we don't pollute the
+ namespace with <stddef.h>'s symbols. Otherwise, if <stddef.h> is
+ available, include it and use ptrdiff_t. In traditional C, long is
+ the best that we can do. */
+
+#ifdef __PTRDIFF_TYPE__
+# define PTR_INT_TYPE __PTRDIFF_TYPE__
+#else
+# ifdef HAVE_STDDEF_H
+# include <stddef.h>
+# define PTR_INT_TYPE ptrdiff_t
+# else
+# define PTR_INT_TYPE long
+# endif
+#endif
+
+#if defined _LIBC || defined HAVE_STRING_H
+# include <string.h>
+# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
+#else
+# ifdef memcpy
+# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
+# else
+# define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
+# endif
+#endif
+
+struct _obstack_chunk /* Lives at front of each chunk. */
+{
+ char *limit; /* 1 past end of this chunk */
+ struct _obstack_chunk *prev; /* address of prior chunk or NULL */
+ char contents[4]; /* objects begin here */
+};
+
+struct obstack /* control current object in current chunk */
+{
+ long chunk_size; /* preferred size to allocate chunks in */
+ struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
+ char *object_base; /* address of object we are building */
+ char *next_free; /* where to add next char to current object */
+ char *chunk_limit; /* address of char after current chunk */
+ PTR_INT_TYPE temp; /* Temporary for some macros. */
+ int alignment_mask; /* Mask of alignment for each object. */
+#if defined __STDC__ && __STDC__
+ /* These prototypes vary based on `use_extra_arg', and we use
+ casts to the prototypeless function type in all assignments,
+ but having prototypes here quiets -Wstrict-prototypes. */
+ struct _obstack_chunk *(*chunkfun) (void *, long);
+ void (*freefun) (void *, struct _obstack_chunk *);
+ void *extra_arg; /* first arg for chunk alloc/dealloc funcs */
+#else
+ struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk. */
+ void (*freefun) (); /* User's function to free a chunk. */
+ char *extra_arg; /* first arg for chunk alloc/dealloc funcs */
+#endif
+ unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */
+ unsigned maybe_empty_object:1;/* There is a possibility that the current
+ chunk contains a zero-length object. This
+ prevents freeing the chunk if we allocate
+ a bigger chunk to replace it. */
+ unsigned alloc_failed:1; /* No longer used, as we now call the failed
+ handler on error, but retained for binary
+ compatibility. */
+};
+
+/* Declare the external functions we use; they are in obstack.c. */
+
+#if defined __STDC__ && __STDC__
+extern void _obstack_newchunk (struct obstack *, int);
+extern void _obstack_free (struct obstack *, void *);
+extern int _obstack_begin (struct obstack *, int, int,
+ void *(*) (long), void (*) (void *));
+extern int _obstack_begin_1 (struct obstack *, int, int,
+ void *(*) (void *, long),
+ void (*) (void *, void *), void *);
+extern int _obstack_memory_used (struct obstack *);
+#else
+extern void _obstack_newchunk ();
+extern void _obstack_free ();
+extern int _obstack_begin ();
+extern int _obstack_begin_1 ();
+extern int _obstack_memory_used ();
+#endif
+
+#if defined __STDC__ && __STDC__
+
+/* Do the function-declarations after the structs
+ but before defining the macros. */
+
+void obstack_init (struct obstack *obstack);
+
+void * obstack_alloc (struct obstack *obstack, int size);
+
+void * obstack_copy (struct obstack *obstack, void *address, int size);
+void * obstack_copy0 (struct obstack *obstack, void *address, int size);
+
+void obstack_free (struct obstack *obstack, void *block);
+
+void obstack_blank (struct obstack *obstack, int size);
+
+void obstack_grow (struct obstack *obstack, void *data, int size);
+void obstack_grow0 (struct obstack *obstack, void *data, int size);
+
+void obstack_1grow (struct obstack *obstack, int data_char);
+void obstack_ptr_grow (struct obstack *obstack, void *data);
+void obstack_int_grow (struct obstack *obstack, int data);
+
+void * obstack_finish (struct obstack *obstack);
+
+int obstack_object_size (struct obstack *obstack);
+
+int obstack_room (struct obstack *obstack);
+void obstack_make_room (struct obstack *obstack, int size);
+void obstack_1grow_fast (struct obstack *obstack, int data_char);
+void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
+void obstack_int_grow_fast (struct obstack *obstack, int data);
+void obstack_blank_fast (struct obstack *obstack, int size);
+
+void * obstack_base (struct obstack *obstack);
+void * obstack_next_free (struct obstack *obstack);
+int obstack_alignment_mask (struct obstack *obstack);
+int obstack_chunk_size (struct obstack *obstack);
+int obstack_memory_used (struct obstack *obstack);
+
+#endif /* __STDC__ */
+
+/* Non-ANSI C cannot really support alternative functions for these macros,
+ so we do not declare them. */
+
+/* Error handler called when `obstack_chunk_alloc' failed to allocate
+ more memory. This can be set to a user defined function. The
+ default action is to print a message and abort. */
+#if defined __STDC__ && __STDC__
+extern void (*obstack_alloc_failed_handler) (void);
+#else
+extern void (*obstack_alloc_failed_handler) ();
+#endif
+
+/* Exit value used when `print_and_abort' is used. */
+extern int obstack_exit_failure;
+
+/* Pointer to beginning of object being allocated or to be allocated next.
+ Note that this might not be the final address of the object
+ because a new chunk might be needed to hold the final size. */
+
+#define obstack_base(h) ((h)->object_base)
+
+/* Size for allocating ordinary chunks. */
+
+#define obstack_chunk_size(h) ((h)->chunk_size)
+
+/* Pointer to next byte not yet allocated in current chunk. */
+
+#define obstack_next_free(h) ((h)->next_free)
+
+/* Mask specifying low bits that should be clear in address of an object. */
+
+#define obstack_alignment_mask(h) ((h)->alignment_mask)
+
+/* To prevent prototype warnings provide complete argument list in
+ standard C version. */
+#if defined __STDC__ && __STDC__
+
+# define obstack_init(h) \
+ _obstack_begin ((h), 0, 0, \
+ (void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
+
+# define obstack_begin(h, size) \
+ _obstack_begin ((h), (size), 0, \
+ (void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
+
+# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
+ _obstack_begin ((h), (size), (alignment), \
+ (void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun))
+
+# define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
+ _obstack_begin_1 ((h), (size), (alignment), \
+ (void *(*) (void *, long)) (chunkfun), \
+ (void (*) (void *, void *)) (freefun), (arg))
+
+# define obstack_chunkfun(h, newchunkfun) \
+ ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
+
+# define obstack_freefun(h, newfreefun) \
+ ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
+
+#else
+
+# define obstack_init(h) \
+ _obstack_begin ((h), 0, 0, \
+ (void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free)
+
+# define obstack_begin(h, size) \
+ _obstack_begin ((h), (size), 0, \
+ (void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free)
+
+# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
+ _obstack_begin ((h), (size), (alignment), \
+ (void *(*) ()) (chunkfun), (void (*) ()) (freefun))
+
+# define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
+ _obstack_begin_1 ((h), (size), (alignment), \
+ (void *(*) ()) (chunkfun), (void (*) ()) (freefun), (arg))
+
+# define obstack_chunkfun(h, newchunkfun) \
+ ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun))
+
+# define obstack_freefun(h, newfreefun) \
+ ((h) -> freefun = (void (*)()) (newfreefun))
+
+#endif
+
+#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
+
+#define obstack_blank_fast(h,n) ((h)->next_free += (n))
+
+#define obstack_memory_used(h) _obstack_memory_used (h)
+
+#if defined __GNUC__ && defined __STDC__ && __STDC__
+/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
+ does not implement __extension__. But that compiler doesn't define
+ __GNUC_MINOR__. */
+# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
+# define __extension__
+# endif
+
+/* For GNU C, if not -traditional,
+ we can define these macros to compute all args only once
+ without using a global variable.
+ Also, we can avoid using the `temp' slot, to make faster code. */
+
+# define obstack_object_size(OBSTACK) \
+ __extension__ \
+ ({ struct obstack *__o = (OBSTACK); \
+ (unsigned) (__o->next_free - __o->object_base); })
+
+# define obstack_room(OBSTACK) \
+ __extension__ \
+ ({ struct obstack *__o = (OBSTACK); \
+ (unsigned) (__o->chunk_limit - __o->next_free); })
+
+# define obstack_make_room(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->chunk_limit - __o->next_free < __len) \
+ _obstack_newchunk (__o, __len); \
+ (void) 0; })
+
+# define obstack_empty_p(OBSTACK) \
+ __extension__ \
+ ({ struct obstack *__o = (OBSTACK); \
+ (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); })
+
+# define obstack_grow(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->next_free + __len > __o->chunk_limit) \
+ _obstack_newchunk (__o, __len); \
+ _obstack_memcpy (__o->next_free, (char *) (where), __len); \
+ __o->next_free += __len; \
+ (void) 0; })
+
+# define obstack_grow0(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->next_free + __len + 1 > __o->chunk_limit) \
+ _obstack_newchunk (__o, __len + 1); \
+ _obstack_memcpy (__o->next_free, (char *) (where), __len); \
+ __o->next_free += __len; \
+ *(__o->next_free)++ = 0; \
+ (void) 0; })
+
+# define obstack_1grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + 1 > __o->chunk_limit) \
+ _obstack_newchunk (__o, 1); \
+ *(__o->next_free)++ = (datum); \
+ (void) 0; })
+
+/* These assume that the obstack alignment is good enough for pointers or ints,
+ and that the data added so far to the current object
+ shares that much alignment. */
+
+# define obstack_ptr_grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + sizeof (void *) > __o->chunk_limit) \
+ _obstack_newchunk (__o, sizeof (void *)); \
+ *((void **)__o->next_free) = ((void *)datum); \
+ __o->next_free += sizeof (void *); \
+ (void) 0; })
+
+# define obstack_int_grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + sizeof (int) > __o->chunk_limit) \
+ _obstack_newchunk (__o, sizeof (int)); \
+ *((int *)__o->next_free)++ = ((int)datum); \
+ (void) 0; })
+
+# define obstack_ptr_grow_fast(h,aptr) (*((void **) (h)->next_free)++ = (void *)aptr)
+# define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
+
+# define obstack_blank(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->chunk_limit - __o->next_free < __len) \
+ _obstack_newchunk (__o, __len); \
+ __o->next_free += __len; \
+ (void) 0; })
+
+# define obstack_alloc(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_blank (__h, (length)); \
+ obstack_finish (__h); })
+
+# define obstack_copy(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_grow (__h, (where), (length)); \
+ obstack_finish (__h); })
+
+# define obstack_copy0(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_grow0 (__h, (where), (length)); \
+ obstack_finish (__h); })
+
+/* The local variable is named __o1 to avoid a name conflict
+ when obstack_blank is called. */
+# define obstack_finish(OBSTACK) \
+__extension__ \
+({ struct obstack *__o1 = (OBSTACK); \
+ void *value; \
+ value = (void *) __o1->object_base; \
+ if (__o1->next_free == value) \
+ __o1->maybe_empty_object = 1; \
+ __o1->next_free \
+ = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
+ & ~ (__o1->alignment_mask)); \
+ if (__o1->next_free - (char *)__o1->chunk \
+ > __o1->chunk_limit - (char *)__o1->chunk) \
+ __o1->next_free = __o1->chunk_limit; \
+ __o1->object_base = __o1->next_free; \
+ value; })
+
+# define obstack_free(OBSTACK, OBJ) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ void *__obj = (OBJ); \
+ if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \
+ __o->next_free = __o->object_base = __obj; \
+ else (obstack_free) (__o, __obj); })
+
+#else /* not __GNUC__ or not __STDC__ */
+
+# define obstack_object_size(h) \
+ (unsigned) ((h)->next_free - (h)->object_base)
+
+# define obstack_room(h) \
+ (unsigned) ((h)->chunk_limit - (h)->next_free)
+
+# define obstack_empty_p(h) \
+ ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0)
+
+/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
+ so that we can avoid having void expressions
+ in the arms of the conditional expression.
+ Casting the third operand to void was tried before,
+ but some compilers won't accept it. */
+
+# define obstack_make_room(h,length) \
+( (h)->temp = (length), \
+ (((h)->next_free + (h)->temp > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp), 0) : 0))
+
+# define obstack_grow(h,where,length) \
+( (h)->temp = (length), \
+ (((h)->next_free + (h)->temp > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
+ _obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp), \
+ (h)->next_free += (h)->temp)
+
+# define obstack_grow0(h,where,length) \
+( (h)->temp = (length), \
+ (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \
+ _obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp), \
+ (h)->next_free += (h)->temp, \
+ *((h)->next_free)++ = 0)
+
+# define obstack_1grow(h,datum) \
+( (((h)->next_free + 1 > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), 1), 0) : 0), \
+ (*((h)->next_free)++ = (datum)))
+
+# define obstack_ptr_grow(h,datum) \
+( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \
+ (*((char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *) datum)))
+
+# define obstack_int_grow(h,datum) \
+( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \
+ (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = ((int) datum)))
+
+# define obstack_ptr_grow_fast(h,aptr) (*((char **) (h)->next_free)++ = (char *) aptr)
+# define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
+
+# define obstack_blank(h,length) \
+( (h)->temp = (length), \
+ (((h)->chunk_limit - (h)->next_free < (h)->temp) \
+ ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
+ ((h)->next_free += (h)->temp))
+
+# define obstack_alloc(h,length) \
+ (obstack_blank ((h), (length)), obstack_finish ((h)))
+
+# define obstack_copy(h,where,length) \
+ (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
+
+# define obstack_copy0(h,where,length) \
+ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
+
+# define obstack_finish(h) \
+( ((h)->next_free == (h)->object_base \
+ ? (((h)->maybe_empty_object = 1), 0) \
+ : 0), \
+ (h)->temp = __PTR_TO_INT ((h)->object_base), \
+ (h)->next_free \
+ = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \
+ & ~ ((h)->alignment_mask)), \
+ (((h)->next_free - (char *) (h)->chunk \
+ > (h)->chunk_limit - (char *) (h)->chunk) \
+ ? ((h)->next_free = (h)->chunk_limit) : 0), \
+ (h)->object_base = (h)->next_free, \
+ __INT_TO_PTR ((h)->temp))
+
+# if defined __STDC__ && __STDC__
+# define obstack_free(h,obj) \
+( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \
+ (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
+ ? (int) ((h)->next_free = (h)->object_base \
+ = (h)->temp + (char *) (h)->chunk) \
+ : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0)))
+# else
+# define obstack_free(h,obj) \
+( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \
+ (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
+ ? (int) ((h)->next_free = (h)->object_base \
+ = (h)->temp + (char *) (h)->chunk) \
+ : (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0)))
+# endif
+
+#endif /* not __GNUC__ or not __STDC__ */
+
+#ifdef __cplusplus
+} /* C++ */
+#endif
+
+#endif /* obstack.h */
diff --git a/gcc/prefix.c b/gcc/prefix.c
deleted file mode 100755
index 613bdb7..0000000
--- a/gcc/prefix.c
+++ /dev/null
@@ -1,317 +0,0 @@
-/* Utility to update paths from internal to external forms.
- Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
-
-This file is part of GNU CC.
-
-GNU CC is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public
-License as published by the Free Software Foundation; either
-version 2 of the License, or (at your option) any later version.
-
-GCC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GCC; see the file COPYING. If not, write to the Free
-Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-/* This file contains routines to update a path, both to canonicalize
- the directory format and to handle any prefix translation.
-
- This file must be compiled with -DPREFIX= to specify the "prefix"
- value used by configure. If a filename does not begin with this
- prefix, it will not be affected other than by directory canonicalization.
-
- Each caller of 'update_path' may specify both a filename and
- a translation prefix and consist of the name of the package that contains
- the file ("@GCC", "@BINUTIL", "@GNU", etc).
-
- If the prefix is not specified, the filename will only undergo
- directory canonicalization.
-
- If it is specified, the string given by PREFIX will be replaced
- by the specified prefix (with a '@' in front unless the prefix begins
- with a '$') and further translation will be done as follows
- until none of the two conditions below are met:
-
- 1) If the filename begins with '@', the string between the '@' and
- the end of the name or the first '/' or directory separator will
- be considered a "key" and looked up as follows:
-
- -- If this is a Win32 OS, then the Registry will be examined for
- an entry of "key" in
-
- HKEY_LOCAL_MACHINE\SOFTWARE\Free Software Foundation\
-
- if found, that value will be used.
-
- -- If not found (or not a Win32 OS), the environment variable
- key_ROOT (the value of "key" concatenated with the constant "_ROOT")
- is tried. If that fails, then PREFIX (see above) is used.
-
- 2) If the filename begins with a '$', the rest of the string up
- to the end or the first '/' or directory separator will be used
- as an environment variable, whose value will be returned.
-
- Once all this is done, any '/' will be converted to DIR_SEPARATOR,
- if they are different.
-
- NOTE: using resolve_keyed_path under Win32 requires linking with
- advapi32.dll. */
-
-
-#include "config.h"
-#include "system.h"
-#ifdef _WIN32
-#include <windows.h>
-#endif
-#include "prefix.h"
-
-static const char *std_prefix = PREFIX;
-
-static const char *get_key_value (char *);
-static const char *translate_name (const char *);
-static char *save_string (const char *, int);
-
-#ifdef _WIN32
-static char *lookup_key (char *);
-static HKEY reg_key = (HKEY) INVALID_HANDLE_VALUE;
-#endif
-
-/* Given KEY, as above, return its value. */
-
-static const char *
-get_key_value (key)
- char *key;
-{
- const char *prefix = 0;
- char *temp = 0;
-
-#ifdef _WIN32
- prefix = lookup_key (key);
-#endif
-
- if (prefix == 0)
- prefix = getenv (temp = concat (key, "_ROOT", NULL));
-
- if (prefix == 0)
- prefix = std_prefix;
-
- if (temp)
- free (temp);
-
- return prefix;
-}
-
-/* Concatenate a sequence of strings, returning the result.
-
- This function is based on the one in libiberty. */
-
-char *
-concat (const char *first, ...)
-{
- register int length;
- register char *newstr;
- register char *end;
- register const char *arg;
- va_list args;
-
- /* First compute the size of the result and get sufficient memory. */
-
- va_start (args, first);
-
- arg = first;
- length = 0;
-
- while (arg != 0)
- {
- length += strlen (arg);
- arg = va_arg (args, const char *);
- }
-
- newstr = (char *) malloc (length + 1);
- va_end (args);
-
- /* Now copy the individual pieces to the result string. */
-
- va_start (args, first);
-
- end = newstr;
- arg = first;
- while (arg != 0)
- {
- while (*arg)
- *end++ = *arg++;
- arg = va_arg (args, const char *);
- }
- *end = '\000';
- va_end (args);
-
- return (newstr);
-}
-
-/* Return a copy of a string that has been placed in the heap. */
-
-static char *
-save_string (s, len)
- const char *s;
- int len;
-{
- register char *result = xmalloc (len + 1);
-
- copy_memory (s, result, len);
- result[len] = 0;
- return result;
-}
-
-#ifdef _WIN32
-
-/* Look up "key" in the registry, as above. */
-
-static char *
-lookup_key (key)
- char *key;
-{
- char *dst;
- DWORD size;
- DWORD type;
- LONG res;
-
- if (reg_key == (HKEY) INVALID_HANDLE_VALUE)
- {
- res = RegOpenKeyExA (HKEY_LOCAL_MACHINE, "SOFTWARE", 0,
- KEY_READ, &reg_key);
-
- if (res == ERROR_SUCCESS)
- res = RegOpenKeyExA (reg_key, "Free Software Foundation", 0,
- KEY_READ, &reg_key);
-
- if (res != ERROR_SUCCESS)
- {
- reg_key = (HKEY) INVALID_HANDLE_VALUE;
- return 0;
- }
- }
-
- size = 32;
- dst = (char *) malloc (size);
-
- res = RegQueryValueExA (reg_key, key, 0, &type, dst, &size);
- if (res == ERROR_MORE_DATA && type == REG_SZ)
- {
- dst = (char *) realloc (dst, size);
- res = RegQueryValueExA (reg_key, key, 0, &type, dst, &size);
- }
-
- if (type != REG_SZ || res != ERROR_SUCCESS)
- {
- free (dst);
- dst = 0;
- }
-
- return dst;
-}
-#endif
-
-/* If NAME starts with a '@' or '$', apply the translation rules above
- and return a new name. Otherwise, return the given name. */
-
-static const char *
-translate_name (name)
- const char *name;
-{
- char code = name[0];
- char *key;
- const char *prefix = 0;
- int keylen;
-
- if (code != '@' && code != '$')
- return name;
-
- for (keylen = 0;
- (name[keylen + 1] != 0 && name[keylen + 1] != '/'
-#ifdef DIR_SEPARATOR
- && name[keylen + 1] != DIR_SEPARATOR
-#endif
- );
- keylen++)
- ;
-
- key = (char *) alloca (keylen + 1);
- strncpy (key, &name[1], keylen);
- key[keylen] = 0;
-
- name = &name[keylen + 1];
-
- if (code == '@')
- {
- prefix = get_key_value (key);
- if (prefix == 0)
- prefix = std_prefix;
- }
- else
- prefix = getenv (key);
-
- if (prefix == 0)
- prefix = PREFIX;
-
- /* Remove any trailing directory separator from what we got. */
- if (prefix[strlen (prefix) - 1] == '/'
-#ifdef DIR_SEPARATOR
- || prefix[strlen (prefix) - 1] == DIR_SEPARATOR
-#endif
- )
- {
- char * temp = save_string (prefix, strlen (prefix));
- temp[strlen (temp) - 1] = 0;
- prefix = temp;
- }
-
- return concat (prefix, name, NULL);
-}
-
-/* Update PATH using KEY if PATH starts with PREFIX. */
-
-const char *
-update_path (path, key)
- const char *path;
- const char *key;
-{
- if (! strncmp (path, std_prefix, strlen (std_prefix)) && key != 0)
- {
- if (key[0] != '$')
- key = concat ("@", key, NULL);
-
- path = concat (key, &path[strlen (std_prefix)], NULL);
-
- while (path[0] == '@' || path[0] == '$')
- path = translate_name (path);
- }
-
-#ifdef DIR_SEPARATOR
- if (DIR_SEPARATOR != '/')
- {
- int i;
- int len = strlen (path);
-
- path = save_string (path, len);
- for (i = 0; i < len; i++)
- if (path[i] == '/')
- path[i] = DIR_SEPARATOR;
- }
-#endif
-
- return path;
-}
-
-/* Reset the standard prefix */
-void
-set_std_prefix (prefix, len)
- const char *prefix;
- int len;
-{
- std_prefix = save_string (prefix, len);
-}
diff --git a/gcc/prefix.h b/gcc/prefix.h
deleted file mode 100755
index 5ea515f..0000000
--- a/gcc/prefix.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Provide prototypes for functions exported from prefix.c.
- Copyright (C) 1999 Free Software Foundation, Inc.
-
-This file is part of GNU CC.
-
-GNU CC is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public
-License as published by the Free Software Foundation; either
-version 2 of the License, or (at your option) any later version.
-
-GCC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GCC; see the file COPYING. If not, write to the Free
-Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-
-#ifndef __GCC_PREFIX_H__
-#define __GCC_PREFIX_H__
-
-extern const char *update_path (const char *, const char *);
-extern void set_std_prefix (const char *, int);
-
-#endif /* ! __GCC_PREFIX_H__ */
diff --git a/gcc/rtl.texi b/gcc/rtl.texi
deleted file mode 100755
index 751e11c..0000000
--- a/gcc/rtl.texi
+++ /dev/null
@@ -1,2946 +0,0 @@
-@c Copyright (C) 1988, 89, 92, 94, 97, 1998 Free Software Foundation, Inc.
-@c This is part of the GCC manual.
-@c For copying conditions, see the file gcc.texi.
-
-@node RTL
-@chapter RTL Representation
-@cindex RTL representation
-@cindex representation of RTL
-@cindex Register Transfer Language (RTL)
-
-Most of the work of the compiler is done on an intermediate representation
-called register transfer language. In this language, the instructions to be
-output are described, pretty much one by one, in an algebraic form that
-describes what the instruction does.
-
-RTL is inspired by Lisp lists. It has both an internal form, made up of
-structures that point at other structures, and a textual form that is used
-in the machine description and in printed debugging dumps. The textual
-form uses nested parentheses to indicate the pointers in the internal form.
-
-@menu
-* RTL Objects:: Expressions vs vectors vs strings vs integers.
-* Accessors:: Macros to access expression operands or vector elts.
-* Flags:: Other flags in an RTL expression.
-* Machine Modes:: Describing the size and format of a datum.
-* Constants:: Expressions with constant values.
-* Regs and Memory:: Expressions representing register contents or memory.
-* Arithmetic:: Expressions representing arithmetic on other expressions.
-* Comparisons:: Expressions representing comparison of expressions.
-* Bit Fields:: Expressions representing bitfields in memory or reg.
-* Conversions:: Extending, truncating, floating or fixing.
-* RTL Declarations:: Declaring volatility, constancy, etc.
-* Side Effects:: Expressions for storing in registers, etc.
-* Incdec:: Embedded side-effects for autoincrement addressing.
-* Assembler:: Representing @code{asm} with operands.
-* Insns:: Expression types for entire insns.
-* Calls:: RTL representation of function call insns.
-* Sharing:: Some expressions are unique; others *must* be copied.
-* Reading RTL:: Reading textual RTL from a file.
-@end menu
-
-@node RTL Objects, Accessors, RTL, RTL
-@section RTL Object Types
-@cindex RTL object types
-
-@cindex RTL integers
-@cindex RTL strings
-@cindex RTL vectors
-@cindex RTL expression
-@cindex RTX (See RTL)
-RTL uses five kinds of objects: expressions, integers, wide integers,
-strings and vectors. Expressions are the most important ones. An RTL
-expression (``RTX'', for short) is a C structure, but it is usually
-referred to with a pointer; a type that is given the typedef name
-@code{rtx}.
-
-An integer is simply an @code{int}; their written form uses decimal digits.
-A wide integer is an integral object whose type is @code{HOST_WIDE_INT}
-(@pxref{Config}); their written form uses decimal digits.
-
-A string is a sequence of characters. In core it is represented as a
-@code{char *} in usual C fashion, and it is written in C syntax as well.
-However, strings in RTL may never be null. If you write an empty string in
-a machine description, it is represented in core as a null pointer rather
-than as a pointer to a null character. In certain contexts, these null
-pointers instead of strings are valid. Within RTL code, strings are most
-commonly found inside @code{symbol_ref} expressions, but they appear in
-other contexts in the RTL expressions that make up machine descriptions.
-
-A vector contains an arbitrary number of pointers to expressions. The
-number of elements in the vector is explicitly present in the vector.
-The written form of a vector consists of square brackets
-(@samp{[@dots{}]}) surrounding the elements, in sequence and with
-whitespace separating them. Vectors of length zero are not created;
-null pointers are used instead.
-
-@cindex expression codes
-@cindex codes, RTL expression
-@findex GET_CODE
-@findex PUT_CODE
-Expressions are classified by @dfn{expression codes} (also called RTX
-codes). The expression code is a name defined in @file{rtl.def}, which is
-also (in upper case) a C enumeration constant. The possible expression
-codes and their meanings are machine-independent. The code of an RTX can
-be extracted with the macro @code{GET_CODE (@var{x})} and altered with
-@code{PUT_CODE (@var{x}, @var{newcode})}.
-
-The expression code determines how many operands the expression contains,
-and what kinds of objects they are. In RTL, unlike Lisp, you cannot tell
-by looking at an operand what kind of object it is. Instead, you must know
-from its context---from the expression code of the containing expression.
-For example, in an expression of code @code{subreg}, the first operand is
-to be regarded as an expression and the second operand as an integer. In
-an expression of code @code{plus}, there are two operands, both of which
-are to be regarded as expressions. In a @code{symbol_ref} expression,
-there is one operand, which is to be regarded as a string.
-
-Expressions are written as parentheses containing the name of the
-expression type, its flags and machine mode if any, and then the operands
-of the expression (separated by spaces).
-
-Expression code names in the @samp{md} file are written in lower case,
-but when they appear in C code they are written in upper case. In this
-manual, they are shown as follows: @code{const_int}.
-
-@cindex (nil)
-@cindex nil
-In a few contexts a null pointer is valid where an expression is normally
-wanted. The written form of this is @code{(nil)}.
-
-@node Accessors, Flags, RTL Objects, RTL
-@section Access to Operands
-@cindex accessors
-@cindex access to operands
-@cindex operand access
-
-@cindex RTL format
-For each expression type @file{rtl.def} specifies the number of
-contained objects and their kinds, with four possibilities: @samp{e} for
-expression (actually a pointer to an expression), @samp{i} for integer,
-@samp{w} for wide integer, @samp{s} for string, and @samp{E} for vector
-of expressions. The sequence of letters for an expression code is
-called its @dfn{format}. Thus, the format of @code{subreg} is
-@samp{ei}.@refill
-
-@cindex RTL format characters
-A few other format characters are used occasionally:
-
-@table @code
-@item u
-@samp{u} is equivalent to @samp{e} except that it is printed differently
-in debugging dumps. It is used for pointers to insns.
-
-@item n
-@samp{n} is equivalent to @samp{i} except that it is printed differently
-in debugging dumps. It is used for the line number or code number of a
-@code{note} insn.
-
-@item S
-@samp{S} indicates a string which is optional. In the RTL objects in
-core, @samp{S} is equivalent to @samp{s}, but when the object is read,
-from an @samp{md} file, the string value of this operand may be omitted.
-An omitted string is taken to be the null string.
-
-@item V
-@samp{V} indicates a vector which is optional. In the RTL objects in
-core, @samp{V} is equivalent to @samp{E}, but when the object is read
-from an @samp{md} file, the vector value of this operand may be omitted.
-An omitted vector is effectively the same as a vector of no elements.
-
-@item 0
-@samp{0} means a slot whose contents do not fit any normal category.
-@samp{0} slots are not printed at all in dumps, and are often used in
-special ways by small parts of the compiler.
-@end table
-
-There are macros to get the number of operands, the format, and the
-class of an expression code:
-
-@table @code
-@findex GET_RTX_LENGTH
-@item GET_RTX_LENGTH (@var{code})
-Number of operands of an RTX of code @var{code}.
-
-@findex GET_RTX_FORMAT
-@item GET_RTX_FORMAT (@var{code})
-The format of an RTX of code @var{code}, as a C string.
-
-@findex GET_RTX_CLASS
-@cindex classes of RTX codes
-@item GET_RTX_CLASS (@var{code})
-A single character representing the type of RTX operation that code
-@var{code} performs.
-
-The following classes are defined:
-
-@table @code
-@item o
-An RTX code that represents an actual object, such as @code{reg} or
-@code{mem}. @code{subreg} is not in this class.
-
-@item <
-An RTX code for a comparison. The codes in this class are
-@code{NE}, @code{EQ}, @code{LE}, @code{LT}, @code{GE}, @code{GT},
-@code{LEU}, @code{LTU}, @code{GEU}, @code{GTU}.@refill
-
-@item 1
-An RTX code for a unary arithmetic operation, such as @code{neg}.
-
-@item c
-An RTX code for a commutative binary operation, other than @code{NE}
-and @code{EQ} (which have class @samp{<}).
-
-@item 2
-An RTX code for a noncommutative binary operation, such as @code{MINUS}.
-
-@item b
-An RTX code for a bitfield operation, either @code{ZERO_EXTRACT} or
-@code{SIGN_EXTRACT}.
-
-@item 3
-An RTX code for other three input operations, such as @code{IF_THEN_ELSE}.
-
-@item i
-An RTX code for a machine insn (@code{INSN}, @code{JUMP_INSN}, and
-@code{CALL_INSN}).@refill
-
-@item m
-An RTX code for something that matches in insns, such as @code{MATCH_DUP}.
-
-@item x
-All other RTX codes.
-@end table
-@end table
-
-@findex XEXP
-@findex XINT
-@findex XWINT
-@findex XSTR
-Operands of expressions are accessed using the macros @code{XEXP},
-@code{XINT}, @code{XWINT} and @code{XSTR}. Each of these macros takes
-two arguments: an expression-pointer (RTX) and an operand number
-(counting from zero). Thus,@refill
-
-@example
-XEXP (@var{x}, 2)
-@end example
-
-@noindent
-accesses operand 2 of expression @var{x}, as an expression.
-
-@example
-XINT (@var{x}, 2)
-@end example
-
-@noindent
-accesses the same operand as an integer. @code{XSTR}, used in the same
-fashion, would access it as a string.
-
-Any operand can be accessed as an integer, as an expression or as a string.
-You must choose the correct method of access for the kind of value actually
-stored in the operand. You would do this based on the expression code of
-the containing expression. That is also how you would know how many
-operands there are.
-
-For example, if @var{x} is a @code{subreg} expression, you know that it has
-two operands which can be correctly accessed as @code{XEXP (@var{x}, 0)}
-and @code{XINT (@var{x}, 1)}. If you did @code{XINT (@var{x}, 0)}, you
-would get the address of the expression operand but cast as an integer;
-that might occasionally be useful, but it would be cleaner to write
-@code{(int) XEXP (@var{x}, 0)}. @code{XEXP (@var{x}, 1)} would also
-compile without error, and would return the second, integer operand cast as
-an expression pointer, which would probably result in a crash when
-accessed. Nothing stops you from writing @code{XEXP (@var{x}, 28)} either,
-but this will access memory past the end of the expression with
-unpredictable results.@refill
-
-Access to operands which are vectors is more complicated. You can use the
-macro @code{XVEC} to get the vector-pointer itself, or the macros
-@code{XVECEXP} and @code{XVECLEN} to access the elements and length of a
-vector.
-
-@table @code
-@findex XVEC
-@item XVEC (@var{exp}, @var{idx})
-Access the vector-pointer which is operand number @var{idx} in @var{exp}.
-
-@findex XVECLEN
-@item XVECLEN (@var{exp}, @var{idx})
-Access the length (number of elements) in the vector which is
-in operand number @var{idx} in @var{exp}. This value is an @code{int}.
-
-@findex XVECEXP
-@item XVECEXP (@var{exp}, @var{idx}, @var{eltnum})
-Access element number @var{eltnum} in the vector which is
-in operand number @var{idx} in @var{exp}. This value is an RTX.
-
-It is up to you to make sure that @var{eltnum} is not negative
-and is less than @code{XVECLEN (@var{exp}, @var{idx})}.
-@end table
-
-All the macros defined in this section expand into lvalues and therefore
-can be used to assign the operands, lengths and vector elements as well as
-to access them.
-
-@node Flags, Machine Modes, Accessors, RTL
-@section Flags in an RTL Expression
-@cindex flags in RTL expression
-
-RTL expressions contain several flags (one-bit bitfields) and other
-values that are used in certain types of expression. Most often they
-are accessed with the following macros:
-
-@table @code
-@findex MEM_VOLATILE_P
-@cindex @code{mem} and @samp{/v}
-@cindex @code{volatil}, in @code{mem}
-@cindex @samp{/v} in RTL dump
-@item MEM_VOLATILE_P (@var{x})
-In @code{mem} expressions, nonzero for volatile memory references.
-Stored in the @code{volatil} field and printed as @samp{/v}.
-
-@findex MEM_IN_STRUCT_P
-@cindex @code{mem} and @samp{/s}
-@cindex @code{in_struct}, in @code{mem}
-@cindex @samp{/s} in RTL dump
-@item MEM_IN_STRUCT_P (@var{x})
-In @code{mem} expressions, nonzero for reference to an entire structure,
-union or array, or to a component of one. Zero for references to a
-scalar variable or through a pointer to a scalar. Stored in the
-@code{in_struct} field and printed as @samp{/s}. If both this flag and
-MEM_SCALAR_P are clear, then we don't know whether this MEM is in a
-structure or not. Both flags should never be simultaneously set.
-
-@findex MEM_SCALAR_P
-@cindex @code{mem} and @samp{/f}
-@cindex @code{frame_related}, in@code{mem}
-@cindex @samp{/f} in RTL dump
-@item MEM_SCALAR_P (@var{x})
-In @code{mem} expressions, nonzero for reference to a scalar known not
-to be a member of a structure, union, or array. Zero for such
-references and for indirections through pointers, even pointers pointing
-to scalar types. If both this flag and MEM_STRUCT_P are clear, then we
-don't know whether this MEM is in a structure or not. Both flags should
-never be simultaneously set.
-
-@findex MEM_ALIAS_SET
-@item MEM_ALIAS_SET (@var{x})
-In @code{mem} expressions, the alias set to which @var{x} belongs. If
-zero, @var{x} is not in any alias set, and may alias anything. If
-nonzero, @var{x} may only alias objects in the same alias set. This
-value is set (in a language-specific manner) by the front-end. This
-field is not a bit-field; it is in an integer, found as the second
-argument to the @code{mem}.
-
-@findex REG_LOOP_TEST_P
-@cindex @code{reg} and @samp{/s}
-@cindex @code{in_struct}, in @code{reg}
-@item REG_LOOP_TEST_P
-In @code{reg} expressions, nonzero if this register's entire life is
-contained in the exit test code for some loop. Stored in the
-@code{in_struct} field and printed as @samp{/s}.
-
-@findex REG_USERVAR_P
-@cindex @code{reg} and @samp{/v}
-@cindex @code{volatil}, in @code{reg}
-@item REG_USERVAR_P (@var{x})
-In a @code{reg}, nonzero if it corresponds to a variable present in
-the user's source code. Zero for temporaries generated internally by
-the compiler. Stored in the @code{volatil} field and printed as
-@samp{/v}.
-
-@cindex @samp{/i} in RTL dump
-@findex REG_FUNCTION_VALUE_P
-@cindex @code{reg} and @samp{/i}
-@cindex @code{integrated}, in @code{reg}
-@item REG_FUNCTION_VALUE_P (@var{x})
-Nonzero in a @code{reg} if it is the place in which this function's
-value is going to be returned. (This happens only in a hard
-register.) Stored in the @code{integrated} field and printed as
-@samp{/i}.
-
-The same hard register may be used also for collecting the values of
-functions called by this one, but @code{REG_FUNCTION_VALUE_P} is zero
-in this kind of use.
-
-@findex SUBREG_PROMOTED_VAR_P
-@cindex @code{subreg} and @samp{/s}
-@cindex @code{in_struct}, in @code{subreg}
-@item SUBREG_PROMOTED_VAR_P
-Nonzero in a @code{subreg} if it was made when accessing an object that
-was promoted to a wider mode in accord with the @code{PROMOTED_MODE} machine
-description macro (@pxref{Storage Layout}). In this case, the mode of
-the @code{subreg} is the declared mode of the object and the mode of
-@code{SUBREG_REG} is the mode of the register that holds the object.
-Promoted variables are always either sign- or zero-extended to the wider
-mode on every assignment. Stored in the @code{in_struct} field and
-printed as @samp{/s}.
-
-@findex SUBREG_PROMOTED_UNSIGNED_P
-@cindex @code{subreg} and @samp{/u}
-@cindex @code{unchanging}, in @code{subreg}
-@item SUBREG_PROMOTED_UNSIGNED_P
-Nonzero in a @code{subreg} that has @code{SUBREG_PROMOTED_VAR_P} nonzero
-if the object being referenced is kept zero-extended and zero if it
-is kept sign-extended. Stored in the @code{unchanging} field and
-printed as @samp{/u}.
-
-@findex RTX_UNCHANGING_P
-@cindex @code{reg} and @samp{/u}
-@cindex @code{mem} and @samp{/u}
-@cindex @code{unchanging}, in @code{reg} and @code{mem}
-@cindex @samp{/u} in RTL dump
-@item RTX_UNCHANGING_P (@var{x})
-Nonzero in a @code{reg} or @code{mem} if the value is not changed.
-(This flag is not set for memory references via pointers to constants.
-Such pointers only guarantee that the object will not be changed
-explicitly by the current function. The object might be changed by
-other functions or by aliasing.) Stored in the
-@code{unchanging} field and printed as @samp{/u}.
-
-@findex RTX_INTEGRATED_P
-@cindex @code{integrated}, in @code{insn}
-@item RTX_INTEGRATED_P (@var{insn})
-Nonzero in an insn if it resulted from an in-line function call.
-Stored in the @code{integrated} field and printed as @samp{/i}.
-
-@findex SYMBOL_REF_USED
-@cindex @code{used}, in @code{symbol_ref}
-@item SYMBOL_REF_USED (@var{x})
-In a @code{symbol_ref}, indicates that @var{x} has been used. This is
-normally only used to ensure that @var{x} is only declared external
-once. Stored in the @code{used} field.
-
-@findex SYMBOL_REF_FLAG
-@cindex @code{symbol_ref} and @samp{/v}
-@cindex @code{volatil}, in @code{symbol_ref}
-@item SYMBOL_REF_FLAG (@var{x})
-In a @code{symbol_ref}, this is used as a flag for machine-specific purposes.
-Stored in the @code{volatil} field and printed as @samp{/v}.
-
-@findex LABEL_OUTSIDE_LOOP_P
-@cindex @code{label_ref} and @samp{/s}
-@cindex @code{in_struct}, in @code{label_ref}
-@item LABEL_OUTSIDE_LOOP_P
-In @code{label_ref} expressions, nonzero if this is a reference to a
-label that is outside the innermost loop containing the reference to the
-label. Stored in the @code{in_struct} field and printed as @samp{/s}.
-
-@findex INSN_DELETED_P
-@cindex @code{volatil}, in @code{insn}
-@item INSN_DELETED_P (@var{insn})
-In an insn, nonzero if the insn has been deleted. Stored in the
-@code{volatil} field and printed as @samp{/v}.
-
-@findex INSN_ANNULLED_BRANCH_P
-@cindex @code{insn} and @samp{/u}
-@cindex @code{unchanging}, in @code{insn}
-@item INSN_ANNULLED_BRANCH_P (@var{insn})
-In an @code{insn} in the delay slot of a branch insn, indicates that an
-annulling branch should be used. See the discussion under
-@code{sequence} below. Stored in the @code{unchanging} field and printed
-as @samp{/u}.
-
-@findex INSN_FROM_TARGET_P
-@cindex @code{insn} and @samp{/s}
-@cindex @code{in_struct}, in @code{insn}
-@cindex @samp{/s} in RTL dump
-@item INSN_FROM_TARGET_P (@var{insn})
-In an @code{insn} in a delay slot of a branch, indicates that the insn
-is from the target of the branch. If the branch insn has
-@code{INSN_ANNULLED_BRANCH_P} set, this insn will only be executed if
-the branch is taken. For annulled branches with
-@code{INSN_FROM_TARGET_P} clear, the insn will be executed only if the
-branch is not taken. When @code{INSN_ANNULLED_BRANCH_P} is not set,
-this insn will always be executed. Stored in the @code{in_struct}
-field and printed as @samp{/s}.
-
-@findex CONSTANT_POOL_ADDRESS_P
-@cindex @code{symbol_ref} and @samp{/u}
-@cindex @code{unchanging}, in @code{symbol_ref}
-@item CONSTANT_POOL_ADDRESS_P (@var{x})
-Nonzero in a @code{symbol_ref} if it refers to part of the current
-function's ``constants pool''. These are addresses close to the
-beginning of the function, and GNU CC assumes they can be addressed
-directly (perhaps with the help of base registers). Stored in the
-@code{unchanging} field and printed as @samp{/u}.
-
-@findex CONST_CALL_P
-@cindex @code{call_insn} and @samp{/u}
-@cindex @code{unchanging}, in @code{call_insn}
-@item CONST_CALL_P (@var{x})
-In a @code{call_insn}, indicates that the insn represents a call to a const
-function. Stored in the @code{unchanging} field and printed as @samp{/u}.
-
-@findex LABEL_PRESERVE_P
-@cindex @code{code_label} and @samp{/i}
-@cindex @code{in_struct}, in @code{code_label}
-@item LABEL_PRESERVE_P (@var{x})
-In a @code{code_label}, indicates that the label can never be deleted.
-Labels referenced by a non-local goto will have this bit set. Stored
-in the @code{in_struct} field and printed as @samp{/s}.
-
-@findex SCHED_GROUP_P
-@cindex @code{insn} and @samp{/i}
-@cindex @code{in_struct}, in @code{insn}
-@item SCHED_GROUP_P (@var{insn})
-During instruction scheduling, in an insn, indicates that the previous insn
-must be scheduled together with this insn. This is used to ensure that
-certain groups of instructions will not be split up by the instruction
-scheduling pass, for example, @code{use} insns before a @code{call_insn} may
-not be separated from the @code{call_insn}. Stored in the @code{in_struct}
-field and printed as @samp{/s}.
-@end table
-
-These are the fields which the above macros refer to:
-
-@table @code
-@findex used
-@item used
-Normally, this flag is used only momentarily, at the end of RTL
-generation for a function, to count the number of times an expression
-appears in insns. Expressions that appear more than once are copied,
-according to the rules for shared structure (@pxref{Sharing}).
-
-In a @code{symbol_ref}, it indicates that an external declaration for
-the symbol has already been written.
-
-In a @code{reg}, it is used by the leaf register renumbering code to ensure
-that each register is only renumbered once.
-
-@findex volatil
-@item volatil
-This flag is used in @code{mem}, @code{symbol_ref} and @code{reg}
-expressions and in insns. In RTL dump files, it is printed as
-@samp{/v}.
-
-@cindex volatile memory references
-In a @code{mem} expression, it is 1 if the memory reference is volatile.
-Volatile memory references may not be deleted, reordered or combined.
-
-In a @code{symbol_ref} expression, it is used for machine-specific
-purposes.
-
-In a @code{reg} expression, it is 1 if the value is a user-level variable.
-0 indicates an internal compiler temporary.
-
-In an insn, 1 means the insn has been deleted.
-
-@findex in_struct
-@item in_struct
-In @code{mem} expressions, it is 1 if the memory datum referred to is
-all or part of a structure or array; 0 if it is (or might be) a scalar
-variable. A reference through a C pointer has 0 because the pointer
-might point to a scalar variable. This information allows the compiler
-to determine something about possible cases of aliasing.
-
-In an insn in the delay slot of a branch, 1 means that this insn is from
-the target of the branch.
-
-During instruction scheduling, in an insn, 1 means that this insn must be
-scheduled as part of a group together with the previous insn.
-
-In @code{reg} expressions, it is 1 if the register has its entire life
-contained within the test expression of some loop.
-
-In @code{subreg} expressions, 1 means that the @code{subreg} is accessing
-an object that has had its mode promoted from a wider mode.
-
-In @code{label_ref} expressions, 1 means that the referenced label is
-outside the innermost loop containing the insn in which the @code{label_ref}
-was found.
-
-In @code{code_label} expressions, it is 1 if the label may never be deleted.
-This is used for labels which are the target of non-local gotos.
-
-In an RTL dump, this flag is represented as @samp{/s}.
-
-@findex unchanging
-@item unchanging
-In @code{reg} and @code{mem} expressions, 1 means
-that the value of the expression never changes.
-
-In @code{subreg} expressions, it is 1 if the @code{subreg} references an
-unsigned object whose mode has been promoted to a wider mode.
-
-In an insn, 1 means that this is an annulling branch.
-
-In a @code{symbol_ref} expression, 1 means that this symbol addresses
-something in the per-function constants pool.
-
-In a @code{call_insn}, 1 means that this instruction is a call to a
-const function.
-
-In an RTL dump, this flag is represented as @samp{/u}.
-
-@findex integrated
-@item integrated
-In some kinds of expressions, including insns, this flag means the
-rtl was produced by procedure integration.
-
-In a @code{reg} expression, this flag indicates the register
-containing the value to be returned by the current function. On
-machines that pass parameters in registers, the same register number
-may be used for parameters as well, but this flag is not set on such
-uses.
-@end table
-
-@node Machine Modes, Constants, Flags, RTL
-@section Machine Modes
-@cindex machine modes
-
-@findex enum machine_mode
-A machine mode describes a size of data object and the representation used
-for it. In the C code, machine modes are represented by an enumeration
-type, @code{enum machine_mode}, defined in @file{machmode.def}. Each RTL
-expression has room for a machine mode and so do certain kinds of tree
-expressions (declarations and types, to be precise).
-
-In debugging dumps and machine descriptions, the machine mode of an RTL
-expression is written after the expression code with a colon to separate
-them. The letters @samp{mode} which appear at the end of each machine mode
-name are omitted. For example, @code{(reg:SI 38)} is a @code{reg}
-expression with machine mode @code{SImode}. If the mode is
-@code{VOIDmode}, it is not written at all.
-
-Here is a table of machine modes. The term ``byte'' below refers to an
-object of @code{BITS_PER_UNIT} bits (@pxref{Storage Layout}).
-
-@table @code
-@findex QImode
-@item QImode
-``Quarter-Integer'' mode represents a single byte treated as an integer.
-
-@findex HImode
-@item HImode
-``Half-Integer'' mode represents a two-byte integer.
-
-@findex PSImode
-@item PSImode
-``Partial Single Integer'' mode represents an integer which occupies
-four bytes but which doesn't really use all four. On some machines,
-this is the right mode to use for pointers.
-
-@findex SImode
-@item SImode
-``Single Integer'' mode represents a four-byte integer.
-
-@findex PDImode
-@item PDImode
-``Partial Double Integer'' mode represents an integer which occupies
-eight bytes but which doesn't really use all eight. On some machines,
-this is the right mode to use for certain pointers.
-
-@findex DImode
-@item DImode
-``Double Integer'' mode represents an eight-byte integer.
-
-@findex TImode
-@item TImode
-``Tetra Integer'' (?) mode represents a sixteen-byte integer.
-
-@findex SFmode
-@item SFmode
-``Single Floating'' mode represents a single-precision (four byte) floating
-point number.
-
-@findex DFmode
-@item DFmode
-``Double Floating'' mode represents a double-precision (eight byte) floating
-point number.
-
-@findex XFmode
-@item XFmode
-``Extended Floating'' mode represents a triple-precision (twelve byte)
-floating point number. This mode is used for IEEE extended floating
-point. On some systems not all bits within these bytes will actually
-be used.
-
-@findex TFmode
-@item TFmode
-``Tetra Floating'' mode represents a quadruple-precision (sixteen byte)
-floating point number.
-
-@findex CCmode
-@item CCmode
-``Condition Code'' mode represents the value of a condition code, which
-is a machine-specific set of bits used to represent the result of a
-comparison operation. Other machine-specific modes may also be used for
-the condition code. These modes are not used on machines that use
-@code{cc0} (see @pxref{Condition Code}).
-
-@findex BLKmode
-@item BLKmode
-``Block'' mode represents values that are aggregates to which none of
-the other modes apply. In RTL, only memory references can have this mode,
-and only if they appear in string-move or vector instructions. On machines
-which have no such instructions, @code{BLKmode} will not appear in RTL.
-
-@findex VOIDmode
-@item VOIDmode
-Void mode means the absence of a mode or an unspecified mode.
-For example, RTL expressions of code @code{const_int} have mode
-@code{VOIDmode} because they can be taken to have whatever mode the context
-requires. In debugging dumps of RTL, @code{VOIDmode} is expressed by
-the absence of any mode.
-
-@findex SCmode
-@findex DCmode
-@findex XCmode
-@findex TCmode
-@item SCmode, DCmode, XCmode, TCmode
-These modes stand for a complex number represented as a pair of floating
-point values. The floating point values are in @code{SFmode},
-@code{DFmode}, @code{XFmode}, and @code{TFmode}, respectively.
-
-@findex CQImode
-@findex CHImode
-@findex CSImode
-@findex CDImode
-@findex CTImode
-@findex COImode
-@item CQImode, CHImode, CSImode, CDImode, CTImode, COImode
-These modes stand for a complex number represented as a pair of integer
-values. The integer values are in @code{QImode}, @code{HImode},
-@code{SImode}, @code{DImode}, @code{TImode}, and @code{OImode},
-respectively.
-@end table
-
-The machine description defines @code{Pmode} as a C macro which expands
-into the machine mode used for addresses. Normally this is the mode
-whose size is @code{BITS_PER_WORD}, @code{SImode} on 32-bit machines.
-
-The only modes which a machine description @i{must} support are
-@code{QImode}, and the modes corresponding to @code{BITS_PER_WORD},
-@code{FLOAT_TYPE_SIZE} and @code{DOUBLE_TYPE_SIZE}.
-The compiler will attempt to use @code{DImode} for 8-byte structures and
-unions, but this can be prevented by overriding the definition of
-@code{MAX_FIXED_MODE_SIZE}. Alternatively, you can have the compiler
-use @code{TImode} for 16-byte structures and unions. Likewise, you can
-arrange for the C type @code{short int} to avoid using @code{HImode}.
-
-@cindex mode classes
-Very few explicit references to machine modes remain in the compiler and
-these few references will soon be removed. Instead, the machine modes
-are divided into mode classes. These are represented by the enumeration
-type @code{enum mode_class} defined in @file{machmode.h}. The possible
-mode classes are:
-
-@table @code
-@findex MODE_INT
-@item MODE_INT
-Integer modes. By default these are @code{QImode}, @code{HImode},
-@code{SImode}, @code{DImode}, and @code{TImode}.
-
-@findex MODE_PARTIAL_INT
-@item MODE_PARTIAL_INT
-The ``partial integer'' modes, @code{PSImode} and @code{PDImode}.
-
-@findex MODE_FLOAT
-@item MODE_FLOAT
-floating point modes. By default these are @code{SFmode}, @code{DFmode},
-@code{XFmode} and @code{TFmode}.
-
-@findex MODE_COMPLEX_INT
-@item MODE_COMPLEX_INT
-Complex integer modes. (These are not currently implemented).
-
-@findex MODE_COMPLEX_FLOAT
-@item MODE_COMPLEX_FLOAT
-Complex floating point modes. By default these are @code{SCmode},
-@code{DCmode}, @code{XCmode}, and @code{TCmode}.
-
-@findex MODE_FUNCTION
-@item MODE_FUNCTION
-Algol or Pascal function variables including a static chain.
-(These are not currently implemented).
-
-@findex MODE_CC
-@item MODE_CC
-Modes representing condition code values. These are @code{CCmode} plus
-any modes listed in the @code{EXTRA_CC_MODES} macro. @xref{Jump Patterns},
-also see @ref{Condition Code}.
-
-@findex MODE_RANDOM
-@item MODE_RANDOM
-This is a catchall mode class for modes which don't fit into the above
-classes. Currently @code{VOIDmode} and @code{BLKmode} are in
-@code{MODE_RANDOM}.
-@end table
-
-Here are some C macros that relate to machine modes:
-
-@table @code
-@findex GET_MODE
-@item GET_MODE (@var{x})
-Returns the machine mode of the RTX @var{x}.
-
-@findex PUT_MODE
-@item PUT_MODE (@var{x}, @var{newmode})
-Alters the machine mode of the RTX @var{x} to be @var{newmode}.
-
-@findex NUM_MACHINE_MODES
-@item NUM_MACHINE_MODES
-Stands for the number of machine modes available on the target
-machine. This is one greater than the largest numeric value of any
-machine mode.
-
-@findex GET_MODE_NAME
-@item GET_MODE_NAME (@var{m})
-Returns the name of mode @var{m} as a string.
-
-@findex GET_MODE_CLASS
-@item GET_MODE_CLASS (@var{m})
-Returns the mode class of mode @var{m}.
-
-@findex GET_MODE_WIDER_MODE
-@item GET_MODE_WIDER_MODE (@var{m})
-Returns the next wider natural mode. For example, the expression
-@code{GET_MODE_WIDER_MODE (QImode)} returns @code{HImode}.
-
-@findex GET_MODE_SIZE
-@item GET_MODE_SIZE (@var{m})
-Returns the size in bytes of a datum of mode @var{m}.
-
-@findex GET_MODE_BITSIZE
-@item GET_MODE_BITSIZE (@var{m})
-Returns the size in bits of a datum of mode @var{m}.
-
-@findex GET_MODE_MASK
-@item GET_MODE_MASK (@var{m})
-Returns a bitmask containing 1 for all bits in a word that fit within
-mode @var{m}. This macro can only be used for modes whose bitsize is
-less than or equal to @code{HOST_BITS_PER_INT}.
-
-@findex GET_MODE_ALIGNMENT
-@item GET_MODE_ALIGNMENT (@var{m)})
-Return the required alignment, in bits, for an object of mode @var{m}.
-
-@findex GET_MODE_UNIT_SIZE
-@item GET_MODE_UNIT_SIZE (@var{m})
-Returns the size in bytes of the subunits of a datum of mode @var{m}.
-This is the same as @code{GET_MODE_SIZE} except in the case of complex
-modes. For them, the unit size is the size of the real or imaginary
-part.
-
-@findex GET_MODE_NUNITS
-@item GET_MODE_NUNITS (@var{m})
-Returns the number of units contained in a mode, i.e.,
-@code{GET_MODE_SIZE} divided by @code{GET_MODE_UNIT_SIZE}.
-
-@findex GET_CLASS_NARROWEST_MODE
-@item GET_CLASS_NARROWEST_MODE (@var{c})
-Returns the narrowest mode in mode class @var{c}.
-@end table
-
-@findex byte_mode
-@findex word_mode
-The global variables @code{byte_mode} and @code{word_mode} contain modes
-whose classes are @code{MODE_INT} and whose bitsizes are either
-@code{BITS_PER_UNIT} or @code{BITS_PER_WORD}, respectively. On 32-bit
-machines, these are @code{QImode} and @code{SImode}, respectively.
-
-@node Constants, Regs and Memory, Machine Modes, RTL
-@section Constant Expression Types
-@cindex RTL constants
-@cindex RTL constant expression types
-
-The simplest RTL expressions are those that represent constant values.
-
-@table @code
-@findex const_int
-@item (const_int @var{i})
-This type of expression represents the integer value @var{i}. @var{i}
-is customarily accessed with the macro @code{INTVAL} as in
-@code{INTVAL (@var{exp})}, which is equivalent to @code{XWINT (@var{exp}, 0)}.
-
-@findex const0_rtx
-@findex const1_rtx
-@findex const2_rtx
-@findex constm1_rtx
-There is only one expression object for the integer value zero; it is
-the value of the variable @code{const0_rtx}. Likewise, the only
-expression for integer value one is found in @code{const1_rtx}, the only
-expression for integer value two is found in @code{const2_rtx}, and the
-only expression for integer value negative one is found in
-@code{constm1_rtx}. Any attempt to create an expression of code
-@code{const_int} and value zero, one, two or negative one will return
-@code{const0_rtx}, @code{const1_rtx}, @code{const2_rtx} or
-@code{constm1_rtx} as appropriate.@refill
-
-@findex const_true_rtx
-Similarly, there is only one object for the integer whose value is
-@code{STORE_FLAG_VALUE}. It is found in @code{const_true_rtx}. If
-@code{STORE_FLAG_VALUE} is one, @code{const_true_rtx} and
-@code{const1_rtx} will point to the same object. If
-@code{STORE_FLAG_VALUE} is -1, @code{const_true_rtx} and
-@code{constm1_rtx} will point to the same object.@refill
-
-@findex const_double
-@item (const_double:@var{m} @var{addr} @var{i0} @var{i1} @dots{})
-Represents either a floating-point constant of mode @var{m} or an
-integer constant too large to fit into @code{HOST_BITS_PER_WIDE_INT}
-bits but small enough to fit within twice that number of bits (GNU CC
-does not provide a mechanism to represent even larger constants). In
-the latter case, @var{m} will be @code{VOIDmode}.
-
-@findex CONST_DOUBLE_MEM
-@findex CONST_DOUBLE_CHAIN
-@var{addr} is used to contain the @code{mem} expression that corresponds
-to the location in memory that at which the constant can be found. If
-it has not been allocated a memory location, but is on the chain of all
-@code{const_double} expressions in this compilation (maintained using an
-undisplayed field), @var{addr} contains @code{const0_rtx}. If it is not
-on the chain, @var{addr} contains @code{cc0_rtx}. @var{addr} is
-customarily accessed with the macro @code{CONST_DOUBLE_MEM} and the
-chain field via @code{CONST_DOUBLE_CHAIN}.@refill
-
-@findex CONST_DOUBLE_LOW
-If @var{m} is @code{VOIDmode}, the bits of the value are stored in
-@var{i0} and @var{i1}. @var{i0} is customarily accessed with the macro
-@code{CONST_DOUBLE_LOW} and @var{i1} with @code{CONST_DOUBLE_HIGH}.
-
-If the constant is floating point (regardless of its precision), then
-the number of integers used to store the value depends on the size of
-@code{REAL_VALUE_TYPE} (@pxref{Cross-compilation}). The integers
-represent a floating point number, but not precisely in the target
-machine's or host machine's floating point format. To convert them to
-the precise bit pattern used by the target machine, use the macro
-@code{REAL_VALUE_TO_TARGET_DOUBLE} and friends (@pxref{Data Output}).
-
-@findex CONST0_RTX
-@findex CONST1_RTX
-@findex CONST2_RTX
-The macro @code{CONST0_RTX (@var{mode})} refers to an expression with
-value 0 in mode @var{mode}. If mode @var{mode} is of mode class
-@code{MODE_INT}, it returns @code{const0_rtx}. Otherwise, it returns a
-@code{CONST_DOUBLE} expression in mode @var{mode}. Similarly, the macro
-@code{CONST1_RTX (@var{mode})} refers to an expression with value 1 in
-mode @var{mode} and similarly for @code{CONST2_RTX}.
-
-@findex const_string
-@item (const_string @var{str})
-Represents a constant string with value @var{str}. Currently this is
-used only for insn attributes (@pxref{Insn Attributes}) since constant
-strings in C are placed in memory.
-
-@findex symbol_ref
-@item (symbol_ref:@var{mode} @var{symbol})
-Represents the value of an assembler label for data. @var{symbol} is
-a string that describes the name of the assembler label. If it starts
-with a @samp{*}, the label is the rest of @var{symbol} not including
-the @samp{*}. Otherwise, the label is @var{symbol}, usually prefixed
-with @samp{_}.
-
-The @code{symbol_ref} contains a mode, which is usually @code{Pmode}.
-Usually that is the only mode for which a symbol is directly valid.
-
-@findex label_ref
-@item (label_ref @var{label})
-Represents the value of an assembler label for code. It contains one
-operand, an expression, which must be a @code{code_label} that appears
-in the instruction sequence to identify the place where the label
-should go.
-
-The reason for using a distinct expression type for code label
-references is so that jump optimization can distinguish them.
-
-@item (const:@var{m} @var{exp})
-Represents a constant that is the result of an assembly-time
-arithmetic computation. The operand, @var{exp}, is an expression that
-contains only constants (@code{const_int}, @code{symbol_ref} and
-@code{label_ref} expressions) combined with @code{plus} and
-@code{minus}. However, not all combinations are valid, since the
-assembler cannot do arbitrary arithmetic on relocatable symbols.
-
-@var{m} should be @code{Pmode}.
-
-@findex high
-@item (high:@var{m} @var{exp})
-Represents the high-order bits of @var{exp}, usually a
-@code{symbol_ref}. The number of bits is machine-dependent and is
-normally the number of bits specified in an instruction that initializes
-the high order bits of a register. It is used with @code{lo_sum} to
-represent the typical two-instruction sequence used in RISC machines to
-reference a global memory location.
-
-@var{m} should be @code{Pmode}.
-@end table
-
-@node Regs and Memory, Arithmetic, Constants, RTL
-@section Registers and Memory
-@cindex RTL register expressions
-@cindex RTL memory expressions
-
-Here are the RTL expression types for describing access to machine
-registers and to main memory.
-
-@table @code
-@findex reg
-@cindex hard registers
-@cindex pseudo registers
-@item (reg:@var{m} @var{n})
-For small values of the integer @var{n} (those that are less than
-@code{FIRST_PSEUDO_REGISTER}), this stands for a reference to machine
-register number @var{n}: a @dfn{hard register}. For larger values of
-@var{n}, it stands for a temporary value or @dfn{pseudo register}.
-The compiler's strategy is to generate code assuming an unlimited
-number of such pseudo registers, and later convert them into hard
-registers or into memory references.
-
-@var{m} is the machine mode of the reference. It is necessary because
-machines can generally refer to each register in more than one mode.
-For example, a register may contain a full word but there may be
-instructions to refer to it as a half word or as a single byte, as
-well as instructions to refer to it as a floating point number of
-various precisions.
-
-Even for a register that the machine can access in only one mode,
-the mode must always be specified.
-
-The symbol @code{FIRST_PSEUDO_REGISTER} is defined by the machine
-description, since the number of hard registers on the machine is an
-invariant characteristic of the machine. Note, however, that not
-all of the machine registers must be general registers. All the
-machine registers that can be used for storage of data are given
-hard register numbers, even those that can be used only in certain
-instructions or can hold only certain types of data.
-
-A hard register may be accessed in various modes throughout one
-function, but each pseudo register is given a natural mode
-and is accessed only in that mode. When it is necessary to describe
-an access to a pseudo register using a nonnatural mode, a @code{subreg}
-expression is used.
-
-A @code{reg} expression with a machine mode that specifies more than
-one word of data may actually stand for several consecutive registers.
-If in addition the register number specifies a hardware register, then
-it actually represents several consecutive hardware registers starting
-with the specified one.
-
-Each pseudo register number used in a function's RTL code is
-represented by a unique @code{reg} expression.
-
-@findex FIRST_VIRTUAL_REGISTER
-@findex LAST_VIRTUAL_REGISTER
-Some pseudo register numbers, those within the range of
-@code{FIRST_VIRTUAL_REGISTER} to @code{LAST_VIRTUAL_REGISTER} only
-appear during the RTL generation phase and are eliminated before the
-optimization phases. These represent locations in the stack frame that
-cannot be determined until RTL generation for the function has been
-completed. The following virtual register numbers are defined:
-
-@table @code
-@findex VIRTUAL_INCOMING_ARGS_REGNUM
-@item VIRTUAL_INCOMING_ARGS_REGNUM
-This points to the first word of the incoming arguments passed on the
-stack. Normally these arguments are placed there by the caller, but the
-callee may have pushed some arguments that were previously passed in
-registers.
-
-@cindex @code{FIRST_PARM_OFFSET} and virtual registers
-@cindex @code{ARG_POINTER_REGNUM} and virtual registers
-When RTL generation is complete, this virtual register is replaced
-by the sum of the register given by @code{ARG_POINTER_REGNUM} and the
-value of @code{FIRST_PARM_OFFSET}.
-
-@findex VIRTUAL_STACK_VARS_REGNUM
-@cindex @code{FRAME_GROWS_DOWNWARD} and virtual registers
-@item VIRTUAL_STACK_VARS_REGNUM
-If @code{FRAME_GROWS_DOWNWARD} is defined, this points to immediately
-above the first variable on the stack. Otherwise, it points to the
-first variable on the stack.
-
-@cindex @code{STARTING_FRAME_OFFSET} and virtual registers
-@cindex @code{FRAME_POINTER_REGNUM} and virtual registers
-@code{VIRTUAL_STACK_VARS_REGNUM} is replaced with the sum of the
-register given by @code{FRAME_POINTER_REGNUM} and the value
-@code{STARTING_FRAME_OFFSET}.
-
-@findex VIRTUAL_STACK_DYNAMIC_REGNUM
-@item VIRTUAL_STACK_DYNAMIC_REGNUM
-This points to the location of dynamically allocated memory on the stack
-immediately after the stack pointer has been adjusted by the amount of
-memory desired.
-
-@cindex @code{STACK_DYNAMIC_OFFSET} and virtual registers
-@cindex @code{STACK_POINTER_REGNUM} and virtual registers
-This virtual register is replaced by the sum of the register given by
-@code{STACK_POINTER_REGNUM} and the value @code{STACK_DYNAMIC_OFFSET}.
-
-@findex VIRTUAL_OUTGOING_ARGS_REGNUM
-@item VIRTUAL_OUTGOING_ARGS_REGNUM
-This points to the location in the stack at which outgoing arguments
-should be written when the stack is pre-pushed (arguments pushed using
-push insns should always use @code{STACK_POINTER_REGNUM}).
-
-@cindex @code{STACK_POINTER_OFFSET} and virtual registers
-This virtual register is replaced by the sum of the register given by
-@code{STACK_POINTER_REGNUM} and the value @code{STACK_POINTER_OFFSET}.
-@end table
-
-@findex subreg
-@item (subreg:@var{m} @var{reg} @var{wordnum})
-@code{subreg} expressions are used to refer to a register in a machine
-mode other than its natural one, or to refer to one register of
-a multi-word @code{reg} that actually refers to several registers.
-
-Each pseudo-register has a natural mode. If it is necessary to
-operate on it in a different mode---for example, to perform a fullword
-move instruction on a pseudo-register that contains a single
-byte---the pseudo-register must be enclosed in a @code{subreg}. In
-such a case, @var{wordnum} is zero.
-
-Usually @var{m} is at least as narrow as the mode of @var{reg}, in which
-case it is restricting consideration to only the bits of @var{reg} that
-are in @var{m}.
-
-Sometimes @var{m} is wider than the mode of @var{reg}. These
-@code{subreg} expressions are often called @dfn{paradoxical}. They are
-used in cases where we want to refer to an object in a wider mode but do
-not care what value the additional bits have. The reload pass ensures
-that paradoxical references are only made to hard registers.
-
-The other use of @code{subreg} is to extract the individual registers of
-a multi-register value. Machine modes such as @code{DImode} and
-@code{TImode} can indicate values longer than a word, values which
-usually require two or more consecutive registers. To access one of the
-registers, use a @code{subreg} with mode @code{SImode} and a
-@var{wordnum} that says which register.
-
-Storing in a non-paradoxical @code{subreg} has undefined results for
-bits belonging to the same word as the @code{subreg}. This laxity makes
-it easier to generate efficient code for such instructions. To
-represent an instruction that preserves all the bits outside of those in
-the @code{subreg}, use @code{strict_low_part} around the @code{subreg}.
-
-@cindex @code{WORDS_BIG_ENDIAN}, effect on @code{subreg}
-The compilation parameter @code{WORDS_BIG_ENDIAN}, if set to 1, says
-that word number zero is the most significant part; otherwise, it is
-the least significant part.
-
-@cindex @code{FLOAT_WORDS_BIG_ENDIAN}, (lack of) effect on @code{subreg}
-On a few targets, @code{FLOAT_WORDS_BIG_ENDIAN} disagrees with
-@code{WORDS_BIG_ENDIAN}.
-However, most parts of the compiler treat floating point values as if
-they had the same endianness as integer values. This works because
-they handle them solely as a collection of integer values, with no
-particular numerical value. Only real.c and the runtime libraries
-care about @code{FLOAT_WORDS_BIG_ENDIAN}.
-
-@cindex combiner pass
-@cindex reload pass
-@cindex @code{subreg}, special reload handling
-Between the combiner pass and the reload pass, it is possible to have a
-paradoxical @code{subreg} which contains a @code{mem} instead of a
-@code{reg} as its first operand. After the reload pass, it is also
-possible to have a non-paradoxical @code{subreg} which contains a
-@code{mem}; this usually occurs when the @code{mem} is a stack slot
-which replaced a pseudo register.
-
-Note that it is not valid to access a @code{DFmode} value in @code{SFmode}
-using a @code{subreg}. On some machines the most significant part of a
-@code{DFmode} value does not have the same format as a single-precision
-floating value.
-
-It is also not valid to access a single word of a multi-word value in a
-hard register when less registers can hold the value than would be
-expected from its size. For example, some 32-bit machines have
-floating-point registers that can hold an entire @code{DFmode} value.
-If register 10 were such a register @code{(subreg:SI (reg:DF 10) 1)}
-would be invalid because there is no way to convert that reference to
-a single machine register. The reload pass prevents @code{subreg}
-expressions such as these from being formed.
-
-@findex SUBREG_REG
-@findex SUBREG_WORD
-The first operand of a @code{subreg} expression is customarily accessed
-with the @code{SUBREG_REG} macro and the second operand is customarily
-accessed with the @code{SUBREG_WORD} macro.
-
-@findex scratch
-@cindex scratch operands
-@item (scratch:@var{m})
-This represents a scratch register that will be required for the
-execution of a single instruction and not used subsequently. It is
-converted into a @code{reg} by either the local register allocator or
-the reload pass.
-
-@code{scratch} is usually present inside a @code{clobber} operation
-(@pxref{Side Effects}).
-
-@findex cc0
-@cindex condition code register
-@item (cc0)
-This refers to the machine's condition code register. It has no
-operands and may not have a machine mode. There are two ways to use it:
-
-@itemize @bullet
-@item
-To stand for a complete set of condition code flags. This is best on
-most machines, where each comparison sets the entire series of flags.
-
-With this technique, @code{(cc0)} may be validly used in only two
-contexts: as the destination of an assignment (in test and compare
-instructions) and in comparison operators comparing against zero
-(@code{const_int} with value zero; that is to say, @code{const0_rtx}).
-
-@item
-To stand for a single flag that is the result of a single condition.
-This is useful on machines that have only a single flag bit, and in
-which comparison instructions must specify the condition to test.
-
-With this technique, @code{(cc0)} may be validly used in only two
-contexts: as the destination of an assignment (in test and compare
-instructions) where the source is a comparison operator, and as the
-first operand of @code{if_then_else} (in a conditional branch).
-@end itemize
-
-@findex cc0_rtx
-There is only one expression object of code @code{cc0}; it is the
-value of the variable @code{cc0_rtx}. Any attempt to create an
-expression of code @code{cc0} will return @code{cc0_rtx}.
-
-Instructions can set the condition code implicitly. On many machines,
-nearly all instructions set the condition code based on the value that
-they compute or store. It is not necessary to record these actions
-explicitly in the RTL because the machine description includes a
-prescription for recognizing the instructions that do so (by means of
-the macro @code{NOTICE_UPDATE_CC}). @xref{Condition Code}. Only
-instructions whose sole purpose is to set the condition code, and
-instructions that use the condition code, need mention @code{(cc0)}.
-
-On some machines, the condition code register is given a register number
-and a @code{reg} is used instead of @code{(cc0)}. This is usually the
-preferable approach if only a small subset of instructions modify the
-condition code. Other machines store condition codes in general
-registers; in such cases a pseudo register should be used.
-
-Some machines, such as the Sparc and RS/6000, have two sets of
-arithmetic instructions, one that sets and one that does not set the
-condition code. This is best handled by normally generating the
-instruction that does not set the condition code, and making a pattern
-that both performs the arithmetic and sets the condition code register
-(which would not be @code{(cc0)} in this case). For examples, search
-for @samp{addcc} and @samp{andcc} in @file{sparc.md}.
-
-@findex pc
-@item (pc)
-@cindex program counter
-This represents the machine's program counter. It has no operands and
-may not have a machine mode. @code{(pc)} may be validly used only in
-certain specific contexts in jump instructions.
-
-@findex pc_rtx
-There is only one expression object of code @code{pc}; it is the value
-of the variable @code{pc_rtx}. Any attempt to create an expression of
-code @code{pc} will return @code{pc_rtx}.
-
-All instructions that do not jump alter the program counter implicitly
-by incrementing it, but there is no need to mention this in the RTL.
-
-@findex mem
-@item (mem:@var{m} @var{addr})
-This RTX represents a reference to main memory at an address
-represented by the expression @var{addr}. @var{m} specifies how large
-a unit of memory is accessed.
-
-@findex addressof
-@item (addressof:@var{m} @var{reg})
-This RTX represents a request for the address of register @var{reg}. Its mode
-is always @code{Pmode}. If there are any @code{addressof}
-expressions left in the function after CSE, @var{reg} is forced into the
-stack and the @code{addressof} expression is replaced with a @code{plus}
-expression for the address of its stack slot.
-@end table
-
-@node Arithmetic, Comparisons, Regs and Memory, RTL
-@section RTL Expressions for Arithmetic
-@cindex arithmetic, in RTL
-@cindex math, in RTL
-@cindex RTL expressions for arithmetic
-
-Unless otherwise specified, all the operands of arithmetic expressions
-must be valid for mode @var{m}. An operand is valid for mode @var{m}
-if it has mode @var{m}, or if it is a @code{const_int} or
-@code{const_double} and @var{m} is a mode of class @code{MODE_INT}.
-
-For commutative binary operations, constants should be placed in the
-second operand.
-
-@table @code
-@findex plus
-@cindex RTL addition
-@cindex RTL sum
-@item (plus:@var{m} @var{x} @var{y})
-Represents the sum of the values represented by @var{x} and @var{y}
-carried out in machine mode @var{m}.
-
-@findex lo_sum
-@item (lo_sum:@var{m} @var{x} @var{y})
-Like @code{plus}, except that it represents that sum of @var{x} and the
-low-order bits of @var{y}. The number of low order bits is
-machine-dependent but is normally the number of bits in a @code{Pmode}
-item minus the number of bits set by the @code{high} code
-(@pxref{Constants}).
-
-@var{m} should be @code{Pmode}.
-
-@findex minus
-@cindex RTL subtraction
-@cindex RTL difference
-@item (minus:@var{m} @var{x} @var{y})
-Like @code{plus} but represents subtraction.
-
-@findex compare
-@cindex RTL comparison
-@item (compare:@var{m} @var{x} @var{y})
-Represents the result of subtracting @var{y} from @var{x} for purposes
-of comparison. The result is computed without overflow, as if with
-infinite precision.
-
-Of course, machines can't really subtract with infinite precision.
-However, they can pretend to do so when only the sign of the
-result will be used, which is the case when the result is stored
-in the condition code. And that is the only way this kind of expression
-may validly be used: as a value to be stored in the condition codes.
-
-The mode @var{m} is not related to the modes of @var{x} and @var{y},
-but instead is the mode of the condition code value. If @code{(cc0)}
-is used, it is @code{VOIDmode}. Otherwise it is some mode in class
-@code{MODE_CC}, often @code{CCmode}. @xref{Condition Code}.
-
-Normally, @var{x} and @var{y} must have the same mode. Otherwise,
-@code{compare} is valid only if the mode of @var{x} is in class
-@code{MODE_INT} and @var{y} is a @code{const_int} or
-@code{const_double} with mode @code{VOIDmode}. The mode of @var{x}
-determines what mode the comparison is to be done in; thus it must not
-be @code{VOIDmode}.
-
-If one of the operands is a constant, it should be placed in the
-second operand and the comparison code adjusted as appropriate.
-
-A @code{compare} specifying two @code{VOIDmode} constants is not valid
-since there is no way to know in what mode the comparison is to be
-performed; the comparison must either be folded during the compilation
-or the first operand must be loaded into a register while its mode is
-still known.
-
-@findex neg
-@item (neg:@var{m} @var{x})
-Represents the negation (subtraction from zero) of the value represented
-by @var{x}, carried out in mode @var{m}.
-
-@findex mult
-@cindex multiplication
-@cindex product
-@item (mult:@var{m} @var{x} @var{y})
-Represents the signed product of the values represented by @var{x} and
-@var{y} carried out in machine mode @var{m}.
-
-Some machines support a multiplication that generates a product wider
-than the operands. Write the pattern for this as
-
-@example
-(mult:@var{m} (sign_extend:@var{m} @var{x}) (sign_extend:@var{m} @var{y}))
-@end example
-
-where @var{m} is wider than the modes of @var{x} and @var{y}, which need
-not be the same.
-
-Write patterns for unsigned widening multiplication similarly using
-@code{zero_extend}.
-
-@findex div
-@cindex division
-@cindex signed division
-@cindex quotient
-@item (div:@var{m} @var{x} @var{y})
-Represents the quotient in signed division of @var{x} by @var{y},
-carried out in machine mode @var{m}. If @var{m} is a floating point
-mode, it represents the exact quotient; otherwise, the integerized
-quotient.
-
-Some machines have division instructions in which the operands and
-quotient widths are not all the same; you should represent
-such instructions using @code{truncate} and @code{sign_extend} as in,
-
-@example
-(truncate:@var{m1} (div:@var{m2} @var{x} (sign_extend:@var{m2} @var{y})))
-@end example
-
-@findex udiv
-@cindex unsigned division
-@cindex division
-@item (udiv:@var{m} @var{x} @var{y})
-Like @code{div} but represents unsigned division.
-
-@findex mod
-@findex umod
-@cindex remainder
-@cindex division
-@item (mod:@var{m} @var{x} @var{y})
-@itemx (umod:@var{m} @var{x} @var{y})
-Like @code{div} and @code{udiv} but represent the remainder instead of
-the quotient.
-
-@findex smin
-@findex smax
-@cindex signed minimum
-@cindex signed maximum
-@item (smin:@var{m} @var{x} @var{y})
-@itemx (smax:@var{m} @var{x} @var{y})
-Represents the smaller (for @code{smin}) or larger (for @code{smax}) of
-@var{x} and @var{y}, interpreted as signed integers in mode @var{m}.
-
-@findex umin
-@findex umax
-@cindex unsigned minimum and maximum
-@item (umin:@var{m} @var{x} @var{y})
-@itemx (umax:@var{m} @var{x} @var{y})
-Like @code{smin} and @code{smax}, but the values are interpreted as unsigned
-integers.
-
-@findex not
-@cindex complement, bitwise
-@cindex bitwise complement
-@item (not:@var{m} @var{x})
-Represents the bitwise complement of the value represented by @var{x},
-carried out in mode @var{m}, which must be a fixed-point machine mode.
-
-@findex and
-@cindex logical-and, bitwise
-@cindex bitwise logical-and
-@item (and:@var{m} @var{x} @var{y})
-Represents the bitwise logical-and of the values represented by
-@var{x} and @var{y}, carried out in machine mode @var{m}, which must be
-a fixed-point machine mode.
-
-@findex ior
-@cindex inclusive-or, bitwise
-@cindex bitwise inclusive-or
-@item (ior:@var{m} @var{x} @var{y})
-Represents the bitwise inclusive-or of the values represented by @var{x}
-and @var{y}, carried out in machine mode @var{m}, which must be a
-fixed-point mode.
-
-@findex xor
-@cindex exclusive-or, bitwise
-@cindex bitwise exclusive-or
-@item (xor:@var{m} @var{x} @var{y})
-Represents the bitwise exclusive-or of the values represented by @var{x}
-and @var{y}, carried out in machine mode @var{m}, which must be a
-fixed-point mode.
-
-@findex ashift
-@cindex left shift
-@cindex shift
-@cindex arithmetic shift
-@item (ashift:@var{m} @var{x} @var{c})
-Represents the result of arithmetically shifting @var{x} left by @var{c}
-places. @var{x} have mode @var{m}, a fixed-point machine mode. @var{c}
-be a fixed-point mode or be a constant with mode @code{VOIDmode}; which
-mode is determined by the mode called for in the machine description
-entry for the left-shift instruction. For example, on the Vax, the mode
-of @var{c} is @code{QImode} regardless of @var{m}.
-
-@findex lshiftrt
-@cindex right shift
-@findex ashiftrt
-@item (lshiftrt:@var{m} @var{x} @var{c})
-@itemx (ashiftrt:@var{m} @var{x} @var{c})
-Like @code{ashift} but for right shift. Unlike the case for left shift,
-these two operations are distinct.
-
-@findex rotate
-@cindex rotate
-@cindex left rotate
-@findex rotatert
-@cindex right rotate
-@item (rotate:@var{m} @var{x} @var{c})
-@itemx (rotatert:@var{m} @var{x} @var{c})
-Similar but represent left and right rotate. If @var{c} is a constant,
-use @code{rotate}.
-
-@findex abs
-@cindex absolute value
-@item (abs:@var{m} @var{x})
-Represents the absolute value of @var{x}, computed in mode @var{m}.
-
-@findex sqrt
-@cindex square root
-@item (sqrt:@var{m} @var{x})
-Represents the square root of @var{x}, computed in mode @var{m}.
-Most often @var{m} will be a floating point mode.
-
-@findex ffs
-@item (ffs:@var{m} @var{x})
-Represents one plus the index of the least significant 1-bit in
-@var{x}, represented as an integer of mode @var{m}. (The value is
-zero if @var{x} is zero.) The mode of @var{x} need not be @var{m};
-depending on the target machine, various mode combinations may be
-valid.
-@end table
-
-@node Comparisons, Bit Fields, Arithmetic, RTL
-@section Comparison Operations
-@cindex RTL comparison operations
-
-Comparison operators test a relation on two operands and are considered
-to represent a machine-dependent nonzero value described by, but not
-necessarily equal to, @code{STORE_FLAG_VALUE} (@pxref{Misc})
-if the relation holds, or zero if it does not. The mode of the
-comparison operation is independent of the mode of the data being
-compared. If the comparison operation is being tested (e.g., the first
-operand of an @code{if_then_else}), the mode must be @code{VOIDmode}.
-If the comparison operation is producing data to be stored in some
-variable, the mode must be in class @code{MODE_INT}. All comparison
-operations producing data must use the same mode, which is
-machine-specific.
-
-@cindex condition codes
-There are two ways that comparison operations may be used. The
-comparison operators may be used to compare the condition codes
-@code{(cc0)} against zero, as in @code{(eq (cc0) (const_int 0))}. Such
-a construct actually refers to the result of the preceding instruction
-in which the condition codes were set. The instructing setting the
-condition code must be adjacent to the instruction using the condition
-code; only @code{note} insns may separate them.
-
-Alternatively, a comparison operation may directly compare two data
-objects. The mode of the comparison is determined by the operands; they
-must both be valid for a common machine mode. A comparison with both
-operands constant would be invalid as the machine mode could not be
-deduced from it, but such a comparison should never exist in RTL due to
-constant folding.
-
-In the example above, if @code{(cc0)} were last set to
-@code{(compare @var{x} @var{y})}, the comparison operation is
-identical to @code{(eq @var{x} @var{y})}. Usually only one style
-of comparisons is supported on a particular machine, but the combine
-pass will try to merge the operations to produce the @code{eq} shown
-in case it exists in the context of the particular insn involved.
-
-Inequality comparisons come in two flavors, signed and unsigned. Thus,
-there are distinct expression codes @code{gt} and @code{gtu} for signed and
-unsigned greater-than. These can produce different results for the same
-pair of integer values: for example, 1 is signed greater-than -1 but not
-unsigned greater-than, because -1 when regarded as unsigned is actually
-@code{0xffffffff} which is greater than 1.
-
-The signed comparisons are also used for floating point values. Floating
-point comparisons are distinguished by the machine modes of the operands.
-
-@table @code
-@findex eq
-@cindex equal
-@item (eq:@var{m} @var{x} @var{y})
-1 if the values represented by @var{x} and @var{y} are equal,
-otherwise 0.
-
-@findex ne
-@cindex not equal
-@item (ne:@var{m} @var{x} @var{y})
-1 if the values represented by @var{x} and @var{y} are not equal,
-otherwise 0.
-
-@findex gt
-@cindex greater than
-@item (gt:@var{m} @var{x} @var{y})
-1 if the @var{x} is greater than @var{y}. If they are fixed-point,
-the comparison is done in a signed sense.
-
-@findex gtu
-@cindex greater than
-@cindex unsigned greater than
-@item (gtu:@var{m} @var{x} @var{y})
-Like @code{gt} but does unsigned comparison, on fixed-point numbers only.
-
-@findex lt
-@cindex less than
-@findex ltu
-@cindex unsigned less than
-@item (lt:@var{m} @var{x} @var{y})
-@itemx (ltu:@var{m} @var{x} @var{y})
-Like @code{gt} and @code{gtu} but test for ``less than''.
-
-@findex ge
-@cindex greater than
-@findex geu
-@cindex unsigned greater than
-@item (ge:@var{m} @var{x} @var{y})
-@itemx (geu:@var{m} @var{x} @var{y})
-Like @code{gt} and @code{gtu} but test for ``greater than or equal''.
-
-@findex le
-@cindex less than or equal
-@findex leu
-@cindex unsigned less than
-@item (le:@var{m} @var{x} @var{y})
-@itemx (leu:@var{m} @var{x} @var{y})
-Like @code{gt} and @code{gtu} but test for ``less than or equal''.
-
-@findex if_then_else
-@item (if_then_else @var{cond} @var{then} @var{else})
-This is not a comparison operation but is listed here because it is
-always used in conjunction with a comparison operation. To be
-precise, @var{cond} is a comparison expression. This expression
-represents a choice, according to @var{cond}, between the value
-represented by @var{then} and the one represented by @var{else}.
-
-On most machines, @code{if_then_else} expressions are valid only
-to express conditional jumps.
-
-@findex cond
-@item (cond [@var{test1} @var{value1} @var{test2} @var{value2} @dots{}] @var{default})
-Similar to @code{if_then_else}, but more general. Each of @var{test1},
-@var{test2}, @dots{} is performed in turn. The result of this expression is
-the @var{value} corresponding to the first non-zero test, or @var{default} if
-none of the tests are non-zero expressions.
-
-This is currently not valid for instruction patterns and is supported only
-for insn attributes. @xref{Insn Attributes}.
-@end table
-
-@node Bit Fields, Conversions, Comparisons, RTL
-@section Bit Fields
-@cindex bit fields
-
-Special expression codes exist to represent bitfield instructions.
-These types of expressions are lvalues in RTL; they may appear
-on the left side of an assignment, indicating insertion of a value
-into the specified bit field.
-
-@table @code
-@findex sign_extract
-@cindex @code{BITS_BIG_ENDIAN}, effect on @code{sign_extract}
-@item (sign_extract:@var{m} @var{loc} @var{size} @var{pos})
-This represents a reference to a sign-extended bit field contained or
-starting in @var{loc} (a memory or register reference). The bit field
-is @var{size} bits wide and starts at bit @var{pos}. The compilation
-option @code{BITS_BIG_ENDIAN} says which end of the memory unit
-@var{pos} counts from.
-
-If @var{loc} is in memory, its mode must be a single-byte integer mode.
-If @var{loc} is in a register, the mode to use is specified by the
-operand of the @code{insv} or @code{extv} pattern
-(@pxref{Standard Names}) and is usually a full-word integer mode,
-which is the default if none is specified.
-
-The mode of @var{pos} is machine-specific and is also specified
-in the @code{insv} or @code{extv} pattern.
-
-The mode @var{m} is the same as the mode that would be used for
-@var{loc} if it were a register.
-
-@findex zero_extract
-@item (zero_extract:@var{m} @var{loc} @var{size} @var{pos})
-Like @code{sign_extract} but refers to an unsigned or zero-extended
-bit field. The same sequence of bits are extracted, but they
-are filled to an entire word with zeros instead of by sign-extension.
-@end table
-
-@node Conversions, RTL Declarations, Bit Fields, RTL
-@section Conversions
-@cindex conversions
-@cindex machine mode conversions
-
-All conversions between machine modes must be represented by
-explicit conversion operations. For example, an expression
-which is the sum of a byte and a full word cannot be written as
-@code{(plus:SI (reg:QI 34) (reg:SI 80))} because the @code{plus}
-operation requires two operands of the same machine mode.
-Therefore, the byte-sized operand is enclosed in a conversion
-operation, as in
-
-@example
-(plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80))
-@end example
-
-The conversion operation is not a mere placeholder, because there
-may be more than one way of converting from a given starting mode
-to the desired final mode. The conversion operation code says how
-to do it.
-
-For all conversion operations, @var{x} must not be @code{VOIDmode}
-because the mode in which to do the conversion would not be known.
-The conversion must either be done at compile-time or @var{x}
-must be placed into a register.
-
-@table @code
-@findex sign_extend
-@item (sign_extend:@var{m} @var{x})
-Represents the result of sign-extending the value @var{x}
-to machine mode @var{m}. @var{m} must be a fixed-point mode
-and @var{x} a fixed-point value of a mode narrower than @var{m}.
-
-@findex zero_extend
-@item (zero_extend:@var{m} @var{x})
-Represents the result of zero-extending the value @var{x}
-to machine mode @var{m}. @var{m} must be a fixed-point mode
-and @var{x} a fixed-point value of a mode narrower than @var{m}.
-
-@findex float_extend
-@item (float_extend:@var{m} @var{x})
-Represents the result of extending the value @var{x}
-to machine mode @var{m}. @var{m} must be a floating point mode
-and @var{x} a floating point value of a mode narrower than @var{m}.
-
-@findex truncate
-@item (truncate:@var{m} @var{x})
-Represents the result of truncating the value @var{x}
-to machine mode @var{m}. @var{m} must be a fixed-point mode
-and @var{x} a fixed-point value of a mode wider than @var{m}.
-
-@findex float_truncate
-@item (float_truncate:@var{m} @var{x})
-Represents the result of truncating the value @var{x}
-to machine mode @var{m}. @var{m} must be a floating point mode
-and @var{x} a floating point value of a mode wider than @var{m}.
-
-@findex float
-@item (float:@var{m} @var{x})
-Represents the result of converting fixed point value @var{x},
-regarded as signed, to floating point mode @var{m}.
-
-@findex unsigned_float
-@item (unsigned_float:@var{m} @var{x})
-Represents the result of converting fixed point value @var{x},
-regarded as unsigned, to floating point mode @var{m}.
-
-@findex fix
-@item (fix:@var{m} @var{x})
-When @var{m} is a fixed point mode, represents the result of
-converting floating point value @var{x} to mode @var{m}, regarded as
-signed. How rounding is done is not specified, so this operation may
-be used validly in compiling C code only for integer-valued operands.
-
-@findex unsigned_fix
-@item (unsigned_fix:@var{m} @var{x})
-Represents the result of converting floating point value @var{x} to
-fixed point mode @var{m}, regarded as unsigned. How rounding is done
-is not specified.
-
-@findex fix
-@item (fix:@var{m} @var{x})
-When @var{m} is a floating point mode, represents the result of
-converting floating point value @var{x} (valid for mode @var{m}) to an
-integer, still represented in floating point mode @var{m}, by rounding
-towards zero.
-@end table
-
-@node RTL Declarations, Side Effects, Conversions, RTL
-@section Declarations
-@cindex RTL declarations
-@cindex declarations, RTL
-
-Declaration expression codes do not represent arithmetic operations
-but rather state assertions about their operands.
-
-@table @code
-@findex strict_low_part
-@cindex @code{subreg}, in @code{strict_low_part}
-@item (strict_low_part (subreg:@var{m} (reg:@var{n} @var{r}) 0))
-This expression code is used in only one context: as the destination operand of a
-@code{set} expression. In addition, the operand of this expression
-must be a non-paradoxical @code{subreg} expression.
-
-The presence of @code{strict_low_part} says that the part of the
-register which is meaningful in mode @var{n}, but is not part of
-mode @var{m}, is not to be altered. Normally, an assignment to such
-a subreg is allowed to have undefined effects on the rest of the
-register when @var{m} is less than a word.
-@end table
-
-@node Side Effects, Incdec, RTL Declarations, RTL
-@section Side Effect Expressions
-@cindex RTL side effect expressions
-
-The expression codes described so far represent values, not actions.
-But machine instructions never produce values; they are meaningful
-only for their side effects on the state of the machine. Special
-expression codes are used to represent side effects.
-
-The body of an instruction is always one of these side effect codes;
-the codes described above, which represent values, appear only as
-the operands of these.
-
-@table @code
-@findex set
-@item (set @var{lval} @var{x})
-Represents the action of storing the value of @var{x} into the place
-represented by @var{lval}. @var{lval} must be an expression
-representing a place that can be stored in: @code{reg} (or
-@code{subreg} or @code{strict_low_part}), @code{mem}, @code{pc} or
-@code{cc0}.@refill
-
-If @var{lval} is a @code{reg}, @code{subreg} or @code{mem}, it has a
-machine mode; then @var{x} must be valid for that mode.@refill
-
-If @var{lval} is a @code{reg} whose machine mode is less than the full
-width of the register, then it means that the part of the register
-specified by the machine mode is given the specified value and the
-rest of the register receives an undefined value. Likewise, if
-@var{lval} is a @code{subreg} whose machine mode is narrower than
-the mode of the register, the rest of the register can be changed in
-an undefined way.
-
-If @var{lval} is a @code{strict_low_part} of a @code{subreg}, then the
-part of the register specified by the machine mode of the
-@code{subreg} is given the value @var{x} and the rest of the register
-is not changed.@refill
-
-If @var{lval} is @code{(cc0)}, it has no machine mode, and @var{x} may
-be either a @code{compare} expression or a value that may have any mode.
-The latter case represents a ``test'' instruction. The expression
-@code{(set (cc0) (reg:@var{m} @var{n}))} is equivalent to
-@code{(set (cc0) (compare (reg:@var{m} @var{n}) (const_int 0)))}.
-Use the former expression to save space during the compilation.
-
-@cindex jump instructions and @code{set}
-@cindex @code{if_then_else} usage
-If @var{lval} is @code{(pc)}, we have a jump instruction, and the
-possibilities for @var{x} are very limited. It may be a
-@code{label_ref} expression (unconditional jump). It may be an
-@code{if_then_else} (conditional jump), in which case either the
-second or the third operand must be @code{(pc)} (for the case which
-does not jump) and the other of the two must be a @code{label_ref}
-(for the case which does jump). @var{x} may also be a @code{mem} or
-@code{(plus:SI (pc) @var{y})}, where @var{y} may be a @code{reg} or a
-@code{mem}; these unusual patterns are used to represent jumps through
-branch tables.@refill
-
-If @var{lval} is neither @code{(cc0)} nor @code{(pc)}, the mode of
-@var{lval} must not be @code{VOIDmode} and the mode of @var{x} must be
-valid for the mode of @var{lval}.
-
-@findex SET_DEST
-@findex SET_SRC
-@var{lval} is customarily accessed with the @code{SET_DEST} macro and
-@var{x} with the @code{SET_SRC} macro.
-
-@findex return
-@item (return)
-As the sole expression in a pattern, represents a return from the
-current function, on machines where this can be done with one
-instruction, such as Vaxes. On machines where a multi-instruction
-``epilogue'' must be executed in order to return from the function,
-returning is done by jumping to a label which precedes the epilogue, and
-the @code{return} expression code is never used.
-
-Inside an @code{if_then_else} expression, represents the value to be
-placed in @code{pc} to return to the caller.
-
-Note that an insn pattern of @code{(return)} is logically equivalent to
-@code{(set (pc) (return))}, but the latter form is never used.
-
-@findex call
-@item (call @var{function} @var{nargs})
-Represents a function call. @var{function} is a @code{mem} expression
-whose address is the address of the function to be called.
-@var{nargs} is an expression which can be used for two purposes: on
-some machines it represents the number of bytes of stack argument; on
-others, it represents the number of argument registers.
-
-Each machine has a standard machine mode which @var{function} must
-have. The machine description defines macro @code{FUNCTION_MODE} to
-expand into the requisite mode name. The purpose of this mode is to
-specify what kind of addressing is allowed, on machines where the
-allowed kinds of addressing depend on the machine mode being
-addressed.
-
-@findex clobber
-@item (clobber @var{x})
-Represents the storing or possible storing of an unpredictable,
-undescribed value into @var{x}, which must be a @code{reg},
-@code{scratch} or @code{mem} expression.
-
-One place this is used is in string instructions that store standard
-values into particular hard registers. It may not be worth the
-trouble to describe the values that are stored, but it is essential to
-inform the compiler that the registers will be altered, lest it
-attempt to keep data in them across the string instruction.
-
-If @var{x} is @code{(mem:BLK (const_int 0))}, it means that all memory
-locations must be presumed clobbered.
-
-Note that the machine description classifies certain hard registers as
-``call-clobbered''. All function call instructions are assumed by
-default to clobber these registers, so there is no need to use
-@code{clobber} expressions to indicate this fact. Also, each function
-call is assumed to have the potential to alter any memory location,
-unless the function is declared @code{const}.
-
-If the last group of expressions in a @code{parallel} are each a
-@code{clobber} expression whose arguments are @code{reg} or
-@code{match_scratch} (@pxref{RTL Template}) expressions, the combiner
-phase can add the appropriate @code{clobber} expressions to an insn it
-has constructed when doing so will cause a pattern to be matched.
-
-This feature can be used, for example, on a machine that whose multiply
-and add instructions don't use an MQ register but which has an
-add-accumulate instruction that does clobber the MQ register. Similarly,
-a combined instruction might require a temporary register while the
-constituent instructions might not.
-
-When a @code{clobber} expression for a register appears inside a
-@code{parallel} with other side effects, the register allocator
-guarantees that the register is unoccupied both before and after that
-insn. However, the reload phase may allocate a register used for one of
-the inputs unless the @samp{&} constraint is specified for the selected
-alternative (@pxref{Modifiers}). You can clobber either a specific hard
-register, a pseudo register, or a @code{scratch} expression; in the
-latter two cases, GNU CC will allocate a hard register that is available
-there for use as a temporary.
-
-For instructions that require a temporary register, you should use
-@code{scratch} instead of a pseudo-register because this will allow the
-combiner phase to add the @code{clobber} when required. You do this by
-coding (@code{clobber} (@code{match_scratch} @dots{})). If you do
-clobber a pseudo register, use one which appears nowhere else---generate
-a new one each time. Otherwise, you may confuse CSE.
-
-There is one other known use for clobbering a pseudo register in a
-@code{parallel}: when one of the input operands of the insn is also
-clobbered by the insn. In this case, using the same pseudo register in
-the clobber and elsewhere in the insn produces the expected results.
-
-@findex use
-@item (use @var{x})
-Represents the use of the value of @var{x}. It indicates that the
-value in @var{x} at this point in the program is needed, even though
-it may not be apparent why this is so. Therefore, the compiler will
-not attempt to delete previous instructions whose only effect is to
-store a value in @var{x}. @var{x} must be a @code{reg} expression.
-
-During the reload phase, an insn that has a @code{use} as pattern
-can carry a reg_equal note. These @code{use} insns will be deleted
-before the reload phase exits.
-
-During the delayed branch scheduling phase, @var{x} may be an insn.
-This indicates that @var{x} previously was located at this place in the
-code and its data dependencies need to be taken into account. These
-@code{use} insns will be deleted before the delayed branch scheduling
-phase exits.
-
-@findex parallel
-@item (parallel [@var{x0} @var{x1} @dots{}])
-Represents several side effects performed in parallel. The square
-brackets stand for a vector; the operand of @code{parallel} is a
-vector of expressions. @var{x0}, @var{x1} and so on are individual
-side effect expressions---expressions of code @code{set}, @code{call},
-@code{return}, @code{clobber} or @code{use}.@refill
-
-``In parallel'' means that first all the values used in the individual
-side-effects are computed, and second all the actual side-effects are
-performed. For example,
-
-@example
-(parallel [(set (reg:SI 1) (mem:SI (reg:SI 1)))
- (set (mem:SI (reg:SI 1)) (reg:SI 1))])
-@end example
-
-@noindent
-says unambiguously that the values of hard register 1 and the memory
-location addressed by it are interchanged. In both places where
-@code{(reg:SI 1)} appears as a memory address it refers to the value
-in register 1 @emph{before} the execution of the insn.
-
-It follows that it is @emph{incorrect} to use @code{parallel} and
-expect the result of one @code{set} to be available for the next one.
-For example, people sometimes attempt to represent a jump-if-zero
-instruction this way:
-
-@example
-(parallel [(set (cc0) (reg:SI 34))
- (set (pc) (if_then_else
- (eq (cc0) (const_int 0))
- (label_ref @dots{})
- (pc)))])
-@end example
-
-@noindent
-But this is incorrect, because it says that the jump condition depends
-on the condition code value @emph{before} this instruction, not on the
-new value that is set by this instruction.
-
-@cindex peephole optimization, RTL representation
-Peephole optimization, which takes place together with final assembly
-code output, can produce insns whose patterns consist of a @code{parallel}
-whose elements are the operands needed to output the resulting
-assembler code---often @code{reg}, @code{mem} or constant expressions.
-This would not be well-formed RTL at any other stage in compilation,
-but it is ok then because no further optimization remains to be done.
-However, the definition of the macro @code{NOTICE_UPDATE_CC}, if
-any, must deal with such insns if you define any peephole optimizations.
-
-@findex sequence
-@item (sequence [@var{insns} @dots{}])
-Represents a sequence of insns. Each of the @var{insns} that appears
-in the vector is suitable for appearing in the chain of insns, so it
-must be an @code{insn}, @code{jump_insn}, @code{call_insn},
-@code{code_label}, @code{barrier} or @code{note}.
-
-A @code{sequence} RTX is never placed in an actual insn during RTL
-generation. It represents the sequence of insns that result from a
-@code{define_expand} @emph{before} those insns are passed to
-@code{emit_insn} to insert them in the chain of insns. When actually
-inserted, the individual sub-insns are separated out and the
-@code{sequence} is forgotten.
-
-After delay-slot scheduling is completed, an insn and all the insns that
-reside in its delay slots are grouped together into a @code{sequence}.
-The insn requiring the delay slot is the first insn in the vector;
-subsequent insns are to be placed in the delay slot.
-
-@code{INSN_ANNULLED_BRANCH_P} is set on an insn in a delay slot to
-indicate that a branch insn should be used that will conditionally annul
-the effect of the insns in the delay slots. In such a case,
-@code{INSN_FROM_TARGET_P} indicates that the insn is from the target of
-the branch and should be executed only if the branch is taken; otherwise
-the insn should be executed only if the branch is not taken.
-@xref{Delay Slots}.
-@end table
-
-These expression codes appear in place of a side effect, as the body of
-an insn, though strictly speaking they do not always describe side
-effects as such:
-
-@table @code
-@findex asm_input
-@item (asm_input @var{s})
-Represents literal assembler code as described by the string @var{s}.
-
-@findex unspec
-@findex unspec_volatile
-@item (unspec [@var{operands} @dots{}] @var{index})
-@itemx (unspec_volatile [@var{operands} @dots{}] @var{index})
-Represents a machine-specific operation on @var{operands}. @var{index}
-selects between multiple machine-specific operations.
-@code{unspec_volatile} is used for volatile operations and operations
-that may trap; @code{unspec} is used for other operations.
-
-These codes may appear inside a @code{pattern} of an
-insn, inside a @code{parallel}, or inside an expression.
-
-@findex addr_vec
-@item (addr_vec:@var{m} [@var{lr0} @var{lr1} @dots{}])
-Represents a table of jump addresses. The vector elements @var{lr0},
-etc., are @code{label_ref} expressions. The mode @var{m} specifies
-how much space is given to each address; normally @var{m} would be
-@code{Pmode}.
-
-@findex addr_diff_vec
-@item (addr_diff_vec:@var{m} @var{base} [@var{lr0} @var{lr1} @dots{}] @var{min} @var{max} @var{flags})
-Represents a table of jump addresses expressed as offsets from
-@var{base}. The vector elements @var{lr0}, etc., are @code{label_ref}
-expressions and so is @var{base}. The mode @var{m} specifies how much
-space is given to each address-difference. @var{min} and @var{max}
-are set up by branch shortening and hold a label with a minimum and a
-maximum address, respectively. @var{flags} indicates the relative
-position of @var{base}, @var{min} and @var{max} to the cointaining insn
-and of @var{min} and @var{max} to @var{base}. See rtl.def for details.@refill
-@end table
-
-@node Incdec, Assembler, Side Effects, RTL
-@section Embedded Side-Effects on Addresses
-@cindex RTL preincrement
-@cindex RTL postincrement
-@cindex RTL predecrement
-@cindex RTL postdecrement
-
-Six special side-effect expression codes appear as memory addresses.
-
-@table @code
-@findex pre_dec
-@item (pre_dec:@var{m} @var{x})
-Represents the side effect of decrementing @var{x} by a standard
-amount and represents also the value that @var{x} has after being
-decremented. @var{x} must be a @code{reg} or @code{mem}, but most
-machines allow only a @code{reg}. @var{m} must be the machine mode
-for pointers on the machine in use. The amount @var{x} is decremented
-by is the length in bytes of the machine mode of the containing memory
-reference of which this expression serves as the address. Here is an
-example of its use:@refill
-
-@example
-(mem:DF (pre_dec:SI (reg:SI 39)))
-@end example
-
-@noindent
-This says to decrement pseudo register 39 by the length of a @code{DFmode}
-value and use the result to address a @code{DFmode} value.
-
-@findex pre_inc
-@item (pre_inc:@var{m} @var{x})
-Similar, but specifies incrementing @var{x} instead of decrementing it.
-
-@findex post_dec
-@item (post_dec:@var{m} @var{x})
-Represents the same side effect as @code{pre_dec} but a different
-value. The value represented here is the value @var{x} has @i{before}
-being decremented.
-
-@findex post_inc
-@item (post_inc:@var{m} @var{x})
-Similar, but specifies incrementing @var{x} instead of decrementing it.
-
-@findex post_modify
-@item (post_modify:@var{m} @var{x} @var{y})
-
-Represents the side effect of setting @var{x} to @var{y} and
-represents @var{x} before @var{x} is modified. @var{x} must be a
-@code{reg} or @code{mem}, but most machines allow only a @code{reg}.
-@var{m} must be the machine mode for pointers on the machine in use.
-The amount @var{x} is decremented by is the length in bytes of the
-machine mode of the containing memory reference of which this expression
-serves as the address. Note that this is not currently implemented.
-
-The expression @var{y} must be one of three forms:
-@table @code
-@code{(plus:@var{m} @var{x} @var{z})},
-@code{(minus:@var{m} @var{x} @var{z})}, or
-@code{(plus:@var{m} @var{x} @var{i})},
-@end table
-where @var{z} is an index register and @var{i} is a constant.
-
-Here is an example of its use:@refill
-
-@example
-(mem:SF (post_modify:SI (reg:SI 42) (plus (reg:SI 42) (reg:SI 48))))
-@end example
-
-This says to modify pseudo register 42 by adding the contents of pseudo
-register 48 to it, after the use of what ever 42 points to.
-
-@findex post_modify
-@item (pre_modify:@var{m} @var{x} @var{expr})
-Similar except side effects happen before the use.
-@end table
-
-These embedded side effect expressions must be used with care. Instruction
-patterns may not use them. Until the @samp{flow} pass of the compiler,
-they may occur only to represent pushes onto the stack. The @samp{flow}
-pass finds cases where registers are incremented or decremented in one
-instruction and used as an address shortly before or after; these cases are
-then transformed to use pre- or post-increment or -decrement.
-
-If a register used as the operand of these expressions is used in
-another address in an insn, the original value of the register is used.
-Uses of the register outside of an address are not permitted within the
-same insn as a use in an embedded side effect expression because such
-insns behave differently on different machines and hence must be treated
-as ambiguous and disallowed.
-
-An instruction that can be represented with an embedded side effect
-could also be represented using @code{parallel} containing an additional
-@code{set} to describe how the address register is altered. This is not
-done because machines that allow these operations at all typically
-allow them wherever a memory address is called for. Describing them as
-additional parallel stores would require doubling the number of entries
-in the machine description.
-
-@node Assembler, Insns, Incdec, RTL
-@section Assembler Instructions as Expressions
-@cindex assembler instructions in RTL
-
-@cindex @code{asm_operands}, usage
-The RTX code @code{asm_operands} represents a value produced by a
-user-specified assembler instruction. It is used to represent
-an @code{asm} statement with arguments. An @code{asm} statement with
-a single output operand, like this:
-
-@smallexample
-asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z));
-@end smallexample
-
-@noindent
-is represented using a single @code{asm_operands} RTX which represents
-the value that is stored in @code{outputvar}:
-
-@smallexample
-(set @var{rtx-for-outputvar}
- (asm_operands "foo %1,%2,%0" "a" 0
- [@var{rtx-for-addition-result} @var{rtx-for-*z}]
- [(asm_input:@var{m1} "g")
- (asm_input:@var{m2} "di")]))
-@end smallexample
-
-@noindent
-Here the operands of the @code{asm_operands} RTX are the assembler
-template string, the output-operand's constraint, the index-number of the
-output operand among the output operands specified, a vector of input
-operand RTX's, and a vector of input-operand modes and constraints. The
-mode @var{m1} is the mode of the sum @code{x+y}; @var{m2} is that of
-@code{*z}.
-
-When an @code{asm} statement has multiple output values, its insn has
-several such @code{set} RTX's inside of a @code{parallel}. Each @code{set}
-contains a @code{asm_operands}; all of these share the same assembler
-template and vectors, but each contains the constraint for the respective
-output operand. They are also distinguished by the output-operand index
-number, which is 0, 1, @dots{} for successive output operands.
-
-@node Insns, Calls, Assembler, RTL
-@section Insns
-@cindex insns
-
-The RTL representation of the code for a function is a doubly-linked
-chain of objects called @dfn{insns}. Insns are expressions with
-special codes that are used for no other purpose. Some insns are
-actual instructions; others represent dispatch tables for @code{switch}
-statements; others represent labels to jump to or various sorts of
-declarative information.
-
-In addition to its own specific data, each insn must have a unique
-id-number that distinguishes it from all other insns in the current
-function (after delayed branch scheduling, copies of an insn with the
-same id-number may be present in multiple places in a function, but
-these copies will always be identical and will only appear inside a
-@code{sequence}), and chain pointers to the preceding and following
-insns. These three fields occupy the same position in every insn,
-independent of the expression code of the insn. They could be accessed
-with @code{XEXP} and @code{XINT}, but instead three special macros are
-always used:
-
-@table @code
-@findex INSN_UID
-@item INSN_UID (@var{i})
-Accesses the unique id of insn @var{i}.
-
-@findex PREV_INSN
-@item PREV_INSN (@var{i})
-Accesses the chain pointer to the insn preceding @var{i}.
-If @var{i} is the first insn, this is a null pointer.
-
-@findex NEXT_INSN
-@item NEXT_INSN (@var{i})
-Accesses the chain pointer to the insn following @var{i}.
-If @var{i} is the last insn, this is a null pointer.
-@end table
-
-@findex get_insns
-@findex get_last_insn
-The first insn in the chain is obtained by calling @code{get_insns}; the
-last insn is the result of calling @code{get_last_insn}. Within the
-chain delimited by these insns, the @code{NEXT_INSN} and
-@code{PREV_INSN} pointers must always correspond: if @var{insn} is not
-the first insn,
-
-@example
-NEXT_INSN (PREV_INSN (@var{insn})) == @var{insn}
-@end example
-
-@noindent
-is always true and if @var{insn} is not the last insn,
-
-@example
-PREV_INSN (NEXT_INSN (@var{insn})) == @var{insn}
-@end example
-
-@noindent
-is always true.
-
-After delay slot scheduling, some of the insns in the chain might be
-@code{sequence} expressions, which contain a vector of insns. The value
-of @code{NEXT_INSN} in all but the last of these insns is the next insn
-in the vector; the value of @code{NEXT_INSN} of the last insn in the vector
-is the same as the value of @code{NEXT_INSN} for the @code{sequence} in
-which it is contained. Similar rules apply for @code{PREV_INSN}.
-
-This means that the above invariants are not necessarily true for insns
-inside @code{sequence} expressions. Specifically, if @var{insn} is the
-first insn in a @code{sequence}, @code{NEXT_INSN (PREV_INSN (@var{insn}))}
-is the insn containing the @code{sequence} expression, as is the value
-of @code{PREV_INSN (NEXT_INSN (@var{insn}))} is @var{insn} is the last
-insn in the @code{sequence} expression. You can use these expressions
-to find the containing @code{sequence} expression.@refill
-
-Every insn has one of the following six expression codes:
-
-@table @code
-@findex insn
-@item insn
-The expression code @code{insn} is used for instructions that do not jump
-and do not do function calls. @code{sequence} expressions are always
-contained in insns with code @code{insn} even if one of those insns
-should jump or do function calls.
-
-Insns with code @code{insn} have four additional fields beyond the three
-mandatory ones listed above. These four are described in a table below.
-
-@findex jump_insn
-@item jump_insn
-The expression code @code{jump_insn} is used for instructions that may
-jump (or, more generally, may contain @code{label_ref} expressions). If
-there is an instruction to return from the current function, it is
-recorded as a @code{jump_insn}.
-
-@findex JUMP_LABEL
-@code{jump_insn} insns have the same extra fields as @code{insn} insns,
-accessed in the same way and in addition contain a field
-@code{JUMP_LABEL} which is defined once jump optimization has completed.
-
-For simple conditional and unconditional jumps, this field contains the
-@code{code_label} to which this insn will (possibly conditionally)
-branch. In a more complex jump, @code{JUMP_LABEL} records one of the
-labels that the insn refers to; the only way to find the others
-is to scan the entire body of the insn.
-
-Return insns count as jumps, but since they do not refer to any labels,
-they have zero in the @code{JUMP_LABEL} field.
-
-@findex call_insn
-@item call_insn
-The expression code @code{call_insn} is used for instructions that may do
-function calls. It is important to distinguish these instructions because
-they imply that certain registers and memory locations may be altered
-unpredictably.
-
-@findex CALL_INSN_FUNCTION_USAGE
-@code{call_insn} insns have the same extra fields as @code{insn} insns,
-accessed in the same way and in addition contain a field
-@code{CALL_INSN_FUNCTION_USAGE}, which contains a list (chain of
-@code{expr_list} expressions) containing @code{use} and @code{clobber}
-expressions that denote hard registers used or clobbered by the called
-function. A register specified in a @code{clobber} in this list is
-modified @emph{after} the execution of the @code{call_insn}, while a
-register in a @code{clobber} in the body of the @code{call_insn} is
-clobbered before the insn completes execution. @code{clobber}
-expressions in this list augment registers specified in
-@code{CALL_USED_REGISTERS} (@pxref{Register Basics}).
-
-@findex code_label
-@findex CODE_LABEL_NUMBER
-@item code_label
-A @code{code_label} insn represents a label that a jump insn can jump
-to. It contains two special fields of data in addition to the three
-standard ones. @code{CODE_LABEL_NUMBER} is used to hold the @dfn{label
-number}, a number that identifies this label uniquely among all the
-labels in the compilation (not just in the current function).
-Ultimately, the label is represented in the assembler output as an
-assembler label, usually of the form @samp{L@var{n}} where @var{n} is
-the label number.
-
-When a @code{code_label} appears in an RTL expression, it normally
-appears within a @code{label_ref} which represents the address of
-the label, as a number.
-
-@findex LABEL_NUSES
-The field @code{LABEL_NUSES} is only defined once the jump optimization
-phase is completed and contains the number of times this label is
-referenced in the current function.
-
-@findex barrier
-@item barrier
-Barriers are placed in the instruction stream when control cannot flow
-past them. They are placed after unconditional jump instructions to
-indicate that the jumps are unconditional and after calls to
-@code{volatile} functions, which do not return (e.g., @code{exit}).
-They contain no information beyond the three standard fields.
-
-@findex note
-@findex NOTE_LINE_NUMBER
-@findex NOTE_SOURCE_FILE
-@item note
-@code{note} insns are used to represent additional debugging and
-declarative information. They contain two nonstandard fields, an
-integer which is accessed with the macro @code{NOTE_LINE_NUMBER} and a
-string accessed with @code{NOTE_SOURCE_FILE}.
-
-If @code{NOTE_LINE_NUMBER} is positive, the note represents the
-position of a source line and @code{NOTE_SOURCE_FILE} is the source file name
-that the line came from. These notes control generation of line
-number data in the assembler output.
-
-Otherwise, @code{NOTE_LINE_NUMBER} is not really a line number but a
-code with one of the following values (and @code{NOTE_SOURCE_FILE}
-must contain a null pointer):
-
-@table @code
-@findex NOTE_INSN_DELETED
-@item NOTE_INSN_DELETED
-Such a note is completely ignorable. Some passes of the compiler
-delete insns by altering them into notes of this kind.
-
-@findex NOTE_INSN_BLOCK_BEG
-@findex NOTE_INSN_BLOCK_END
-@item NOTE_INSN_BLOCK_BEG
-@itemx NOTE_INSN_BLOCK_END
-These types of notes indicate the position of the beginning and end
-of a level of scoping of variable names. They control the output
-of debugging information.
-
-@findex NOTE_INSN_EH_REGION_BEG
-@findex NOTE_INSN_EH_REGION_END
-@item NOTE_INSN_EH_REGION_BEG
-@itemx NOTE_INSN_EH_REGION_END
-These types of notes indicate the position of the beginning and end of a
-level of scoping for exception handling. @code{NOTE_BLOCK_NUMBER}
-identifies which @code{CODE_LABEL} is associated with the given region.
-
-@findex NOTE_INSN_LOOP_BEG
-@findex NOTE_INSN_LOOP_END
-@item NOTE_INSN_LOOP_BEG
-@itemx NOTE_INSN_LOOP_END
-These types of notes indicate the position of the beginning and end
-of a @code{while} or @code{for} loop. They enable the loop optimizer
-to find loops quickly.
-
-@findex NOTE_INSN_LOOP_CONT
-@item NOTE_INSN_LOOP_CONT
-Appears at the place in a loop that @code{continue} statements jump to.
-
-@findex NOTE_INSN_LOOP_VTOP
-@item NOTE_INSN_LOOP_VTOP
-This note indicates the place in a loop where the exit test begins for
-those loops in which the exit test has been duplicated. This position
-becomes another virtual start of the loop when considering loop
-invariants.
-
-@findex NOTE_INSN_FUNCTION_END
-@item NOTE_INSN_FUNCTION_END
-Appears near the end of the function body, just before the label that
-@code{return} statements jump to (on machine where a single instruction
-does not suffice for returning). This note may be deleted by jump
-optimization.
-
-@findex NOTE_INSN_SETJMP
-@item NOTE_INSN_SETJMP
-Appears following each call to @code{setjmp} or a related function.
-@end table
-
-These codes are printed symbolically when they appear in debugging dumps.
-@end table
-
-@cindex @code{TImode}, in @code{insn}
-@cindex @code{HImode}, in @code{insn}
-@cindex @code{QImode}, in @code{insn}
-The machine mode of an insn is normally @code{VOIDmode}, but some
-phases use the mode for various purposes.
-
-The common subexpression elimination pass sets the mode of an insn to
-@code{QImode} when it is the first insn in a block that has already
-been processed.
-
-The second Haifa scheduling pass, for targets that can multiple issue,
-sets the mode of an insn to @code{TImode} when it is believed that the
-instruction begins an issue group. That is, when the instruction
-cannot issue simultaneously with the previous. This may be relied on
-by later passes, in particular machine-dependant reorg.
-
-Here is a table of the extra fields of @code{insn}, @code{jump_insn}
-and @code{call_insn} insns:
-
-@table @code
-@findex PATTERN
-@item PATTERN (@var{i})
-An expression for the side effect performed by this insn. This must be
-one of the following codes: @code{set}, @code{call}, @code{use},
-@code{clobber}, @code{return}, @code{asm_input}, @code{asm_output},
-@code{addr_vec}, @code{addr_diff_vec}, @code{trap_if}, @code{unspec},
-@code{unspec_volatile}, @code{parallel}, or @code{sequence}. If it is a @code{parallel},
-each element of the @code{parallel} must be one these codes, except that
-@code{parallel} expressions cannot be nested and @code{addr_vec} and
-@code{addr_diff_vec} are not permitted inside a @code{parallel} expression.
-
-@findex INSN_CODE
-@item INSN_CODE (@var{i})
-An integer that says which pattern in the machine description matches
-this insn, or -1 if the matching has not yet been attempted.
-
-Such matching is never attempted and this field remains -1 on an insn
-whose pattern consists of a single @code{use}, @code{clobber},
-@code{asm_input}, @code{addr_vec} or @code{addr_diff_vec} expression.
-
-@findex asm_noperands
-Matching is also never attempted on insns that result from an @code{asm}
-statement. These contain at least one @code{asm_operands} expression.
-The function @code{asm_noperands} returns a non-negative value for
-such insns.
-
-In the debugging output, this field is printed as a number followed by
-a symbolic representation that locates the pattern in the @file{md}
-file as some small positive or negative offset from a named pattern.
-
-@findex LOG_LINKS
-@item LOG_LINKS (@var{i})
-A list (chain of @code{insn_list} expressions) giving information about
-dependencies between instructions within a basic block. Neither a jump
-nor a label may come between the related insns.
-
-@findex REG_NOTES
-@item REG_NOTES (@var{i})
-A list (chain of @code{expr_list} and @code{insn_list} expressions)
-giving miscellaneous information about the insn. It is often
-information pertaining to the registers used in this insn.
-@end table
-
-The @code{LOG_LINKS} field of an insn is a chain of @code{insn_list}
-expressions. Each of these has two operands: the first is an insn,
-and the second is another @code{insn_list} expression (the next one in
-the chain). The last @code{insn_list} in the chain has a null pointer
-as second operand. The significant thing about the chain is which
-insns appear in it (as first operands of @code{insn_list}
-expressions). Their order is not significant.
-
-This list is originally set up by the flow analysis pass; it is a null
-pointer until then. Flow only adds links for those data dependencies
-which can be used for instruction combination. For each insn, the flow
-analysis pass adds a link to insns which store into registers values
-that are used for the first time in this insn. The instruction
-scheduling pass adds extra links so that every dependence will be
-represented. Links represent data dependencies, antidependencies and
-output dependencies; the machine mode of the link distinguishes these
-three types: antidependencies have mode @code{REG_DEP_ANTI}, output
-dependencies have mode @code{REG_DEP_OUTPUT}, and data dependencies have
-mode @code{VOIDmode}.
-
-The @code{REG_NOTES} field of an insn is a chain similar to the
-@code{LOG_LINKS} field but it includes @code{expr_list} expressions in
-addition to @code{insn_list} expressions. There are several kinds of
-register notes, which are distinguished by the machine mode, which in a
-register note is really understood as being an @code{enum reg_note}.
-The first operand @var{op} of the note is data whose meaning depends on
-the kind of note.
-
-@findex REG_NOTE_KIND
-@findex PUT_REG_NOTE_KIND
-The macro @code{REG_NOTE_KIND (@var{x})} returns the kind of
-register note. Its counterpart, the macro @code{PUT_REG_NOTE_KIND
-(@var{x}, @var{newkind})} sets the register note type of @var{x} to be
-@var{newkind}.
-
-Register notes are of three classes: They may say something about an
-input to an insn, they may say something about an output of an insn, or
-they may create a linkage between two insns. There are also a set
-of values that are only used in @code{LOG_LINKS}.
-
-These register notes annotate inputs to an insn:
-
-@table @code
-@findex REG_DEAD
-@item REG_DEAD
-The value in @var{op} dies in this insn; that is to say, altering the
-value immediately after this insn would not affect the future behavior
-of the program.
-
-This does not necessarily mean that the register @var{op} has no useful
-value after this insn since it may also be an output of the insn. In
-such a case, however, a @code{REG_DEAD} note would be redundant and is
-usually not present until after the reload pass, but no code relies on
-this fact.
-
-@findex REG_INC
-@item REG_INC
-The register @var{op} is incremented (or decremented; at this level
-there is no distinction) by an embedded side effect inside this insn.
-This means it appears in a @code{post_inc}, @code{pre_inc},
-@code{post_dec} or @code{pre_dec} expression.
-
-@findex REG_NONNEG
-@item REG_NONNEG
-The register @var{op} is known to have a nonnegative value when this
-insn is reached. This is used so that decrement and branch until zero
-instructions, such as the m68k dbra, can be matched.
-
-The @code{REG_NONNEG} note is added to insns only if the machine
-description has a @samp{decrement_and_branch_until_zero} pattern.
-
-@findex REG_NO_CONFLICT
-@item REG_NO_CONFLICT
-This insn does not cause a conflict between @var{op} and the item
-being set by this insn even though it might appear that it does.
-In other words, if the destination register and @var{op} could
-otherwise be assigned the same register, this insn does not
-prevent that assignment.
-
-Insns with this note are usually part of a block that begins with a
-@code{clobber} insn specifying a multi-word pseudo register (which will
-be the output of the block), a group of insns that each set one word of
-the value and have the @code{REG_NO_CONFLICT} note attached, and a final
-insn that copies the output to itself with an attached @code{REG_EQUAL}
-note giving the expression being computed. This block is encapsulated
-with @code{REG_LIBCALL} and @code{REG_RETVAL} notes on the first and
-last insns, respectively.
-
-@findex REG_LABEL
-@item REG_LABEL
-This insn uses @var{op}, a @code{code_label}, but is not a
-@code{jump_insn}. The presence of this note allows jump optimization to
-be aware that @var{op} is, in fact, being used.
-@end table
-
-The following notes describe attributes of outputs of an insn:
-
-@table @code
-@findex REG_EQUIV
-@findex REG_EQUAL
-@item REG_EQUIV
-@itemx REG_EQUAL
-This note is only valid on an insn that sets only one register and
-indicates that that register will be equal to @var{op} at run time; the
-scope of this equivalence differs between the two types of notes. The
-value which the insn explicitly copies into the register may look
-different from @var{op}, but they will be equal at run time. If the
-output of the single @code{set} is a @code{strict_low_part} expression,
-the note refers to the register that is contained in @code{SUBREG_REG}
-of the @code{subreg} expression.
-
-For @code{REG_EQUIV}, the register is equivalent to @var{op} throughout
-the entire function, and could validly be replaced in all its
-occurrences by @var{op}. (``Validly'' here refers to the data flow of
-the program; simple replacement may make some insns invalid.) For
-example, when a constant is loaded into a register that is never
-assigned any other value, this kind of note is used.
-
-When a parameter is copied into a pseudo-register at entry to a function,
-a note of this kind records that the register is equivalent to the stack
-slot where the parameter was passed. Although in this case the register
-may be set by other insns, it is still valid to replace the register
-by the stack slot throughout the function.
-
-A @code{REG_EQUIV} note is also used on an instruction which copies a
-register parameter into a pseudo-register at entry to a function, if
-there is a stack slot where that parameter could be stored. Although
-other insns may set the pseudo-register, it is valid for the compiler to
-replace the pseudo-register by stack slot throughout the function,
-provided the compiler ensures that the stack slot is properly
-initialized by making the replacement in the initial copy instruction as
-well. This is used on machines for which the calling convention
-allocates stack space for register parameters. See
-@code{REG_PARM_STACK_SPACE} in @ref{Stack Arguments}.
-
-In the case of @code{REG_EQUAL}, the register that is set by this insn
-will be equal to @var{op} at run time at the end of this insn but not
-necessarily elsewhere in the function. In this case, @var{op}
-is typically an arithmetic expression. For example, when a sequence of
-insns such as a library call is used to perform an arithmetic operation,
-this kind of note is attached to the insn that produces or copies the
-final value.
-
-These two notes are used in different ways by the compiler passes.
-@code{REG_EQUAL} is used by passes prior to register allocation (such as
-common subexpression elimination and loop optimization) to tell them how
-to think of that value. @code{REG_EQUIV} notes are used by register
-allocation to indicate that there is an available substitute expression
-(either a constant or a @code{mem} expression for the location of a
-parameter on the stack) that may be used in place of a register if
-insufficient registers are available.
-
-Except for stack homes for parameters, which are indicated by a
-@code{REG_EQUIV} note and are not useful to the early optimization
-passes and pseudo registers that are equivalent to a memory location
-throughout there entire life, which is not detected until later in
-the compilation, all equivalences are initially indicated by an attached
-@code{REG_EQUAL} note. In the early stages of register allocation, a
-@code{REG_EQUAL} note is changed into a @code{REG_EQUIV} note if
-@var{op} is a constant and the insn represents the only set of its
-destination register.
-
-Thus, compiler passes prior to register allocation need only check for
-@code{REG_EQUAL} notes and passes subsequent to register allocation
-need only check for @code{REG_EQUIV} notes.
-
-@findex REG_UNUSED
-@item REG_UNUSED
-The register @var{op} being set by this insn will not be used in a
-subsequent insn. This differs from a @code{REG_DEAD} note, which
-indicates that the value in an input will not be used subsequently.
-These two notes are independent; both may be present for the same
-register.
-
-@findex REG_WAS_0
-@item REG_WAS_0
-The single output of this insn contained zero before this insn.
-@var{op} is the insn that set it to zero. You can rely on this note if
-it is present and @var{op} has not been deleted or turned into a @code{note};
-its absence implies nothing.
-@end table
-
-These notes describe linkages between insns. They occur in pairs: one
-insn has one of a pair of notes that points to a second insn, which has
-the inverse note pointing back to the first insn.
-
-@table @code
-@findex REG_RETVAL
-@item REG_RETVAL
-This insn copies the value of a multi-insn sequence (for example, a
-library call), and @var{op} is the first insn of the sequence (for a
-library call, the first insn that was generated to set up the arguments
-for the library call).
-
-Loop optimization uses this note to treat such a sequence as a single
-operation for code motion purposes and flow analysis uses this note to
-delete such sequences whose results are dead.
-
-A @code{REG_EQUAL} note will also usually be attached to this insn to
-provide the expression being computed by the sequence.
-
-These notes will be deleted after reload, since they are no longer
-accurate or useful.
-
-@findex REG_LIBCALL
-@item REG_LIBCALL
-This is the inverse of @code{REG_RETVAL}: it is placed on the first
-insn of a multi-insn sequence, and it points to the last one.
-
-These notes are deleted after reload, since they are no longer useful or
-accurate.
-
-@findex REG_CC_SETTER
-@findex REG_CC_USER
-@item REG_CC_SETTER
-@itemx REG_CC_USER
-On machines that use @code{cc0}, the insns which set and use @code{cc0}
-set and use @code{cc0} are adjacent. However, when branch delay slot
-filling is done, this may no longer be true. In this case a
-@code{REG_CC_USER} note will be placed on the insn setting @code{cc0} to
-point to the insn using @code{cc0} and a @code{REG_CC_SETTER} note will
-be placed on the insn using @code{cc0} to point to the insn setting
-@code{cc0}.@refill
-@end table
-
-These values are only used in the @code{LOG_LINKS} field, and indicate
-the type of dependency that each link represents. Links which indicate
-a data dependence (a read after write dependence) do not use any code,
-they simply have mode @code{VOIDmode}, and are printed without any
-descriptive text.
-
-@table @code
-@findex REG_DEP_ANTI
-@item REG_DEP_ANTI
-This indicates an anti dependence (a write after read dependence).
-
-@findex REG_DEP_OUTPUT
-@item REG_DEP_OUTPUT
-This indicates an output dependence (a write after write dependence).
-@end table
-
-These notes describe information gathered from gcov profile data. They
-are stored in the @code{REG_NOTES} field of an insn as an
-@code{expr_list}.
-
-@table @code
-@findex REG_EXEC_COUNT
-@item REG_EXEC_COUNT
-This is used to indicate the number of times a basic block was executed
-according to the profile data. The note is attached to the first insn in
-the basic block.
-
-@findex REG_BR_PROB
-@item REG_BR_PROB
-This is used to specify the ratio of branches to non-branches of a
-branch insn according to the profile data. The value is stored as a
-value between 0 and REG_BR_PROB_BASE; larger values indicate a higher
-probability that the branch will be taken.
-
-@findex REG_BR_PRED
-@item REG_BR_PRED
-These notes are found in JUMP insns after delayed branch scheduling
-has taken place. They indicate both the direction and the likelyhood
-of the JUMP. The format is a bitmask of ATTR_FLAG_* values.
-
-@findex REG_FRAME_RELATED_EXPR
-@item REG_FRAME_RELATED_EXPR
-This is used on an RTX_FRAME_RELATED_P insn wherein the attached expression
-is used in place of the actual insn pattern. This is done in cases where
-the pattern is either complex or misleading.
-@end table
-
-For convenience, the machine mode in an @code{insn_list} or
-@code{expr_list} is printed using these symbolic codes in debugging dumps.
-
-@findex insn_list
-@findex expr_list
-The only difference between the expression codes @code{insn_list} and
-@code{expr_list} is that the first operand of an @code{insn_list} is
-assumed to be an insn and is printed in debugging dumps as the insn's
-unique id; the first operand of an @code{expr_list} is printed in the
-ordinary way as an expression.
-
-@node Calls, Sharing, Insns, RTL
-@section RTL Representation of Function-Call Insns
-@cindex calling functions in RTL
-@cindex RTL function-call insns
-@cindex function-call insns
-
-Insns that call subroutines have the RTL expression code @code{call_insn}.
-These insns must satisfy special rules, and their bodies must use a special
-RTL expression code, @code{call}.
-
-@cindex @code{call} usage
-A @code{call} expression has two operands, as follows:
-
-@example
-(call (mem:@var{fm} @var{addr}) @var{nbytes})
-@end example
-
-@noindent
-Here @var{nbytes} is an operand that represents the number of bytes of
-argument data being passed to the subroutine, @var{fm} is a machine mode
-(which must equal as the definition of the @code{FUNCTION_MODE} macro in
-the machine description) and @var{addr} represents the address of the
-subroutine.
-
-For a subroutine that returns no value, the @code{call} expression as
-shown above is the entire body of the insn, except that the insn might
-also contain @code{use} or @code{clobber} expressions.
-
-@cindex @code{BLKmode}, and function return values
-For a subroutine that returns a value whose mode is not @code{BLKmode},
-the value is returned in a hard register. If this register's number is
-@var{r}, then the body of the call insn looks like this:
-
-@example
-(set (reg:@var{m} @var{r})
- (call (mem:@var{fm} @var{addr}) @var{nbytes}))
-@end example
-
-@noindent
-This RTL expression makes it clear (to the optimizer passes) that the
-appropriate register receives a useful value in this insn.
-
-When a subroutine returns a @code{BLKmode} value, it is handled by
-passing to the subroutine the address of a place to store the value.
-So the call insn itself does not ``return'' any value, and it has the
-same RTL form as a call that returns nothing.
-
-On some machines, the call instruction itself clobbers some register,
-for example to contain the return address. @code{call_insn} insns
-on these machines should have a body which is a @code{parallel}
-that contains both the @code{call} expression and @code{clobber}
-expressions that indicate which registers are destroyed. Similarly,
-if the call instruction requires some register other than the stack
-pointer that is not explicitly mentioned it its RTL, a @code{use}
-subexpression should mention that register.
-
-Functions that are called are assumed to modify all registers listed in
-the configuration macro @code{CALL_USED_REGISTERS} (@pxref{Register
-Basics}) and, with the exception of @code{const} functions and library
-calls, to modify all of memory.
-
-Insns containing just @code{use} expressions directly precede the
-@code{call_insn} insn to indicate which registers contain inputs to the
-function. Similarly, if registers other than those in
-@code{CALL_USED_REGISTERS} are clobbered by the called function, insns
-containing a single @code{clobber} follow immediately after the call to
-indicate which registers.
-
-@node Sharing
-@section Structure Sharing Assumptions
-@cindex sharing of RTL components
-@cindex RTL structure sharing assumptions
-
-The compiler assumes that certain kinds of RTL expressions are unique;
-there do not exist two distinct objects representing the same value.
-In other cases, it makes an opposite assumption: that no RTL expression
-object of a certain kind appears in more than one place in the
-containing structure.
-
-These assumptions refer to a single function; except for the RTL
-objects that describe global variables and external functions,
-and a few standard objects such as small integer constants,
-no RTL objects are common to two functions.
-
-@itemize @bullet
-@cindex @code{reg}, RTL sharing
-@item
-Each pseudo-register has only a single @code{reg} object to represent it,
-and therefore only a single machine mode.
-
-@cindex symbolic label
-@cindex @code{symbol_ref}, RTL sharing
-@item
-For any symbolic label, there is only one @code{symbol_ref} object
-referring to it.
-
-@cindex @code{const_int}, RTL sharing
-@item
-There is only one @code{const_int} expression with value 0, only
-one with value 1, and only one with value @minus{}1.
-Some other integer values are also stored uniquely.
-
-@cindex @code{pc}, RTL sharing
-@item
-There is only one @code{pc} expression.
-
-@cindex @code{cc0}, RTL sharing
-@item
-There is only one @code{cc0} expression.
-
-@cindex @code{const_double}, RTL sharing
-@item
-There is only one @code{const_double} expression with value 0 for
-each floating point mode. Likewise for values 1 and 2.
-
-@cindex @code{label_ref}, RTL sharing
-@cindex @code{scratch}, RTL sharing
-@item
-No @code{label_ref} or @code{scratch} appears in more than one place in
-the RTL structure; in other words, it is safe to do a tree-walk of all
-the insns in the function and assume that each time a @code{label_ref}
-or @code{scratch} is seen it is distinct from all others that are seen.
-
-@cindex @code{mem}, RTL sharing
-@item
-Only one @code{mem} object is normally created for each static
-variable or stack slot, so these objects are frequently shared in all
-the places they appear. However, separate but equal objects for these
-variables are occasionally made.
-
-@cindex @code{asm_operands}, RTL sharing
-@item
-When a single @code{asm} statement has multiple output operands, a
-distinct @code{asm_operands} expression is made for each output operand.
-However, these all share the vector which contains the sequence of input
-operands. This sharing is used later on to test whether two
-@code{asm_operands} expressions come from the same statement, so all
-optimizations must carefully preserve the sharing if they copy the
-vector at all.
-
-@item
-No RTL object appears in more than one place in the RTL structure
-except as described above. Many passes of the compiler rely on this
-by assuming that they can modify RTL objects in place without unwanted
-side-effects on other insns.
-
-@findex unshare_all_rtl
-@item
-During initial RTL generation, shared structure is freely introduced.
-After all the RTL for a function has been generated, all shared
-structure is copied by @code{unshare_all_rtl} in @file{emit-rtl.c},
-after which the above rules are guaranteed to be followed.
-
-@findex copy_rtx_if_shared
-@item
-During the combiner pass, shared structure within an insn can exist
-temporarily. However, the shared structure is copied before the
-combiner is finished with the insn. This is done by calling
-@code{copy_rtx_if_shared}, which is a subroutine of
-@code{unshare_all_rtl}.
-@end itemize
-
-@node Reading RTL
-@section Reading RTL
-
-To read an RTL object from a file, call @code{read_rtx}. It takes one
-argument, a stdio stream, and returns a single RTL object.
-
-Reading RTL from a file is very slow. This is not currently a
-problem since reading RTL occurs only as part of building the
-compiler.
-
-People frequently have the idea of using RTL stored as text in a file as
-an interface between a language front end and the bulk of GNU CC. This
-idea is not feasible.
-
-GNU CC was designed to use RTL internally only. Correct RTL for a given
-program is very dependent on the particular target machine. And the RTL
-does not contain all the information about the program.
-
-The proper way to interface GNU CC to a new language front end is with
-the ``tree'' data structure. There is no manual for this data
-structure, but it is described in the files @file{tree.h} and
-@file{tree.def}.
diff --git a/gcc/splay-tree.c b/gcc/splay-tree.c
new file mode 100755
index 0000000..3c53a4c
--- /dev/null
+++ b/gcc/splay-tree.c
@@ -0,0 +1,329 @@
+/* A splay-tree datatype.
+ Copyright (C) 1998 Free Software Foundation, Inc.
+ Contributed by Mark Mitchell (mark@markmitchell.com).
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* For an easily readable description of splay-trees, see:
+
+ Lewis, Harry R. and Denenberg, Larry. Data Structures and Their
+ Algorithms. Harper-Collins, Inc. 1991. */
+
+#include "config.h"
+#include <stdlib.h>
+
+#include "splay-tree.h"
+
+static void splay_tree_delete_helper (splay_tree, splay_tree_node);
+static void splay_tree_splay (splay_tree, splay_tree_key);
+static splay_tree_node splay_tree_splay_helper
+ (splay_tree,
+ splay_tree_key,
+ splay_tree_node*,
+ splay_tree_node*,
+ splay_tree_node*);
+static int splay_tree_foreach_helper (splay_tree,
+ splay_tree_node,
+ splay_tree_foreach_fn,
+ void*);
+
+/* Deallocate NODE (a member of SP), and all its sub-trees. */
+
+static void
+splay_tree_delete_helper (sp, node)
+ splay_tree sp;
+ splay_tree_node node;
+{
+ if (!node)
+ return;
+
+ splay_tree_delete_helper (sp, node->left);
+ splay_tree_delete_helper (sp, node->right);
+
+ if (sp->delete_key)
+ (*sp->delete_key)(node->key);
+ if (sp->delete_value)
+ (*sp->delete_value)(node->value);
+
+ free ((char*) node);
+}
+
+/* Help splay SP around KEY. PARENT and GRANDPARENT are the parent
+ and grandparent, respectively, of NODE. */
+
+static splay_tree_node
+splay_tree_splay_helper (sp, key, node, parent, grandparent)
+ splay_tree sp;
+ splay_tree_key key;
+ splay_tree_node *node;
+ splay_tree_node *parent;
+ splay_tree_node *grandparent;
+{
+ splay_tree_node *next;
+ splay_tree_node n;
+ int comparison;
+
+ n = *node;
+
+ if (!n)
+ return *parent;
+
+ comparison = (*sp->comp) (key, n->key);
+
+ if (comparison == 0)
+ /* We've found the target. */
+ next = 0;
+ else if (comparison < 0)
+ /* The target is to the left. */
+ next = &n->left;
+ else
+ /* The target is to the right. */
+ next = &n->right;
+
+ if (next)
+ {
+ /* Continue down the tree. */
+ n = splay_tree_splay_helper (sp, key, next, node, parent);
+
+ /* The recursive call will change the place to which NODE
+ points. */
+ if (*node != n)
+ return n;
+ }
+
+ if (!parent)
+ /* NODE is the root. We are done. */
+ return n;
+
+ /* First, handle the case where there is no grandparent (i.e.,
+ *PARENT is the root of the tree.) */
+ if (!grandparent)
+ {
+ if (n == (*parent)->left)
+ {
+ *node = n->right;
+ n->right = *parent;
+ }
+ else
+ {
+ *node = n->left;
+ n->left = *parent;
+ }
+ *parent = n;
+ return n;
+ }
+
+ /* Next handle the cases where both N and *PARENT are left children,
+ or where both are right children. */
+ if (n == (*parent)->left && *parent == (*grandparent)->left)
+ {
+ splay_tree_node p = *parent;
+
+ (*grandparent)->left = p->right;
+ p->right = *grandparent;
+ p->left = n->right;
+ n->right = p;
+ *grandparent = n;
+ return n;
+ }
+ else if (n == (*parent)->right && *parent == (*grandparent)->right)
+ {
+ splay_tree_node p = *parent;
+
+ (*grandparent)->right = p->left;
+ p->left = *grandparent;
+ p->right = n->left;
+ n->left = p;
+ *grandparent = n;
+ return n;
+ }
+
+ /* Finally, deal with the case where N is a left child, but *PARENT
+ is a right child, or vice versa. */
+ if (n == (*parent)->left)
+ {
+ (*parent)->left = n->right;
+ n->right = *parent;
+ (*grandparent)->right = n->left;
+ n->left = *grandparent;
+ *grandparent = n;
+ return n;
+ }
+ else
+ {
+ (*parent)->right = n->left;
+ n->left = *parent;
+ (*grandparent)->left = n->right;
+ n->right = *grandparent;
+ *grandparent = n;
+ return n;
+ }
+}
+
+/* Splay SP around KEY. */
+
+static void
+splay_tree_splay (sp, key)
+ splay_tree sp;
+ splay_tree_key key;
+{
+ if (sp->root == 0)
+ return;
+
+ splay_tree_splay_helper (sp, key, &sp->root,
+ /*grandparent=*/0, /*parent=*/0);
+}
+
+/* Call FN, passing it the DATA, for every node below NODE, all of
+ which are from SP, following an in-order traversal. If FN every
+ returns a non-zero value, the iteration ceases immediately, and the
+ value is returned. Otherwise, this function returns 0. */
+
+static int
+splay_tree_foreach_helper (sp, node, fn, data)
+ splay_tree sp;
+ splay_tree_node node;
+ splay_tree_foreach_fn fn;
+ void* data;
+{
+ int val;
+
+ if (!node)
+ return 0;
+
+ val = splay_tree_foreach_helper (sp, node->left, fn, data);
+ if (val)
+ return val;
+
+ val = (*fn)(node, data);
+ if (val)
+ return val;
+
+ return splay_tree_foreach_helper (sp, node->right, fn, data);
+}
+
+/* Allocate a new splay tree, using COMPARE_FN to compare nodes,
+ DELETE_KEY_FN to deallocate keys, and DELETE_VALUE_FN to deallocate
+ values. */
+
+splay_tree
+splay_tree_new (compare_fn, delete_key_fn, delete_value_fn)
+ splay_tree_compare_fn compare_fn;
+ splay_tree_delete_key_fn delete_key_fn;
+ splay_tree_delete_value_fn delete_value_fn;
+{
+ splay_tree sp = (splay_tree) xmalloc (sizeof (struct splay_tree));
+ sp->root = 0;
+ sp->comp = compare_fn;
+ sp->delete_key = delete_key_fn;
+ sp->delete_value = delete_value_fn;
+
+ return sp;
+}
+
+/* Deallocate SP. */
+
+void
+splay_tree_delete (sp)
+ splay_tree sp;
+{
+ splay_tree_delete_helper (sp, sp->root);
+ free ((char*) sp);
+}
+
+/* Insert a new node (associating KEY with DATA) into SP. If a
+ previous node with the indicated KEY exists, its data is replaced
+ with the new value. */
+
+void
+splay_tree_insert (sp, key, value)
+ splay_tree sp;
+ splay_tree_key key;
+ splay_tree_value value;
+{
+ int comparison;
+
+ splay_tree_splay (sp, key);
+
+ if (sp->root)
+ comparison = (*sp->comp)(sp->root->key, key);
+
+ if (sp->root && comparison == 0)
+ {
+ /* If the root of the tree already has the indicated KEY, just
+ replace the value with VALUE. */
+ if (sp->delete_value)
+ (*sp->delete_value)(sp->root->value);
+ sp->root->value = value;
+ }
+ else
+ {
+ /* Create a new node, and insert it at the root. */
+ splay_tree_node node;
+
+ node = (splay_tree_node) xmalloc (sizeof (struct splay_tree_node));
+ node->key = key;
+ node->value = value;
+
+ if (!sp->root)
+ node->left = node->right = 0;
+ else if (comparison < 0)
+ {
+ node->left = sp->root;
+ node->right = node->left->right;
+ node->left->right = 0;
+ }
+ else
+ {
+ node->right = sp->root;
+ node->left = node->right->left;
+ node->right->left = 0;
+ }
+
+ sp->root = node;
+ }
+}
+
+/* Lookup KEY in SP, returning VALUE if present, and NULL
+ otherwise. */
+
+splay_tree_node
+splay_tree_lookup (sp, key)
+ splay_tree sp;
+ splay_tree_key key;
+{
+ splay_tree_splay (sp, key);
+
+ if (sp->root && (*sp->comp)(sp->root->key, key) == 0)
+ return sp->root;
+ else
+ return 0;
+}
+
+/* Call FN, passing it the DATA, for every node in SP, following an
+ in-order traversal. If FN every returns a non-zero value, the
+ iteration ceases immediately, and the value is returned.
+ Otherwise, this function returns 0. */
+
+int
+splay_tree_foreach (sp, fn, data)
+ splay_tree sp;
+ splay_tree_foreach_fn fn;
+ void *data;
+{
+ return splay_tree_foreach_helper (sp, sp->root, fn, data);
+}
diff --git a/gcc/splay-tree.h b/gcc/splay-tree.h
new file mode 100755
index 0000000..be367a3
--- /dev/null
+++ b/gcc/splay-tree.h
@@ -0,0 +1,102 @@
+/* A splay-tree datatype.
+ Copyright (C) 1998 Free Software Foundation, Inc.
+ Contributed by Mark Mitchell (mark@markmitchell.com).
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* For an easily readable description of splay-trees, see:
+
+ Lewis, Harry R. and Denenberg, Larry. Data Structures and Their
+ Algorithms. Harper-Collins, Inc. 1991.
+
+ The major feature of splay trees is that all basic tree operations
+ are amortized O(log n) time for a tree with n nodes. */
+
+#ifndef _SPLAY_TREE_H
+#define _SPLAY_TREE_H
+
+/* Use typedefs for the key and data types to facilitate changing
+ these types, if necessary. These types should be sufficiently wide
+ that any pointer or scalar can be cast to these types, and then
+ cast back, without loss of precision. */
+typedef unsigned long int splay_tree_key;
+typedef unsigned long int splay_tree_value;
+
+/* Forward declaration for a node in the tree. */
+typedef struct splay_tree_node *splay_tree_node;
+
+/* The type of a function which compares two splay-tree keys. The
+ function should return values as for qsort. */
+typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key);
+
+/* The type of a function used to deallocate any resources associated
+ with the key. */
+typedef void (*splay_tree_delete_key_fn) (splay_tree_key);
+
+/* The type of a function used to deallocate any resources associated
+ with the value. */
+typedef void (*splay_tree_delete_value_fn) (splay_tree_value);
+
+/* The type of a function used to iterate over the tree. */
+typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*);
+
+/* The nodes in the splay tree. */
+struct splay_tree_node
+{
+ /* The key. */
+ splay_tree_key key;
+
+ /* The value. */
+ splay_tree_value value;
+
+ /* The left and right children, respectively. */
+ splay_tree_node left;
+ splay_tree_node right;
+};
+
+/* The splay tree itself. */
+typedef struct splay_tree
+{
+ /* The root of the tree. */
+ splay_tree_node root;
+
+ /* The comparision function. */
+ splay_tree_compare_fn comp;
+
+ /* The deallocate-key function. NULL if no cleanup is necessary. */
+ splay_tree_delete_key_fn delete_key;
+
+ /* The deallocate-value function. NULL if no cleanup is necessary. */
+ splay_tree_delete_value_fn delete_value;
+} *splay_tree;
+
+extern splay_tree splay_tree_new (splay_tree_compare_fn,
+ splay_tree_delete_key_fn,
+ splay_tree_delete_value_fn);
+extern void splay_tree_delete (splay_tree);
+extern void splay_tree_insert (splay_tree,
+ splay_tree_key,
+ splay_tree_value);
+extern splay_tree_node splay_tree_lookup
+ (splay_tree,
+ splay_tree_key);
+extern int splay_tree_foreach (splay_tree,
+ splay_tree_foreach_fn,
+ void*);
+
+#endif /* _SPLAY_TREE_H */
diff --git a/gcc/system.h b/gcc/system.h
index b2f1d1e..1022bbd 100755
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -102,6 +102,9 @@ Boston, MA 02111-1307, USA. */
#define _(String) String
#define N_(String) String
-#include "libiberty.h"
+extern void *xmalloc (size_t);
+extern void *xrealloc (void *, size_t);
+extern void *xcalloc (size_t, size_t);
+extern char *xstrdup (const char *);
#endif /* __GCC_SYSTEM_H__ */
diff --git a/gcc/texinfo.tex b/gcc/texinfo.tex
deleted file mode 100755
index 469f471..0000000
--- a/gcc/texinfo.tex
+++ /dev/null
@@ -1,5298 +0,0 @@
-% texinfo.tex -- TeX macros to handle Texinfo files.
-% $Id: texinfo.tex,v 1.23 1998/11/11 05:49:30 law Exp $
-%
-% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98
-% Free Software Foundation, Inc.
-%
-% This texinfo.tex file is free software; you can redistribute it and/or
-% modify it under the terms of the GNU General Public License as
-% published by the Free Software Foundation; either version 2, or (at
-% your option) any later version.
-%
-% This texinfo.tex file is distributed in the hope that it will be
-% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-% General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this texinfo.tex file; see the file COPYING. If not, write
-% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-% Boston, MA 02111-1307, USA.
-%
-% In other words, you are welcome to use, share and improve this program.
-% You are forbidden to forbid anyone else to use, share and improve
-% what you give them. Help stamp out software-hoarding!
-%
-% Please try the latest version of texinfo.tex before submitting bug
-% reports; you can get the latest version from:
-% ftp://ftp.gnu.org/pub/gnu/texinfo.tex
-% /home/gd/gnu/doc/texinfo.tex on the GNU machines.
-% (and all GNU mirrors, see ftp://ftp.gnu.org/pub/gnu/README.mirrors)
-% ftp://tug.org/tex/texinfo.tex
-% ftp://ctan.org/macros/texinfo/texinfo.tex
-% (and all CTAN mirrors, finger ctan@tug.org for a list).
-% The texinfo.tex in the texinfo distribution itself could well be out
-% of date, so if that's what you're using, please check.
-%
-% Send bug reports to bug-texinfo@gnu.org.
-% Please include a precise test case in each bug report,
-% including a complete document with which we can reproduce the problem.
-%
-% To process a Texinfo manual with TeX, it's most reliable to use the
-% texi2dvi shell script that comes with the distribution. For simple
-% manuals, you can get away with:
-% tex foo.texi
-% texindex foo.??
-% tex foo.texi
-% tex foo.texi
-% dvips foo.dvi -o # or whatever, to process the dvi file.
-% The extra runs of TeX get the cross-reference information correct.
-% Sometimes one run after texindex suffices, and sometimes you need more
-% than two; texi2dvi does it as many times as necessary.
-
-
-% Make it possible to create a .fmt file just by loading this file:
-% if the underlying format is not loaded, start by loading it now.
-% Added by gildea November 1993.
-\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
-
-% This automatically updates the version number based on RCS.
-\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
-\deftexinfoversion$Revision: 1.23 $
-\message{Loading texinfo package [Version \texinfoversion]:}
-
-% If in a .fmt file, print the version number
-% and turn on active characters that we couldn't do earlier because
-% they might have appeared in the input file name.
-\everyjob{\message{[Texinfo version \texinfoversion]}\message{}
- \catcode`+=\active \catcode`\_=\active}
-
-% Save some parts of plain tex whose names we will redefine.
-
-\let\ptexb=\b
-\let\ptexbullet=\bullet
-\let\ptexc=\c
-\let\ptexcomma=\,
-\let\ptexdot=\.
-\let\ptexdots=\dots
-\let\ptexend=\end
-\let\ptexequiv=\equiv
-\let\ptexexclam=\!
-\let\ptexi=\i
-\let\ptexlbrace=\{
-\let\ptexrbrace=\}
-\let\ptexstar=\*
-\let\ptext=\t
-
-% We never want plain's outer \+ definition in Texinfo.
-% For @tex, we can use \tabalign.
-\let\+ = \relax
-
-
-\message{Basics,}
-\chardef\other=12
-
-% If this character appears in an error message or help string, it
-% starts a new line in the output.
-\newlinechar = `^^J
-
-% Set up fixed words for English if not already set.
-\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
-\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
-\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
-\ifx\putwordInfo\undefined \gdef\putwordfile{Info}\fi
-\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
-\ifx\putwordon\undefined \gdef\putwordon{on}\fi
-\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
-\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
-\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
-\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
-\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
-\ifx\putwordShortContents\undefined \gdef\putwordShortContents{Short Contents}\fi
-\ifx\putwordTableofContents\undefined\gdef\putwordTableofContents{Table of Contents}\fi
-
-% Ignore a token.
-%
-\def\gobble#1{}
-
-\hyphenation{ap-pen-dix}
-\hyphenation{mini-buf-fer mini-buf-fers}
-\hyphenation{eshell}
-\hyphenation{white-space}
-
-% Margin to add to right of even pages, to left of odd pages.
-\newdimen \bindingoffset
-\newdimen \normaloffset
-\newdimen\pagewidth \newdimen\pageheight
-
-% Sometimes it is convenient to have everything in the transcript file
-% and nothing on the terminal. We don't just call \tracingall here,
-% since that produces some useless output on the terminal.
-%
-\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\def\loggingall{\tracingcommands2 \tracingstats2
- \tracingpages1 \tracingoutput1 \tracinglostchars1
- \tracingmacros2 \tracingparagraphs1 \tracingrestores1
- \showboxbreadth\maxdimen\showboxdepth\maxdimen
-}%
-
-% For @cropmarks command.
-% Do @cropmarks to get crop marks.
-%
-\newif\ifcropmarks
-\let\cropmarks = \cropmarkstrue
-%
-% Dimensions to add cropmarks at corners.
-% Added by P. A. MacKay, 12 Nov. 1986
-%
-\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
-\newdimen\cornerlong \cornerlong=1pc
-\newdimen\cornerthick \cornerthick=.3pt
-\newdimen\topandbottommargin \topandbottommargin=.75in
-
-% Main output routine.
-\chardef\PAGE = 255
-\output = {\onepageout{\pagecontents\PAGE}}
-
-\newbox\headlinebox
-\newbox\footlinebox
-
-% \onepageout takes a vbox as an argument. Note that \pagecontents
-% does insertions, but you have to call it yourself.
-\def\onepageout#1{%
- \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
- %
- \ifodd\pageno \advance\hoffset by \bindingoffset
- \else \advance\hoffset by -\bindingoffset\fi
- %
- % Do this outside of the \shipout so @code etc. will be expanded in
- % the headline as they should be, not taken literally (outputting ''code).
- \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
- \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
- %
- {%
- % Have to do this stuff outside the \shipout because we want it to
- % take effect in \write's, yet the group defined by the \vbox ends
- % before the \shipout runs.
- %
- \escapechar = `\\ % use backslash in output files.
- \indexdummies % don't expand commands in the output.
- \normalturnoffactive % \ in index entries must not stay \, e.g., if
- % the page break happens to be in the middle of an example.
- \shipout\vbox{%
- \ifcropmarks \vbox to \outervsize\bgroup
- \hsize = \outerhsize
- \line{\ewtop\hfil\ewtop}%
- \nointerlineskip
- \line{%
- \vbox{\moveleft\cornerthick\nstop}%
- \hfill
- \vbox{\moveright\cornerthick\nstop}%
- }%
- \vskip\topandbottommargin
- \line\bgroup
- \hfil % center the page within the outer (page) hsize.
- \ifodd\pageno\hskip\bindingoffset\fi
- \vbox\bgroup
- \fi
- %
- \unvbox\headlinebox
- \pagebody{#1}%
- \ifdim\ht\footlinebox > 0pt
- % Only leave this space if the footline is nonempty.
- % (We lessened \vsize for it in \oddfootingxxx.)
- % The \baselineskip=24pt in plain's \makefootline has no effect.
- \vskip 2\baselineskip
- \unvbox\footlinebox
- \fi
- %
- \ifcropmarks
- \egroup % end of \vbox\bgroup
- \hfil\egroup % end of (centering) \line\bgroup
- \vskip\topandbottommargin plus1fill minus1fill
- \boxmaxdepth = \cornerthick
- \line{%
- \vbox{\moveleft\cornerthick\nsbot}%
- \hfill
- \vbox{\moveright\cornerthick\nsbot}%
- }%
- \nointerlineskip
- \line{\ewbot\hfil\ewbot}%
- \egroup % \vbox from first cropmarks clause
- \fi
- }% end of \shipout\vbox
- }% end of group with \turnoffactive
- \advancepageno
- \ifnum\outputpenalty>-20000 \else\dosupereject\fi
-}
-
-\newinsert\margin \dimen\margin=\maxdimen
-
-\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
-{\catcode`\@ =11
-\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
-% marginal hacks, juha@viisa.uucp (Juha Takala)
-\ifvoid\margin\else % marginal info is present
- \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
-\dimen@=\dp#1 \unvbox#1
-\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
-\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
-}
-
-% Here are the rules for the cropmarks. Note that they are
-% offset so that the space between them is truly \outerhsize or \outervsize
-% (P. A. MacKay, 12 November, 1986)
-%
-\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
-\def\nstop{\vbox
- {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
-\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
-\def\nsbot{\vbox
- {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
-
-% Parse an argument, then pass it to #1. The argument is the rest of
-% the input line (except we remove a trailing comment). #1 should be a
-% macro which expects an ordinary undelimited TeX argument.
-%
-\def\parsearg#1{%
- \let\next = #1%
- \begingroup
- \obeylines
- \futurelet\temp\parseargx
-}
-
-% If the next token is an obeyed space (from an @example environment or
-% the like), remove it and recurse. Otherwise, we're done.
-\def\parseargx{%
- % \obeyedspace is defined far below, after the definition of \sepspaces.
- \ifx\obeyedspace\temp
- \expandafter\parseargdiscardspace
- \else
- \expandafter\parseargline
- \fi
-}
-
-% Remove a single space (as the delimiter token to the macro call).
-{\obeyspaces %
- \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
-
-{\obeylines %
- \gdef\parseargline#1^^M{%
- \endgroup % End of the group started in \parsearg.
- %
- % First remove any @c comment, then any @comment.
- % Result of each macro is put in \toks0.
- \argremovec #1\c\relax %
- \expandafter\argremovecomment \the\toks0 \comment\relax %
- %
- % Call the caller's macro, saved as \next in \parsearg.
- \expandafter\next\expandafter{\the\toks0}%
- }%
-}
-
-% Since all \c{,omment} does is throw away the argument, we can let TeX
-% do that for us. The \relax here is matched by the \relax in the call
-% in \parseargline; it could be more or less anything, its purpose is
-% just to delimit the argument to the \c.
-\def\argremovec#1\c#2\relax{\toks0 = {#1}}
-\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
-
-% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
-% @end itemize @c foo
-% will have two active spaces as part of the argument with the
-% `itemize'. Here we remove all active spaces from #1, and assign the
-% result to \toks0.
-%
-% This loses if there are any *other* active characters besides spaces
-% in the argument -- _ ^ +, for example -- since they get expanded.
-% Fortunately, Texinfo does not define any such commands. (If it ever
-% does, the catcode of the characters in questionwill have to be changed
-% here.) But this means we cannot call \removeactivespaces as part of
-% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
-% that \parsearg gets might well have any character at all in it.
-%
-\def\removeactivespaces#1{%
- \begingroup
- \ignoreactivespaces
- \edef\temp{#1}%
- \global\toks0 = \expandafter{\temp}%
- \endgroup
-}
-
-% Change the active space to expand to nothing.
-%
-\begingroup
- \obeyspaces
- \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
-\endgroup
-
-
-\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
-
-%% These are used to keep @begin/@end levels from running away
-%% Call \inENV within environments (after a \begingroup)
-\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
-\def\ENVcheck{%
-\ifENV\errmessage{Still within an environment. Type Return to continue.}
-\endgroup\fi} % This is not perfect, but it should reduce lossage
-
-% @begin foo is the same as @foo, for now.
-\newhelp\EMsimple{Type <Return> to continue.}
-
-\outer\def\begin{\parsearg\beginxxx}
-
-\def\beginxxx #1{%
-\expandafter\ifx\csname #1\endcsname\relax
-{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
-\csname #1\endcsname\fi}
-
-% @end foo executes the definition of \Efoo.
-%
-\def\end{\parsearg\endxxx}
-\def\endxxx #1{%
- \removeactivespaces{#1}%
- \edef\endthing{\the\toks0}%
- %
- \expandafter\ifx\csname E\endthing\endcsname\relax
- \expandafter\ifx\csname \endthing\endcsname\relax
- % There's no \foo, i.e., no ``environment'' foo.
- \errhelp = \EMsimple
- \errmessage{Undefined command `@end \endthing'}%
- \else
- \unmatchedenderror\endthing
- \fi
- \else
- % Everything's ok; the right environment has been started.
- \csname E\endthing\endcsname
- \fi
-}
-
-% There is an environment #1, but it hasn't been started. Give an error.
-%
-\def\unmatchedenderror#1{%
- \errhelp = \EMsimple
- \errmessage{This `@end #1' doesn't have a matching `@#1'}%
-}
-
-% Define the control sequence \E#1 to give an unmatched @end error.
-%
-\def\defineunmatchedend#1{%
- \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
-}
-
-
-% Single-spacing is done by various environments (specifically, in
-% \nonfillstart and \quotations).
-\newskip\singlespaceskip \singlespaceskip = 12.5pt
-\def\singlespace{%
- % Why was this kern here? It messes up equalizing space above and below
- % environments. --karl, 6may93
- %{\advance \baselineskip by -\singlespaceskip
- %\kern \baselineskip}%
- \setleading \singlespaceskip
-}
-
-%% Simple single-character @ commands
-
-% @@ prints an @
-% Kludge this until the fonts are right (grr).
-\def\@{{\tt\char64}}
-
-% This is turned off because it was never documented
-% and you can use @w{...} around a quote to suppress ligatures.
-%% Define @` and @' to be the same as ` and '
-%% but suppressing ligatures.
-%\def\`{{`}}
-%\def\'{{'}}
-
-% Used to generate quoted braces.
-\def\mylbrace {{\tt\char123}}
-\def\myrbrace {{\tt\char125}}
-\let\{=\mylbrace
-\let\}=\myrbrace
-\begingroup
- % Definitions to produce actual \{ & \} command in an index.
- \catcode`\{ = 12 \catcode`\} = 12
- \catcode`\[ = 1 \catcode`\] = 2
- \catcode`\@ = 0 \catcode`\\ = 12
- @gdef@lbracecmd[\{]%
- @gdef@rbracecmd[\}]%
-@endgroup
-
-% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
-% Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H.
-\let\, = \c
-\let\dotaccent = \.
-\def\ringaccent#1{{\accent23 #1}}
-\let\tieaccent = \t
-\let\ubaraccent = \b
-\let\udotaccent = \d
-
-% Other special characters: @questiondown @exclamdown
-% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss.
-\def\questiondown{?`}
-\def\exclamdown{!`}
-
-% Dotless i and dotless j, used for accents.
-\def\imacro{i}
-\def\jmacro{j}
-\def\dotless#1{%
- \def\temp{#1}%
- \ifx\temp\imacro \ptexi
- \else\ifx\temp\jmacro \j
- \else \errmessage{@dotless can be used only with i or j}%
- \fi\fi
-}
-
-% Be sure we're in horizontal mode when doing a tie, since we make space
-% equivalent to this in @example-like environments. Otherwise, a space
-% at the beginning of a line will start with \penalty -- and
-% since \penalty is valid in vertical mode, we'd end up putting the
-% penalty on the vertical list instead of in the new paragraph.
-{\catcode`@ = 11
- % Avoid using \@M directly, because that causes trouble
- % if the definition is written into an index file.
- \global\let\tiepenalty = \@M
- \gdef\tie{\leavevmode\penalty\tiepenalty\ }
-}
-
-% @: forces normal size whitespace following.
-\def\:{\spacefactor=1000 }
-
-% @* forces a line break.
-\def\*{\hfil\break\hbox{}\ignorespaces}
-
-% @. is an end-of-sentence period.
-\def\.{.\spacefactor=3000 }
-
-% @! is an end-of-sentence bang.
-\def\!{!\spacefactor=3000 }
-
-% @? is an end-of-sentence query.
-\def\?{?\spacefactor=3000 }
-
-% @w prevents a word break. Without the \leavevmode, @w at the
-% beginning of a paragraph, when TeX is still in vertical mode, would
-% produce a whole line of output instead of starting the paragraph.
-\def\w#1{\leavevmode\hbox{#1}}
-
-% @group ... @end group forces ... to be all on one page, by enclosing
-% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
-% to keep its height that of a normal line. According to the rules for
-% \topskip (p.114 of the TeXbook), the glue inserted is
-% max (\topskip - \ht (first item), 0). If that height is large,
-% therefore, no glue is inserted, and the space between the headline and
-% the text is small, which looks bad.
-%
-\def\group{\begingroup
- \ifnum\catcode13=\active \else
- \errhelp = \groupinvalidhelp
- \errmessage{@group invalid in context where filling is enabled}%
- \fi
- %
- % The \vtop we start below produces a box with normal height and large
- % depth; thus, TeX puts \baselineskip glue before it, and (when the
- % next line of text is done) \lineskip glue after it. (See p.82 of
- % the TeXbook.) Thus, space below is not quite equal to space
- % above. But it's pretty close.
- \def\Egroup{%
- \egroup % End the \vtop.
- \endgroup % End the \group.
- }%
- %
- \vtop\bgroup
- % We have to put a strut on the last line in case the @group is in
- % the midst of an example, rather than completely enclosing it.
- % Otherwise, the interline space between the last line of the group
- % and the first line afterwards is too small. But we can't put the
- % strut in \Egroup, since there it would be on a line by itself.
- % Hence this just inserts a strut at the beginning of each line.
- \everypar = {\strut}%
- %
- % Since we have a strut on every line, we don't need any of TeX's
- % normal interline spacing.
- \offinterlineskip
- %
- % OK, but now we have to do something about blank
- % lines in the input in @example-like environments, which normally
- % just turn into \lisppar, which will insert no space now that we've
- % turned off the interline space. Simplest is to make them be an
- % empty paragraph.
- \ifx\par\lisppar
- \edef\par{\leavevmode \par}%
- %
- % Reset ^^M's definition to new definition of \par.
- \obeylines
- \fi
- %
- % Do @comment since we are called inside an environment such as
- % @example, where each end-of-line in the input causes an
- % end-of-line in the output. We don't want the end-of-line after
- % the `@group' to put extra space in the output. Since @group
- % should appear on a line by itself (according to the Texinfo
- % manual), we don't worry about eating any user text.
- \comment
-}
-%
-% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
-% message, so this ends up printing `@group can only ...'.
-%
-\newhelp\groupinvalidhelp{%
-group can only be used in environments such as @example,^^J%
-where each line of input produces a line of output.}
-
-% @need space-in-mils
-% forces a page break if there is not space-in-mils remaining.
-
-\newdimen\mil \mil=0.001in
-
-\def\need{\parsearg\needx}
-
-% Old definition--didn't work.
-%\def\needx #1{\par %
-%% This method tries to make TeX break the page naturally
-%% if the depth of the box does not fit.
-%{\baselineskip=0pt%
-%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000
-%\prevdepth=-1000pt
-%}}
-
-\def\needx#1{%
- % Go into vertical mode, so we don't make a big box in the middle of a
- % paragraph.
- \par
- %
- % Don't add any leading before our big empty box, but allow a page
- % break, since the best break might be right here.
- \allowbreak
- \nointerlineskip
- \vtop to #1\mil{\vfil}%
- %
- % TeX does not even consider page breaks if a penalty added to the
- % main vertical list is 10000 or more. But in order to see if the
- % empty box we just added fits on the page, we must make it consider
- % page breaks. On the other hand, we don't want to actually break the
- % page after the empty box. So we use a penalty of 9999.
- %
- % There is an extremely small chance that TeX will actually break the
- % page at this \penalty, if there are no other feasible breakpoints in
- % sight. (If the user is using lots of big @group commands, which
- % almost-but-not-quite fill up a page, TeX will have a hard time doing
- % good page breaking, for example.) However, I could not construct an
- % example where a page broke at this \penalty; if it happens in a real
- % document, then we can reconsider our strategy.
- \penalty9999
- %
- % Back up by the size of the box, whether we did a page break or not.
- \kern -#1\mil
- %
- % Do not allow a page break right after this kern.
- \nobreak
-}
-
-% @br forces paragraph break
-
-\let\br = \par
-
-% @dots{} output an ellipsis using the current font.
-% We do .5em per period so that it has the same spacing in a typewriter
-% font as three actual period characters.
-%
-\def\dots{\hbox to 1.5em{%
- \hskip 0pt plus 0.25fil minus 0.25fil
- .\hss.\hss.%
- \hskip 0pt plus 0.5fil minus 0.5fil
-}}
-
-% @enddots{} is an end-of-sentence ellipsis.
-%
-\def\enddots{%
- \hbox to 2em{%
- \hskip 0pt plus 0.25fil minus 0.25fil
- .\hss.\hss.\hss.%
- \hskip 0pt plus 0.5fil minus 0.5fil
- }%
- \spacefactor=3000
-}
-
-
-% @page forces the start of a new page
-
-\def\page{\par\vfill\supereject}
-
-% @exdent text....
-% outputs text on separate line in roman font, starting at standard page margin
-
-% This records the amount of indent in the innermost environment.
-% That's how much \exdent should take out.
-\newskip\exdentamount
-
-% This defn is used inside fill environments such as @defun.
-\def\exdent{\parsearg\exdentyyy}
-\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
-
-% This defn is used inside nofill environments such as @example.
-\def\nofillexdent{\parsearg\nofillexdentyyy}
-\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
-\leftline{\hskip\leftskip{\rm#1}}}}
-
-% @inmargin{TEXT} puts TEXT in the margin next to the current paragraph.
-
-\def\inmargin#1{%
-\strut\vadjust{\nobreak\kern-\strutdepth
- \vtop to \strutdepth{\baselineskip\strutdepth\vss
- \llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}}
-\newskip\inmarginspacing \inmarginspacing=1cm
-\def\strutdepth{\dp\strutbox}
-
-%\hbox{{\rm#1}}\hfil\break}}
-
-% @include file insert text of that file as input.
-% Allow normal characters that we make active in the argument (a file name).
-\def\include{\begingroup
- \catcode`\\=12
- \catcode`~=12
- \catcode`^=12
- \catcode`_=12
- \catcode`|=12
- \catcode`<=12
- \catcode`>=12
- \catcode`+=12
- \parsearg\includezzz}
-% Restore active chars for included file.
-\def\includezzz#1{\endgroup\begingroup
- % Read the included file in a group so nested @include's work.
- \def\thisfile{#1}%
- \input\thisfile
-\endgroup}
-
-\def\thisfile{}
-
-% @center line outputs that line, centered
-
-\def\center{\parsearg\centerzzz}
-\def\centerzzz #1{{\advance\hsize by -\leftskip
-\advance\hsize by -\rightskip
-\centerline{#1}}}
-
-% @sp n outputs n lines of vertical space
-
-\def\sp{\parsearg\spxxx}
-\def\spxxx #1{\vskip #1\baselineskip}
-
-% @comment ...line which is ignored...
-% @c is the same as @comment
-% @ignore ... @end ignore is another way to write a comment
-
-\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
-\parsearg \commentxxx}
-
-\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
-
-\let\c=\comment
-
-% @paragraphindent is defined for the Info formatting commands only.
-\let\paragraphindent=\comment
-
-% Prevent errors for section commands.
-% Used in @ignore and in failing conditionals.
-\def\ignoresections{%
-\let\chapter=\relax
-\let\unnumbered=\relax
-\let\top=\relax
-\let\unnumberedsec=\relax
-\let\unnumberedsection=\relax
-\let\unnumberedsubsec=\relax
-\let\unnumberedsubsection=\relax
-\let\unnumberedsubsubsec=\relax
-\let\unnumberedsubsubsection=\relax
-\let\section=\relax
-\let\subsec=\relax
-\let\subsubsec=\relax
-\let\subsection=\relax
-\let\subsubsection=\relax
-\let\appendix=\relax
-\let\appendixsec=\relax
-\let\appendixsection=\relax
-\let\appendixsubsec=\relax
-\let\appendixsubsection=\relax
-\let\appendixsubsubsec=\relax
-\let\appendixsubsubsection=\relax
-\let\contents=\relax
-\let\smallbook=\relax
-\let\titlepage=\relax
-}
-
-% Used in nested conditionals, where we have to parse the Texinfo source
-% and so want to turn off most commands, in case they are used
-% incorrectly.
-%
-\def\ignoremorecommands{%
- \let\defcodeindex = \relax
- \let\defcv = \relax
- \let\deffn = \relax
- \let\deffnx = \relax
- \let\defindex = \relax
- \let\defivar = \relax
- \let\defmac = \relax
- \let\defmethod = \relax
- \let\defop = \relax
- \let\defopt = \relax
- \let\defspec = \relax
- \let\deftp = \relax
- \let\deftypefn = \relax
- \let\deftypefun = \relax
- \let\deftypevar = \relax
- \let\deftypevr = \relax
- \let\defun = \relax
- \let\defvar = \relax
- \let\defvr = \relax
- \let\ref = \relax
- \let\xref = \relax
- \let\printindex = \relax
- \let\pxref = \relax
- \let\settitle = \relax
- \let\setchapternewpage = \relax
- \let\setchapterstyle = \relax
- \let\everyheading = \relax
- \let\evenheading = \relax
- \let\oddheading = \relax
- \let\everyfooting = \relax
- \let\evenfooting = \relax
- \let\oddfooting = \relax
- \let\headings = \relax
- \let\include = \relax
- \let\lowersections = \relax
- \let\down = \relax
- \let\raisesections = \relax
- \let\up = \relax
- \let\set = \relax
- \let\clear = \relax
- \let\item = \relax
-}
-
-% Ignore @ignore ... @end ignore.
-%
-\def\ignore{\doignore{ignore}}
-
-% Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text.
-%
-\def\ifinfo{\doignore{ifinfo}}
-\def\ifhtml{\doignore{ifhtml}}
-\def\ifnottex{\doignore{ifnottex}}
-\def\html{\doignore{html}}
-\def\menu{\doignore{menu}}
-\def\direntry{\doignore{direntry}}
-
-% @dircategory CATEGORY -- specify a category of the dir file
-% which this file should belong to. Ignore this in TeX.
-\let\dircategory = \comment
-
-% Ignore text until a line `@end #1'.
-%
-\def\doignore#1{\begingroup
- % Don't complain about control sequences we have declared \outer.
- \ignoresections
- %
- % Define a command to swallow text until we reach `@end #1'.
- % This @ is a catcode 12 token (that is the normal catcode of @ in
- % this texinfo.tex file). We change the catcode of @ below to match.
- \long\def\doignoretext##1@end #1{\enddoignore}%
- %
- % Make sure that spaces turn into tokens that match what \doignoretext wants.
- \catcode32 = 10
- %
- % Ignore braces, too, so mismatched braces don't cause trouble.
- \catcode`\{ = 9
- \catcode`\} = 9
- %
- % We must not have @c interpreted as a control sequence.
- \catcode`\@ = 12
- %
- % Make the letter c a comment character so that the rest of the line
- % will be ignored. This way, the document can have (for example)
- % @c @end ifinfo
- % and the @end ifinfo will be properly ignored.
- % (We've just changed @ to catcode 12.)
- \catcode`\c = 14
- %
- % And now expand that command.
- \doignoretext
-}
-
-% What we do to finish off ignored text.
-%
-\def\enddoignore{\endgroup\ignorespaces}%
-
-\newif\ifwarnedobs\warnedobsfalse
-\def\obstexwarn{%
- \ifwarnedobs\relax\else
- % We need to warn folks that they may have trouble with TeX 3.0.
- % This uses \immediate\write16 rather than \message to get newlines.
- \immediate\write16{}
- \immediate\write16{***WARNING*** for users of Unix TeX 3.0!}
- \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
- \immediate\write16{If you are running another version of TeX, relax.}
- \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
- \immediate\write16{ Then upgrade your TeX installation if you can.}
- \immediate\write16{ (See ftp://ftp.gnu.ai.mit.edu/pub/gnu/TeX.README.)}
- \immediate\write16{If you are stuck with version 3.0, run the}
- \immediate\write16{ script ``tex3patch'' from the Texinfo distribution}
- \immediate\write16{ to use a workaround.}
- \immediate\write16{}
- \global\warnedobstrue
- \fi
-}
-
-% **In TeX 3.0, setting text in \nullfont hangs tex. For a
-% workaround (which requires the file ``dummy.tfm'' to be installed),
-% uncomment the following line:
-%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
-
-% Ignore text, except that we keep track of conditional commands for
-% purposes of nesting, up to an `@end #1' command.
-%
-\def\nestedignore#1{%
- \obstexwarn
- % We must actually expand the ignored text to look for the @end
- % command, so that nested ignore constructs work. Thus, we put the
- % text into a \vbox and then do nothing with the result. To minimize
- % the change of memory overflow, we follow the approach outlined on
- % page 401 of the TeXbook: make the current font be a dummy font.
- %
- \setbox0 = \vbox\bgroup
- % Don't complain about control sequences we have declared \outer.
- \ignoresections
- %
- % Define `@end #1' to end the box, which will in turn undefine the
- % @end command again.
- \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
- %
- % We are going to be parsing Texinfo commands. Most cause no
- % trouble when they are used incorrectly, but some commands do
- % complicated argument parsing or otherwise get confused, so we
- % undefine them.
- %
- % We can't do anything about stray @-signs, unfortunately;
- % they'll produce `undefined control sequence' errors.
- \ignoremorecommands
- %
- % Set the current font to be \nullfont, a TeX primitive, and define
- % all the font commands to also use \nullfont. We don't use
- % dummy.tfm, as suggested in the TeXbook, because not all sites
- % might have that installed. Therefore, math mode will still
- % produce output, but that should be an extremely small amount of
- % stuff compared to the main input.
- %
- \nullfont
- \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont
- \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont
- \let\tensf = \nullfont
- % Similarly for index fonts (mostly for their use in
- % smallexample)
- \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont
- \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont
- \let\indsf = \nullfont
- %
- % Don't complain when characters are missing from the fonts.
- \tracinglostchars = 0
- %
- % Don't bother to do space factor calculations.
- \frenchspacing
- %
- % Don't report underfull hboxes.
- \hbadness = 10000
- %
- % Do minimal line-breaking.
- \pretolerance = 10000
- %
- % Do not execute instructions in @tex
- \def\tex{\doignore{tex}}%
-}
-
-% @set VAR sets the variable VAR to an empty value.
-% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
-%
-% Since we want to separate VAR from REST-OF-LINE (which might be
-% empty), we can't just use \parsearg; we have to insert a space of our
-% own to delimit the rest of the line, and then take it out again if we
-% didn't need it. Make sure the catcode of space is correct to avoid
-% losing inside @example, for instance.
-%
-\def\set{\begingroup\catcode` =10
- \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
- \parsearg\setxxx}
-\def\setxxx#1{\setyyy#1 \endsetyyy}
-\def\setyyy#1 #2\endsetyyy{%
- \def\temp{#2}%
- \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
- \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
- \fi
- \endgroup
-}
-% Can't use \xdef to pre-expand #2 and save some time, since \temp or
-% \next or other control sequences that we've defined might get us into
-% an infinite loop. Consider `@set foo @cite{bar}'.
-\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
-
-% @clear VAR clears (i.e., unsets) the variable VAR.
-%
-\def\clear{\parsearg\clearxxx}
-\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
-
-% @value{foo} gets the text saved in variable foo.
-%
-\def\value{\begingroup
- \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
- \valuexxx}
-\def\valuexxx#1{\expandablevalue{#1}\endgroup}
-
-% We have this subroutine so that we can handle at least some @value's
-% properly in indexes (we \let\value to this in \indexdummies). Ones
-% whose names contain - or _ still won't work, but we can't do anything
-% about that. The command has to be fully expandable, since the result
-% winds up in the index file. This means that if the variable's value
-% contains other Texinfo commands, it's almost certain it will fail
-% (although perhaps we could fix that with sufficient work to do a
-% one-level expansion on the result, instead of complete).
-%
-\def\expandablevalue#1{%
- \expandafter\ifx\csname SET#1\endcsname\relax
- {[No value for ``#1'']v}%
- \else
- \csname SET#1\endcsname
- \fi
-}
-
-% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
-% with @set.
-%
-\def\ifset{\parsearg\ifsetxxx}
-\def\ifsetxxx #1{%
- \expandafter\ifx\csname SET#1\endcsname\relax
- \expandafter\ifsetfail
- \else
- \expandafter\ifsetsucceed
- \fi
-}
-\def\ifsetsucceed{\conditionalsucceed{ifset}}
-\def\ifsetfail{\nestedignore{ifset}}
-\defineunmatchedend{ifset}
-
-% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
-% defined with @set, or has been undefined with @clear.
-%
-\def\ifclear{\parsearg\ifclearxxx}
-\def\ifclearxxx #1{%
- \expandafter\ifx\csname SET#1\endcsname\relax
- \expandafter\ifclearsucceed
- \else
- \expandafter\ifclearfail
- \fi
-}
-\def\ifclearsucceed{\conditionalsucceed{ifclear}}
-\def\ifclearfail{\nestedignore{ifclear}}
-\defineunmatchedend{ifclear}
-
-% @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text
-% following, through the first @end iftex (etc.). Make `@end iftex'
-% (etc.) valid only after an @iftex.
-%
-\def\iftex{\conditionalsucceed{iftex}}
-\def\ifnothtml{\conditionalsucceed{ifnothtml}}
-\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
-\defineunmatchedend{iftex}
-\defineunmatchedend{ifnothtml}
-\defineunmatchedend{ifnotinfo}
-
-% We can't just want to start a group at @iftex (for example) and end it
-% at @end iftex, since then @set commands inside the conditional have no
-% effect (they'd get reverted at the end of the group). So we must
-% define \Eiftex to redefine itself to be its previous value. (We can't
-% just define it to fail again with an ``unmatched end'' error, since
-% the @ifset might be nested.)
-%
-\def\conditionalsucceed#1{%
- \edef\temp{%
- % Remember the current value of \E#1.
- \let\nece{prevE#1} = \nece{E#1}%
- %
- % At the `@end #1', redefine \E#1 to be its previous value.
- \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
- }%
- \temp
-}
-
-% We need to expand lots of \csname's, but we don't want to expand the
-% control sequences after we've constructed them.
-%
-\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
-
-% @asis just yields its argument. Used with @table, for example.
-%
-\def\asis#1{#1}
-
-% @math means output in math mode.
-% We don't use $'s directly in the definition of \math because control
-% sequences like \math are expanded when the toc file is written. Then,
-% we read the toc file back, the $'s will be normal characters (as they
-% should be, according to the definition of Texinfo). So we must use a
-% control sequence to switch into and out of math mode.
-%
-% This isn't quite enough for @math to work properly in indices, but it
-% seems unlikely it will ever be needed there.
-%
-\let\implicitmath = $
-\def\math#1{\implicitmath #1\implicitmath}
-
-% @bullet and @minus need the same treatment as @math, just above.
-\def\bullet{\implicitmath\ptexbullet\implicitmath}
-\def\minus{\implicitmath-\implicitmath}
-
-\def\node{\ENVcheck\parsearg\nodezzz}
-\def\nodezzz#1{\nodexxx [#1,]}
-\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
-\let\nwnode=\node
-\let\lastnode=\relax
-
-\def\donoderef{\ifx\lastnode\relax\else
-\expandafter\expandafter\expandafter\setref{\lastnode}\fi
-\global\let\lastnode=\relax}
-
-\def\unnumbnoderef{\ifx\lastnode\relax\else
-\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
-\global\let\lastnode=\relax}
-
-\def\appendixnoderef{\ifx\lastnode\relax\else
-\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
-\global\let\lastnode=\relax}
-
-% @refill is a no-op.
-\let\refill=\relax
-
-% If working on a large document in chapters, it is convenient to
-% be able to disable indexing, cross-referencing, and contents, for test runs.
-% This is done with @novalidate (before @setfilename).
-%
-\newif\iflinks \linkstrue % by default we want the aux files.
-\let\novalidate = \linksfalse
-
-% @setfilename is done at the beginning of every texinfo file.
-% So open here the files we need to have open while reading the input.
-% This makes it possible to make a .fmt file for texinfo.
-\def\setfilename{%
- \iflinks
- \readauxfile
- \opencontents
- \fi % \openindices needs to do some work in any case.
- \openindices
- \fixbackslash % Turn off hack to swallow `\input texinfo'.
- \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
- %
- % If texinfo.cnf is present on the system, read it.
- % Useful for site-wide @afourpaper, etc.
- % Just to be on the safe side, close the input stream before the \input.
- \openin 1 texinfo.cnf
- \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
- \closein1
- \temp
- %
- \comment % Ignore the actual filename.
-}
-
-% Called from \setfilename.
-%
-\def\openindices{%
- \newindex{cp}%
- \newcodeindex{fn}%
- \newcodeindex{vr}%
- \newcodeindex{tp}%
- \newcodeindex{ky}%
- \newcodeindex{pg}%
-}
-
-% @bye.
-\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
-
-
-\message{fonts,}
-% Font-change commands.
-
-% Texinfo sort of supports the sans serif font style, which plain TeX does not.
-% So we set up a \sf analogous to plain's \rm, etc.
-\newfam\sffam
-\def\sf{\fam=\sffam \tensf}
-\let\li = \sf % Sometimes we call it \li, not \sf.
-
-% We don't need math for this one.
-\def\ttsl{\tenttsl}
-
-% Use Computer Modern fonts at \magstephalf (11pt).
-\newcount\mainmagstep
-\mainmagstep=\magstephalf
-
-% Set the font macro #1 to the font named #2, adding on the
-% specified font prefix (normally `cm').
-% #3 is the font's design size, #4 is a scale factor
-\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
-
-% Use cm as the default font prefix.
-% To specify the font prefix, you must define \fontprefix
-% before you read in texinfo.tex.
-\ifx\fontprefix\undefined
-\def\fontprefix{cm}
-\fi
-% Support font families that don't use the same naming scheme as CM.
-\def\rmshape{r}
-\def\rmbshape{bx} %where the normal face is bold
-\def\bfshape{b}
-\def\bxshape{bx}
-\def\ttshape{tt}
-\def\ttbshape{tt}
-\def\ttslshape{sltt}
-\def\itshape{ti}
-\def\itbshape{bxti}
-\def\slshape{sl}
-\def\slbshape{bxsl}
-\def\sfshape{ss}
-\def\sfbshape{ss}
-\def\scshape{csc}
-\def\scbshape{csc}
-
-\ifx\bigger\relax
-\let\mainmagstep=\magstep1
-\setfont\textrm\rmshape{12}{1000}
-\setfont\texttt\ttshape{12}{1000}
-\else
-\setfont\textrm\rmshape{10}{\mainmagstep}
-\setfont\texttt\ttshape{10}{\mainmagstep}
-\fi
-% Instead of cmb10, you many want to use cmbx10.
-% cmbx10 is a prettier font on its own, but cmb10
-% looks better when embedded in a line with cmr10.
-\setfont\textbf\bfshape{10}{\mainmagstep}
-\setfont\textit\itshape{10}{\mainmagstep}
-\setfont\textsl\slshape{10}{\mainmagstep}
-\setfont\textsf\sfshape{10}{\mainmagstep}
-\setfont\textsc\scshape{10}{\mainmagstep}
-\setfont\textttsl\ttslshape{10}{\mainmagstep}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-
-% A few fonts for @defun, etc.
-\setfont\defbf\bxshape{10}{\magstep1} %was 1314
-\setfont\deftt\ttshape{10}{\magstep1}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
-
-% Fonts for indices and small examples (9pt).
-% We actually use the slanted font rather than the italic,
-% because texinfo normally uses the slanted fonts for that.
-% Do not make many font distinctions in general in the index, since they
-% aren't very useful.
-\setfont\ninett\ttshape{9}{1000}
-\setfont\indrm\rmshape{9}{1000}
-\setfont\indit\slshape{9}{1000}
-\let\indsl=\indit
-\let\indtt=\ninett
-\let\indttsl=\ninett
-\let\indsf=\indrm
-\let\indbf=\indrm
-\setfont\indsc\scshape{10}{900}
-\font\indi=cmmi9
-\font\indsy=cmsy9
-
-% Fonts for title page:
-\setfont\titlerm\rmbshape{12}{\magstep3}
-\setfont\titleit\itbshape{10}{\magstep4}
-\setfont\titlesl\slbshape{10}{\magstep4}
-\setfont\titlett\ttbshape{12}{\magstep3}
-\setfont\titlettsl\ttslshape{10}{\magstep4}
-\setfont\titlesf\sfbshape{17}{\magstep1}
-\let\titlebf=\titlerm
-\setfont\titlesc\scbshape{10}{\magstep4}
-\font\titlei=cmmi12 scaled \magstep3
-\font\titlesy=cmsy10 scaled \magstep4
-\def\authorrm{\secrm}
-
-% Chapter (and unnumbered) fonts (17.28pt).
-\setfont\chaprm\rmbshape{12}{\magstep2}
-\setfont\chapit\itbshape{10}{\magstep3}
-\setfont\chapsl\slbshape{10}{\magstep3}
-\setfont\chaptt\ttbshape{12}{\magstep2}
-\setfont\chapttsl\ttslshape{10}{\magstep3}
-\setfont\chapsf\sfbshape{17}{1000}
-\let\chapbf=\chaprm
-\setfont\chapsc\scbshape{10}{\magstep3}
-\font\chapi=cmmi12 scaled \magstep2
-\font\chapsy=cmsy10 scaled \magstep3
-
-% Section fonts (14.4pt).
-\setfont\secrm\rmbshape{12}{\magstep1}
-\setfont\secit\itbshape{10}{\magstep2}
-\setfont\secsl\slbshape{10}{\magstep2}
-\setfont\sectt\ttbshape{12}{\magstep1}
-\setfont\secttsl\ttslshape{10}{\magstep2}
-\setfont\secsf\sfbshape{12}{\magstep1}
-\let\secbf\secrm
-\setfont\secsc\scbshape{10}{\magstep2}
-\font\seci=cmmi12 scaled \magstep1
-\font\secsy=cmsy10 scaled \magstep2
-
-% \setfont\ssecrm\bxshape{10}{\magstep1} % This size an font looked bad.
-% \setfont\ssecit\itshape{10}{\magstep1} % The letters were too crowded.
-% \setfont\ssecsl\slshape{10}{\magstep1}
-% \setfont\ssectt\ttshape{10}{\magstep1}
-% \setfont\ssecsf\sfshape{10}{\magstep1}
-
-%\setfont\ssecrm\bfshape{10}{1315} % Note the use of cmb rather than cmbx.
-%\setfont\ssecit\itshape{10}{1315} % Also, the size is a little larger than
-%\setfont\ssecsl\slshape{10}{1315} % being scaled magstep1.
-%\setfont\ssectt\ttshape{10}{1315}
-%\setfont\ssecsf\sfshape{10}{1315}
-
-%\let\ssecbf=\ssecrm
-
-% Subsection fonts (13.15pt).
-\setfont\ssecrm\rmbshape{12}{\magstephalf}
-\setfont\ssecit\itbshape{10}{1315}
-\setfont\ssecsl\slbshape{10}{1315}
-\setfont\ssectt\ttbshape{12}{\magstephalf}
-\setfont\ssecttsl\ttslshape{10}{1315}
-\setfont\ssecsf\sfbshape{12}{\magstephalf}
-\let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{\magstep1}
-\font\sseci=cmmi12 scaled \magstephalf
-\font\ssecsy=cmsy10 scaled 1315
-% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
-% but that is not a standard magnification.
-
-% In order for the font changes to affect most math symbols and letters,
-% we have to define the \textfont of the standard families. Since
-% texinfo doesn't allow for producing subscripts and superscripts, we
-% don't bother to reset \scriptfont and \scriptscriptfont (which would
-% also require loading a lot more fonts).
-%
-\def\resetmathfonts{%
- \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy
- \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf
- \textfont\ttfam = \tentt \textfont\sffam = \tensf
-}
-
-
-% The font-changing commands redefine the meanings of \tenSTYLE, instead
-% of just \STYLE. We do this so that font changes will continue to work
-% in math mode, where it is the current \fam that is relevant in most
-% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam
-% \tenbf}, for example. By redefining \tenbf, we obviate the need to
-% redefine \bf itself.
-\def\textfonts{%
- \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
- \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
- \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
- \resetmathfonts}
-\def\titlefonts{%
- \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
- \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
- \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
- \let\tenttsl=\titlettsl
- \resetmathfonts \setleading{25pt}}
-\def\titlefont#1{{\titlefonts\rm #1}}
-\def\chapfonts{%
- \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
- \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
- \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
- \resetmathfonts \setleading{19pt}}
-\def\secfonts{%
- \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
- \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
- \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
- \resetmathfonts \setleading{16pt}}
-\def\subsecfonts{%
- \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
- \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
- \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
- \resetmathfonts \setleading{15pt}}
-\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
-\def\indexfonts{%
- \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
- \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
- \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl
- \resetmathfonts \setleading{12pt}}
-
-% Set up the default fonts, so we can use them for creating boxes.
-%
-\textfonts
-
-% Define these so they can be easily changed for other fonts.
-\def\angleleft{$\langle$}
-\def\angleright{$\rangle$}
-
-% Count depth in font-changes, for error checks
-\newcount\fontdepth \fontdepth=0
-
-% Fonts for short table of contents.
-\setfont\shortcontrm\rmshape{12}{1000}
-\setfont\shortcontbf\bxshape{12}{1000}
-\setfont\shortcontsl\slshape{12}{1000}
-
-%% Add scribe-like font environments, plus @l for inline lisp (usually sans
-%% serif) and @ii for TeX italic
-
-% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
-% unless the following character is such as not to need one.
-\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
-\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
-
-\let\i=\smartitalic
-\let\var=\smartitalic
-\let\dfn=\smartitalic
-\let\emph=\smartitalic
-\let\cite=\smartitalic
-
-\def\b#1{{\bf #1}}
-\let\strong=\b
-
-% We can't just use \exhyphenpenalty, because that only has effect at
-% the end of a paragraph. Restore normal hyphenation at the end of the
-% group within which \nohyphenation is presumably called.
-%
-\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
-\def\restorehyphenation{\hyphenchar\font = `- }
-
-\def\t#1{%
- {\tt \rawbackslash \frenchspacing #1}%
- \null
-}
-\let\ttfont=\t
-\def\samp#1{`\tclose{#1}'\null}
-\setfont\smallrm\rmshape{8}{1000}
-\font\smallsy=cmsy9
-\def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{%
- \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
- \vbox{\hrule\kern-0.4pt
- \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
- \kern-0.4pt\hrule}%
- \kern-.06em\raise0.4pt\hbox{\angleright}}}}
-% The old definition, with no lozenge:
-%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
-\def\ctrl #1{{\tt \rawbackslash \hat}#1}
-
-\let\file=\samp
-
-% @code is a modification of @t,
-% which makes spaces the same size as normal in the surrounding text.
-\def\tclose#1{%
- {%
- % Change normal interword space to be same as for the current font.
- \spaceskip = \fontdimen2\font
- %
- % Switch to typewriter.
- \tt
- %
- % But `\ ' produces the large typewriter interword space.
- \def\ {{\spaceskip = 0pt{} }}%
- %
- % Turn off hyphenation.
- \nohyphenation
- %
- \rawbackslash
- \frenchspacing
- #1%
- }%
- \null
-}
-
-% We *must* turn on hyphenation at `-' and `_' in \code.
-% Otherwise, it is too hard to avoid overfull hboxes
-% in the Emacs manual, the Library manual, etc.
-
-% Unfortunately, TeX uses one parameter (\hyphenchar) to control
-% both hyphenation at - and hyphenation within words.
-% We must therefore turn them both off (\tclose does that)
-% and arrange explicitly to hyphenate at a dash.
-% -- rms.
-{
-\catcode`\-=\active
-\catcode`\_=\active
-\catcode`\|=\active
-\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex}
-% The following is used by \doprintindex to insure that long function names
-% wrap around. It is necessary for - and _ to be active before the index is
-% read from the file, as \entry parses the arguments long before \code is
-% ever called. -- mycroft
-% _ is always active; and it shouldn't be \let = to an _ that is a
-% subscript character anyway. Then, @cindex @samp{_} (for example)
-% fails. --karl
-\global\def\indexbreaks{%
- \catcode`\-=\active \let-\realdash
-}
-}
-
-\def\realdash{-}
-\def\codedash{-\discretionary{}{}{}}
-\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}}
-\def\codex #1{\tclose{#1}\endgroup}
-
-%\let\exp=\tclose %Was temporary
-
-% @kbd is like @code, except that if the argument is just one @key command,
-% then @kbd has no effect.
-
-% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
-% `example' (@kbd uses ttsl only inside of @example and friends),
-% or `code' (@kbd uses normal tty font always).
-\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
-\def\kbdinputstylexxx#1{%
- \def\arg{#1}%
- \ifx\arg\worddistinct
- \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
- \else\ifx\arg\wordexample
- \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
- \else\ifx\arg\wordcode
- \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
- \fi\fi\fi
-}
-\def\worddistinct{distinct}
-\def\wordexample{example}
-\def\wordcode{code}
-
-% Default is kbdinputdistinct. (Too much of a hassle to call the macro,
-% the catcodes are wrong for parsearg to work.)
-\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}
-
-\def\xkey{\key}
-\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
-\ifx\one\xkey\ifx\threex\three \key{#2}%
-\else{\tclose{\kbdfont\look}}\fi
-\else{\tclose{\kbdfont\look}}\fi}
-
-% @url. Quotes do not seem necessary, so use \code.
-\let\url=\code
-
-% @uref (abbreviation for `urlref') takes an optional second argument
-% specifying the text to display. First (mandatory) arg is the url.
-% Perhaps eventually put in a hypertex \special here.
-%
-\def\uref#1{\urefxxx #1,,\finish}
-\def\urefxxx#1,#2,#3\finish{%
- \setbox0 = \hbox{\ignorespaces #2}%
- \ifdim\wd0 > 0pt
- \unhbox0\ (\code{#1})%
- \else
- \code{#1}%
- \fi
-}
-
-% rms does not like the angle brackets --karl, 17may97.
-% So now @email is just like @uref.
-%\def\email#1{\angleleft{\tt #1}\angleright}
-\let\email=\uref
-
-% Check if we are currently using a typewriter font. Since all the
-% Computer Modern typewriter fonts have zero interword stretch (and
-% shrink), and it is reasonable to expect all typewriter fonts to have
-% this property, we can check that font parameter.
-%
-\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
-
-% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
-% argument is to make the input look right: @dmn{pt} instead of
-% @dmn{}pt.
-%
-\def\dmn#1{\thinspace #1}
-
-\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
-
-% @l was never documented to mean ``switch to the Lisp font'',
-% and it is not used as such in any manual I can find. We need it for
-% Polish suppressed-l. --karl, 22sep96.
-%\def\l#1{{\li #1}\null}
-
-\def\r#1{{\rm #1}} % roman font
-% Use of \lowercase was suggested.
-\def\sc#1{{\smallcaps#1}} % smallcaps font
-\def\ii#1{{\it #1}} % italic font
-
-% @pounds{} is a sterling sign.
-\def\pounds{{\it\$}}
-
-
-\message{page headings,}
-
-\newskip\titlepagetopglue \titlepagetopglue = 1.5in
-\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
-
-% First the title page. Must do @settitle before @titlepage.
-\newif\ifseenauthor
-\newif\iffinishedtitlepage
-
-\def\shorttitlepage{\parsearg\shorttitlepagezzz}
-\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
- \endgroup\page\hbox{}\page}
-
-\def\titlepage{\begingroup \parindent=0pt \textfonts
- \let\subtitlerm=\tenrm
-% I deinstalled the following change because \cmr12 is undefined.
-% This change was not in the ChangeLog anyway. --rms.
-% \let\subtitlerm=\cmr12
- \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
- %
- \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
- %
- % Leave some space at the very top of the page.
- \vglue\titlepagetopglue
- %
- % Now you can print the title using @title.
- \def\title{\parsearg\titlezzz}%
- \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
- % print a rule at the page bottom also.
- \finishedtitlepagefalse
- \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
- % No rule at page bottom unless we print one at the top with @title.
- \finishedtitlepagetrue
- %
- % Now you can put text using @subtitle.
- \def\subtitle{\parsearg\subtitlezzz}%
- \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
- %
- % @author should come last, but may come many times.
- \def\author{\parsearg\authorzzz}%
- \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
- {\authorfont \leftline{##1}}}%
- %
- % Most title ``pages'' are actually two pages long, with space
- % at the top of the second. We don't want the ragged left on the second.
- \let\oldpage = \page
- \def\page{%
- \iffinishedtitlepage\else
- \finishtitlepage
- \fi
- \oldpage
- \let\page = \oldpage
- \hbox{}}%
-% \def\page{\oldpage \hbox{}}
-}
-
-\def\Etitlepage{%
- \iffinishedtitlepage\else
- \finishtitlepage
- \fi
- % It is important to do the page break before ending the group,
- % because the headline and footline are only empty inside the group.
- % If we use the new definition of \page, we always get a blank page
- % after the title page, which we certainly don't want.
- \oldpage
- \endgroup
- \HEADINGSon
-}
-
-\def\finishtitlepage{%
- \vskip4pt \hrule height 2pt width \hsize
- \vskip\titlepagebottomglue
- \finishedtitlepagetrue
-}
-
-%%% Set up page headings and footings.
-
-\let\thispage=\folio
-
-\newtoks \evenheadline % Token sequence for heading line of even pages
-\newtoks \oddheadline % Token sequence for heading line of odd pages
-\newtoks \evenfootline % Token sequence for footing line of even pages
-\newtoks \oddfootline % Token sequence for footing line of odd pages
-
-% Now make Tex use those variables
-\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
- \else \the\evenheadline \fi}}
-\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
- \else \the\evenfootline \fi}\HEADINGShook}
-\let\HEADINGShook=\relax
-
-% Commands to set those variables.
-% For example, this is what @headings on does
-% @evenheading @thistitle|@thispage|@thischapter
-% @oddheading @thischapter|@thispage|@thistitle
-% @evenfooting @thisfile||
-% @oddfooting ||@thisfile
-
-\def\evenheading{\parsearg\evenheadingxxx}
-\def\oddheading{\parsearg\oddheadingxxx}
-\def\everyheading{\parsearg\everyheadingxxx}
-
-\def\evenfooting{\parsearg\evenfootingxxx}
-\def\oddfooting{\parsearg\oddfootingxxx}
-\def\everyfooting{\parsearg\everyfootingxxx}
-
-{\catcode`\@=0 %
-
-\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
-\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
-\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
-
-\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
-\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
-\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
- \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
- %
- % Leave some space for the footline. Hopefully ok to assume
- % @evenfooting will not be used by itself.
- \global\advance\pageheight by -\baselineskip
- \global\advance\vsize by -\baselineskip
-}
-
-\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
-%
-}% unbind the catcode of @.
-
-% @headings double turns headings on for double-sided printing.
-% @headings single turns headings on for single-sided printing.
-% @headings off turns them off.
-% @headings on same as @headings double, retained for compatibility.
-% @headings after turns on double-sided headings after this page.
-% @headings doubleafter turns on double-sided headings after this page.
-% @headings singleafter turns on single-sided headings after this page.
-% By default, they are off at the start of a document,
-% and turned `on' after @end titlepage.
-
-\def\headings #1 {\csname HEADINGS#1\endcsname}
-
-\def\HEADINGSoff{
-\global\evenheadline={\hfil} \global\evenfootline={\hfil}
-\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
-\HEADINGSoff
-% When we turn headings on, set the page number to 1.
-% For double-sided printing, put current file name in lower left corner,
-% chapter name on inside top of right hand pages, document
-% title on inside top of left hand pages, and page numbers on outside top
-% edge of all pages.
-\def\HEADINGSdouble{
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-\let\contentsalignmacro = \chappager
-
-% For single-sided printing, chapter title goes across top left of page,
-% page number on top right.
-\def\HEADINGSsingle{
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-\def\HEADINGSon{\HEADINGSdouble}
-
-\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
-\let\HEADINGSdoubleafter=\HEADINGSafter
-\def\HEADINGSdoublex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-
-\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
-\def\HEADINGSsinglex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-
-% Subroutines used in generating headings
-% Produces Day Month Year style of output.
-\def\today{\number\day\space
-\ifcase\month\or
-January\or February\or March\or April\or May\or June\or
-July\or August\or September\or October\or November\or December\fi
-\space\number\year}
-
-% Use this if you want the Month Day, Year style of output.
-%\def\today{\ifcase\month\or
-%January\or February\or March\or April\or May\or June\or
-%July\or August\or September\or October\or November\or December\fi
-%\space\number\day, \number\year}
-
-% @settitle line... specifies the title of the document, for headings
-% It generates no output of its own
-
-\def\thistitle{No Title}
-\def\settitle{\parsearg\settitlezzz}
-\def\settitlezzz #1{\gdef\thistitle{#1}}
-
-
-\message{tables,}
-% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
-
-% default indentation of table text
-\newdimen\tableindent \tableindent=.8in
-% default indentation of @itemize and @enumerate text
-\newdimen\itemindent \itemindent=.3in
-% margin between end of table item and start of table text.
-\newdimen\itemmargin \itemmargin=.1in
-
-% used internally for \itemindent minus \itemmargin
-\newdimen\itemmax
-
-% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
-% these defs.
-% They also define \itemindex
-% to index the item name in whatever manner is desired (perhaps none).
-
-\newif\ifitemxneedsnegativevskip
-
-\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
-
-\def\internalBitem{\smallbreak \parsearg\itemzzz}
-\def\internalBitemx{\itemxpar \parsearg\itemzzz}
-
-\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
-\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
-
-\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
-\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
-
-\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
- \itemzzz {#1}}
-
-\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
- \itemzzz {#1}}
-
-\def\itemzzz #1{\begingroup %
- \advance\hsize by -\rightskip
- \advance\hsize by -\tableindent
- \setbox0=\hbox{\itemfont{#1}}%
- \itemindex{#1}%
- \nobreak % This prevents a break before @itemx.
- %
- % Be sure we are not still in the middle of a paragraph.
- %{\parskip = 0in
- %\par
- %}%
- %
- % If the item text does not fit in the space we have, put it on a line
- % by itself, and do not allow a page break either before or after that
- % line. We do not start a paragraph here because then if the next
- % command is, e.g., @kindex, the whatsit would get put into the
- % horizontal list on a line by itself, resulting in extra blank space.
- \ifdim \wd0>\itemmax
- %
- % Make this a paragraph so we get the \parskip glue and wrapping,
- % but leave it ragged-right.
- \begingroup
- \advance\leftskip by-\tableindent
- \advance\hsize by\tableindent
- \advance\rightskip by0pt plus1fil
- \leavevmode\unhbox0\par
- \endgroup
- %
- % We're going to be starting a paragraph, but we don't want the
- % \parskip glue -- logically it's part of the @item we just started.
- \nobreak \vskip-\parskip
- %
- % Stop a page break at the \parskip glue coming up. Unfortunately
- % we can't prevent a possible page break at the following
- % \baselineskip glue.
- \nobreak
- \endgroup
- \itemxneedsnegativevskipfalse
- \else
- % The item text fits into the space. Start a paragraph, so that the
- % following text (if any) will end up on the same line. Since that
- % text will be indented by \tableindent, we make the item text be in
- % a zero-width box.
- \noindent
- \rlap{\hskip -\tableindent\box0}\ignorespaces%
- \endgroup%
- \itemxneedsnegativevskiptrue%
- \fi
-}
-
-\def\item{\errmessage{@item while not in a table}}
-\def\itemx{\errmessage{@itemx while not in a table}}
-\def\kitem{\errmessage{@kitem while not in a table}}
-\def\kitemx{\errmessage{@kitemx while not in a table}}
-\def\xitem{\errmessage{@xitem while not in a table}}
-\def\xitemx{\errmessage{@xitemx while not in a table}}
-
-%% Contains a kludge to get @end[description] to work
-\def\description{\tablez{\dontindex}{1}{}{}{}{}}
-
-\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
-{\obeylines\obeyspaces%
-\gdef\tablex #1^^M{%
-\tabley\dontindex#1 \endtabley}}
-
-\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
-{\obeylines\obeyspaces%
-\gdef\ftablex #1^^M{%
-\tabley\fnitemindex#1 \endtabley
-\def\Eftable{\endgraf\afterenvbreak\endgroup}%
-\let\Etable=\relax}}
-
-\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
-{\obeylines\obeyspaces%
-\gdef\vtablex #1^^M{%
-\tabley\vritemindex#1 \endtabley
-\def\Evtable{\endgraf\afterenvbreak\endgroup}%
-\let\Etable=\relax}}
-
-\def\dontindex #1{}
-\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
-\def\vritemindex #1{\doind {vr}{\code{#1}}}%
-
-{\obeyspaces %
-\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
-\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
-
-\def\tablez #1#2#3#4#5#6{%
-\aboveenvbreak %
-\begingroup %
-\def\Edescription{\Etable}% Necessary kludge.
-\let\itemindex=#1%
-\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
-\ifnum 0#4>0 \tableindent=#4\mil \fi %
-\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
-\def\itemfont{#2}%
-\itemmax=\tableindent %
-\advance \itemmax by -\itemmargin %
-\advance \leftskip by \tableindent %
-\exdentamount=\tableindent
-\parindent = 0pt
-\parskip = \smallskipamount
-\ifdim \parskip=0pt \parskip=2pt \fi%
-\def\Etable{\endgraf\afterenvbreak\endgroup}%
-\let\item = \internalBitem %
-\let\itemx = \internalBitemx %
-\let\kitem = \internalBkitem %
-\let\kitemx = \internalBkitemx %
-\let\xitem = \internalBxitem %
-\let\xitemx = \internalBxitemx %
-}
-
-% This is the counter used by @enumerate, which is really @itemize
-
-\newcount \itemno
-
-\def\itemize{\parsearg\itemizezzz}
-
-\def\itemizezzz #1{%
- \begingroup % ended by the @end itemize
- \itemizey {#1}{\Eitemize}
-}
-
-\def\itemizey #1#2{%
-\aboveenvbreak %
-\itemmax=\itemindent %
-\advance \itemmax by -\itemmargin %
-\advance \leftskip by \itemindent %
-\exdentamount=\itemindent
-\parindent = 0pt %
-\parskip = \smallskipamount %
-\ifdim \parskip=0pt \parskip=2pt \fi%
-\def#2{\endgraf\afterenvbreak\endgroup}%
-\def\itemcontents{#1}%
-\let\item=\itemizeitem}
-
-% Set sfcode to normal for the chars that usually have another value.
-% These are `.?!:;,'
-\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
- \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
-
-% \splitoff TOKENS\endmark defines \first to be the first token in
-% TOKENS, and \rest to be the remainder.
-%
-\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
-
-% Allow an optional argument of an uppercase letter, lowercase letter,
-% or number, to specify the first label in the enumerated list. No
-% argument is the same as `1'.
-%
-\def\enumerate{\parsearg\enumeratezzz}
-\def\enumeratezzz #1{\enumeratey #1 \endenumeratey}
-\def\enumeratey #1 #2\endenumeratey{%
- \begingroup % ended by the @end enumerate
- %
- % If we were given no argument, pretend we were given `1'.
- \def\thearg{#1}%
- \ifx\thearg\empty \def\thearg{1}\fi
- %
- % Detect if the argument is a single token. If so, it might be a
- % letter. Otherwise, the only valid thing it can be is a number.
- % (We will always have one token, because of the test we just made.
- % This is a good thing, since \splitoff doesn't work given nothing at
- % all -- the first parameter is undelimited.)
- \expandafter\splitoff\thearg\endmark
- \ifx\rest\empty
- % Only one token in the argument. It could still be anything.
- % A ``lowercase letter'' is one whose \lccode is nonzero.
- % An ``uppercase letter'' is one whose \lccode is both nonzero, and
- % not equal to itself.
- % Otherwise, we assume it's a number.
- %
- % We need the \relax at the end of the \ifnum lines to stop TeX from
- % continuing to look for a <number>.
- %
- \ifnum\lccode\expandafter`\thearg=0\relax
- \numericenumerate % a number (we hope)
- \else
- % It's a letter.
- \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
- \lowercaseenumerate % lowercase letter
- \else
- \uppercaseenumerate % uppercase letter
- \fi
- \fi
- \else
- % Multiple tokens in the argument. We hope it's a number.
- \numericenumerate
- \fi
-}
-
-% An @enumerate whose labels are integers. The starting integer is
-% given in \thearg.
-%
-\def\numericenumerate{%
- \itemno = \thearg
- \startenumeration{\the\itemno}%
-}
-
-% The starting (lowercase) letter is in \thearg.
-\def\lowercaseenumerate{%
- \itemno = \expandafter`\thearg
- \startenumeration{%
- % Be sure we're not beyond the end of the alphabet.
- \ifnum\itemno=0
- \errmessage{No more lowercase letters in @enumerate; get a bigger
- alphabet}%
- \fi
- \char\lccode\itemno
- }%
-}
-
-% The starting (uppercase) letter is in \thearg.
-\def\uppercaseenumerate{%
- \itemno = \expandafter`\thearg
- \startenumeration{%
- % Be sure we're not beyond the end of the alphabet.
- \ifnum\itemno=0
- \errmessage{No more uppercase letters in @enumerate; get a bigger
- alphabet}
- \fi
- \char\uccode\itemno
- }%
-}
-
-% Call itemizey, adding a period to the first argument and supplying the
-% common last two arguments. Also subtract one from the initial value in
-% \itemno, since @item increments \itemno.
-%
-\def\startenumeration#1{%
- \advance\itemno by -1
- \itemizey{#1.}\Eenumerate\flushcr
-}
-
-% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
-% to @enumerate.
-%
-\def\alphaenumerate{\enumerate{a}}
-\def\capsenumerate{\enumerate{A}}
-\def\Ealphaenumerate{\Eenumerate}
-\def\Ecapsenumerate{\Eenumerate}
-
-% Definition of @item while inside @itemize.
-
-\def\itemizeitem{%
-\advance\itemno by 1
-{\let\par=\endgraf \smallbreak}%
-\ifhmode \errmessage{In hmode at itemizeitem}\fi
-{\parskip=0in \hskip 0pt
-\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
-\vadjust{\penalty 1200}}%
-\flushcr}
-
-% @multitable macros
-% Amy Hendrickson, 8/18/94, 3/6/96
-%
-% @multitable ... @end multitable will make as many columns as desired.
-% Contents of each column will wrap at width given in preamble. Width
-% can be specified either with sample text given in a template line,
-% or in percent of \hsize, the current width of text on page.
-
-% Table can continue over pages but will only break between lines.
-
-% To make preamble:
-%
-% Either define widths of columns in terms of percent of \hsize:
-% @multitable @columnfractions .25 .3 .45
-% @item ...
-%
-% Numbers following @columnfractions are the percent of the total
-% current hsize to be used for each column. You may use as many
-% columns as desired.
-
-
-% Or use a template:
-% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-% @item ...
-% using the widest term desired in each column.
-%
-% For those who want to use more than one line's worth of words in
-% the preamble, break the line within one argument and it
-% will parse correctly, i.e.,
-%
-% @multitable {Column 1 template} {Column 2 template} {Column 3
-% template}
-% Not:
-% @multitable {Column 1 template} {Column 2 template}
-% {Column 3 template}
-
-% Each new table line starts with @item, each subsequent new column
-% starts with @tab. Empty columns may be produced by supplying @tab's
-% with nothing between them for as many times as empty columns are needed,
-% ie, @tab@tab@tab will produce two empty columns.
-
-% @item, @tab, @multitable or @end multitable do not need to be on their
-% own lines, but it will not hurt if they are.
-
-% Sample multitable:
-
-% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-% @item first col stuff @tab second col stuff @tab third col
-% @item
-% first col stuff
-% @tab
-% second col stuff
-% @tab
-% third col
-% @item first col stuff @tab second col stuff
-% @tab Many paragraphs of text may be used in any column.
-%
-% They will wrap at the width determined by the template.
-% @item@tab@tab This will be in third column.
-% @end multitable
-
-% Default dimensions may be reset by user.
-% @multitableparskip is vertical space between paragraphs in table.
-% @multitableparindent is paragraph indent in table.
-% @multitablecolmargin is horizontal space to be left between columns.
-% @multitablelinespace is space to leave between table items, baseline
-% to baseline.
-% 0pt means it depends on current normal line spacing.
-%
-\newskip\multitableparskip
-\newskip\multitableparindent
-\newdimen\multitablecolspace
-\newskip\multitablelinespace
-\multitableparskip=0pt
-\multitableparindent=6pt
-\multitablecolspace=12pt
-\multitablelinespace=0pt
-
-% Macros used to set up halign preamble:
-%
-\let\endsetuptable\relax
-\def\xendsetuptable{\endsetuptable}
-\let\columnfractions\relax
-\def\xcolumnfractions{\columnfractions}
-\newif\ifsetpercent
-
-% 2/1/96, to allow fractions to be given with more than one digit.
-\def\pickupwholefraction#1 {\global\advance\colcount by1 %
-\expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%
-\setuptable}
-
-\newcount\colcount
-\def\setuptable#1{\def\firstarg{#1}%
-\ifx\firstarg\xendsetuptable\let\go\relax%
-\else
- \ifx\firstarg\xcolumnfractions\global\setpercenttrue%
- \else
- \ifsetpercent
- \let\go\pickupwholefraction % In this case arg of setuptable
- % is the decimal point before the
- % number given in percent of hsize.
- % We don't need this so we don't use it.
- \else
- \global\advance\colcount by1
- \setbox0=\hbox{#1 }% Add a normal word space as a separator;
- % typically that is always in the input, anyway.
- \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
- \fi%
- \fi%
-\ifx\go\pickupwholefraction\else\let\go\setuptable\fi%
-\fi\go}
-
-% multitable syntax
-\def\tab{&\hskip1sp\relax} % 2/2/96
- % tiny skip here makes sure this column space is
- % maintained, even if it is never used.
-
-% @multitable ... @end multitable definitions:
-
-\def\multitable{\parsearg\dotable}
-\def\dotable#1{\bgroup
- \vskip\parskip
- \let\item\crcr
- \tolerance=9500
- \hbadness=9500
- \setmultitablespacing
- \parskip=\multitableparskip
- \parindent=\multitableparindent
- \overfullrule=0pt
- \global\colcount=0
- \def\Emultitable{\global\setpercentfalse\cr\egroup\egroup}%
- %
- % To parse everything between @multitable and @item:
- \setuptable#1 \endsetuptable
- %
- % \everycr will reset column counter, \colcount, at the end of
- % each line. Every column entry will cause \colcount to advance by one.
- % The table preamble
- % looks at the current \colcount to find the correct column width.
- \everycr{\noalign{%
- %
- % \filbreak%% keeps underfull box messages off when table breaks over pages.
- % Maybe so, but it also creates really weird page breaks when the table
- % breaks over pages. Wouldn't \vfil be better? Wait until the problem
- % manifests itself, so it can be fixed for real --karl.
- \global\colcount=0\relax}}%
- %
- % This preamble sets up a generic column definition, which will
- % be used as many times as user calls for columns.
- % \vtop will set a single line and will also let text wrap and
- % continue for many paragraphs if desired.
- \halign\bgroup&\global\advance\colcount by 1\relax
- \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
- %
- % In order to keep entries from bumping into each other
- % we will add a \leftskip of \multitablecolspace to all columns after
- % the first one.
- %
- % If a template has been used, we will add \multitablecolspace
- % to the width of each template entry.
- %
- % If the user has set preamble in terms of percent of \hsize we will
- % use that dimension as the width of the column, and the \leftskip
- % will keep entries from bumping into each other. Table will start at
- % left margin and final column will justify at right margin.
- %
- % Make sure we don't inherit \rightskip from the outer environment.
- \rightskip=0pt
- \ifnum\colcount=1
- % The first column will be indented with the surrounding text.
- \advance\hsize by\leftskip
- \else
- \ifsetpercent \else
- % If user has not set preamble in terms of percent of \hsize
- % we will advance \hsize by \multitablecolspace.
- \advance\hsize by \multitablecolspace
- \fi
- % In either case we will make \leftskip=\multitablecolspace:
- \leftskip=\multitablecolspace
- \fi
- % Ignoring space at the beginning and end avoids an occasional spurious
- % blank line, when TeX decides to break the line at the space before the
- % box from the multistrut, so the strut ends up on a line by itself.
- % For example:
- % @multitable @columnfractions .11 .89
- % @item @code{#}
- % @tab Legal holiday which is valid in major parts of the whole country.
- % Is automatically provided with highlighting sequences respectively marking
- % characters.
- \noindent\ignorespaces##\unskip\multistrut}\cr
-}
-
-\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
-% If so, do nothing. If not, give it an appropriate dimension based on
-% current baselineskip.
-\ifdim\multitablelinespace=0pt
-%% strut to put in table in case some entry doesn't have descenders,
-%% to keep lines equally spaced
-\let\multistrut = \strut
-%% Test to see if parskip is larger than space between lines of
-%% table. If not, do nothing.
-%% If so, set to same dimension as multitablelinespace.
-\else
-\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
-width0pt\relax} \fi
-\ifdim\multitableparskip>\multitablelinespace
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
- %% than skip between lines in the table.
-\fi%
-\ifdim\multitableparskip=0pt
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
- %% than skip between lines in the table.
-\fi}
-
-
-\message{indexing,}
-% Index generation facilities
-
-% Define \newwrite to be identical to plain tex's \newwrite
-% except not \outer, so it can be used within \newindex.
-{\catcode`\@=11
-\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
-
-% \newindex {foo} defines an index named foo.
-% It automatically defines \fooindex such that
-% \fooindex ...rest of line... puts an entry in the index foo.
-% It also defines \fooindfile to be the number of the output channel for
-% the file that accumulates this index. The file's extension is foo.
-% The name of an index should be no more than 2 characters long
-% for the sake of vms.
-%
-\def\newindex#1{%
- \iflinks
- \expandafter\newwrite \csname#1indfile\endcsname
- \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
- \fi
- \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
- \noexpand\doindex{#1}}
-}
-
-% @defindex foo == \newindex{foo}
-
-\def\defindex{\parsearg\newindex}
-
-% Define @defcodeindex, like @defindex except put all entries in @code.
-
-\def\newcodeindex#1{%
- \iflinks
- \expandafter\newwrite \csname#1indfile\endcsname
- \openout \csname#1indfile\endcsname \jobname.#1
- \fi
- \expandafter\xdef\csname#1index\endcsname{%
- \noexpand\docodeindex{#1}}
-}
-
-\def\defcodeindex{\parsearg\newcodeindex}
-
-% @synindex foo bar makes index foo feed into index bar.
-% Do this instead of @defindex foo if you don't want it as a separate index.
-% The \closeout helps reduce unnecessary open files; the limit on the
-% Acorn RISC OS is a mere 16 files.
-\def\synindex#1 #2 {%
- \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
- \expandafter\closeout\csname#1indfile\endcsname
- \expandafter\let\csname#1indfile\endcsname=\synindexfoo
- \expandafter\xdef\csname#1index\endcsname{% define \xxxindex
- \noexpand\doindex{#2}}%
-}
-
-% @syncodeindex foo bar similar, but put all entries made for index foo
-% inside @code.
-\def\syncodeindex#1 #2 {%
- \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
- \expandafter\closeout\csname#1indfile\endcsname
- \expandafter\let\csname#1indfile\endcsname=\synindexfoo
- \expandafter\xdef\csname#1index\endcsname{% define \xxxindex
- \noexpand\docodeindex{#2}}%
-}
-
-% Define \doindex, the driver for all \fooindex macros.
-% Argument #1 is generated by the calling \fooindex macro,
-% and it is "foo", the name of the index.
-
-% \doindex just uses \parsearg; it calls \doind for the actual work.
-% This is because \doind is more useful to call from other macros.
-
-% There is also \dosubind {index}{topic}{subtopic}
-% which makes an entry in a two-level index such as the operation index.
-
-\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
-\def\singleindexer #1{\doind{\indexname}{#1}}
-
-% like the previous two, but they put @code around the argument.
-\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
-\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
-
-\def\indexdummies{%
-\def\ { }%
-% Take care of the plain tex accent commands.
-\def\"{\realbackslash "}%
-\def\`{\realbackslash `}%
-\def\'{\realbackslash '}%
-\def\^{\realbackslash ^}%
-\def\~{\realbackslash ~}%
-\def\={\realbackslash =}%
-\def\b{\realbackslash b}%
-\def\c{\realbackslash c}%
-\def\d{\realbackslash d}%
-\def\u{\realbackslash u}%
-\def\v{\realbackslash v}%
-\def\H{\realbackslash H}%
-% Take care of the plain tex special European modified letters.
-\def\oe{\realbackslash oe}%
-\def\ae{\realbackslash ae}%
-\def\aa{\realbackslash aa}%
-\def\OE{\realbackslash OE}%
-\def\AE{\realbackslash AE}%
-\def\AA{\realbackslash AA}%
-\def\o{\realbackslash o}%
-\def\O{\realbackslash O}%
-\def\l{\realbackslash l}%
-\def\L{\realbackslash L}%
-\def\ss{\realbackslash ss}%
-% Take care of texinfo commands likely to appear in an index entry.
-% (Must be a way to avoid doing expansion at all, and thus not have to
-% laboriously list every single command here.)
-\def\@{@}% will be @@ when we switch to @ as escape char.
-%\let\{ = \lbracecmd
-%\let\} = \rbracecmd
-\def\_{{\realbackslash _}}%
-\def\w{\realbackslash w }%
-\def\bf{\realbackslash bf }%
-%\def\rm{\realbackslash rm }%
-\def\sl{\realbackslash sl }%
-\def\sf{\realbackslash sf}%
-\def\tt{\realbackslash tt}%
-\def\gtr{\realbackslash gtr}%
-\def\less{\realbackslash less}%
-\def\hat{\realbackslash hat}%
-\def\TeX{\realbackslash TeX}%
-\def\dots{\realbackslash dots }%
-\def\result{\realbackslash result}%
-\def\equiv{\realbackslash equiv}%
-\def\expansion{\realbackslash expansion}%
-\def\print{\realbackslash print}%
-\def\error{\realbackslash error}%
-\def\point{\realbackslash point}%
-\def\copyright{\realbackslash copyright}%
-\def\tclose##1{\realbackslash tclose {##1}}%
-\def\code##1{\realbackslash code {##1}}%
-\def\dotless##1{\realbackslash dotless {##1}}%
-\def\samp##1{\realbackslash samp {##1}}%
-\def\,##1{\realbackslash ,{##1}}%
-\def\t##1{\realbackslash t {##1}}%
-\def\r##1{\realbackslash r {##1}}%
-\def\i##1{\realbackslash i {##1}}%
-\def\b##1{\realbackslash b {##1}}%
-\def\sc##1{\realbackslash sc {##1}}%
-\def\cite##1{\realbackslash cite {##1}}%
-\def\key##1{\realbackslash key {##1}}%
-\def\file##1{\realbackslash file {##1}}%
-\def\var##1{\realbackslash var {##1}}%
-\def\kbd##1{\realbackslash kbd {##1}}%
-\def\dfn##1{\realbackslash dfn {##1}}%
-\def\emph##1{\realbackslash emph {##1}}%
-%
-% Handle some cases of @value -- where the variable name does not
-% contain - or _, and the value does not contain any
-% (non-fully-expandable) commands.
-\let\value = \expandablevalue
-%
-\unsepspaces
-}
-
-% If an index command is used in an @example environment, any spaces
-% therein should become regular spaces in the raw index file, not the
-% expansion of \tie (\\leavevmode \penalty \@M \ ).
-{\obeyspaces
- \gdef\unsepspaces{\obeyspaces\let =\space}}
-
-% \indexnofonts no-ops all font-change commands.
-% This is used when outputting the strings to sort the index by.
-\def\indexdummyfont#1{#1}
-\def\indexdummytex{TeX}
-\def\indexdummydots{...}
-
-\def\indexnofonts{%
-% Just ignore accents.
-\let\,=\indexdummyfont
-\let\"=\indexdummyfont
-\let\`=\indexdummyfont
-\let\'=\indexdummyfont
-\let\^=\indexdummyfont
-\let\~=\indexdummyfont
-\let\==\indexdummyfont
-\let\b=\indexdummyfont
-\let\c=\indexdummyfont
-\let\d=\indexdummyfont
-\let\u=\indexdummyfont
-\let\v=\indexdummyfont
-\let\H=\indexdummyfont
-\let\dotless=\indexdummyfont
-% Take care of the plain tex special European modified letters.
-\def\oe{oe}%
-\def\ae{ae}%
-\def\aa{aa}%
-\def\OE{OE}%
-\def\AE{AE}%
-\def\AA{AA}%
-\def\o{o}%
-\def\O{O}%
-\def\l{l}%
-\def\L{L}%
-\def\ss{ss}%
-\let\w=\indexdummyfont
-\let\t=\indexdummyfont
-\let\r=\indexdummyfont
-\let\i=\indexdummyfont
-\let\b=\indexdummyfont
-\let\emph=\indexdummyfont
-\let\strong=\indexdummyfont
-\let\cite=\indexdummyfont
-\let\sc=\indexdummyfont
-%Don't no-op \tt, since it isn't a user-level command
-% and is used in the definitions of the active chars like <, >, |...
-%\let\tt=\indexdummyfont
-\let\tclose=\indexdummyfont
-\let\code=\indexdummyfont
-\let\file=\indexdummyfont
-\let\samp=\indexdummyfont
-\let\kbd=\indexdummyfont
-\let\key=\indexdummyfont
-\let\var=\indexdummyfont
-\let\TeX=\indexdummytex
-\let\dots=\indexdummydots
-\def\@{@}%
-}
-
-% To define \realbackslash, we must make \ not be an escape.
-% We must first make another character (@) an escape
-% so we do not become unable to do a definition.
-
-{\catcode`\@=0 \catcode`\\=\other
- @gdef@realbackslash{\}}
-
-\let\indexbackslash=0 %overridden during \printindex.
-\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
-
-% For \ifx comparisons.
-\def\emptymacro{\empty}
-
-% Most index entries go through here, but \dosubind is the general case.
-%
-\def\doind#1#2{\dosubind{#1}{#2}\empty}
-
-% Workhorse for all \fooindexes.
-% #1 is name of index, #2 is stuff to put there, #3 is subentry --
-% \empty if called from \doind, as we usually are. The main exception
-% is with defuns, which call us directly.
-%
-\def\dosubind#1#2#3{%
- % Put the index entry in the margin if desired.
- \ifx\SETmarginindex\relax\else
- \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
- \fi
- {%
- \count255=\lastpenalty
- {%
- \indexdummies % Must do this here, since \bf, etc expand at this stage
- \escapechar=`\\
- {%
- \let\folio = 0% We will expand all macros now EXCEPT \folio.
- \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
- % so it will be output as is; and it will print as backslash.
- %
- \def\thirdarg{#3}%
- %
- % If third arg is present, precede it with space in sort key.
- \ifx\thirdarg\emptymacro
- \let\subentry = \empty
- \else
- \def\subentry{ #3}%
- \fi
- %
- % First process the index-string with all font commands turned off
- % to get the string to sort by.
- {\indexnofonts \xdef\indexsorttmp{#2\subentry}}%
- %
- % Now produce the complete index entry, with both the sort key and the
- % original text, including any font commands.
- \toks0 = {#2}%
- \edef\temp{%
- \write\csname#1indfile\endcsname{%
- \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
- }%
- %
- % If third (subentry) arg is present, add it to the index string.
- \ifx\thirdarg\emptymacro \else
- \toks0 = {#3}%
- \edef\temp{\temp{\the\toks0}}%
- \fi
- %
- % If a skip is the last thing on the list now, preserve it
- % by backing up by \lastskip, doing the \write, then inserting
- % the skip again. Otherwise, the whatsit generated by the
- % \write will make \lastskip zero. The result is that sequences
- % like this:
- % @end defun
- % @tindex whatever
- % @defun ...
- % will have extra space inserted, because the \medbreak in the
- % start of the @defun won't see the skip inserted by the @end of
- % the previous defun.
- \iflinks
- \skip0 = \lastskip \ifdim\lastskip = 0pt \else \vskip-\lastskip \fi
- \temp
- \ifdim\skip0 = 0pt \else \vskip\skip0 \fi
- \fi
- }%
- }%
- \penalty\count255
- }%
-}
-
-% The index entry written in the file actually looks like
-% \entry {sortstring}{page}{topic}
-% or
-% \entry {sortstring}{page}{topic}{subtopic}
-% The texindex program reads in these files and writes files
-% containing these kinds of lines:
-% \initial {c}
-% before the first topic whose initial is c
-% \entry {topic}{pagelist}
-% for a topic that is used without subtopics
-% \primary {topic}
-% for the beginning of a topic that is used with subtopics
-% \secondary {subtopic}{pagelist}
-% for each subtopic.
-
-% Define the user-accessible indexing commands
-% @findex, @vindex, @kindex, @cindex.
-
-\def\findex {\fnindex}
-\def\kindex {\kyindex}
-\def\cindex {\cpindex}
-\def\vindex {\vrindex}
-\def\tindex {\tpindex}
-\def\pindex {\pgindex}
-
-\def\cindexsub {\begingroup\obeylines\cindexsub}
-{\obeylines %
-\gdef\cindexsub "#1" #2^^M{\endgroup %
-\dosubind{cp}{#2}{#1}}}
-
-% Define the macros used in formatting output of the sorted index material.
-
-% @printindex causes a particular index (the ??s file) to get printed.
-% It does not print any chapter heading (usually an @unnumbered).
-%
-\def\printindex{\parsearg\doprintindex}
-\def\doprintindex#1{\begingroup
- \dobreak \chapheadingskip{10000}%
- %
- \indexfonts \rm
- \tolerance = 9500
- \indexbreaks
- %
- % See if the index file exists and is nonempty.
- % Change catcode of @ here so that if the index file contains
- % \initial {@}
- % as its first line, TeX doesn't complain about mismatched braces
- % (because it thinks @} is a control sequence).
- \catcode`\@ = 11
- \openin 1 \jobname.#1s
- \ifeof 1
- % \enddoublecolumns gets confused if there is no text in the index,
- % and it loses the chapter title and the aux file entries for the
- % index. The easiest way to prevent this problem is to make sure
- % there is some text.
- (Index is nonexistent)
- \else
- %
- % If the index file exists but is empty, then \openin leaves \ifeof
- % false. We have to make TeX try to read something from the file, so
- % it can discover if there is anything in it.
- \read 1 to \temp
- \ifeof 1
- (Index is empty)
- \else
- % Index files are almost Texinfo source, but we use \ as the escape
- % character. It would be better to use @, but that's too big a change
- % to make right now.
- \def\indexbackslash{\rawbackslashxx}%
- \catcode`\\ = 0
- \escapechar = `\\
- \begindoublecolumns
- \input \jobname.#1s
- \enddoublecolumns
- \fi
- \fi
- \closein 1
-\endgroup}
-
-% These macros are used by the sorted index file itself.
-% Change them to control the appearance of the index.
-
-% Same as \bigskipamount except no shrink.
-% \balancecolumns gets confused if there is any shrink.
-\newskip\initialskipamount \initialskipamount 12pt plus4pt
-
-\def\initial #1{%
-{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
-\ifdim\lastskip<\initialskipamount
-\removelastskip \penalty-200 \vskip \initialskipamount\fi
-\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
-
-% This typesets a paragraph consisting of #1, dot leaders, and then #2
-% flush to the right margin. It is used for index and table of contents
-% entries. The paragraph is indented by \leftskip.
-%
-\def\entry #1#2{\begingroup
- %
- % Start a new paragraph if necessary, so our assignments below can't
- % affect previous text.
- \par
- %
- % Do not fill out the last line with white space.
- \parfillskip = 0in
- %
- % No extra space above this paragraph.
- \parskip = 0in
- %
- % Do not prefer a separate line ending with a hyphen to fewer lines.
- \finalhyphendemerits = 0
- %
- % \hangindent is only relevant when the entry text and page number
- % don't both fit on one line. In that case, bob suggests starting the
- % dots pretty far over on the line. Unfortunately, a large
- % indentation looks wrong when the entry text itself is broken across
- % lines. So we use a small indentation and put up with long leaders.
- %
- % \hangafter is reset to 1 (which is the value we want) at the start
- % of each paragraph, so we need not do anything with that.
- \hangindent=2em
- %
- % When the entry text needs to be broken, just fill out the first line
- % with blank space.
- \rightskip = 0pt plus1fil
- %
- % Start a ``paragraph'' for the index entry so the line breaking
- % parameters we've set above will have an effect.
- \noindent
- %
- % Insert the text of the index entry. TeX will do line-breaking on it.
- #1%
- % The following is kludged to not output a line of dots in the index if
- % there are no page numbers. The next person who breaks this will be
- % cursed by a Unix daemon.
- \def\tempa{{\rm }}%
- \def\tempb{#2}%
- \edef\tempc{\tempa}%
- \edef\tempd{\tempb}%
- \ifx\tempc\tempd\ \else%
- %
- % If we must, put the page number on a line of its own, and fill out
- % this line with blank space. (The \hfil is overwhelmed with the
- % fill leaders glue in \indexdotfill if the page number does fit.)
- \hfil\penalty50
- \null\nobreak\indexdotfill % Have leaders before the page number.
- %
- % The `\ ' here is removed by the implicit \unskip that TeX does as
- % part of (the primitive) \par. Without it, a spurious underfull
- % \hbox ensues.
- \ #2% The page number ends the paragraph.
- \fi%
- \par
-\endgroup}
-
-% Like \dotfill except takes at least 1 em.
-\def\indexdotfill{\cleaders
- \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
-
-\def\primary #1{\line{#1\hfil}}
-
-\newskip\secondaryindent \secondaryindent=0.5cm
-
-\def\secondary #1#2{
-{\parfillskip=0in \parskip=0in
-\hangindent =1in \hangafter=1
-\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par
-}}
-
-% Define two-column mode, which we use to typeset indexes.
-% Adapted from the TeXbook, page 416, which is to say,
-% the manmac.tex format used to print the TeXbook itself.
-\catcode`\@=11
-
-\newbox\partialpage
-\newdimen\doublecolumnhsize
-
-\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
- % Grab any single-column material above us.
- \output = {\global\setbox\partialpage = \vbox{%
- %
- % Here is a possibility not foreseen in manmac: if we accumulate a
- % whole lot of material, we might end up calling this \output
- % routine twice in a row (see the doublecol-lose test, which is
- % essentially a couple of indexes with @setchapternewpage off). In
- % that case, we must prevent the second \partialpage from
- % simply overwriting the first, causing us to lose the page.
- % This will preserve it until a real output routine can ship it
- % out. Generally, \partialpage will be empty when this runs and
- % this will be a no-op.
- \unvbox\partialpage
- %
- % Unvbox the main output page.
- \unvbox255
- \kern-\topskip \kern\baselineskip
- }}%
- \eject
- %
- % Use the double-column output routine for subsequent pages.
- \output = {\doublecolumnout}%
- %
- % Change the page size parameters. We could do this once outside this
- % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
- % format, but then we repeat the same computation. Repeating a couple
- % of assignments once per index is clearly meaningless for the
- % execution time, so we may as well do it in one place.
- %
- % First we halve the line length, less a little for the gutter between
- % the columns. We compute the gutter based on the line length, so it
- % changes automatically with the paper format. The magic constant
- % below is chosen so that the gutter has the same value (well, +-<1pt)
- % as it did when we hard-coded it.
- %
- % We put the result in a separate register, \doublecolumhsize, so we
- % can restore it in \pagesofar, after \hsize itself has (potentially)
- % been clobbered.
- %
- \doublecolumnhsize = \hsize
- \advance\doublecolumnhsize by -.04154\hsize
- \divide\doublecolumnhsize by 2
- \hsize = \doublecolumnhsize
- %
- % Double the \vsize as well. (We don't need a separate register here,
- % since nobody clobbers \vsize.)
- \vsize = 2\vsize
-}
-\def\doublecolumnout{%
- \splittopskip=\topskip \splitmaxdepth=\maxdepth
- % Get the available space for the double columns -- the normal
- % (undoubled) page height minus any material left over from the
- % previous page.
- \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
- % box0 will be the left-hand column, box2 the right.
- \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
- \onepageout\pagesofar
- \unvbox255
- \penalty\outputpenalty
-}
-\def\pagesofar{%
- % Re-output the contents of the output page -- any previous material,
- % followed by the two boxes we just split.
- \unvbox\partialpage
- \hsize = \doublecolumnhsize
- \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}%
-}
-\def\enddoublecolumns{%
- \output = {\balancecolumns}\eject % split what we have
- \endgroup % started in \begindoublecolumns
- %
- % Back to normal single-column typesetting, but take account of the
- % fact that we just accumulated some stuff on the output page.
- \pagegoal = \vsize
-}
-\def\balancecolumns{%
- % Called at the end of the double column material.
- \setbox0 = \vbox{\unvbox255}%
- \dimen@ = \ht0
- \advance\dimen@ by \topskip
- \advance\dimen@ by-\baselineskip
- \divide\dimen@ by 2
- \splittopskip = \topskip
- % Loop until we get a decent breakpoint.
- {\vbadness=10000 \loop
- \global\setbox3=\copy0
- \global\setbox1=\vsplit3 to\dimen@
- \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt
- \repeat}%
- \setbox0=\vbox to\dimen@{\unvbox1}%
- \setbox2=\vbox to\dimen@{\unvbox3}%
- \pagesofar
-}
-\catcode`\@ = \other
-
-
-\message{sectioning,}
-% Define chapters, sections, etc.
-
-\newcount\chapno
-\newcount\secno \secno=0
-\newcount\subsecno \subsecno=0
-\newcount\subsubsecno \subsubsecno=0
-
-% This counter is funny since it counts through charcodes of letters A, B, ...
-\newcount\appendixno \appendixno = `\@
-\def\appendixletter{\char\the\appendixno}
-
-\newwrite\contentsfile
-% This is called from \setfilename.
-\def\opencontents{\openout\contentsfile = \jobname.toc }
-
-% Each @chapter defines this as the name of the chapter.
-% page headings and footings can use it. @section does likewise
-
-\def\thischapter{} \def\thissection{}
-\def\seccheck#1{\ifnum \pageno<0
- \errmessage{@#1 not allowed after generating table of contents}%
-\fi}
-
-\def\chapternofonts{%
- \let\rawbackslash=\relax
- \let\frenchspacing=\relax
- \def\result{\realbackslash result}%
- \def\equiv{\realbackslash equiv}%
- \def\expansion{\realbackslash expansion}%
- \def\print{\realbackslash print}%
- \def\TeX{\realbackslash TeX}%
- \def\dots{\realbackslash dots}%
- \def\result{\realbackslash result}%
- \def\equiv{\realbackslash equiv}%
- \def\expansion{\realbackslash expansion}%
- \def\print{\realbackslash print}%
- \def\error{\realbackslash error}%
- \def\point{\realbackslash point}%
- \def\copyright{\realbackslash copyright}%
- \def\tt{\realbackslash tt}%
- \def\bf{\realbackslash bf}%
- \def\w{\realbackslash w}%
- \def\less{\realbackslash less}%
- \def\gtr{\realbackslash gtr}%
- \def\hat{\realbackslash hat}%
- \def\char{\realbackslash char}%
- \def\tclose##1{\realbackslash tclose{##1}}%
- \def\code##1{\realbackslash code{##1}}%
- \def\samp##1{\realbackslash samp{##1}}%
- \def\r##1{\realbackslash r{##1}}%
- \def\b##1{\realbackslash b{##1}}%
- \def\key##1{\realbackslash key{##1}}%
- \def\file##1{\realbackslash file{##1}}%
- \def\kbd##1{\realbackslash kbd{##1}}%
- % These are redefined because @smartitalic wouldn't work inside xdef.
- \def\i##1{\realbackslash i{##1}}%
- \def\cite##1{\realbackslash cite{##1}}%
- \def\var##1{\realbackslash var{##1}}%
- \def\emph##1{\realbackslash emph{##1}}%
- \def\dfn##1{\realbackslash dfn{##1}}%
-}
-
-\newcount\absseclevel % used to calculate proper heading level
-\newcount\secbase\secbase=0 % @raise/lowersections modify this count
-
-% @raisesections: treat @section as chapter, @subsection as section, etc.
-\def\raisesections{\global\advance\secbase by -1}
-\let\up=\raisesections % original BFox name
-
-% @lowersections: treat @chapter as section, @section as subsection, etc.
-\def\lowersections{\global\advance\secbase by 1}
-\let\down=\lowersections % original BFox name
-
-% Choose a numbered-heading macro
-% #1 is heading level if unmodified by @raisesections or @lowersections
-% #2 is text for heading
-\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
- \chapterzzz{#2}
-\or
- \seczzz{#2}
-\or
- \numberedsubseczzz{#2}
-\or
- \numberedsubsubseczzz{#2}
-\else
- \ifnum \absseclevel<0
- \chapterzzz{#2}
- \else
- \numberedsubsubseczzz{#2}
- \fi
-\fi
-}
-
-% like \numhead, but chooses appendix heading levels
-\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
- \appendixzzz{#2}
-\or
- \appendixsectionzzz{#2}
-\or
- \appendixsubseczzz{#2}
-\or
- \appendixsubsubseczzz{#2}
-\else
- \ifnum \absseclevel<0
- \appendixzzz{#2}
- \else
- \appendixsubsubseczzz{#2}
- \fi
-\fi
-}
-
-% like \numhead, but chooses numberless heading levels
-\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
- \unnumberedzzz{#2}
-\or
- \unnumberedseczzz{#2}
-\or
- \unnumberedsubseczzz{#2}
-\or
- \unnumberedsubsubseczzz{#2}
-\else
- \ifnum \absseclevel<0
- \unnumberedzzz{#2}
- \else
- \unnumberedsubsubseczzz{#2}
- \fi
-\fi
-}
-
-
-\def\thischaptername{No Chapter Title}
-\outer\def\chapter{\parsearg\chapteryyy}
-\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
-\def\chapterzzz #1{\seccheck{chapter}%
-\secno=0 \subsecno=0 \subsubsecno=0
-\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}%
-\chapmacro {#1}{\the\chapno}%
-\gdef\thissection{#1}%
-\gdef\thischaptername{#1}%
-% We don't substitute the actual chapter name into \thischapter
-% because we don't want its macros evaluated now.
-\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\donoderef %
-\global\let\section = \numberedsec
-\global\let\subsection = \numberedsubsec
-\global\let\subsubsection = \numberedsubsubsec
-}}
-
-\outer\def\appendix{\parsearg\appendixyyy}
-\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
-\def\appendixzzz #1{\seccheck{appendix}%
-\secno=0 \subsecno=0 \subsubsecno=0
-\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
-\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
-\gdef\thissection{#1}%
-\gdef\thischaptername{#1}%
-\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash chapentry{\the\toks0}%
- {\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\appendixnoderef %
-\global\let\section = \appendixsec
-\global\let\subsection = \appendixsubsec
-\global\let\subsubsection = \appendixsubsubsec
-}}
-
-% @centerchap is like @unnumbered, but the heading is centered.
-\outer\def\centerchap{\parsearg\centerchapyyy}
-\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
-
-\outer\def\top{\parsearg\unnumberedyyy}
-\outer\def\unnumbered{\parsearg\unnumberedyyy}
-\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
-\def\unnumberedzzz #1{\seccheck{unnumbered}%
-\secno=0 \subsecno=0 \subsubsecno=0
-%
-% This used to be simply \message{#1}, but TeX fully expands the
-% argument to \message. Therefore, if #1 contained @-commands, TeX
-% expanded them. For example, in `@unnumbered The @cite{Book}', TeX
-% expanded @cite (which turns out to cause errors because \cite is meant
-% to be executed, not expanded).
-%
-% Anyway, we don't want the fully-expanded definition of @cite to appear
-% as a result of the \message, we just want `@cite' itself. We use
-% \the<toks register> to achieve this: TeX expands \the<toks> only once,
-% simply yielding the contents of the <toks register>.
-\toks0 = {#1}\message{(\the\toks0)}%
-%
-\unnumbchapmacro {#1}%
-\gdef\thischapter{#1}\gdef\thissection{#1}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\unnumbnoderef %
-\global\let\section = \unnumberedsec
-\global\let\subsection = \unnumberedsubsec
-\global\let\subsubsection = \unnumberedsubsubsec
-}}
-
-\outer\def\numberedsec{\parsearg\secyyy}
-\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
-\def\seczzz #1{\seccheck{section}%
-\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
-\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash secentry %
-{\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\donoderef %
-\penalty 10000 %
-}}
-
-\outer\def\appendixsection{\parsearg\appendixsecyyy}
-\outer\def\appendixsec{\parsearg\appendixsecyyy}
-\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
-\def\appendixsectionzzz #1{\seccheck{appendixsection}%
-\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
-\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash secentry %
-{\the\toks0}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\appendixnoderef %
-\penalty 10000 %
-}}
-
-\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
-\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
-\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
-\plainsecheading {#1}\gdef\thissection{#1}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\unnumbnoderef %
-\penalty 10000 %
-}}
-
-\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
-\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
-\def\numberedsubseczzz #1{\seccheck{subsection}%
-\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
-\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash subsecentry %
-{\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\donoderef %
-\penalty 10000 %
-}}
-
-\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
-\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
-\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
-\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
-\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash subsecentry %
-{\the\toks0}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\appendixnoderef %
-\penalty 10000 %
-}}
-
-\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
-\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
-\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
-\plainsubsecheading {#1}\gdef\thissection{#1}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\unnumbnoderef %
-\penalty 10000 %
-}}
-
-\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
-\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
-\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
-\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
-\subsubsecheading {#1}
- {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash subsubsecentry{\the\toks0}
- {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
- {\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\donoderef %
-\penalty 10000 %
-}}
-
-\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
-\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
-\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
-\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
-\subsubsecheading {#1}
- {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash subsubsecentry{\the\toks0}%
- {\appendixletter}
- {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\appendixnoderef %
-\penalty 10000 %
-}}
-
-\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
-\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
-\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
-\plainsubsubsecheading {#1}\gdef\thissection{#1}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}%
-\escapechar=`\\%
-\iflinks \write\contentsfile\temp \fi
-\unnumbnoderef %
-\penalty 10000 %
-}}
-
-% These are variants which are not "outer", so they can appear in @ifinfo.
-% Actually, they should now be obsolete; ordinary section commands should work.
-\def\infotop{\parsearg\unnumberedzzz}
-\def\infounnumbered{\parsearg\unnumberedzzz}
-\def\infounnumberedsec{\parsearg\unnumberedseczzz}
-\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
-\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
-
-\def\infoappendix{\parsearg\appendixzzz}
-\def\infoappendixsec{\parsearg\appendixseczzz}
-\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
-\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
-
-\def\infochapter{\parsearg\chapterzzz}
-\def\infosection{\parsearg\sectionzzz}
-\def\infosubsection{\parsearg\subsectionzzz}
-\def\infosubsubsection{\parsearg\subsubsectionzzz}
-
-% These macros control what the section commands do, according
-% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
-% Define them by default for a numbered chapter.
-\global\let\section = \numberedsec
-\global\let\subsection = \numberedsubsec
-\global\let\subsubsection = \numberedsubsubsec
-
-% Define @majorheading, @heading and @subheading
-
-% NOTE on use of \vbox for chapter headings, section headings, and
-% such:
-% 1) We use \vbox rather than the earlier \line to permit
-% overlong headings to fold.
-% 2) \hyphenpenalty is set to 10000 because hyphenation in a
-% heading is obnoxious; this forbids it.
-% 3) Likewise, headings look best if no \parindent is used, and
-% if justification is not attempted. Hence \raggedright.
-
-
-\def\majorheading{\parsearg\majorheadingzzz}
-\def\majorheadingzzz #1{%
-{\advance\chapheadingskip by 10pt \chapbreak }%
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}\bigskip \par\penalty 200}
-
-\def\chapheading{\parsearg\chapheadingzzz}
-\def\chapheadingzzz #1{\chapbreak %
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}\bigskip \par\penalty 200}
-
-% @heading, @subheading, @subsubheading.
-\def\heading{\parsearg\plainsecheading}
-\def\subheading{\parsearg\plainsubsecheading}
-\def\subsubheading{\parsearg\plainsubsubsecheading}
-
-% These macros generate a chapter, section, etc. heading only
-% (including whitespace, linebreaking, etc. around it),
-% given all the information in convenient, parsed form.
-
-%%% Args are the skip and penalty (usually negative)
-\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
-
-\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
-
-%%% Define plain chapter starts, and page on/off switching for it
-% Parameter controlling skip before chapter headings (if needed)
-
-\newskip\chapheadingskip
-
-\def\chapbreak{\dobreak \chapheadingskip {-4000}}
-\def\chappager{\par\vfill\supereject}
-\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
-
-\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
-
-\def\CHAPPAGoff{
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chapbreak
-\global\let\pagealignmacro=\chappager}
-
-\def\CHAPPAGon{
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chappager
-\global\let\pagealignmacro=\chappager
-\global\def\HEADINGSon{\HEADINGSsingle}}
-
-\def\CHAPPAGodd{
-\global\let\contentsalignmacro = \chapoddpage
-\global\let\pchapsepmacro=\chapoddpage
-\global\let\pagealignmacro=\chapoddpage
-\global\def\HEADINGSon{\HEADINGSdouble}}
-
-\CHAPPAGon
-
-\def\CHAPFplain{
-\global\let\chapmacro=\chfplain
-\global\let\unnumbchapmacro=\unnchfplain
-\global\let\centerchapmacro=\centerchfplain}
-
-% Plain chapter opening.
-% #1 is the text, #2 the chapter number or empty if unnumbered.
-\def\chfplain#1#2{%
- \pchapsepmacro
- {%
- \chapfonts \rm
- \def\chapnum{#2}%
- \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
- \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
- \hangindent = \wd0 \centerparametersmaybe
- \unhbox0 #1\par}%
- }%
- \nobreak\bigskip % no page break after a chapter title
- \nobreak
-}
-
-% Plain opening for unnumbered.
-\def\unnchfplain#1{\chfplain{#1}{}}
-
-% @centerchap -- centered and unnumbered.
-\let\centerparametersmaybe = \relax
-\def\centerchfplain#1{{%
- \def\centerparametersmaybe{%
- \advance\rightskip by 3\rightskip
- \leftskip = \rightskip
- \parfillskip = 0pt
- }%
- \chfplain{#1}{}%
-}}
-
-\CHAPFplain % The default
-
-\def\unnchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}\bigskip \par\penalty 10000 %
-}
-
-\def\chfopen #1#2{\chapoddpage {\chapfonts
-\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
-\par\penalty 5000 %
-}
-
-\def\centerchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt
- \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 %
-}
-
-\def\CHAPFopen{
-\global\let\chapmacro=\chfopen
-\global\let\unnumbchapmacro=\unnchfopen
-\global\let\centerchapmacro=\centerchfopen}
-
-
-% Section titles.
-\newskip\secheadingskip
-\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
-\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
-\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
-
-% Subsection titles.
-\newskip \subsecheadingskip
-\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
-\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
-\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
-
-% Subsubsection titles.
-\let\subsubsecheadingskip = \subsecheadingskip
-\let\subsubsecheadingbreak = \subsecheadingbreak
-\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
-\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
-
-
-% Print any size section title.
-%
-% #1 is the section type (sec/subsec/subsubsec), #2 is the section
-% number (maybe empty), #3 the text.
-\def\sectionheading#1#2#3{%
- {%
- \expandafter\advance\csname #1headingskip\endcsname by \parskip
- \csname #1headingbreak\endcsname
- }%
- {%
- % Switch to the right set of fonts.
- \csname #1fonts\endcsname \rm
- %
- % Only insert the separating space if we have a section number.
- \def\secnum{#2}%
- \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
- %
- \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
- \hangindent = \wd0 % zero if no section number
- \unhbox0 #3}%
- }%
- \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak
-}
-
-
-\message{toc printing,}
-% Finish up the main text and prepare to read what we've written
-% to \contentsfile.
-
-\newskip\contentsrightmargin \contentsrightmargin=1in
-\def\startcontents#1{%
- % If @setchapternewpage on, and @headings double, the contents should
- % start on an odd page, unlike chapters. Thus, we maintain
- % \contentsalignmacro in parallel with \pagealignmacro.
- % From: Torbjorn Granlund <tege@matematik.su.se>
- \contentsalignmacro
- \immediate\closeout \contentsfile
- \ifnum \pageno>0
- \pageno = -1 % Request roman numbered pages.
- \fi
- % Don't need to put `Contents' or `Short Contents' in the headline.
- % It is abundantly clear what they are.
- \unnumbchapmacro{#1}\def\thischapter{}%
- \begingroup % Set up to handle contents files properly.
- \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
- % We can't do this, because then an actual ^ in a section
- % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97.
- %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
- \raggedbottom % Worry more about breakpoints than the bottom.
- \advance\hsize by -\contentsrightmargin % Don't use the full line length.
-}
-
-
-% Normal (long) toc.
-\outer\def\contents{%
- \startcontents{\putwordTableofContents}%
- \input \jobname.toc
- \endgroup
- \vfill \eject
-}
-
-% And just the chapters.
-\outer\def\summarycontents{%
- \startcontents{\putwordShortContents}%
- %
- \let\chapentry = \shortchapentry
- \let\unnumbchapentry = \shortunnumberedentry
- % We want a true roman here for the page numbers.
- \secfonts
- \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
- \rm
- \hyphenpenalty = 10000
- \advance\baselineskip by 1pt % Open it up a little.
- \def\secentry ##1##2##3##4{}
- \def\unnumbsecentry ##1##2{}
- \def\subsecentry ##1##2##3##4##5{}
- \def\unnumbsubsecentry ##1##2{}
- \def\subsubsecentry ##1##2##3##4##5##6{}
- \def\unnumbsubsubsecentry ##1##2{}
- \input \jobname.toc
- \endgroup
- \vfill \eject
-}
-\let\shortcontents = \summarycontents
-
-% These macros generate individual entries in the table of contents.
-% The first argument is the chapter or section name.
-% The last argument is the page number.
-% The arguments in between are the chapter number, section number, ...
-
-% Chapter-level things, for both the long and short contents.
-\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
-
-% See comments in \dochapentry re vbox and related settings
-\def\shortchapentry#1#2#3{%
- \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}%
-}
-
-% Typeset the label for a chapter or appendix for the short contents.
-% The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter.
-% We could simplify the code here by writing out an \appendixentry
-% command in the toc file for appendices, instead of using \chapentry
-% for both, but it doesn't seem worth it.
-\setbox0 = \hbox{\shortcontrm \putwordAppendix }
-\newdimen\shortappendixwidth \shortappendixwidth = \wd0
-
-\def\shortchaplabel#1{%
- % We typeset #1 in a box of constant width, regardless of the text of
- % #1, so the chapter titles will come out aligned.
- \setbox0 = \hbox{#1}%
- \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi
- %
- % This space should be plenty, since a single number is .5em, and the
- % widest letter (M) is 1em, at least in the Computer Modern fonts.
- % (This space doesn't include the extra space that gets added after
- % the label; that gets put in by \shortchapentry above.)
- \advance\dimen0 by 1.1em
- \hbox to \dimen0{#1\hfil}%
-}
-
-\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
-\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}}
-
-% Sections.
-\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
-\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
-
-% Subsections.
-\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
-\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
-
-% And subsubsections.
-\def\subsubsecentry#1#2#3#4#5#6{%
- \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
-\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
-
-% This parameter controls the indentation of the various levels.
-\newdimen\tocindent \tocindent = 3pc
-
-% Now for the actual typesetting. In all these, #1 is the text and #2 is the
-% page number.
-%
-% If the toc has to be broken over pages, we want it to be at chapters
-% if at all possible; hence the \penalty.
-\def\dochapentry#1#2{%
- \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
- \begingroup
- \chapentryfonts
- \tocentry{#1}{\dopageno{#2}}%
- \endgroup
- \nobreak\vskip .25\baselineskip plus.1\baselineskip
-}
-
-\def\dosecentry#1#2{\begingroup
- \secentryfonts \leftskip=\tocindent
- \tocentry{#1}{\dopageno{#2}}%
-\endgroup}
-
-\def\dosubsecentry#1#2{\begingroup
- \subsecentryfonts \leftskip=2\tocindent
- \tocentry{#1}{\dopageno{#2}}%
-\endgroup}
-
-\def\dosubsubsecentry#1#2{\begingroup
- \subsubsecentryfonts \leftskip=3\tocindent
- \tocentry{#1}{\dopageno{#2}}%
-\endgroup}
-
-% Final typesetting of a toc entry; we use the same \entry macro as for
-% the index entries, but we want to suppress hyphenation here. (We
-% can't do that in the \entry macro, since index entries might consist
-% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
-\def\tocentry#1#2{\begingroup
- \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
- % Do not use \turnoffactive in these arguments. Since the toc is
- % typeset in cmr, so characters such as _ would come out wrong; we
- % have to do the usual translation tricks.
- \entry{#1}{#2}%
-\endgroup}
-
-% Space between chapter (or whatever) number and the title.
-\def\labelspace{\hskip1em \relax}
-
-\def\dopageno#1{{\rm #1}}
-\def\doshortpageno#1{{\rm #1}}
-
-\def\chapentryfonts{\secfonts \rm}
-\def\secentryfonts{\textfonts}
-\let\subsecentryfonts = \textfonts
-\let\subsubsecentryfonts = \textfonts
-
-
-\message{environments,}
-
-% Since these characters are used in examples, it should be an even number of
-% \tt widths. Each \tt character is 1en, so two makes it 1em.
-% Furthermore, these definitions must come after we define our fonts.
-\newbox\dblarrowbox \newbox\longdblarrowbox
-\newbox\pushcharbox \newbox\bullbox
-\newbox\equivbox \newbox\errorbox
-
-%{\tentt
-%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
-%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
-%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil}
-%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil}
-% Adapted from the manmac format (p.420 of TeXbook)
-%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex
-% depth .1ex\hfil}
-%}
-
-% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
-\def\point{$\star$}
-\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
-\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
-\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
-\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
-
-% Adapted from the TeXbook's \boxit.
-{\tentt \global\dimen0 = 3em}% Width of the box.
-\dimen2 = .55pt % Thickness of rules
-% The text. (`r' is open on the right, `e' somewhat less so on the left.)
-\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
-
-\global\setbox\errorbox=\hbox to \dimen0{\hfil
- \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
- \advance\hsize by -2\dimen2 % Rules.
- \vbox{
- \hrule height\dimen2
- \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
- \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
- \kern3pt\vrule width\dimen2}% Space to right.
- \hrule height\dimen2}
- \hfil}
-
-% The @error{} command.
-\def\error{\leavevmode\lower.7ex\copy\errorbox}
-
-% @tex ... @end tex escapes into raw Tex temporarily.
-% One exception: @ is still an escape character, so that @end tex works.
-% But \@ or @@ will get a plain tex @ character.
-
-\def\tex{\begingroup
- \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
- \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
- \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
- \catcode `\%=14
- \catcode 43=12 % plus
- \catcode`\"=12
- \catcode`\==12
- \catcode`\|=12
- \catcode`\<=12
- \catcode`\>=12
- \escapechar=`\\
- %
- \let\b=\ptexb
- \let\bullet=\ptexbullet
- \let\c=\ptexc
- \let\,=\ptexcomma
- \let\.=\ptexdot
- \let\dots=\ptexdots
- \let\equiv=\ptexequiv
- \let\!=\ptexexclam
- \let\i=\ptexi
- \let\{=\ptexlbrace
- \let\+=\tabalign
- \let\}=\ptexrbrace
- \let\*=\ptexstar
- \let\t=\ptext
- %
- \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
- \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
- \def\@{@}%
-\let\Etex=\endgroup}
-
-% Define @lisp ... @endlisp.
-% @lisp does a \begingroup so it can rebind things,
-% including the definition of @endlisp (which normally is erroneous).
-
-% Amount to narrow the margins by for @lisp.
-\newskip\lispnarrowing \lispnarrowing=0.4in
-
-% This is the definition that ^^M gets inside @lisp, @example, and other
-% such environments. \null is better than a space, since it doesn't
-% have any width.
-\def\lisppar{\null\endgraf}
-
-% Make each space character in the input produce a normal interword
-% space in the output. Don't allow a line break at this space, as this
-% is used only in environments like @example, where each line of input
-% should produce a line of output anyway.
-%
-{\obeyspaces %
-\gdef\sepspaces{\obeyspaces\let =\tie}}
-
-% Define \obeyedspace to be our active space, whatever it is. This is
-% for use in \parsearg.
-{\sepspaces%
-\global\let\obeyedspace= }
-
-% This space is always present above and below environments.
-\newskip\envskipamount \envskipamount = 0pt
-
-% Make spacing and below environment symmetrical. We use \parskip here
-% to help in doing that, since in @example-like environments \parskip
-% is reset to zero; thus the \afterenvbreak inserts no space -- but the
-% start of the next paragraph will insert \parskip
-%
-\def\aboveenvbreak{{\advance\envskipamount by \parskip
-\endgraf \ifdim\lastskip<\envskipamount
-\removelastskip \penalty-50 \vskip\envskipamount \fi}}
-
-\let\afterenvbreak = \aboveenvbreak
-
-% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
-\let\nonarrowing=\relax
-
-% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
-% environment contents.
-\font\circle=lcircle10
-\newdimen\circthick
-\newdimen\cartouter\newdimen\cartinner
-\newskip\normbskip\newskip\normpskip\newskip\normlskip
-\circthick=\fontdimen8\circle
-%
-\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
-\def\ctr{{\hskip 6pt\circle\char'010}}
-\def\cbl{{\circle\char'012\hskip -6pt}}
-\def\cbr{{\hskip 6pt\circle\char'011}}
-\def\carttop{\hbox to \cartouter{\hskip\lskip
- \ctl\leaders\hrule height\circthick\hfil\ctr
- \hskip\rskip}}
-\def\cartbot{\hbox to \cartouter{\hskip\lskip
- \cbl\leaders\hrule height\circthick\hfil\cbr
- \hskip\rskip}}
-%
-\newskip\lskip\newskip\rskip
-
-\long\def\cartouche{%
-\begingroup
- \lskip=\leftskip \rskip=\rightskip
- \leftskip=0pt\rightskip=0pt %we want these *outside*.
- \cartinner=\hsize \advance\cartinner by-\lskip
- \advance\cartinner by-\rskip
- \cartouter=\hsize
- \advance\cartouter by 18.4pt % allow for 3pt kerns on either
-% side, and for 6pt waste from
-% each corner char, and rule thickness
- \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
- % Flag to tell @lisp, etc., not to narrow margin.
- \let\nonarrowing=\comment
- \vbox\bgroup
- \baselineskip=0pt\parskip=0pt\lineskip=0pt
- \carttop
- \hbox\bgroup
- \hskip\lskip
- \vrule\kern3pt
- \vbox\bgroup
- \hsize=\cartinner
- \kern3pt
- \begingroup
- \baselineskip=\normbskip
- \lineskip=\normlskip
- \parskip=\normpskip
- \vskip -\parskip
-\def\Ecartouche{%
- \endgroup
- \kern3pt
- \egroup
- \kern3pt\vrule
- \hskip\rskip
- \egroup
- \cartbot
- \egroup
-\endgroup
-}}
-
-
-% This macro is called at the beginning of all the @example variants,
-% inside a group.
-\def\nonfillstart{%
- \aboveenvbreak
- \inENV % This group ends at the end of the body
- \hfuzz = 12pt % Don't be fussy
- \sepspaces % Make spaces be word-separators rather than space tokens.
- \singlespace
- \let\par = \lisppar % don't ignore blank lines
- \obeylines % each line of input is a line of output
- \parskip = 0pt
- \parindent = 0pt
- \emergencystretch = 0pt % don't try to avoid overfull boxes
- % @cartouche defines \nonarrowing to inhibit narrowing
- % at next level down.
- \ifx\nonarrowing\relax
- \advance \leftskip by \lispnarrowing
- \exdentamount=\lispnarrowing
- \let\exdent=\nofillexdent
- \let\nonarrowing=\relax
- \fi
-}
-
-% To ending an @example-like environment, we first end the paragraph
-% (via \afterenvbreak's vertical glue), and then the group. That way we
-% keep the zero \parskip that the environments set -- \parskip glue
-% will be inserted at the beginning of the next paragraph in the
-% document, after the environment.
-%
-\def\nonfillfinish{\afterenvbreak\endgroup}%
-
-\def\lisp{\begingroup
- \nonfillstart
- \let\Elisp = \nonfillfinish
- \tt
- % Make @kbd do something special, if requested.
- \let\kbdfont\kbdexamplefont
- \rawbackslash % have \ input char produce \ char from current font
- \gobble
-}
-
-% Define the \E... control sequence only if we are inside the
-% environment, so the error checking in \end will work.
-%
-% We must call \lisp last in the definition, since it reads the
-% return following the @example (or whatever) command.
-%
-\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
-\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp}
-\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
-
-% @smallexample and @smalllisp. This is not used unless the @smallbook
-% command is given. Originally contributed by Pavel@xerox.
-%
-\def\smalllispx{\begingroup
- \nonfillstart
- \let\Esmalllisp = \nonfillfinish
- \let\Esmallexample = \nonfillfinish
- %
- % Smaller fonts for small examples.
- \indexfonts \tt
- \rawbackslash % make \ output the \ character from the current font (tt)
- \gobble
-}
-
-% This is @display; same as @lisp except use roman font.
-%
-\def\display{\begingroup
- \nonfillstart
- \let\Edisplay = \nonfillfinish
- \gobble
-}
-
-% This is @format; same as @display except don't narrow margins.
-%
-\def\format{\begingroup
- \let\nonarrowing = t
- \nonfillstart
- \let\Eformat = \nonfillfinish
- \gobble
-}
-
-% @flushleft (same as @format) and @flushright.
-%
-\def\flushleft{\begingroup
- \let\nonarrowing = t
- \nonfillstart
- \let\Eflushleft = \nonfillfinish
- \gobble
-}
-\def\flushright{\begingroup
- \let\nonarrowing = t
- \nonfillstart
- \let\Eflushright = \nonfillfinish
- \advance\leftskip by 0pt plus 1fill
- \gobble}
-
-% @quotation does normal linebreaking (hence we can't use \nonfillstart)
-% and narrows the margins.
-%
-\def\quotation{%
- \begingroup\inENV %This group ends at the end of the @quotation body
- {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
- \singlespace
- \parindent=0pt
- % We have retained a nonzero parskip for the environment, since we're
- % doing normal filling. So to avoid extra space below the environment...
- \def\Equotation{\parskip = 0pt \nonfillfinish}%
- %
- % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
- \ifx\nonarrowing\relax
- \advance\leftskip by \lispnarrowing
- \advance\rightskip by \lispnarrowing
- \exdentamount = \lispnarrowing
- \let\nonarrowing = \relax
- \fi
-}
-
-\message{defuns,}
-% Define formatter for defuns
-% First, allow user to change definition object font (\df) internally
-\def\setdeffont #1 {\csname DEF#1\endcsname}
-
-\newskip\defbodyindent \defbodyindent=.4in
-\newskip\defargsindent \defargsindent=50pt
-\newskip\deftypemargin \deftypemargin=12pt
-\newskip\deflastargmargin \deflastargmargin=18pt
-
-\newcount\parencount
-% define \functionparens, which makes ( and ) and & do special things.
-% \functionparens affects the group it is contained in.
-\def\activeparens{%
-\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
-\catcode`\[=\active \catcode`\]=\active}
-
-% Make control sequences which act like normal parenthesis chars.
-\let\lparen = ( \let\rparen = )
-
-{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
-
-% Be sure that we always have a definition for `(', etc. For example,
-% if the fn name has parens in it, \boldbrax will not be in effect yet,
-% so TeX would otherwise complain about undefined control sequence.
-\global\let(=\lparen \global\let)=\rparen
-\global\let[=\lbrack \global\let]=\rbrack
-
-\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
-\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
-% This is used to turn on special parens
-% but make & act ordinary (given that it's active).
-\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
-
-% Definitions of (, ) and & used in args for functions.
-% This is the definition of ( outside of all parentheses.
-\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
- \global\advance\parencount by 1
-}
-%
-% This is the definition of ( when already inside a level of parens.
-\gdef\opnested{\char`\(\global\advance\parencount by 1 }
-%
-\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
- % also in that case restore the outer-level definition of (.
- \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
- \global\advance \parencount by -1 }
-% If we encounter &foo, then turn on ()-hacking afterwards
-\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
-%
-\gdef\normalparens{\boldbrax\let&=\ampnr}
-} % End of definition inside \activeparens
-%% These parens (in \boldbrax) actually are a little bolder than the
-%% contained text. This is especially needed for [ and ]
-\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
-\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
-\def\ampnr{\&}
-\def\lbrb{{\bf\char`\[}}
-\def\rbrb{{\bf\char`\]}}
-
-% First, defname, which formats the header line itself.
-% #1 should be the function name.
-% #2 should be the type of definition, such as "Function".
-
-\def\defname #1#2{%
-% Get the values of \leftskip and \rightskip as they were
-% outside the @def...
-\dimen2=\leftskip
-\advance\dimen2 by -\defbodyindent
-\dimen3=\rightskip
-\advance\dimen3 by -\defbodyindent
-\noindent %
-\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
-\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
-\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
-\parshape 2 0in \dimen0 \defargsindent \dimen1 %
-% Now output arg 2 ("Function" or some such)
-% ending at \deftypemargin from the right margin,
-% but stuck inside a box of width 0 so it does not interfere with linebreaking
-{% Adjust \hsize to exclude the ambient margins,
-% so that \rightline will obey them.
-\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
-\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
-% Make all lines underfull and no complaints:
-\tolerance=10000 \hbadness=10000
-\advance\leftskip by -\defbodyindent
-\exdentamount=\defbodyindent
-{\df #1}\enskip % Generate function name
-}
-
-% Actually process the body of a definition
-% #1 should be the terminating control sequence, such as \Edefun.
-% #2 should be the "another name" control sequence, such as \defunx.
-% #3 should be the control sequence that actually processes the header,
-% such as \defunheader.
-
-\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup %
-\catcode 61=\active % 61 is `='
-\obeylines\activeparens\spacesplit#3}
-
-% #1 is the \E... control sequence to end the definition (which we define).
-% #2 is the \...x control sequence for consecutive fns (which we define).
-% #3 is the control sequence to call to resume processing.
-% #4, delimited by the space, is the class name.
-%
-\def\defmethparsebody#1#2#3#4 {\begingroup\inENV %
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
-
-% @deftypemethod has an extra argument that nothing else does. Sigh.
-% #1 is the \E... control sequence to end the definition (which we define).
-% #2 is the \...x control sequence for consecutive fns (which we define).
-% #3 is the control sequence to call to resume processing.
-% #4, delimited by the space, is the class name.
-% #5 is the method's return type.
-%
-\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV %
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup\obeylines\activeparens\spacesplit{#3{#4}{#5}}}
-
-\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2##1 ##2 {\def#4{##1}%
-\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
-
-% These parsing functions are similar to the preceding ones
-% except that they do not make parens into active characters.
-% These are used for "variables" since they have no arguments.
-
-\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2{\begingroup\obeylines\spacesplit#3}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup %
-\catcode 61=\active %
-\obeylines\spacesplit#3}
-
-% This is used for \def{tp,vr}parsebody. It could probably be used for
-% some of the others, too, with some judicious conditionals.
-%
-\def\parsebodycommon#1#2#3{%
- \begingroup\inENV %
- \medbreak %
- % Define the end token that this defining construct specifies
- % so that it will exit this group.
- \def#1{\endgraf\endgroup\medbreak}%
- \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
- \parindent=0in
- \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
- \exdentamount=\defbodyindent
- \begingroup\obeylines
-}
-
-\def\defvrparsebody#1#2#3#4 {%
- \parsebodycommon{#1}{#2}{#3}%
- \spacesplit{#3{#4}}%
-}
-
-% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
-% type is just `struct', because we lose the braces in `{struct
-% termios}' when \spacesplit reads its undelimited argument. Sigh.
-% \let\deftpparsebody=\defvrparsebody
-%
-% So, to get around this, we put \empty in with the type name. That
-% way, TeX won't find exactly `{...}' as an undelimited argument, and
-% won't strip off the braces.
-%
-\def\deftpparsebody #1#2#3#4 {%
- \parsebodycommon{#1}{#2}{#3}%
- \spacesplit{\parsetpheaderline{#3{#4}}}\empty
-}
-
-% Fine, but then we have to eventually remove the \empty *and* the
-% braces (if any). That's what this does.
-%
-\def\removeemptybraces\empty#1\relax{#1}
-
-% After \spacesplit has done its work, this is called -- #1 is the final
-% thing to call, #2 the type name (which starts with \empty), and #3
-% (which might be empty) the arguments.
-%
-\def\parsetpheaderline#1#2#3{%
- #1{\removeemptybraces#2\relax}{#3}%
-}%
-
-\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2##1 ##2 {\def#4{##1}%
-\begingroup\obeylines\spacesplit{#3{##2}}}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup\obeylines\spacesplit{#3{#5}}}
-
-% Split up #2 at the first space token.
-% call #1 with two arguments:
-% the first is all of #2 before the space token,
-% the second is all of #2 after that space token.
-% If #2 contains no space token, all of it is passed as the first arg
-% and the second is passed as empty.
-
-{\obeylines
-\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
-\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
-\ifx\relax #3%
-#1{#2}{}\else #1{#2}{#3#4}\fi}}
-
-% So much for the things common to all kinds of definitions.
-
-% Define @defun.
-
-% First, define the processing that is wanted for arguments of \defun
-% Use this to expand the args and terminate the paragraph they make up
-
-\def\defunargs #1{\functionparens \sl
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-\hyphenchar\tensl=0
-#1%
-\hyphenchar\tensl=45
-\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
-\interlinepenalty=10000
-\advance\rightskip by 0pt plus 1fil
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
-}
-
-\def\deftypefunargs #1{%
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-% Use \boldbraxnoamp, not \functionparens, so that & is not special.
-\boldbraxnoamp
-\tclose{#1}% avoid \code because of side effects on active chars
-\interlinepenalty=10000
-\advance\rightskip by 0pt plus 1fil
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
-}
-
-% Do complete processing of one @defun or @defunx line already parsed.
-
-% @deffn Command forward-char nchars
-
-\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
-
-\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defun == @deffn Function
-
-\def\defun{\defparsebody\Edefun\defunx\defunheader}
-
-\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{Function}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @deftypefun int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
-
-% #1 is the data type. #2 is the name and args.
-\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
-% #1 is the data type, #2 the name, #3 the args.
-\def\deftypefunheaderx #1#2 #3\relax{%
-\doind {fn}{\code{#2}}% Make entry in function index
-\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}%
-\deftypefunargs {#3}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
-
-% \defheaderxcond#1\relax$$$
-% puts #1 in @code, followed by a space, but does nothing if #1 is null.
-\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi}
-
-% #1 is the classification. #2 is the data type. #3 is the name and args.
-\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
-% #1 is the classification, #2 the data type, #3 the name, #4 the args.
-\def\deftypefnheaderx #1#2#3 #4\relax{%
-\doind {fn}{\code{#3}}% Make entry in function index
-\begingroup
-\normalparens % notably, turn off `&' magic, which prevents
-% at least some C++ text from working
-\defname {\defheaderxcond#2\relax$$$#3}{#1}%
-\deftypefunargs {#4}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defmac == @deffn Macro
-
-\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
-
-\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{Macro}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defspec == @deffn Special Form
-
-\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
-
-\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{Special Form}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% This definition is run if you use @defunx
-% anywhere other than immediately after a @defun or @defunx.
-
-\def\deffnx #1 {\errmessage{@deffnx in invalid context}}
-\def\defunx #1 {\errmessage{@defunx in invalid context}}
-\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
-\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
-\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
-\def\deftypemethodx #1 {\errmessage{@deftypemethodx in invalid context}}
-\def\deftypefunx #1 {\errmessage{@deftypeunx in invalid context}}
-
-% @defmethod, and so on
-
-% @defop CATEGORY CLASS OPERATION ARG...
-
-\def\defop #1 {\def\defoptype{#1}%
-\defopparsebody\Edefop\defopx\defopheader\defoptype}
-
-\def\defopheader #1#2#3{%
-\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index
-\begingroup\defname {#2}{\defoptype{} on #1}%
-\defunargs {#3}\endgroup %
-}
-
-% @deftypemethod CLASS RETURN-TYPE METHOD ARG...
-%
-\def\deftypemethod{%
- \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
-%
-% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
-\def\deftypemethodheader#1#2#3#4{%
- \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
- \begingroup
- \defname{\defheaderxcond#2\relax$$$#3}{\putwordMethodon\ \code{#1}}%
- \deftypefunargs{#4}%
- \endgroup
-}
-
-% @defmethod == @defop Method
-%
-\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
-%
-% #1 is the class name, #2 the method name, #3 the args.
-\def\defmethodheader#1#2#3{%
- \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
- \begingroup
- \defname{#2}{\putwordMethodon\ \code{#1}}%
- \defunargs{#3}%
- \endgroup
-}
-
-% @defcv {Class Option} foo-class foo-flag
-
-\def\defcv #1 {\def\defcvtype{#1}%
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
-
-\def\defcvarheader #1#2#3{%
-\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
-\begingroup\defname {#2}{\defcvtype{} of #1}%
-\defvarargs {#3}\endgroup %
-}
-
-% @defivar == @defcv {Instance Variable}
-
-\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
-
-\def\defivarheader #1#2#3{%
-\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
-\begingroup\defname {#2}{Instance Variable of #1}%
-\defvarargs {#3}\endgroup %
-}
-
-% These definitions are run if you use @defmethodx, etc.,
-% anywhere other than immediately after a @defmethod, etc.
-
-\def\defopx #1 {\errmessage{@defopx in invalid context}}
-\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}
-\def\defcvx #1 {\errmessage{@defcvx in invalid context}}
-\def\defivarx #1 {\errmessage{@defivarx in invalid context}}
-
-% Now @defvar
-
-% First, define the processing that is wanted for arguments of @defvar.
-% This is actually simple: just print them in roman.
-% This must expand the args and terminate the paragraph they make up
-\def\defvarargs #1{\normalparens #1%
-\interlinepenalty=10000
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000}
-
-% @defvr Counter foo-count
-
-\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
-
-\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
-
-% @defvar == @defvr Variable
-
-\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
-
-\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{Variable}%
-\defvarargs {#2}\endgroup %
-}
-
-% @defopt == @defvr {User Option}
-
-\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
-
-\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{User Option}%
-\defvarargs {#2}\endgroup %
-}
-
-% @deftypevar int foobar
-
-\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
-
-% #1 is the data type. #2 is the name, perhaps followed by text that
-% is actually part of the data type, which should not be put into the index.
-\def\deftypevarheader #1#2{%
-\dovarind#2 \relax% Make entry in variables index
-\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}%
-\interlinepenalty=10000
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000
-\endgroup}
-\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
-
-% @deftypevr {Global Flag} int enable
-
-\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
-
-\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
-\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
-\interlinepenalty=10000
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000
-\endgroup}
-
-% This definition is run if you use @defvarx
-% anywhere other than immediately after a @defvar or @defvarx.
-
-\def\defvrx #1 {\errmessage{@defvrx in invalid context}}
-\def\defvarx #1 {\errmessage{@defvarx in invalid context}}
-\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
-\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}}
-\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}}
-
-% Now define @deftp
-% Args are printed in bold, a slight difference from @defvar.
-
-\def\deftpargs #1{\bf \defvarargs{#1}}
-
-% @deftp Class window height width ...
-
-\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
-
-\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
-\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
-
-% This definition is run if you use @deftpx, etc
-% anywhere other than immediately after a @deftp, etc.
-
-\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
-
-
-\message{macros,}
-% @macro.
-
-% To do this right we need a feature of e-TeX, \scantokens,
-% which we arrange to emulate with a temporary file in ordinary TeX.
-\ifx\eTeXversion\undefined
- \newwrite\macscribble
- \def\scantokens#1{%
-% \toks0={#1}%
- \immediate\openout\macscribble=\jobname.tmp
- \immediate\write\macscribble{#1}%\the\toks0}%
- \immediate\closeout\macscribble
- \input \jobname.tmp
-}
-\fi
-
-\newcount\paramno % Count of parameters
-\newtoks\macname % Macro name
-\newif\ifrecursive % Is it recursive?
-
-% Utility: does \let #1 = #2, except with \csnames.
-\def\cslet#1#2{%
-\expandafter\expandafter
-\expandafter\let
-\expandafter\expandafter
-\csname#1\endcsname
-\csname#2\endcsname}
-
-% Macro bodies are absorbed as an argument in a context where
-% all characters are catcode 10, 11 or 12, except \ which is active
-% (as in normal texinfo). It is necessary to change the definition of \.
-
-\def\macrobodyctxt{%
- \catcode`\~=12
- \catcode`\^=12
- \catcode`\_=12
- \catcode`\|=12
- \catcode`\<=12
- \catcode`\>=12
- \catcode`\+=12
- \catcode`\{=12
- \catcode`\}=12
- \catcode`\@=12
- \catcode`\^^M=10
- \usembodybackslash}
-
-% \mbodybackslash is the definition of \ in @macro bodies.
-% It maps \foo\ => \csname macarg.foo\endcsname => #N
-% where N is the macro parameter number.
-% We define \csname macarg.\endcsname to be \realbackslash, so
-% \\ in macro replacement text gets you a backslash.
-
-{\catcode`@=0 \catcode`\\=\active
- @gdef@usembodybackslash{@let\=@mbodybackslash}
- @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
-}
-\expandafter\def\csname macarg.\endcsname{\realbackslash}
-
-% The catcode games are necessary because @macro may or may not
-% have a brace-surrounded list of arguments, and we need to do
-% different stuff in each case. Making {, } \other is the only
-% way to prevent their being deleted by the tokenizer.
-\def\macro{\recursivefalse
- \bgroup\catcode`\{=\other\catcode`\}=\other\parsearg\macroxxx}
-\def\rmacro{\recursivetrue
- \bgroup\catcode`\{=\other\catcode`\}=\other\parsearg\macroxxx}
-
-\def\macroxxx#1{\egroup % started in \macro
- \getargs{#1}% now \macname is the macname and \toks0 the arglist
- \edef\temp{\the\toks0}%
- \ifx\temp\empty % no arguments
- \paramno=0%
- \else
- \expandafter\parsemargdef \the\toks0;%
- \fi
- \expandafter\ifx \csname macsave.\the\macname\endcsname \relax
- \cslet{macsave.\the\macname}{\the\macname}%
- \else
- \message{Warning: redefining \the\macname}%
- \fi
- \begingroup \macrobodyctxt
- \ifrecursive \expandafter\parsermacbody
- \else \expandafter\parsemacbody
- \fi}
-
-\def\unmacro{\parsearg\unmacroxxx}
-\def\unmacroxxx#1{
- \expandafter\ifx \csname macsave.\the\macname\endcsname \relax
- \errmessage{Macro \the\macname\ not defined.}%
- \else
- \cslet{#1}{macsave.#1}%
- \expandafter\let \csname macsave.\the\macname\endcsname \undefined
- \fi
-}
-
-% Parse the optional {params} list. Set up \paramno and \paramlist
-% so \defmacro knows what to do. Define \macarg.blah for each blah
-% in the params list, to be ##N where N is the position in that list.
-% That gets used by \mbodybackslash (above).
-
-% This code has to take great care with `macro parameter char #'. The
-% eight hashes in a row on the macarg.#1 line collapse to four in the
-% definition of \macarg.blah, to two when \parsemacbody expands the
-% macro replacement text, and to one when \defmacro writes the macro
-% definiton. The games with \twohash are to postpone expansion till
-% the very end, when \parsemargdefyyy crunches \paramlist into
-% something that can be splatted into a \expandafter\def\blah line (in
-% \defmacro).
-\def\parsemargdef#1;{\paramno=0\def\paramlist{}\parsemargdefxxx#1,;,}
-\def\parsemargdefxxx#1,{%
- \let\twohash\relax
- \if#1;\let\next=\parsemargdefyyy
- \else \let\next=\parsemargdefxxx
- \advance\paramno by 1%
- \expandafter\edef\csname macarg.#1\endcsname{########\the\paramno}%
- \edef\paramlist{\paramlist\twohash\twohash\the\paramno,}%
- \fi\next}
-\def\parsemargdefyyy{\let\twohash##\relax \edef\paramlist{\paramlist}}
-
-% These two commands read recursive and nonrecursive macro bodies.
-% (They're different since rec and nonrec macros end differently.)
-
-\long\def\parsemacbody#1@end macro%
-{\xdef\temp{#1} \endgroup\defmacro}%
-\long\def\parsermacbody#1@end macro%
-{\xdef\temp{#1} \endgroup\defmacro}%
-
-
-% This defines the macro itself. There are six cases: recursive and
-% nonrecursive macros of zero, one, and many arguments.
-% Much magic with \expandafter here.
-\def\defmacro{%
- \ifrecursive
- \ifcase\paramno
- % 0
- \expandafter\edef\csname\the\macname\endcsname{%
- \noexpand\scantokens{\temp}}%
- \or % 1
- \expandafter\edef\csname\the\macname\endcsname{%
- \noexpand\braceorline\csname\the\macname xxx\endcsname}%
- \expandafter\edef\csname\the\macname xxx\endcsname##1{%
- \noexpand\scantokens{\temp}}%
- \else % many
- \expandafter\edef\csname\the\macname\endcsname##1{%
- \csname\the\macname xxx\endcsname ##1,}%
- \expandafter\expandafter
- \expandafter\edef
- \expandafter\expandafter
- \csname\the\macname xxx\endcsname
- \paramlist{\noexpand\scantokens{\temp}}%
- \fi
- \else
- \ifcase\paramno
- % 0
- \expandafter\edef\csname\the\macname\endcsname{%
- \noexpand\norecurse{\the\macname}%
- \noexpand\scantokens{\temp}\egroup}%
- \or % 1
- \expandafter\edef\csname\the\macname\endcsname{%
- \noexpand\braceorline\csname\the\macname xxx\endcsname}%
- \expandafter\edef\csname\the\macname xxx\endcsname##1{%
- \noexpand\norecurse{\the\macname}
- \noexpand\scantokens{\temp}\egroup}%
- \else % many
- \expandafter\edef\csname\the\macname\endcsname##1{%
- \csname\the\macname xxx\endcsname ##1,}%
- \expandafter\expandafter
- \expandafter\edef
- \expandafter\expandafter
- \csname\the\macname xxx\endcsname
- \paramlist{%
- \noexpand\norecurse{\the\macname}
- \noexpand\scantokens{\temp}\egroup}%
- \fi
- \fi}
-
-\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
-
-% \braceorline decides whether the next nonwhitespace character is a
-% {. If so it reads up to the closing }, if not, it reads the whole
-% line. Whatever was read is then fed to the next control sequence
-% as an argument (by \parsebrace or \parsearg)
-\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
-\def\braceorlinexxx{%
- \ifx\nchar\bgroup\else
- \expandafter\parsearg
- \fi \next}
-
-% We need {} to be \other inside these commands. [] are temporary
-% grouping symbols.
-\begingroup
-\catcode`\{=\other \catcode`\}=\other
-\catcode`\[=1 \catcode`\]=2
-
-% @macro can be called with or without a brace-surrounded macro
-% argument list. These three sequences extract the macro name and arg
-% list in hopefully all cases. Note that anything on the line after the
-% first pair of braces will be thrown out (Makeinfo puts it into the
-% macro body).
-\gdef\getargs#1[\getargsxxx|#1 {}|]
-\gdef\getargsxxx|#1 {#2}#3|[%
- \toks0=[#2]%
- \edef\tmp[\the\toks0]%
- \ifx\tmp\empty
- \getargsnospaces|#1{}|%
- \else
- \macname=[#1]%
- \fi]
-\gdef\getargsnospaces|#1{#2}#3|[\macname=[#1]\toks0=[#2]]
-
-\endgroup
-
-
-\message{cross references,}
-\newwrite\auxfile
-
-\newif\ifhavexrefs % True if xref values are known.
-\newif\ifwarnedxrefs % True if we warned once that they aren't known.
-
-% @inforef is relatively simple.
-\def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
- node \samp{\ignorespaces#1{}}}
-
-% @setref{foo} defines a cross-reference point named foo.
-
-\def\setref#1{%
-\dosetq{#1-title}{Ytitle}%
-\dosetq{#1-pg}{Ypagenumber}%
-\dosetq{#1-snt}{Ysectionnumberandtype}}
-
-\def\unnumbsetref#1{%
-\dosetq{#1-title}{Ytitle}%
-\dosetq{#1-pg}{Ypagenumber}%
-\dosetq{#1-snt}{Ynothing}}
-
-\def\appendixsetref#1{%
-\dosetq{#1-title}{Ytitle}%
-\dosetq{#1-pg}{Ypagenumber}%
-\dosetq{#1-snt}{Yappendixletterandtype}}
-
-% \xref, \pxref, and \ref generate cross-references to specified points.
-% For \xrefX, #1 is the node name, #2 the name of the Info
-% cross-reference, #3 the printed node name, #4 the name of the Info
-% file, #5 the name of the printed manual. All but the node name can be
-% omitted.
-%
-\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
-\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
-\def\ref#1{\xrefX[#1,,,,,,,]}
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
- \def\printedmanual{\ignorespaces #5}%
- \def\printednodename{\ignorespaces #3}%
- \setbox1=\hbox{\printedmanual}%
- \setbox0=\hbox{\printednodename}%
- \ifdim \wd0 = 0pt
- % No printed node name was explicitly given.
- \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
- % Use the node name inside the square brackets.
- \def\printednodename{\ignorespaces #1}%
- \else
- % Use the actual chapter/section title appear inside
- % the square brackets. Use the real section title if we have it.
- \ifdim \wd1>0pt%
- % It is in another manual, so we don't have it.
- \def\printednodename{\ignorespaces #1}%
- \else
- \ifhavexrefs
- % We know the real title if we have the xref values.
- \def\printednodename{\refx{#1-title}{}}%
- \else
- % Otherwise just copy the Info node name.
- \def\printednodename{\ignorespaces #1}%
- \fi%
- \fi
- \fi
- \fi
- %
- % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
- % insert empty discretionaries after hyphens, which means that it will
- % not find a line break at a hyphen in a node names. Since some manuals
- % are best written with fairly long node names, containing hyphens, this
- % is a loss. Therefore, we give the text of the node name again, so it
- % is as if TeX is seeing it for the first time.
- \ifdim \wd1 > 0pt
- \putwordsection{} ``\printednodename'' in \cite{\printedmanual}%
- \else
- % _ (for example) has to be the character _ for the purposes of the
- % control sequence corresponding to the node, but it has to expand
- % into the usual \leavevmode...\vrule stuff for purposes of
- % printing. So we \turnoffactive for the \refx-snt, back on for the
- % printing, back off for the \refx-pg.
- {\normalturnoffactive \refx{#1-snt}{}}%
- \space [\printednodename],\space
- \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
- \fi
-\endgroup}
-
-% \dosetq is the interface for calls from other macros
-
-% Use \normalturnoffactive so that punctuation chars such as underscore
-% and backslash work in node names. (\turnoffactive doesn't do \.)
-\def\dosetq#1#2{%
- {\let\folio=0
- \normalturnoffactive
- \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
- \iflinks
- \next
- \fi
- }%
-}
-
-% \internalsetq {foo}{page} expands into
-% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
-% When the aux file is read, ' is the escape character
-
-\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
-
-% Things to be expanded by \internalsetq
-
-\def\Ypagenumber{\folio}
-
-\def\Ytitle{\thissection}
-
-\def\Ynothing{}
-
-\def\Ysectionnumberandtype{%
-\ifnum\secno=0 \putwordChapter\xreftie\the\chapno %
-\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno %
-\else \ifnum \subsubsecno=0 %
-\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno %
-\else %
-\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
-\fi \fi \fi }
-
-\def\Yappendixletterandtype{%
-\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}%
-\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno %
-\else \ifnum \subsubsecno=0 %
-\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
-\else %
-\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
-\fi \fi \fi }
-
-\gdef\xreftie{'tie}
-
-% Use TeX 3.0's \inputlineno to get the line number, for better error
-% messages, but if we're using an old version of TeX, don't do anything.
-%
-\ifx\inputlineno\thisisundefined
- \let\linenumber = \empty % Non-3.0.
-\else
- \def\linenumber{\the\inputlineno:\space}
-\fi
-
-% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
-% If its value is nonempty, SUFFIX is output afterward.
-
-\def\refx#1#2{%
- \expandafter\ifx\csname X#1\endcsname\relax
- % If not defined, say something at least.
- \angleleft un\-de\-fined\angleright
- \iflinks
- \ifhavexrefs
- \message{\linenumber Undefined cross reference `#1'.}%
- \else
- \ifwarnedxrefs\else
- \global\warnedxrefstrue
- \message{Cross reference values unknown; you must run TeX again.}%
- \fi
- \fi
- \fi
- \else
- % It's defined, so just use it.
- \csname X#1\endcsname
- \fi
- #2% Output the suffix in any case.
-}
-
-% This is the macro invoked by entries in the aux file.
-%
-\def\xrdef#1{\begingroup
- % Reenable \ as an escape while reading the second argument.
- \catcode`\\ = 0
- \afterassignment\endgroup
- \expandafter\gdef\csname X#1\endcsname
-}
-
-% Read the last existing aux file, if any. No error if none exists.
-\def\readauxfile{\begingroup
- \catcode`\^^@=\other
- \catcode`\^^A=\other
- \catcode`\^^B=\other
- \catcode`\^^C=\other
- \catcode`\^^D=\other
- \catcode`\^^E=\other
- \catcode`\^^F=\other
- \catcode`\^^G=\other
- \catcode`\^^H=\other
- \catcode`\^^K=\other
- \catcode`\^^L=\other
- \catcode`\^^N=\other
- \catcode`\^^P=\other
- \catcode`\^^Q=\other
- \catcode`\^^R=\other
- \catcode`\^^S=\other
- \catcode`\^^T=\other
- \catcode`\^^U=\other
- \catcode`\^^V=\other
- \catcode`\^^W=\other
- \catcode`\^^X=\other
- \catcode`\^^Z=\other
- \catcode`\^^[=\other
- \catcode`\^^\=\other
- \catcode`\^^]=\other
- \catcode`\^^^=\other
- \catcode`\^^_=\other
- \catcode`\@=\other
- \catcode`\^=\other
- % It was suggested to define this as 7, which would allow ^^e4 etc.
- % in xref tags, i.e., node names. But since ^^e4 notation isn't
- % supported in the main text, it doesn't seem desirable. Furthermore,
- % that is not enough: for node names that actually contain a ^
- % character, we would end up writing a line like this: 'xrdef {'hat
- % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
- % argument, and \hat is not an expandable control sequence. It could
- % all be worked out, but why? Either we support ^^ or we don't.
- %
- % The other change necessary for this was to define \auxhat:
- % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
- % and then to call \auxhat in \setq.
- %
- \catcode`\~=\other
- \catcode`\[=\other
- \catcode`\]=\other
- \catcode`\"=\other
- \catcode`\_=\other
- \catcode`\|=\other
- \catcode`\<=\other
- \catcode`\>=\other
- \catcode`\$=\other
- \catcode`\#=\other
- \catcode`\&=\other
- \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
- % Make the characters 128-255 be printing characters
- {%
- \count 1=128
- \def\loop{%
- \catcode\count 1=\other
- \advance\count 1 by 1
- \ifnum \count 1<256 \loop \fi
- }%
- }%
- % The aux file uses ' as the escape (for now).
- % Turn off \ as an escape so we do not lose on
- % entries which were dumped with control sequences in their names.
- % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
- % Reference to such entries still does not work the way one would wish,
- % but at least they do not bomb out when the aux file is read in.
- \catcode`\{=1
- \catcode`\}=2
- \catcode`\%=\other
- \catcode`\'=0
- \catcode`\\=\other
- %
- \openin 1 \jobname.aux
- \ifeof 1 \else
- \closein 1
- \input \jobname.aux
- \global\havexrefstrue
- \global\warnedobstrue
- \fi
- % Open the new aux file. TeX will close it automatically at exit.
- \openout\auxfile=\jobname.aux
-\endgroup}
-
-
-% Footnotes.
-
-\newcount \footnoteno
-
-% The trailing space in the following definition for supereject is
-% vital for proper filling; pages come out unaligned when you do a
-% pagealignmacro call if that space before the closing brace is
-% removed. (Generally, numeric constants should always be followed by a
-% space to prevent strange expansion errors.)
-\def\supereject{\par\penalty -20000\footnoteno =0 }
-
-% @footnotestyle is meaningful for info output only.
-\let\footnotestyle=\comment
-
-\let\ptexfootnote=\footnote
-
-{\catcode `\@=11
-%
-% Auto-number footnotes. Otherwise like plain.
-\gdef\footnote{%
- \global\advance\footnoteno by \@ne
- \edef\thisfootno{$^{\the\footnoteno}$}%
- %
- % In case the footnote comes at the end of a sentence, preserve the
- % extra spacing after we do the footnote number.
- \let\@sf\empty
- \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
- %
- % Remove inadvertent blank space before typesetting the footnote number.
- \unskip
- \thisfootno\@sf
- \footnotezzz
-}%
-
-% Don't bother with the trickery in plain.tex to not require the
-% footnote text as a parameter. Our footnotes don't need to be so general.
-%
-% Oh yes, they do; otherwise, @ifset and anything else that uses
-% \parseargline fail inside footnotes because the tokens are fixed when
-% the footnote is read. --karl, 16nov96.
-%
-\long\gdef\footnotezzz{\insert\footins\bgroup
- % We want to typeset this text as a normal paragraph, even if the
- % footnote reference occurs in (for example) a display environment.
- % So reset some parameters.
- \interlinepenalty\interfootnotelinepenalty
- \splittopskip\ht\strutbox % top baseline for broken footnotes
- \splitmaxdepth\dp\strutbox
- \floatingpenalty\@MM
- \leftskip\z@skip
- \rightskip\z@skip
- \spaceskip\z@skip
- \xspaceskip\z@skip
- \parindent\defaultparindent
- %
- % Hang the footnote text off the number.
- \hang
- \textindent{\thisfootno}%
- %
- % Don't crash into the line above the footnote text. Since this
- % expands into a box, it must come within the paragraph, lest it
- % provide a place where TeX can split the footnote.
- \footstrut
- \futurelet\next\fo@t
-}
-\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
- \else\let\next\f@t\fi \next}
-\def\f@@t{\bgroup\aftergroup\@foot\let\next}
-\def\f@t#1{#1\@foot}
-\def\@foot{\strut\egroup}
-
-}%end \catcode `\@=11
-
-% Set the baselineskip to #1, and the lineskip and strut size
-% correspondingly. There is no deep meaning behind these magic numbers
-% used as factors; they just match (closely enough) what Knuth defined.
-%
-\def\lineskipfactor{.08333}
-\def\strutheightpercent{.70833}
-\def\strutdepthpercent {.29167}
-%
-\def\setleading#1{%
- \normalbaselineskip = #1\relax
- \normallineskip = \lineskipfactor\normalbaselineskip
- \normalbaselines
- \setbox\strutbox =\hbox{%
- \vrule width0pt height\strutheightpercent\baselineskip
- depth \strutdepthpercent \baselineskip
- }%
-}
-
-% @| inserts a changebar to the left of the current line. It should
-% surround any changed text. This approach does *not* work if the
-% change spans more than two lines of output. To handle that, we would
-% have adopt a much more difficult approach (putting marks into the main
-% vertical list for the beginning and end of each change).
-%
-\def\|{%
- % \vadjust can only be used in horizontal mode.
- \leavevmode
- %
- % Append this vertical mode material after the current line in the output.
- \vadjust{%
- % We want to insert a rule with the height and depth of the current
- % leading; that is exactly what \strutbox is supposed to record.
- \vskip-\baselineskip
- %
- % \vadjust-items are inserted at the left edge of the type. So
- % the \llap here moves out into the left-hand margin.
- \llap{%
- %
- % For a thicker or thinner bar, change the `1pt'.
- \vrule height\baselineskip width1pt
- %
- % This is the space between the bar and the text.
- \hskip 12pt
- }%
- }%
-}
-
-% For a final copy, take out the rectangles
-% that mark overfull boxes (in case you have decided
-% that the text looks ok even though it passes the margin).
-%
-\def\finalout{\overfullrule=0pt}
-
-% @image. We use the macros from epsf.tex to support this.
-% If epsf.tex is not installed and @image is used, we complain.
-%
-% Check for and read epsf.tex up front. If we read it only at @image
-% time, we might be inside a group, and then its definitions would get
-% undone and the next image would fail.
-\openin 1 = epsf.tex
-\ifeof 1 \else
- \closein 1
- % Do not bother showing banner with post-v2.7 epsf.tex (available in
- % doc/epsf.tex until it shows up on ctan).
- \def\epsfannounce{\toks0 = }%
- \input epsf.tex
-\fi
-%
-\newif\ifwarnednoepsf
-\newhelp\noepsfhelp{epsf.tex must be installed for images to
- work. It is also included in the Texinfo distribution, or you can get
- it from ftp://ftp.tug.org/tex/epsf.tex.}
-%
-% Only complain once about lack of epsf.tex.
-\def\image#1{%
- \ifx\epsfbox\undefined
- \ifwarnednoepsf \else
- \errhelp = \noepsfhelp
- \errmessage{epsf.tex not found, images will be ignored}%
- \global\warnednoepsftrue
- \fi
- \else
- \imagexxx #1,,,\finish
- \fi
-}
-%
-% Arguments to @image:
-% #1 is (mandatory) image filename; we tack on .eps extension.
-% #2 is (optional) width, #3 is (optional) height.
-% #4 is just the usual extra ignored arg for parsing this stuff.
-\def\imagexxx#1,#2,#3,#4\finish{%
- % \epsfbox itself resets \epsf?size at each figure.
- \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
- \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
- % If the image is by itself, center it.
- \ifvmode
- \centerline{\epsfbox{#1.eps}}%
- \else
- \epsfbox{#1.eps}%
- \fi
-}
-
-
-\message{paper sizes,}
-% And other related parameters.
-
-\newdimen\defaultparindent \defaultparindent = 15pt
-
-\chapheadingskip = 15pt plus 4pt minus 2pt
-\secheadingskip = 12pt plus 3pt minus 2pt
-\subsecheadingskip = 9pt plus 2pt minus 2pt
-
-% Prevent underfull vbox error messages.
-\vbadness = 10000
-
-% Following George Bush, just get rid of widows and orphans.
-\widowpenalty=10000
-\clubpenalty=10000
-
-% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
-% using an old version of TeX, don't do anything. We want the amount of
-% stretch added to depend on the line length, hence the dependence on
-% \hsize. This makes it come to about 9pt for the 8.5x11 format. We
-% call this whenever the paper size is set.
-%
-\def\setemergencystretch{%
- \ifx\emergencystretch\thisisundefined
- % Allow us to assign to \emergencystretch anyway.
- \def\emergencystretch{\dimen0}%
- \else
- \emergencystretch = \hsize
- \divide\emergencystretch by 45
- \fi
-}
-
-% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
-% 4) hoffset; 5) binding offset; 6) topskip. Then whoever calls us can
-% set \parskip and call \setleading for \baselineskip.
-%
-\def\internalpagesizes#1#2#3#4#5#6{%
- \voffset = #3\relax
- \topskip = #6\relax
- \splittopskip = \topskip
- %
- \vsize = #1\relax
- \advance\vsize by \topskip
- \outervsize = \vsize
- \advance\outervsize by 0.6in
- \pageheight = \vsize
- %
- \hsize = #2\relax
- \outerhsize = \hsize
- \advance\outerhsize by 0.5in
- \pagewidth = \hsize
- %
- \normaloffset = #4\relax
- \bindingoffset = #5\relax
- %
- \parindent = \defaultparindent
- \setemergencystretch
-}
-
-% @letterpaper (the default).
-\def\letterpaper{{\globaldefs = 1
- \parskip = 3pt plus 2pt minus 1pt
- \setleading{13.2pt}%
- %
- % If page is nothing but text, make it come out even.
- \internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}%
-}}
-
-% Use @smallbook to reset parameters for 7x9.5 (or so) format.
-\def\smallbook{{\globaldefs = 1
- \parskip = 2pt plus 1pt
- \setleading{12pt}%
- %
- \internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}%
- %
- \lispnarrowing = 0.3in
- \tolerance = 700
- \hfuzz = 1pt
- \contentsrightmargin = 0pt
- \deftypemargin = 0pt
- \defbodyindent = .5cm
- %
- \let\smalllisp = \smalllispx
- \let\smallexample = \smalllispx
- \def\Esmallexample{\Esmalllisp}%
-}}
-
-% Use @afourpaper to print on European A4 paper.
-\def\afourpaper{{\globaldefs = 1
- \setleading{12pt}%
- \parskip = 3pt plus 2pt minus 1pt
- %
- \internalpagesizes{53\baselineskip}{6.5in}{\voffset}{.25in}{\bindingoffset}{44pt}%
- %
- \tolerance = 700
- \hfuzz = 1pt
-}}
-
-% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin
-% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
-\def\afourlatex{{\globaldefs = 1
- \setleading{13.6pt}%
- %
- \afourpaper
- \internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}%
- %
- \globaldefs = 0
-}}
-
-% Use @afourwide to print on European A4 paper in wide format.
-\def\afourwide{%
- \afourpaper
- \internalpagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}%
- %
- \globaldefs = 0
-}
-
-% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
-% Perhaps we should allow setting the margins, \topskip, \parskip,
-% and/or leading, also. Or perhaps we should compute them somehow.
-%
-\def\pagesizes{\parsearg\pagesizesxxx}
-\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
-\def\pagesizesyyy#1,#2,#3\finish{{%
- \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
- \globaldefs = 1
- %
- \parskip = 3pt plus 2pt minus 1pt
- \setleading{13.2pt}%
- %
- \internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}%
-}}
-
-% Set default to letter.
-%
-\letterpaper
-
-\message{and turning on texinfo input format.}
-
-% Define macros to output various characters with catcode for normal text.
-\catcode`\"=\other
-\catcode`\~=\other
-\catcode`\^=\other
-\catcode`\_=\other
-\catcode`\|=\other
-\catcode`\<=\other
-\catcode`\>=\other
-\catcode`\+=\other
-\def\normaldoublequote{"}
-\def\normaltilde{~}
-\def\normalcaret{^}
-\def\normalunderscore{_}
-\def\normalverticalbar{|}
-\def\normalless{<}
-\def\normalgreater{>}
-\def\normalplus{+}
-
-% This macro is used to make a character print one way in ttfont
-% where it can probably just be output, and another way in other fonts,
-% where something hairier probably needs to be done.
-%
-% #1 is what to print if we are indeed using \tt; #2 is what to print
-% otherwise. Since all the Computer Modern typewriter fonts have zero
-% interword stretch (and shrink), and it is reasonable to expect all
-% typewriter fonts to have this, we can check that font parameter.
-%
-\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}
-
-% Turn off all special characters except @
-% (and those which the user can use as if they were ordinary).
-% Most of these we simply print from the \tt font, but for some, we can
-% use math or other variants that look better in normal text.
-
-\catcode`\"=\active
-\def\activedoublequote{{\tt\char34}}
-\let"=\activedoublequote
-\catcode`\~=\active
-\def~{{\tt\char126}}
-\chardef\hat=`\^
-\catcode`\^=\active
-\def^{{\tt \hat}}
-
-\catcode`\_=\active
-\def_{\ifusingtt\normalunderscore\_}
-% Subroutine for the previous macro.
-\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
-
-\catcode`\|=\active
-\def|{{\tt\char124}}
-\chardef \less=`\<
-\catcode`\<=\active
-\def<{{\tt \less}}
-\chardef \gtr=`\>
-\catcode`\>=\active
-\def>{{\tt \gtr}}
-\catcode`\+=\active
-\def+{{\tt \char 43}}
-%\catcode 27=\active
-%\def^^[{$\diamondsuit$}
-
-% Set up an active definition for =, but don't enable it most of the time.
-{\catcode`\==\active
-\global\def={{\tt \char 61}}}
-
-\catcode`+=\active
-\catcode`\_=\active
-
-% If a .fmt file is being used, characters that might appear in a file
-% name cannot be active until we have parsed the command line.
-% So turn them off again, and have \everyjob (or @setfilename) turn them on.
-% \otherifyactive is called near the end of this file.
-\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
-
-\catcode`\@=0
-
-% \rawbackslashxx output one backslash character in current font
-\global\chardef\rawbackslashxx=`\\
-%{\catcode`\\=\other
-%@gdef@rawbackslashxx{\}}
-
-% \rawbackslash redefines \ as input to do \rawbackslashxx.
-{\catcode`\\=\active
-@gdef@rawbackslash{@let\=@rawbackslashxx }}
-
-% \normalbackslash outputs one backslash in fixed width font.
-\def\normalbackslash{{\tt\rawbackslashxx}}
-
-% Say @foo, not \foo, in error messages.
-\escapechar=`\@
-
-% \catcode 17=0 % Define control-q
-\catcode`\\=\active
-
-% Used sometimes to turn off (effectively) the active characters
-% even after parsing them.
-@def@turnoffactive{@let"=@normaldoublequote
-@let\=@realbackslash
-@let~=@normaltilde
-@let^=@normalcaret
-@let_=@normalunderscore
-@let|=@normalverticalbar
-@let<=@normalless
-@let>=@normalgreater
-@let+=@normalplus}
-
-@def@normalturnoffactive{@let"=@normaldoublequote
-@let\=@normalbackslash
-@let~=@normaltilde
-@let^=@normalcaret
-@let_=@normalunderscore
-@let|=@normalverticalbar
-@let<=@normalless
-@let>=@normalgreater
-@let+=@normalplus}
-
-% Make _ and + \other characters, temporarily.
-% This is canceled by @fixbackslash.
-@otherifyactive
-
-% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
-% That is what \eatinput is for; after that, the `\' should revert to printing
-% a backslash.
-%
-@gdef@eatinput input texinfo{@fixbackslash}
-@global@let\ = @eatinput
-
-% On the other hand, perhaps the file did not have a `\input texinfo'. Then
-% the first `\{ in the file would cause an error. This macro tries to fix
-% that, assuming it is called before the first `\' could plausibly occur.
-% Also back turn on active characters that might appear in the input
-% file name, in case not using a pre-dumped format.
-%
-@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi
- @catcode`+=@active @catcode`@_=@active}
-
-% These look ok in all fonts, so just make them not special. The @rm below
-% makes sure that the current font starts out as the newly loaded cmr10
-@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
-
-@textfonts
-@rm
-
-@c Local variables:
-@c page-delimiter: "^\\\\message"
-@c End:
diff --git a/gcc/tm.texi b/gcc/tm.texi
deleted file mode 100755
index 66b2804..0000000
--- a/gcc/tm.texi
+++ /dev/null
@@ -1,7699 +0,0 @@
-@c Copyright (C) 1988,89,92,93,94,96,97,98,1999 Free Software Foundation, Inc.
-@c This is part of the GCC manual.
-@c For copying conditions, see the file gcc.texi.
-
-@node Target Macros
-@chapter Target Description Macros
-@cindex machine description macros
-@cindex target description macros
-@cindex macros, target description
-@cindex @file{tm.h} macros
-
-In addition to the file @file{@var{machine}.md}, a machine description
-includes a C header file conventionally given the name
-@file{@var{machine}.h}. This header file defines numerous macros
-that convey the information about the target machine that does not fit
-into the scheme of the @file{.md} file. The file @file{tm.h} should be
-a link to @file{@var{machine}.h}. The header file @file{config.h}
-includes @file{tm.h} and most compiler source files include
-@file{config.h}.
-
-@menu
-* Driver:: Controlling how the driver runs the compilation passes.
-* Run-time Target:: Defining @samp{-m} options like @samp{-m68000} and @samp{-m68020}.
-* Storage Layout:: Defining sizes and alignments of data.
-* Type Layout:: Defining sizes and properties of basic user data types.
-* Registers:: Naming and describing the hardware registers.
-* Register Classes:: Defining the classes of hardware registers.
-* Stack and Calling:: Defining which way the stack grows and by how much.
-* Varargs:: Defining the varargs macros.
-* Trampolines:: Code set up at run time to enter a nested function.
-* Library Calls:: Controlling how library routines are implicitly called.
-* Addressing Modes:: Defining addressing modes valid for memory operands.
-* Condition Code:: Defining how insns update the condition code.
-* Costs:: Defining relative costs of different operations.
-* Sections:: Dividing storage into text, data, and other sections.
-* PIC:: Macros for position independent code.
-* Assembler Format:: Defining how to write insns and pseudo-ops to output.
-* Debugging Info:: Defining the format of debugging output.
-* Cross-compilation:: Handling floating point for cross-compilers.
-* Misc:: Everything else.
-@end menu
-
-@node Driver
-@section Controlling the Compilation Driver, @file{gcc}
-@cindex driver
-@cindex controlling the compilation driver
-
-@c prevent bad page break with this line
-You can control the compilation driver.
-
-@table @code
-@findex SWITCH_TAKES_ARG
-@item SWITCH_TAKES_ARG (@var{char})
-A C expression which determines whether the option @samp{-@var{char}}
-takes arguments. The value should be the number of arguments that
-option takes--zero, for many options.
-
-By default, this macro is defined as
-@code{DEFAULT_SWITCH_TAKES_ARG}, which handles the standard options
-properly. You need not define @code{SWITCH_TAKES_ARG} unless you
-wish to add additional options which take arguments. Any redefinition
-should call @code{DEFAULT_SWITCH_TAKES_ARG} and then check for
-additional options.
-
-@findex WORD_SWITCH_TAKES_ARG
-@item WORD_SWITCH_TAKES_ARG (@var{name})
-A C expression which determines whether the option @samp{-@var{name}}
-takes arguments. The value should be the number of arguments that
-option takes--zero, for many options. This macro rather than
-@code{SWITCH_TAKES_ARG} is used for multi-character option names.
-
-By default, this macro is defined as
-@code{DEFAULT_WORD_SWITCH_TAKES_ARG}, which handles the standard options
-properly. You need not define @code{WORD_SWITCH_TAKES_ARG} unless you
-wish to add additional options which take arguments. Any redefinition
-should call @code{DEFAULT_WORD_SWITCH_TAKES_ARG} and then check for
-additional options.
-
-@findex SWITCH_CURTAILS_COMPILATION
-@item SWITCH_CURTAILS_COMPILATION (@var{char})
-A C expression which determines whether the option @samp{-@var{char}}
-stops compilation before the generation of an executable. The value is
-boolean, non-zero if the option does stop an executable from being
-generated, zero otherwise.
-
-By default, this macro is defined as
-@code{DEFAULT_SWITCH_CURTAILS_COMPILATION}, which handles the standard
-options properly. You need not define
-@code{SWITCH_CURTAILS_COMPILATION} unless you wish to add additional
-options which affect the generation of an executable. Any redefinition
-should call @code{DEFAULT_SWITCH_CURTAILS_COMPILATION} and then check
-for additional options.
-
-@findex SWITCHES_NEED_SPACES
-@item SWITCHES_NEED_SPACES
-A string-valued C expression which enumerates the options for which
-the linker needs a space between the option and its argument.
-
-If this macro is not defined, the default value is @code{""}.
-
-@findex CPP_SPEC
-@item CPP_SPEC
-A C string constant that tells the GNU CC driver program options to
-pass to CPP. It can also specify how to translate options you
-give to GNU CC into options for GNU CC to pass to the CPP.
-
-Do not define this macro if it does not need to do anything.
-
-@findex NO_BUILTIN_SIZE_TYPE
-@item NO_BUILTIN_SIZE_TYPE
-If this macro is defined, the preprocessor will not define the builtin macro
-@code{__SIZE_TYPE__}. The macro @code{__SIZE_TYPE__} must then be defined
-by @code{CPP_SPEC} instead.
-
-This should be defined if @code{SIZE_TYPE} depends on target dependent flags
-which are not accessible to the preprocessor. Otherwise, it should not
-be defined.
-
-@findex NO_BUILTIN_PTRDIFF_TYPE
-@item NO_BUILTIN_PTRDIFF_TYPE
-If this macro is defined, the preprocessor will not define the builtin macro
-@code{__PTRDIFF_TYPE__}. The macro @code{__PTRDIFF_TYPE__} must then be
-defined by @code{CPP_SPEC} instead.
-
-This should be defined if @code{PTRDIFF_TYPE} depends on target dependent flags
-which are not accessible to the preprocessor. Otherwise, it should not
-be defined.
-
-@findex SIGNED_CHAR_SPEC
-@item SIGNED_CHAR_SPEC
-A C string constant that tells the GNU CC driver program options to
-pass to CPP. By default, this macro is defined to pass the option
-@samp{-D__CHAR_UNSIGNED__} to CPP if @code{char} will be treated as
-@code{unsigned char} by @code{cc1}.
-
-Do not define this macro unless you need to override the default
-definition.
-
-@findex CC1_SPEC
-@item CC1_SPEC
-A C string constant that tells the GNU CC driver program options to
-pass to @code{cc1}. It can also specify how to translate options you
-give to GNU CC into options for GNU CC to pass to the @code{cc1}.
-
-Do not define this macro if it does not need to do anything.
-
-@findex CC1PLUS_SPEC
-@item CC1PLUS_SPEC
-A C string constant that tells the GNU CC driver program options to
-pass to @code{cc1plus}. It can also specify how to translate options you
-give to GNU CC into options for GNU CC to pass to the @code{cc1plus}.
-
-Do not define this macro if it does not need to do anything.
-
-@findex ASM_SPEC
-@item ASM_SPEC
-A C string constant that tells the GNU CC driver program options to
-pass to the assembler. It can also specify how to translate options
-you give to GNU CC into options for GNU CC to pass to the assembler.
-See the file @file{sun3.h} for an example of this.
-
-Do not define this macro if it does not need to do anything.
-
-@findex ASM_FINAL_SPEC
-@item ASM_FINAL_SPEC
-A C string constant that tells the GNU CC driver program how to
-run any programs which cleanup after the normal assembler.
-Normally, this is not needed. See the file @file{mips.h} for
-an example of this.
-
-Do not define this macro if it does not need to do anything.
-
-@findex LINK_SPEC
-@item LINK_SPEC
-A C string constant that tells the GNU CC driver program options to
-pass to the linker. It can also specify how to translate options you
-give to GNU CC into options for GNU CC to pass to the linker.
-
-Do not define this macro if it does not need to do anything.
-
-@findex LIB_SPEC
-@item LIB_SPEC
-Another C string constant used much like @code{LINK_SPEC}. The difference
-between the two is that @code{LIB_SPEC} is used at the end of the
-command given to the linker.
-
-If this macro is not defined, a default is provided that
-loads the standard C library from the usual place. See @file{gcc.c}.
-
-@findex LIBGCC_SPEC
-@item LIBGCC_SPEC
-Another C string constant that tells the GNU CC driver program
-how and when to place a reference to @file{libgcc.a} into the
-linker command line. This constant is placed both before and after
-the value of @code{LIB_SPEC}.
-
-If this macro is not defined, the GNU CC driver provides a default that
-passes the string @samp{-lgcc} to the linker unless the @samp{-shared}
-option is specified.
-
-@findex STARTFILE_SPEC
-@item STARTFILE_SPEC
-Another C string constant used much like @code{LINK_SPEC}. The
-difference between the two is that @code{STARTFILE_SPEC} is used at
-the very beginning of the command given to the linker.
-
-If this macro is not defined, a default is provided that loads the
-standard C startup file from the usual place. See @file{gcc.c}.
-
-@findex ENDFILE_SPEC
-@item ENDFILE_SPEC
-Another C string constant used much like @code{LINK_SPEC}. The
-difference between the two is that @code{ENDFILE_SPEC} is used at
-the very end of the command given to the linker.
-
-Do not define this macro if it does not need to do anything.
-
-@findex EXTRA_SPECS
-@item EXTRA_SPECS
-Define this macro to provide additional specifications to put in the
-@file{specs} file that can be used in various specifications like
-@code{CC1_SPEC}.
-
-The definition should be an initializer for an array of structures,
-containing a string constant, that defines the specification name, and a
-string constant that provides the specification.
-
-Do not define this macro if it does not need to do anything.
-
-@code{EXTRA_SPECS} is useful when an architecture contains several
-related targets, which have various @code{..._SPECS} which are similar
-to each other, and the maintainer would like one central place to keep
-these definitions.
-
-For example, the PowerPC System V.4 targets use @code{EXTRA_SPECS} to
-define either @code{_CALL_SYSV} when the System V calling sequence is
-used or @code{_CALL_AIX} when the older AIX-based calling sequence is
-used.
-
-The @file{config/rs6000/rs6000.h} target file defines:
-
-@example
-#define EXTRA_SPECS \
- @{ "cpp_sysv_default", CPP_SYSV_DEFAULT @},
-
-#define CPP_SYS_DEFAULT ""
-@end example
-
-The @file{config/rs6000/sysv.h} target file defines:
-@smallexample
-#undef CPP_SPEC
-#define CPP_SPEC \
-"%@{posix: -D_POSIX_SOURCE @} \
-%@{mcall-sysv: -D_CALL_SYSV @} %@{mcall-aix: -D_CALL_AIX @} \
-%@{!mcall-sysv: %@{!mcall-aix: %(cpp_sysv_default) @}@} \
-%@{msoft-float: -D_SOFT_FLOAT@} %@{mcpu=403: -D_SOFT_FLOAT@}"
-
-#undef CPP_SYSV_DEFAULT
-#define CPP_SYSV_DEFAULT "-D_CALL_SYSV"
-@end smallexample
-
-while the @file{config/rs6000/eabiaix.h} target file defines
-@code{CPP_SYSV_DEFAULT} as:
-
-@smallexample
-#undef CPP_SYSV_DEFAULT
-#define CPP_SYSV_DEFAULT "-D_CALL_AIX"
-@end smallexample
-
-@findex LINK_LIBGCC_SPECIAL
-@item LINK_LIBGCC_SPECIAL
-Define this macro if the driver program should find the library
-@file{libgcc.a} itself and should not pass @samp{-L} options to the
-linker. If you do not define this macro, the driver program will pass
-the argument @samp{-lgcc} to tell the linker to do the search and will
-pass @samp{-L} options to it.
-
-@findex LINK_LIBGCC_SPECIAL_1
-@item LINK_LIBGCC_SPECIAL_1
-Define this macro if the driver program should find the library
-@file{libgcc.a}. If you do not define this macro, the driver program will pass
-the argument @samp{-lgcc} to tell the linker to do the search.
-This macro is similar to @code{LINK_LIBGCC_SPECIAL}, except that it does
-not affect @samp{-L} options.
-
-@findex LINK_COMMAND_SPEC
-@item LINK_COMMAND_SPEC
-A C string constant giving the complete command line need to execute the
-linker. When you do this, you will need to update your port each time a
-change is made to the link command line within @file{gcc.c}. Therefore,
-define this macro only if you need to completely redefine the command
-line for invoking the linker and there is no other way to accomplish
-the effect you need.
-
-@findex MULTILIB_DEFAULTS
-@item MULTILIB_DEFAULTS
-Define this macro as a C expression for the initializer of an array of
-string to tell the driver program which options are defaults for this
-target and thus do not need to be handled specially when using
-@code{MULTILIB_OPTIONS}.
-
-Do not define this macro if @code{MULTILIB_OPTIONS} is not defined in
-the target makefile fragment or if none of the options listed in
-@code{MULTILIB_OPTIONS} are set by default.
-@xref{Target Fragment}.
-
-@findex RELATIVE_PREFIX_NOT_LINKDIR
-@item RELATIVE_PREFIX_NOT_LINKDIR
-Define this macro to tell @code{gcc} that it should only translate
-a @samp{-B} prefix into a @samp{-L} linker option if the prefix
-indicates an absolute file name.
-
-@findex STANDARD_EXEC_PREFIX
-@item STANDARD_EXEC_PREFIX
-Define this macro as a C string constant if you wish to override the
-standard choice of @file{/usr/local/lib/gcc-lib/} as the default prefix to
-try when searching for the executable files of the compiler.
-
-@findex MD_EXEC_PREFIX
-@item MD_EXEC_PREFIX
-If defined, this macro is an additional prefix to try after
-@code{STANDARD_EXEC_PREFIX}. @code{MD_EXEC_PREFIX} is not searched
-when the @samp{-b} option is used, or the compiler is built as a cross
-compiler.
-
-@findex STANDARD_STARTFILE_PREFIX
-@item STANDARD_STARTFILE_PREFIX
-Define this macro as a C string constant if you wish to override the
-standard choice of @file{/usr/local/lib/} as the default prefix to
-try when searching for startup files such as @file{crt0.o}.
-
-@findex MD_STARTFILE_PREFIX
-@item MD_STARTFILE_PREFIX
-If defined, this macro supplies an additional prefix to try after the
-standard prefixes. @code{MD_EXEC_PREFIX} is not searched when the
-@samp{-b} option is used, or when the compiler is built as a cross
-compiler.
-
-@findex MD_STARTFILE_PREFIX_1
-@item MD_STARTFILE_PREFIX_1
-If defined, this macro supplies yet another prefix to try after the
-standard prefixes. It is not searched when the @samp{-b} option is
-used, or when the compiler is built as a cross compiler.
-
-@findex INIT_ENVIRONMENT
-@item INIT_ENVIRONMENT
-Define this macro as a C string constant if you wish to set environment
-variables for programs called by the driver, such as the assembler and
-loader. The driver passes the value of this macro to @code{putenv} to
-initialize the necessary environment variables.
-
-@findex LOCAL_INCLUDE_DIR
-@item LOCAL_INCLUDE_DIR
-Define this macro as a C string constant if you wish to override the
-standard choice of @file{/usr/local/include} as the default prefix to
-try when searching for local header files. @code{LOCAL_INCLUDE_DIR}
-comes before @code{SYSTEM_INCLUDE_DIR} in the search order.
-
-Cross compilers do not use this macro and do not search either
-@file{/usr/local/include} or its replacement.
-
-@findex SYSTEM_INCLUDE_DIR
-@item SYSTEM_INCLUDE_DIR
-Define this macro as a C string constant if you wish to specify a
-system-specific directory to search for header files before the standard
-directory. @code{SYSTEM_INCLUDE_DIR} comes before
-@code{STANDARD_INCLUDE_DIR} in the search order.
-
-Cross compilers do not use this macro and do not search the directory
-specified.
-
-@findex STANDARD_INCLUDE_DIR
-@item STANDARD_INCLUDE_DIR
-Define this macro as a C string constant if you wish to override the
-standard choice of @file{/usr/include} as the default prefix to
-try when searching for header files.
-
-Cross compilers do not use this macro and do not search either
-@file{/usr/include} or its replacement.
-
-@findex STANDARD_INCLUDE_COMPONENT
-@item STANDARD_INCLUDE_COMPONENT
-The ``component'' corresponding to @code{STANDARD_INCLUDE_DIR}.
-See @code{INCLUDE_DEFAULTS}, below, for the description of components.
-If you do not define this macro, no component is used.
-
-@findex INCLUDE_DEFAULTS
-@item INCLUDE_DEFAULTS
-Define this macro if you wish to override the entire default search path
-for include files. For a native compiler, the default search path
-usually consists of @code{GCC_INCLUDE_DIR}, @code{LOCAL_INCLUDE_DIR},
-@code{SYSTEM_INCLUDE_DIR}, @code{GPLUSPLUS_INCLUDE_DIR}, and
-@code{STANDARD_INCLUDE_DIR}. In addition, @code{GPLUSPLUS_INCLUDE_DIR}
-and @code{GCC_INCLUDE_DIR} are defined automatically by @file{Makefile},
-and specify private search areas for GCC. The directory
-@code{GPLUSPLUS_INCLUDE_DIR} is used only for C++ programs.
-
-The definition should be an initializer for an array of structures.
-Each array element should have four elements: the directory name (a
-string constant), the component name, and flag for C++-only directories,
-and a flag showing that the includes in the directory don't need to be
-wrapped in @code{extern @samp{C}} when compiling C++. Mark the end of
-the array with a null element.
-
-The component name denotes what GNU package the include file is part of,
-if any, in all upper-case letters. For example, it might be @samp{GCC}
-or @samp{BINUTILS}. If the package is part of the a vendor-supplied
-operating system, code the component name as @samp{0}.
-
-
-For example, here is the definition used for VAX/VMS:
-
-@example
-#define INCLUDE_DEFAULTS \
-@{ \
- @{ "GNU_GXX_INCLUDE:", "G++", 1, 1@}, \
- @{ "GNU_CC_INCLUDE:", "GCC", 0, 0@}, \
- @{ "SYS$SYSROOT:[SYSLIB.]", 0, 0, 0@}, \
- @{ ".", 0, 0, 0@}, \
- @{ 0, 0, 0, 0@} \
-@}
-@end example
-@end table
-
-Here is the order of prefixes tried for exec files:
-
-@enumerate
-@item
-Any prefixes specified by the user with @samp{-B}.
-
-@item
-The environment variable @code{GCC_EXEC_PREFIX}, if any.
-
-@item
-The directories specified by the environment variable @code{COMPILER_PATH}.
-
-@item
-The macro @code{STANDARD_EXEC_PREFIX}.
-
-@item
-@file{/usr/lib/gcc/}.
-
-@item
-The macro @code{MD_EXEC_PREFIX}, if any.
-@end enumerate
-
-Here is the order of prefixes tried for startfiles:
-
-@enumerate
-@item
-Any prefixes specified by the user with @samp{-B}.
-
-@item
-The environment variable @code{GCC_EXEC_PREFIX}, if any.
-
-@item
-The directories specified by the environment variable @code{LIBRARY_PATH}
-(native only, cross compilers do not use this).
-
-@item
-The macro @code{STANDARD_EXEC_PREFIX}.
-
-@item
-@file{/usr/lib/gcc/}.
-
-@item
-The macro @code{MD_EXEC_PREFIX}, if any.
-
-@item
-The macro @code{MD_STARTFILE_PREFIX}, if any.
-
-@item
-The macro @code{STANDARD_STARTFILE_PREFIX}.
-
-@item
-@file{/lib/}.
-
-@item
-@file{/usr/lib/}.
-@end enumerate
-
-@node Run-time Target
-@section Run-time Target Specification
-@cindex run-time target specification
-@cindex predefined macros
-@cindex target specifications
-
-@c prevent bad page break with this line
-Here are run-time target specifications.
-
-@table @code
-@findex CPP_PREDEFINES
-@item CPP_PREDEFINES
-Define this to be a string constant containing @samp{-D} options to
-define the predefined macros that identify this machine and system.
-These macros will be predefined unless the @samp{-ansi} option is
-specified.
-
-In addition, a parallel set of macros are predefined, whose names are
-made by appending @samp{__} at the beginning and at the end. These
-@samp{__} macros are permitted by the ANSI standard, so they are
-predefined regardless of whether @samp{-ansi} is specified.
-
-For example, on the Sun, one can use the following value:
-
-@smallexample
-"-Dmc68000 -Dsun -Dunix"
-@end smallexample
-
-The result is to define the macros @code{__mc68000__}, @code{__sun__}
-and @code{__unix__} unconditionally, and the macros @code{mc68000},
-@code{sun} and @code{unix} provided @samp{-ansi} is not specified.
-
-@findex extern int target_flags
-@item extern int target_flags;
-This declaration should be present.
-
-@cindex optional hardware or system features
-@cindex features, optional, in system conventions
-@item TARGET_@dots{}
-This series of macros is to allow compiler command arguments to
-enable or disable the use of optional features of the target machine.
-For example, one machine description serves both the 68000 and
-the 68020; a command argument tells the compiler whether it should
-use 68020-only instructions or not. This command argument works
-by means of a macro @code{TARGET_68020} that tests a bit in
-@code{target_flags}.
-
-Define a macro @code{TARGET_@var{featurename}} for each such option.
-Its definition should test a bit in @code{target_flags}; for example:
-
-@smallexample
-#define TARGET_68020 (target_flags & 1)
-@end smallexample
-
-One place where these macros are used is in the condition-expressions
-of instruction patterns. Note how @code{TARGET_68020} appears
-frequently in the 68000 machine description file, @file{m68k.md}.
-Another place they are used is in the definitions of the other
-macros in the @file{@var{machine}.h} file.
-
-@findex TARGET_SWITCHES
-@item TARGET_SWITCHES
-This macro defines names of command options to set and clear
-bits in @code{target_flags}. Its definition is an initializer
-with a subgrouping for each command option.
-
-Each subgrouping contains a string constant, that defines the option
-name, a number, which contains the bits to set in
-@code{target_flags}, and a second string which is the description
-displayed by --help. If the number is negative then the bits specified
-by the number are cleared instead of being set. If the description
-string is present but empty, then no help information will be displayed
-for that option, but it will not count as an undocumented option. The
-actual option name is made by appending @samp{-m} to the specified name.
-
-One of the subgroupings should have a null string. The number in
-this grouping is the default value for @code{target_flags}. Any
-target options act starting with that value.
-
-Here is an example which defines @samp{-m68000} and @samp{-m68020}
-with opposite meanings, and picks the latter as the default:
-
-@smallexample
-#define TARGET_SWITCHES \
- @{ @{ "68020", 1, "" @}, \
- @{ "68000", -1, "Compile for the 68000" @}, \
- @{ "", 1, "" @}@}
-@end smallexample
-
-@findex TARGET_OPTIONS
-@item TARGET_OPTIONS
-This macro is similar to @code{TARGET_SWITCHES} but defines names of command
-options that have values. Its definition is an initializer with a
-subgrouping for each command option.
-
-Each subgrouping contains a string constant, that defines the fixed part
-of the option name, the address of a variable, and a description string.
-The variable, type @code{char *}, is set to the variable part of the
-given option if the fixed part matches. The actual option name is made
-by appending @samp{-m} to the specified name.
-
-Here is an example which defines @samp{-mshort-data-@var{number}}. If the
-given option is @samp{-mshort-data-512}, the variable @code{m88k_short_data}
-will be set to the string @code{"512"}.
-
-@smallexample
-extern char *m88k_short_data;
-#define TARGET_OPTIONS \
- @{ @{ "short-data-", &m88k_short_data, "Specify the size of the short data section" @} @}
-@end smallexample
-
-@findex TARGET_VERSION
-@item TARGET_VERSION
-This macro is a C statement to print on @code{stderr} a string
-describing the particular machine description choice. Every machine
-description should define @code{TARGET_VERSION}. For example:
-
-@smallexample
-#ifdef MOTOROLA
-#define TARGET_VERSION \
- fprintf (stderr, " (68k, Motorola syntax)");
-#else
-#define TARGET_VERSION \
- fprintf (stderr, " (68k, MIT syntax)");
-#endif
-@end smallexample
-
-@findex OVERRIDE_OPTIONS
-@item OVERRIDE_OPTIONS
-Sometimes certain combinations of command options do not make sense on
-a particular target machine. You can define a macro
-@code{OVERRIDE_OPTIONS} to take account of this. This macro, if
-defined, is executed once just after all the command options have been
-parsed.
-
-Don't use this macro to turn on various extra optimizations for
-@samp{-O}. That is what @code{OPTIMIZATION_OPTIONS} is for.
-
-@findex OPTIMIZATION_OPTIONS
-@item OPTIMIZATION_OPTIONS (@var{level}, @var{size})
-Some machines may desire to change what optimizations are performed for
-various optimization levels. This macro, if defined, is executed once
-just after the optimization level is determined and before the remainder
-of the command options have been parsed. Values set in this macro are
-used as the default values for the other command line options.
-
-@var{level} is the optimization level specified; 2 if @samp{-O2} is
-specified, 1 if @samp{-O} is specified, and 0 if neither is specified.
-
-@var{size} is non-zero if @samp{-Os} is specified and zero otherwise.
-
-You should not use this macro to change options that are not
-machine-specific. These should uniformly selected by the same
-optimization level on all supported machines. Use this macro to enable
-machine-specific optimizations.
-
-@strong{Do not examine @code{write_symbols} in
-this macro!} The debugging options are not supposed to alter the
-generated code.
-
-@findex CAN_DEBUG_WITHOUT_FP
-@item CAN_DEBUG_WITHOUT_FP
-Define this macro if debugging can be performed even without a frame
-pointer. If this macro is defined, GNU CC will turn on the
-@samp{-fomit-frame-pointer} option whenever @samp{-O} is specified.
-@end table
-
-@node Storage Layout
-@section Storage Layout
-@cindex storage layout
-
-Note that the definitions of the macros in this table which are sizes or
-alignments measured in bits do not need to be constant. They can be C
-expressions that refer to static variables, such as the @code{target_flags}.
-@xref{Run-time Target}.
-
-@table @code
-@findex BITS_BIG_ENDIAN
-@item BITS_BIG_ENDIAN
-Define this macro to have the value 1 if the most significant bit in a
-byte has the lowest number; otherwise define it to have the value zero.
-This means that bit-field instructions count from the most significant
-bit. If the machine has no bit-field instructions, then this must still
-be defined, but it doesn't matter which value it is defined to. This
-macro need not be a constant.
-
-This macro does not affect the way structure fields are packed into
-bytes or words; that is controlled by @code{BYTES_BIG_ENDIAN}.
-
-@findex BYTES_BIG_ENDIAN
-@item BYTES_BIG_ENDIAN
-Define this macro to have the value 1 if the most significant byte in a
-word has the lowest number. This macro need not be a constant.
-
-@findex WORDS_BIG_ENDIAN
-@item WORDS_BIG_ENDIAN
-Define this macro to have the value 1 if, in a multiword object, the
-most significant word has the lowest number. This applies to both
-memory locations and registers; GNU CC fundamentally assumes that the
-order of words in memory is the same as the order in registers. This
-macro need not be a constant.
-
-@findex LIBGCC2_WORDS_BIG_ENDIAN
-@item LIBGCC2_WORDS_BIG_ENDIAN
-Define this macro if WORDS_BIG_ENDIAN is not constant. This must be a
-constant value with the same meaning as WORDS_BIG_ENDIAN, which will be
-used only when compiling libgcc2.c. Typically the value will be set
-based on preprocessor defines.
-
-@findex FLOAT_WORDS_BIG_ENDIAN
-@item FLOAT_WORDS_BIG_ENDIAN
-Define this macro to have the value 1 if @code{DFmode}, @code{XFmode} or
-@code{TFmode} floating point numbers are stored in memory with the word
-containing the sign bit at the lowest address; otherwise define it to
-have the value 0. This macro need not be a constant.
-
-You need not define this macro if the ordering is the same as for
-multi-word integers.
-
-@findex BITS_PER_UNIT
-@item BITS_PER_UNIT
-Define this macro to be the number of bits in an addressable storage
-unit (byte); normally 8.
-
-@findex BITS_PER_WORD
-@item BITS_PER_WORD
-Number of bits in a word; normally 32.
-
-@findex MAX_BITS_PER_WORD
-@item MAX_BITS_PER_WORD
-Maximum number of bits in a word. If this is undefined, the default is
-@code{BITS_PER_WORD}. Otherwise, it is the constant value that is the
-largest value that @code{BITS_PER_WORD} can have at run-time.
-
-@findex UNITS_PER_WORD
-@item UNITS_PER_WORD
-Number of storage units in a word; normally 4.
-
-@findex MIN_UNITS_PER_WORD
-@item MIN_UNITS_PER_WORD
-Minimum number of units in a word. If this is undefined, the default is
-@code{UNITS_PER_WORD}. Otherwise, it is the constant value that is the
-smallest value that @code{UNITS_PER_WORD} can have at run-time.
-
-@findex POINTER_SIZE
-@item POINTER_SIZE
-Width of a pointer, in bits. You must specify a value no wider than the
-width of @code{Pmode}. If it is not equal to the width of @code{Pmode},
-you must define @code{POINTERS_EXTEND_UNSIGNED}.
-
-@findex POINTERS_EXTEND_UNSIGNED
-@item POINTERS_EXTEND_UNSIGNED
-A C expression whose value is nonzero if pointers that need to be
-extended from being @code{POINTER_SIZE} bits wide to @code{Pmode} are to
-be zero-extended and zero if they are to be sign-extended.
-
-You need not define this macro if the @code{POINTER_SIZE} is equal
-to the width of @code{Pmode}.
-
-@findex PROMOTE_MODE
-@item PROMOTE_MODE (@var{m}, @var{unsignedp}, @var{type})
-A macro to update @var{m} and @var{unsignedp} when an object whose type
-is @var{type} and which has the specified mode and signedness is to be
-stored in a register. This macro is only called when @var{type} is a
-scalar type.
-
-On most RISC machines, which only have operations that operate on a full
-register, define this macro to set @var{m} to @code{word_mode} if
-@var{m} is an integer mode narrower than @code{BITS_PER_WORD}. In most
-cases, only integer modes should be widened because wider-precision
-floating-point operations are usually more expensive than their narrower
-counterparts.
-
-For most machines, the macro definition does not change @var{unsignedp}.
-However, some machines, have instructions that preferentially handle
-either signed or unsigned quantities of certain modes. For example, on
-the DEC Alpha, 32-bit loads from memory and 32-bit add instructions
-sign-extend the result to 64 bits. On such machines, set
-@var{unsignedp} according to which kind of extension is more efficient.
-
-Do not define this macro if it would never modify @var{m}.
-
-@findex PROMOTE_FUNCTION_ARGS
-@item PROMOTE_FUNCTION_ARGS
-Define this macro if the promotion described by @code{PROMOTE_MODE}
-should also be done for outgoing function arguments.
-
-@findex PROMOTE_FUNCTION_RETURN
-@item PROMOTE_FUNCTION_RETURN
-Define this macro if the promotion described by @code{PROMOTE_MODE}
-should also be done for the return value of functions.
-
-If this macro is defined, @code{FUNCTION_VALUE} must perform the same
-promotions done by @code{PROMOTE_MODE}.
-
-@findex PROMOTE_FOR_CALL_ONLY
-@item PROMOTE_FOR_CALL_ONLY
-Define this macro if the promotion described by @code{PROMOTE_MODE}
-should @emph{only} be performed for outgoing function arguments or
-function return values, as specified by @code{PROMOTE_FUNCTION_ARGS}
-and @code{PROMOTE_FUNCTION_RETURN}, respectively.
-
-@findex PARM_BOUNDARY
-@item PARM_BOUNDARY
-Normal alignment required for function parameters on the stack, in
-bits. All stack parameters receive at least this much alignment
-regardless of data type. On most machines, this is the same as the
-size of an integer.
-
-@findex STACK_BOUNDARY
-@item STACK_BOUNDARY
-Define this macro if there is a guaranteed alignment for the stack
-pointer on this machine. The definition is a C expression
-for the desired alignment (measured in bits). This value is used as a
-default if PREFERRED_STACK_BOUNDARY is not defined.
-
-@findex PREFERRED_STACK_BOUNDARY
-@item PREFERRED_STACK_BOUNDARY
-Define this macro if you wish to preserve a certain alignment for
-the stack pointer. The definition is a C expression
-for the desired alignment (measured in bits). If STACK_BOUNDARY is
-also defined, this macro must evaluate to a value equal to or larger
-than STACK_BOUNDARY.
-
-@cindex @code{PUSH_ROUNDING}, interaction with @code{PREFERRED_STACK_BOUNDARY}
-If @code{PUSH_ROUNDING} is not defined, the stack will always be aligned
-to the specified boundary. If @code{PUSH_ROUNDING} is defined and specifies
-a less strict alignment than @code{PREFERRED_STACK_BOUNDARY}, the stack may
-be momentarily unaligned while pushing arguments.
-
-@findex FUNCTION_BOUNDARY
-@item FUNCTION_BOUNDARY
-Alignment required for a function entry point, in bits.
-
-@c CYGNUS LOCAL law
-@findex FUNCTION_BOUNDARY_MAX_SKIP
-@item FUNCTION_BOUNDARY_MAX_SKIP (@var{max_skip})
-If defined, the maximum number of padding bytes to insert to force the start
-a function to a particular alignment. If @var{max_skip} is smaller than the
-number of bytes needed to satisfy an alignment request, then no alignment is
-made. The compiler will choose a reasonable default value if you do not
-define this macro. This macro has no effct if @code{ASM_OUTPUT_MAX_SKIP_ALIGN}
-is not defined.
-@c END CYGNUS LOCAL
-
-@findex BIGGEST_ALIGNMENT
-@item BIGGEST_ALIGNMENT
-Biggest alignment that any data type can require on this machine, in bits.
-
-@findex MINIMUM_ATOMIC_ALIGNMENT
-@item MINIMUM_ATOMIC_ALIGNMENT
-If defined, the smallest alignment, in bits, that can be given to an
-object that can be referenced in one operation, without disturbing any
-nearby object. Normally, this is @code{BITS_PER_UNIT}, but may be larger
-on machines that don't have byte or half-word store operations.
-
-@findex BIGGEST_FIELD_ALIGNMENT
-@item BIGGEST_FIELD_ALIGNMENT
-Biggest alignment that any structure field can require on this machine,
-in bits. If defined, this overrides @code{BIGGEST_ALIGNMENT} for
-structure fields only.
-
-@findex ADJUST_FIELD_ALIGN
-@item ADJUST_FIELD_ALIGN (@var{field}, @var{computed})
-An expression for the alignment of a structure field @var{field} if the
-alignment computed in the usual way is @var{computed}. GNU CC uses
-this value instead of the value in @code{BIGGEST_ALIGNMENT} or
-@code{BIGGEST_FIELD_ALIGNMENT}, if defined, for structure fields only.
-
-@findex MAX_OFILE_ALIGNMENT
-@item MAX_OFILE_ALIGNMENT
-Biggest alignment supported by the object file format of this machine.
-Use this macro to limit the alignment which can be specified using the
-@code{__attribute__ ((aligned (@var{n})))} construct. If not defined,
-the default value is @code{BIGGEST_ALIGNMENT}.
-
-@findex DATA_ALIGNMENT
-@item DATA_ALIGNMENT (@var{type}, @var{basic-align})
-If defined, a C expression to compute the alignment for a variables in
-the static store. @var{type} is the data type, and @var{basic-align} is
-the alignment that the object would ordinarily have. The value of this
-macro is used instead of that alignment to align the object.
-
-If this macro is not defined, then @var{basic-align} is used.
-
-@findex strcpy
-One use of this macro is to increase alignment of medium-size data to
-make it all fit in fewer cache lines. Another is to cause character
-arrays to be word-aligned so that @code{strcpy} calls that copy
-constants to character arrays can be done inline.
-
-@findex CONSTANT_ALIGNMENT
-@item CONSTANT_ALIGNMENT (@var{constant}, @var{basic-align})
-If defined, a C expression to compute the alignment given to a constant
-that is being placed in memory. @var{constant} is the constant and
-@var{basic-align} is the alignment that the object would ordinarily
-have. The value of this macro is used instead of that alignment to
-align the object.
-
-If this macro is not defined, then @var{basic-align} is used.
-
-The typical use of this macro is to increase alignment for string
-constants to be word aligned so that @code{strcpy} calls that copy
-constants can be done inline.
-
-@findex EMPTY_FIELD_BOUNDARY
-@item EMPTY_FIELD_BOUNDARY
-Alignment in bits to be given to a structure bit field that follows an
-empty field such as @code{int : 0;}.
-
-Note that @code{PCC_BITFIELD_TYPE_MATTERS} also affects the alignment
-that results from an empty field.
-
-@findex STRUCTURE_SIZE_BOUNDARY
-@item STRUCTURE_SIZE_BOUNDARY
-Number of bits which any structure or union's size must be a multiple of.
-Each structure or union's size is rounded up to a multiple of this.
-
-If you do not define this macro, the default is the same as
-@code{BITS_PER_UNIT}.
-
-@findex STRICT_ALIGNMENT
-@item STRICT_ALIGNMENT
-Define this macro to be the value 1 if instructions will fail to work
-if given data not on the nominal alignment. If instructions will merely
-go slower in that case, define this macro as 0.
-
-@findex PCC_BITFIELD_TYPE_MATTERS
-@item PCC_BITFIELD_TYPE_MATTERS
-Define this if you wish to imitate the way many other C compilers handle
-alignment of bitfields and the structures that contain them.
-
-The behavior is that the type written for a bitfield (@code{int},
-@code{short}, or other integer type) imposes an alignment for the
-entire structure, as if the structure really did contain an ordinary
-field of that type. In addition, the bitfield is placed within the
-structure so that it would fit within such a field, not crossing a
-boundary for it.
-
-Thus, on most machines, a bitfield whose type is written as @code{int}
-would not cross a four-byte boundary, and would force four-byte
-alignment for the whole structure. (The alignment used may not be four
-bytes; it is controlled by the other alignment parameters.)
-
-If the macro is defined, its definition should be a C expression;
-a nonzero value for the expression enables this behavior.
-
-Note that if this macro is not defined, or its value is zero, some
-bitfields may cross more than one alignment boundary. The compiler can
-support such references if there are @samp{insv}, @samp{extv}, and
-@samp{extzv} insns that can directly reference memory.
-
-The other known way of making bitfields work is to define
-@code{STRUCTURE_SIZE_BOUNDARY} as large as @code{BIGGEST_ALIGNMENT}.
-Then every structure can be accessed with fullwords.
-
-Unless the machine has bitfield instructions or you define
-@code{STRUCTURE_SIZE_BOUNDARY} that way, you must define
-@code{PCC_BITFIELD_TYPE_MATTERS} to have a nonzero value.
-
-If your aim is to make GNU CC use the same conventions for laying out
-bitfields as are used by another compiler, here is how to investigate
-what the other compiler does. Compile and run this program:
-
-@example
-struct foo1
-@{
- char x;
- char :0;
- char y;
-@};
-
-struct foo2
-@{
- char x;
- int :0;
- char y;
-@};
-
-main ()
-@{
- printf ("Size of foo1 is %d\n",
- sizeof (struct foo1));
- printf ("Size of foo2 is %d\n",
- sizeof (struct foo2));
- exit (0);
-@}
-@end example
-
-If this prints 2 and 5, then the compiler's behavior is what you would
-get from @code{PCC_BITFIELD_TYPE_MATTERS}.
-
-@findex BITFIELD_NBYTES_LIMITED
-@item BITFIELD_NBYTES_LIMITED
-Like PCC_BITFIELD_TYPE_MATTERS except that its effect is limited to
-aligning a bitfield within the structure.
-
-@findex ROUND_TYPE_SIZE
-@item ROUND_TYPE_SIZE (@var{type}, @var{computed}, @var{specified})
-Define this macro as an expression for the overall size of a type
-(given by @var{type} as a tree node) when the size computed in the
-usual way is @var{computed} and the alignment is @var{specified}.
-
-The default is to round @var{computed} up to a multiple of @var{specified}.
-
-@findex ROUND_TYPE_ALIGN
-@item ROUND_TYPE_ALIGN (@var{type}, @var{computed}, @var{specified})
-Define this macro as an expression for the alignment of a type (given
-by @var{type} as a tree node) if the alignment computed in the usual
-way is @var{computed} and the alignment explicitly specified was
-@var{specified}.
-
-The default is to use @var{specified} if it is larger; otherwise, use
-the smaller of @var{computed} and @code{BIGGEST_ALIGNMENT}
-
-@findex MAX_FIXED_MODE_SIZE
-@item MAX_FIXED_MODE_SIZE
-An integer expression for the size in bits of the largest integer
-machine mode that should actually be used. All integer machine modes of
-this size or smaller can be used for structures and unions with the
-appropriate sizes. If this macro is undefined, @code{GET_MODE_BITSIZE
-(DImode)} is assumed.
-
-@findex STACK_SAVEAREA_MODE
-@item STACK_SAVEAREA_MODE (@var{save_level})
-If defined, an expression of type @code{enum machine_mode} that
-specifies the mode of the save area operand of a
-@code{save_stack_@var{level}} named pattern (@pxref{Standard Names}).
-@var{save_level} is one of @code{SAVE_BLOCK}, @code{SAVE_FUNCTION}, or
-@code{SAVE_NONLOCAL} and selects which of the three named patterns is
-having its mode specified.
-
-You need not define this macro if it always returns @code{Pmode}. You
-would most commonly define this macro if the
-@code{save_stack_@var{level}} patterns need to support both a 32- and a
-64-bit mode.
-
-@findex STACK_SIZE_MODE
-@item STACK_SIZE_MODE
-If defined, an expression of type @code{enum machine_mode} that
-specifies the mode of the size increment operand of an
-@code{allocate_stack} named pattern (@pxref{Standard Names}).
-
-You need not define this macro if it always returns @code{word_mode}.
-You would most commonly define this macro if the @code{allocate_stack}
-pattern needs to support both a 32- and a 64-bit mode.
-
-@findex CHECK_FLOAT_VALUE
-@item CHECK_FLOAT_VALUE (@var{mode}, @var{value}, @var{overflow})
-A C statement to validate the value @var{value} (of type
-@code{double}) for mode @var{mode}. This means that you check whether
-@var{value} fits within the possible range of values for mode
-@var{mode} on this target machine. The mode @var{mode} is always
-a mode of class @code{MODE_FLOAT}. @var{overflow} is nonzero if
-the value is already known to be out of range.
-
-If @var{value} is not valid or if @var{overflow} is nonzero, you should
-set @var{overflow} to 1 and then assign some valid value to @var{value}.
-Allowing an invalid value to go through the compiler can produce
-incorrect assembler code which may even cause Unix assemblers to crash.
-
-This macro need not be defined if there is no work for it to do.
-
-@findex TARGET_FLOAT_FORMAT
-@item TARGET_FLOAT_FORMAT
-A code distinguishing the floating point format of the target machine.
-There are three defined values:
-
-@table @code
-@findex IEEE_FLOAT_FORMAT
-@item IEEE_FLOAT_FORMAT
-This code indicates IEEE floating point. It is the default; there is no
-need to define this macro when the format is IEEE.
-
-@findex VAX_FLOAT_FORMAT
-@item VAX_FLOAT_FORMAT
-This code indicates the peculiar format used on the Vax.
-
-@findex UNKNOWN_FLOAT_FORMAT
-@item UNKNOWN_FLOAT_FORMAT
-This code indicates any other format.
-@end table
-
-The value of this macro is compared with @code{HOST_FLOAT_FORMAT}
-(@pxref{Config}) to determine whether the target machine has the same
-format as the host machine. If any other formats are actually in use on
-supported machines, new codes should be defined for them.
-
-The ordering of the component words of floating point values stored in
-memory is controlled by @code{FLOAT_WORDS_BIG_ENDIAN} for the target
-machine and @code{HOST_FLOAT_WORDS_BIG_ENDIAN} for the host.
-
-@findex DEFAULT_VTABLE_THUNKS
-@item DEFAULT_VTABLE_THUNKS
-GNU CC supports two ways of implementing C++ vtables: traditional or with
-so-called ``thunks''. The flag @samp{-fvtable-thunk} chooses between them.
-Define this macro to be a C expression for the default value of that flag.
-If @code{DEFAULT_VTABLE_THUNKS} is 0, GNU CC uses the traditional
-implementation by default. The ``thunk'' implementation is more efficient
-(especially if you have provided an implementation of
-@code{ASM_OUTPUT_MI_THUNK}, see @ref{Function Entry}), but is not binary
-compatible with code compiled using the traditional implementation.
-If you are writing a new ports, define @code{DEFAULT_VTABLE_THUNKS} to 1.
-
-If you do not define this macro, the default for @samp{-fvtable-thunk} is 0.
-@end table
-
-@node Type Layout
-@section Layout of Source Language Data Types
-
-These macros define the sizes and other characteristics of the standard
-basic data types used in programs being compiled. Unlike the macros in
-the previous section, these apply to specific features of C and related
-languages, rather than to fundamental aspects of storage layout.
-
-@table @code
-@findex INT_TYPE_SIZE
-@item INT_TYPE_SIZE
-A C expression for the size in bits of the type @code{int} on the
-target machine. If you don't define this, the default is one word.
-
-@findex MAX_INT_TYPE_SIZE
-@item MAX_INT_TYPE_SIZE
-Maximum number for the size in bits of the type @code{int} on the target
-machine. If this is undefined, the default is @code{INT_TYPE_SIZE}.
-Otherwise, it is the constant value that is the largest value that
-@code{INT_TYPE_SIZE} can have at run-time. This is used in @code{cpp}.
-
-@findex SHORT_TYPE_SIZE
-@item SHORT_TYPE_SIZE
-A C expression for the size in bits of the type @code{short} on the
-target machine. If you don't define this, the default is half a word.
-(If this would be less than one storage unit, it is rounded up to one
-unit.)
-
-@findex LONG_TYPE_SIZE
-@item LONG_TYPE_SIZE
-A C expression for the size in bits of the type @code{long} on the
-target machine. If you don't define this, the default is one word.
-
-@findex MAX_LONG_TYPE_SIZE
-@item MAX_LONG_TYPE_SIZE
-Maximum number for the size in bits of the type @code{long} on the
-target machine. If this is undefined, the default is
-@code{LONG_TYPE_SIZE}. Otherwise, it is the constant value that is the
-largest value that @code{LONG_TYPE_SIZE} can have at run-time. This is
-used in @code{cpp}.
-
-@findex LONG_LONG_TYPE_SIZE
-@item LONG_LONG_TYPE_SIZE
-A C expression for the size in bits of the type @code{long long} on the
-target machine. If you don't define this, the default is two
-words. If you want to support GNU Ada on your machine, the value of
-macro must be at least 64.
-
-@findex CHAR_TYPE_SIZE
-@item CHAR_TYPE_SIZE
-A C expression for the size in bits of the type @code{char} on the
-target machine. If you don't define this, the default is one quarter
-of a word. (If this would be less than one storage unit, it is rounded up
-to one unit.)
-
-@findex MAX_CHAR_TYPE_SIZE
-@item MAX_CHAR_TYPE_SIZE
-Maximum number for the size in bits of the type @code{char} on the
-target machine. If this is undefined, the default is
-@code{CHAR_TYPE_SIZE}. Otherwise, it is the constant value that is the
-largest value that @code{CHAR_TYPE_SIZE} can have at run-time. This is
-used in @code{cpp}.
-
-@findex FLOAT_TYPE_SIZE
-@item FLOAT_TYPE_SIZE
-A C expression for the size in bits of the type @code{float} on the
-target machine. If you don't define this, the default is one word.
-
-@findex DOUBLE_TYPE_SIZE
-@item DOUBLE_TYPE_SIZE
-A C expression for the size in bits of the type @code{double} on the
-target machine. If you don't define this, the default is two
-words.
-
-@findex LONG_DOUBLE_TYPE_SIZE
-@item LONG_DOUBLE_TYPE_SIZE
-A C expression for the size in bits of the type @code{long double} on
-the target machine. If you don't define this, the default is two
-words.
-
-@findex WIDEST_HARDWARE_FP_SIZE
-@item WIDEST_HARDWARE_FP_SIZE
-A C expression for the size in bits of the widest floating-point format
-supported by the hardware. If you define this macro, you must specify a
-value less than or equal to the value of @code{LONG_DOUBLE_TYPE_SIZE}.
-If you do not define this macro, the value of @code{LONG_DOUBLE_TYPE_SIZE}
-is the default.
-
-@findex DEFAULT_SIGNED_CHAR
-@item DEFAULT_SIGNED_CHAR
-An expression whose value is 1 or 0, according to whether the type
-@code{char} should be signed or unsigned by default. The user can
-always override this default with the options @samp{-fsigned-char}
-and @samp{-funsigned-char}.
-
-@findex DEFAULT_SHORT_ENUMS
-@item DEFAULT_SHORT_ENUMS
-A C expression to determine whether to give an @code{enum} type
-only as many bytes as it takes to represent the range of possible values
-of that type. A nonzero value means to do that; a zero value means all
-@code{enum} types should be allocated like @code{int}.
-
-If you don't define the macro, the default is 0.
-
-@findex SIZE_TYPE
-@item SIZE_TYPE
-A C expression for a string describing the name of the data type to use
-for size values. The typedef name @code{size_t} is defined using the
-contents of the string.
-
-The string can contain more than one keyword. If so, separate them with
-spaces, and write first any length keyword, then @code{unsigned} if
-appropriate, and finally @code{int}. The string must exactly match one
-of the data type names defined in the function
-@code{init_decl_processing} in the file @file{c-decl.c}. You may not
-omit @code{int} or change the order---that would cause the compiler to
-crash on startup.
-
-If you don't define this macro, the default is @code{"long unsigned
-int"}.
-
-@findex PTRDIFF_TYPE
-@item PTRDIFF_TYPE
-A C expression for a string describing the name of the data type to use
-for the result of subtracting two pointers. The typedef name
-@code{ptrdiff_t} is defined using the contents of the string. See
-@code{SIZE_TYPE} above for more information.
-
-If you don't define this macro, the default is @code{"long int"}.
-
-@findex WCHAR_TYPE
-@item WCHAR_TYPE
-A C expression for a string describing the name of the data type to use
-for wide characters. The typedef name @code{wchar_t} is defined using
-the contents of the string. See @code{SIZE_TYPE} above for more
-information.
-
-If you don't define this macro, the default is @code{"int"}.
-
-@findex WCHAR_TYPE_SIZE
-@item WCHAR_TYPE_SIZE
-A C expression for the size in bits of the data type for wide
-characters. This is used in @code{cpp}, which cannot make use of
-@code{WCHAR_TYPE}.
-
-@findex MAX_WCHAR_TYPE_SIZE
-@item MAX_WCHAR_TYPE_SIZE
-Maximum number for the size in bits of the data type for wide
-characters. If this is undefined, the default is
-@code{WCHAR_TYPE_SIZE}. Otherwise, it is the constant value that is the
-largest value that @code{WCHAR_TYPE_SIZE} can have at run-time. This is
-used in @code{cpp}.
-
-@findex OBJC_INT_SELECTORS
-@item OBJC_INT_SELECTORS
-Define this macro if the type of Objective C selectors should be
-@code{int}.
-
-If this macro is not defined, then selectors should have the type
-@code{struct objc_selector *}.
-
-@findex OBJC_SELECTORS_WITHOUT_LABELS
-@item OBJC_SELECTORS_WITHOUT_LABELS
-Define this macro if the compiler can group all the selectors together
-into a vector and use just one label at the beginning of the vector.
-Otherwise, the compiler must give each selector its own assembler
-label.
-
-On certain machines, it is important to have a separate label for each
-selector because this enables the linker to eliminate duplicate selectors.
-
-@findex TARGET_BELL
-@item TARGET_BELL
-A C constant expression for the integer value for escape sequence
-@samp{\a}.
-
-@findex TARGET_TAB
-@findex TARGET_BS
-@findex TARGET_NEWLINE
-@item TARGET_BS
-@itemx TARGET_TAB
-@itemx TARGET_NEWLINE
-C constant expressions for the integer values for escape sequences
-@samp{\b}, @samp{\t} and @samp{\n}.
-
-@findex TARGET_VT
-@findex TARGET_FF
-@findex TARGET_CR
-@item TARGET_VT
-@itemx TARGET_FF
-@itemx TARGET_CR
-C constant expressions for the integer values for escape sequences
-@samp{\v}, @samp{\f} and @samp{\r}.
-@end table
-
-@node Registers
-@section Register Usage
-@cindex register usage
-
-This section explains how to describe what registers the target machine
-has, and how (in general) they can be used.
-
-The description of which registers a specific instruction can use is
-done with register classes; see @ref{Register Classes}. For information
-on using registers to access a stack frame, see @ref{Frame Registers}.
-For passing values in registers, see @ref{Register Arguments}.
-For returning values in registers, see @ref{Scalar Return}.
-
-@menu
-* Register Basics:: Number and kinds of registers.
-* Allocation Order:: Order in which registers are allocated.
-* Values in Registers:: What kinds of values each reg can hold.
-* Leaf Functions:: Renumbering registers for leaf functions.
-* Stack Registers:: Handling a register stack such as 80387.
-* Obsolete Register Macros:: Macros formerly used for the 80387.
-@end menu
-
-@node Register Basics
-@subsection Basic Characteristics of Registers
-
-@c prevent bad page break with this line
-Registers have various characteristics.
-
-@table @code
-@findex FIRST_PSEUDO_REGISTER
-@item FIRST_PSEUDO_REGISTER
-Number of hardware registers known to the compiler. They receive
-numbers 0 through @code{FIRST_PSEUDO_REGISTER-1}; thus, the first
-pseudo register's number really is assigned the number
-@code{FIRST_PSEUDO_REGISTER}.
-
-@item FIXED_REGISTERS
-@findex FIXED_REGISTERS
-@cindex fixed register
-An initializer that says which registers are used for fixed purposes
-all throughout the compiled code and are therefore not available for
-general allocation. These would include the stack pointer, the frame
-pointer (except on machines where that can be used as a general
-register when no frame pointer is needed), the program counter on
-machines where that is considered one of the addressable registers,
-and any other numbered register with a standard use.
-
-This information is expressed as a sequence of numbers, separated by
-commas and surrounded by braces. The @var{n}th number is 1 if
-register @var{n} is fixed, 0 otherwise.
-
-The table initialized from this macro, and the table initialized by
-the following one, may be overridden at run time either automatically,
-by the actions of the macro @code{CONDITIONAL_REGISTER_USAGE}, or by
-the user with the command options @samp{-ffixed-@var{reg}},
-@samp{-fcall-used-@var{reg}} and @samp{-fcall-saved-@var{reg}}.
-
-@findex CALL_USED_REGISTERS
-@item CALL_USED_REGISTERS
-@cindex call-used register
-@cindex call-clobbered register
-@cindex call-saved register
-Like @code{FIXED_REGISTERS} but has 1 for each register that is
-clobbered (in general) by function calls as well as for fixed
-registers. This macro therefore identifies the registers that are not
-available for general allocation of values that must live across
-function calls.
-
-If a register has 0 in @code{CALL_USED_REGISTERS}, the compiler
-automatically saves it on function entry and restores it on function
-exit, if the register is used within the function.
-
-@findex HARD_REGNO_CALL_PART_CLOBBERED
-@item HARD_REGNO_CALL_PART_CLOBBERED (@var{regno}, @var{mode})
-@cindex call-used register
-@cindex call-clobbered register
-@cindex call-saved register
-A C expression that is non-zero if it is not permissible to store a
-value of mode @var{mode} in hard register number @var{regno} across a
-call without some part of it being clobbered. For most machines this
-macro need not be defined. It is only required for machines that do not
-preserve the entire contents of a register across a call.
-
-@findex CONDITIONAL_REGISTER_USAGE
-@findex fixed_regs
-@findex call_used_regs
-@item CONDITIONAL_REGISTER_USAGE
-Zero or more C statements that may conditionally modify four variables
-@code{fixed_regs}, @code{call_used_regs}, @code{global_regs}
-(these three are of type @code{char []}) and @code{reg_class_contents}
-(of type @code{HARD_REG_SET}).
-Before the macro is called @code{fixed_regs}, @code{call_used_regs}
-and @code{reg_class_contents} have been initialized from
-@code{FIXED_REGISTERS}, @code{CALL_USED_REGISTERS} and
-@code{REG_CLASS_CONTENTS}, respectively,
-@code{global_regs} has been cleared, and any @samp{-ffixed-@var{reg}},
-@samp{-fcall-used-@var{reg}} and @samp{-fcall-saved-@var{reg}} command
-options have been applied.
-
-This is necessary in case the fixed or call-clobbered registers depend
-on target flags.
-
-You need not define this macro if it has no work to do.
-
-@cindex disabling certain registers
-@cindex controlling register usage
-If the usage of an entire class of registers depends on the target
-flags, you may indicate this to GCC by using this macro to modify
-@code{fixed_regs} and @code{call_used_regs} to 1 for each of the
-registers in the classes which should not be used by GCC. Also define
-the macro @code{REG_CLASS_FROM_LETTER} to return @code{NO_REGS} if it
-is called with a letter for a class that shouldn't be used.
-
-(However, if this class is not included in @code{GENERAL_REGS} and all
-of the insn patterns whose constraints permit this class are
-controlled by target switches, then GCC will automatically avoid using
-these registers when the target switches are opposed to them.)
-
-@findex NON_SAVING_SETJMP
-@item NON_SAVING_SETJMP
-If this macro is defined and has a nonzero value, it means that
-@code{setjmp} and related functions fail to save the registers, or that
-@code{longjmp} fails to restore them. To compensate, the compiler
-avoids putting variables in registers in functions that use
-@code{setjmp}.
-
-@findex INCOMING_REGNO
-@item INCOMING_REGNO (@var{out})
-Define this macro if the target machine has register windows. This C
-expression returns the register number as seen by the called function
-corresponding to the register number @var{out} as seen by the calling
-function. Return @var{out} if register number @var{out} is not an
-outbound register.
-
-@findex OUTGOING_REGNO
-@item OUTGOING_REGNO (@var{in})
-Define this macro if the target machine has register windows. This C
-expression returns the register number as seen by the calling function
-corresponding to the register number @var{in} as seen by the called
-function. Return @var{in} if register number @var{in} is not an inbound
-register.
-
-@ignore
-@findex PC_REGNUM
-@item PC_REGNUM
-If the program counter has a register number, define this as that
-register number. Otherwise, do not define it.
-@end ignore
-@end table
-
-@node Allocation Order
-@subsection Order of Allocation of Registers
-@cindex order of register allocation
-@cindex register allocation order
-
-@c prevent bad page break with this line
-Registers are allocated in order.
-
-@table @code
-@findex REG_ALLOC_ORDER
-@item REG_ALLOC_ORDER
-If defined, an initializer for a vector of integers, containing the
-numbers of hard registers in the order in which GNU CC should prefer
-to use them (from most preferred to least).
-
-If this macro is not defined, registers are used lowest numbered first
-(all else being equal).
-
-One use of this macro is on machines where the highest numbered
-registers must always be saved and the save-multiple-registers
-instruction supports only sequences of consecutive registers. On such
-machines, define @code{REG_ALLOC_ORDER} to be an initializer that lists
-the highest numbered allocable register first.
-
-@findex ORDER_REGS_FOR_LOCAL_ALLOC
-@item ORDER_REGS_FOR_LOCAL_ALLOC
-A C statement (sans semicolon) to choose the order in which to allocate
-hard registers for pseudo-registers local to a basic block.
-
-Store the desired register order in the array @code{reg_alloc_order}.
-Element 0 should be the register to allocate first; element 1, the next
-register; and so on.
-
-The macro body should not assume anything about the contents of
-@code{reg_alloc_order} before execution of the macro.
-
-On most machines, it is not necessary to define this macro.
-@end table
-
-@node Values in Registers
-@subsection How Values Fit in Registers
-
-This section discusses the macros that describe which kinds of values
-(specifically, which machine modes) each register can hold, and how many
-consecutive registers are needed for a given mode.
-
-@table @code
-@findex HARD_REGNO_NREGS
-@item HARD_REGNO_NREGS (@var{regno}, @var{mode})
-A C expression for the number of consecutive hard registers, starting
-at register number @var{regno}, required to hold a value of mode
-@var{mode}.
-
-On a machine where all registers are exactly one word, a suitable
-definition of this macro is
-
-@smallexample
-#define HARD_REGNO_NREGS(REGNO, MODE) \
- ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \
- / UNITS_PER_WORD))
-@end smallexample
-
-@findex ALTER_HARD_SUBREG
-@item ALTER_HARD_SUBREG (@var{tgt_mode}, @var{word}, @var{src_mode}, @var{regno})
-A C expression that returns an adjusted hard register number for
-
-@smallexample
-(subreg:@var{tgt_mode} (reg:@var{src_mode} @var{regno}) @var{word})
-@end smallexample
-
-This may be needed if the target machine has mixed sized big-endian
-registers, like Sparc v9.
-
-@findex HARD_REGNO_MODE_OK
-@item HARD_REGNO_MODE_OK (@var{regno}, @var{mode})
-A C expression that is nonzero if it is permissible to store a value
-of mode @var{mode} in hard register number @var{regno} (or in several
-registers starting with that one). For a machine where all registers
-are equivalent, a suitable definition is
-
-@smallexample
-#define HARD_REGNO_MODE_OK(REGNO, MODE) 1
-@end smallexample
-
-You need not include code to check for the numbers of fixed registers,
-because the allocation mechanism considers them to be always occupied.
-
-@cindex register pairs
-On some machines, double-precision values must be kept in even/odd
-register pairs. You can implement that by defining this macro to reject
-odd register numbers for such modes.
-
-The minimum requirement for a mode to be OK in a register is that the
-@samp{mov@var{mode}} instruction pattern support moves between the
-register and other hard register in the same class and that moving a
-value into the register and back out not alter it.
-
-Since the same instruction used to move @code{word_mode} will work for
-all narrower integer modes, it is not necessary on any machine for
-@code{HARD_REGNO_MODE_OK} to distinguish between these modes, provided
-you define patterns @samp{movhi}, etc., to take advantage of this. This
-is useful because of the interaction between @code{HARD_REGNO_MODE_OK}
-and @code{MODES_TIEABLE_P}; it is very desirable for all integer modes
-to be tieable.
-
-Many machines have special registers for floating point arithmetic.
-Often people assume that floating point machine modes are allowed only
-in floating point registers. This is not true. Any registers that
-can hold integers can safely @emph{hold} a floating point machine
-mode, whether or not floating arithmetic can be done on it in those
-registers. Integer move instructions can be used to move the values.
-
-On some machines, though, the converse is true: fixed-point machine
-modes may not go in floating registers. This is true if the floating
-registers normalize any value stored in them, because storing a
-non-floating value there would garble it. In this case,
-@code{HARD_REGNO_MODE_OK} should reject fixed-point machine modes in
-floating registers. But if the floating registers do not automatically
-normalize, if you can store any bit pattern in one and retrieve it
-unchanged without a trap, then any machine mode may go in a floating
-register, so you can define this macro to say so.
-
-The primary significance of special floating registers is rather that
-they are the registers acceptable in floating point arithmetic
-instructions. However, this is of no concern to
-@code{HARD_REGNO_MODE_OK}. You handle it by writing the proper
-constraints for those instructions.
-
-On some machines, the floating registers are especially slow to access,
-so that it is better to store a value in a stack frame than in such a
-register if floating point arithmetic is not being done. As long as the
-floating registers are not in class @code{GENERAL_REGS}, they will not
-be used unless some pattern's constraint asks for one.
-
-@findex MODES_TIEABLE_P
-@item MODES_TIEABLE_P (@var{mode1}, @var{mode2})
-A C expression that is nonzero if a value of mode
-@var{mode1} is accessible in mode @var{mode2} without copying.
-
-If @code{HARD_REGNO_MODE_OK (@var{r}, @var{mode1})} and
-@code{HARD_REGNO_MODE_OK (@var{r}, @var{mode2})} are always the same for
-any @var{r}, then @code{MODES_TIEABLE_P (@var{mode1}, @var{mode2})}
-should be nonzero. If they differ for any @var{r}, you should define
-this macro to return zero unless some other mechanism ensures the
-accessibility of the value in a narrower mode.
-
-You should define this macro to return nonzero in as many cases as
-possible since doing so will allow GNU CC to perform better register
-allocation.
-
-@findex AVOID_CCMODE_COPIES
-@item AVOID_CCMODE_COPIES
-Define this macro if the compiler should avoid copies to/from @code{CCmode}
-registers. You should only define this macro if support fo copying to/from
-@code{CCmode} is incomplete.
-@end table
-
-@node Leaf Functions
-@subsection Handling Leaf Functions
-
-@cindex leaf functions
-@cindex functions, leaf
-On some machines, a leaf function (i.e., one which makes no calls) can run
-more efficiently if it does not make its own register window. Often this
-means it is required to receive its arguments in the registers where they
-are passed by the caller, instead of the registers where they would
-normally arrive.
-
-The special treatment for leaf functions generally applies only when
-other conditions are met; for example, often they may use only those
-registers for its own variables and temporaries. We use the term ``leaf
-function'' to mean a function that is suitable for this special
-handling, so that functions with no calls are not necessarily ``leaf
-functions''.
-
-GNU CC assigns register numbers before it knows whether the function is
-suitable for leaf function treatment. So it needs to renumber the
-registers in order to output a leaf function. The following macros
-accomplish this.
-
-@table @code
-@findex LEAF_REGISTERS
-@item LEAF_REGISTERS
-A C initializer for a vector, indexed by hard register number, which
-contains 1 for a register that is allowable in a candidate for leaf
-function treatment.
-
-If leaf function treatment involves renumbering the registers, then the
-registers marked here should be the ones before renumbering---those that
-GNU CC would ordinarily allocate. The registers which will actually be
-used in the assembler code, after renumbering, should not be marked with 1
-in this vector.
-
-Define this macro only if the target machine offers a way to optimize
-the treatment of leaf functions.
-
-@findex LEAF_REG_REMAP
-@item LEAF_REG_REMAP (@var{regno})
-A C expression whose value is the register number to which @var{regno}
-should be renumbered, when a function is treated as a leaf function.
-
-If @var{regno} is a register number which should not appear in a leaf
-function before renumbering, then the expression should yield -1, which
-will cause the compiler to abort.
-
-Define this macro only if the target machine offers a way to optimize the
-treatment of leaf functions, and registers need to be renumbered to do
-this.
-@end table
-
-@findex leaf_function
-Normally, @code{FUNCTION_PROLOGUE} and @code{FUNCTION_EPILOGUE} must
-treat leaf functions specially. It can test the C variable
-@code{leaf_function} which is nonzero for leaf functions. (The variable
-@code{leaf_function} is defined only if @code{LEAF_REGISTERS} is
-defined.)
-@c changed this to fix overfull. ALSO: why the "it" at the beginning
-@c of the next paragraph?! --mew 2feb93
-
-@node Stack Registers
-@subsection Registers That Form a Stack
-
-There are special features to handle computers where some of the
-``registers'' form a stack, as in the 80387 coprocessor for the 80386.
-Stack registers are normally written by pushing onto the stack, and are
-numbered relative to the top of the stack.
-
-Currently, GNU CC can only handle one group of stack-like registers, and
-they must be consecutively numbered.
-
-@table @code
-@findex STACK_REGS
-@item STACK_REGS
-Define this if the machine has any stack-like registers.
-
-@findex FIRST_STACK_REG
-@item FIRST_STACK_REG
-The number of the first stack-like register. This one is the top
-of the stack.
-
-@findex LAST_STACK_REG
-@item LAST_STACK_REG
-The number of the last stack-like register. This one is the bottom of
-the stack.
-@end table
-
-@node Obsolete Register Macros
-@subsection Obsolete Macros for Controlling Register Usage
-
-These features do not work very well. They exist because they used to
-be required to generate correct code for the 80387 coprocessor of the
-80386. They are no longer used by that machine description and may be
-removed in a later version of the compiler. Don't use them!
-
-@table @code
-@findex OVERLAPPING_REGNO_P
-@item OVERLAPPING_REGNO_P (@var{regno})
-If defined, this is a C expression whose value is nonzero if hard
-register number @var{regno} is an overlapping register. This means a
-hard register which overlaps a hard register with a different number.
-(Such overlap is undesirable, but occasionally it allows a machine to
-be supported which otherwise could not be.) This macro must return
-nonzero for @emph{all} the registers which overlap each other. GNU CC
-can use an overlapping register only in certain limited ways. It can
-be used for allocation within a basic block, and may be spilled for
-reloading; that is all.
-
-If this macro is not defined, it means that none of the hard registers
-overlap each other. This is the usual situation.
-
-@findex INSN_CLOBBERS_REGNO_P
-@item INSN_CLOBBERS_REGNO_P (@var{insn}, @var{regno})
-If defined, this is a C expression whose value should be nonzero if
-the insn @var{insn} has the effect of mysteriously clobbering the
-contents of hard register number @var{regno}. By ``mysterious'' we
-mean that the insn's RTL expression doesn't describe such an effect.
-
-If this macro is not defined, it means that no insn clobbers registers
-mysteriously. This is the usual situation; all else being equal,
-it is best for the RTL expression to show all the activity.
-
-@end table
-
-@node Register Classes
-@section Register Classes
-@cindex register class definitions
-@cindex class definitions, register
-
-On many machines, the numbered registers are not all equivalent.
-For example, certain registers may not be allowed for indexed addressing;
-certain registers may not be allowed in some instructions. These machine
-restrictions are described to the compiler using @dfn{register classes}.
-
-You define a number of register classes, giving each one a name and saying
-which of the registers belong to it. Then you can specify register classes
-that are allowed as operands to particular instruction patterns.
-
-@findex ALL_REGS
-@findex NO_REGS
-In general, each register will belong to several classes. In fact, one
-class must be named @code{ALL_REGS} and contain all the registers. Another
-class must be named @code{NO_REGS} and contain no registers. Often the
-union of two classes will be another class; however, this is not required.
-
-@findex GENERAL_REGS
-One of the classes must be named @code{GENERAL_REGS}. There is nothing
-terribly special about the name, but the operand constraint letters
-@samp{r} and @samp{g} specify this class. If @code{GENERAL_REGS} is
-the same as @code{ALL_REGS}, just define it as a macro which expands
-to @code{ALL_REGS}.
-
-Order the classes so that if class @var{x} is contained in class @var{y}
-then @var{x} has a lower class number than @var{y}.
-
-The way classes other than @code{GENERAL_REGS} are specified in operand
-constraints is through machine-dependent operand constraint letters.
-You can define such letters to correspond to various classes, then use
-them in operand constraints.
-
-You should define a class for the union of two classes whenever some
-instruction allows both classes. For example, if an instruction allows
-either a floating point (coprocessor) register or a general register for a
-certain operand, you should define a class @code{FLOAT_OR_GENERAL_REGS}
-which includes both of them. Otherwise you will get suboptimal code.
-
-You must also specify certain redundant information about the register
-classes: for each class, which classes contain it and which ones are
-contained in it; for each pair of classes, the largest class contained
-in their union.
-
-When a value occupying several consecutive registers is expected in a
-certain class, all the registers used must belong to that class.
-Therefore, register classes cannot be used to enforce a requirement for
-a register pair to start with an even-numbered register. The way to
-specify this requirement is with @code{HARD_REGNO_MODE_OK}.
-
-Register classes used for input-operands of bitwise-and or shift
-instructions have a special requirement: each such class must have, for
-each fixed-point machine mode, a subclass whose registers can transfer that
-mode to or from memory. For example, on some machines, the operations for
-single-byte values (@code{QImode}) are limited to certain registers. When
-this is so, each register class that is used in a bitwise-and or shift
-instruction must have a subclass consisting of registers from which
-single-byte values can be loaded or stored. This is so that
-@code{PREFERRED_RELOAD_CLASS} can always have a possible value to return.
-
-@table @code
-@findex enum reg_class
-@item enum reg_class
-An enumeral type that must be defined with all the register class names
-as enumeral values. @code{NO_REGS} must be first. @code{ALL_REGS}
-must be the last register class, followed by one more enumeral value,
-@code{LIM_REG_CLASSES}, which is not a register class but rather
-tells how many classes there are.
-
-Each register class has a number, which is the value of casting
-the class name to type @code{int}. The number serves as an index
-in many of the tables described below.
-
-@findex N_REG_CLASSES
-@item N_REG_CLASSES
-The number of distinct register classes, defined as follows:
-
-@example
-#define N_REG_CLASSES (int) LIM_REG_CLASSES
-@end example
-
-@findex REG_CLASS_NAMES
-@item REG_CLASS_NAMES
-An initializer containing the names of the register classes as C string
-constants. These names are used in writing some of the debugging dumps.
-
-@findex REG_CLASS_CONTENTS
-@item REG_CLASS_CONTENTS
-An initializer containing the contents of the register classes, as integers
-which are bit masks. The @var{n}th integer specifies the contents of class
-@var{n}. The way the integer @var{mask} is interpreted is that
-register @var{r} is in the class if @code{@var{mask} & (1 << @var{r})} is 1.
-
-When the machine has more than 32 registers, an integer does not suffice.
-Then the integers are replaced by sub-initializers, braced groupings containing
-several integers. Each sub-initializer must be suitable as an initializer
-for the type @code{HARD_REG_SET} which is defined in @file{hard-reg-set.h}.
-
-@findex REGNO_REG_CLASS
-@item REGNO_REG_CLASS (@var{regno})
-A C expression whose value is a register class containing hard register
-@var{regno}. In general there is more than one such class; choose a class
-which is @dfn{minimal}, meaning that no smaller class also contains the
-register.
-
-@findex BASE_REG_CLASS
-@item BASE_REG_CLASS
-A macro whose definition is the name of the class to which a valid
-base register must belong. A base register is one used in an address
-which is the register value plus a displacement.
-
-@findex INDEX_REG_CLASS
-@item INDEX_REG_CLASS
-A macro whose definition is the name of the class to which a valid
-index register must belong. An index register is one used in an
-address where its value is either multiplied by a scale factor or
-added to another register (as well as added to a displacement).
-
-@findex REG_CLASS_FROM_LETTER
-@item REG_CLASS_FROM_LETTER (@var{char})
-A C expression which defines the machine-dependent operand constraint
-letters for register classes. If @var{char} is such a letter, the
-value should be the register class corresponding to it. Otherwise,
-the value should be @code{NO_REGS}. The register letter @samp{r},
-corresponding to class @code{GENERAL_REGS}, will not be passed
-to this macro; you do not need to handle it.
-
-@findex REGNO_OK_FOR_BASE_P
-@item REGNO_OK_FOR_BASE_P (@var{num})
-A C expression which is nonzero if register number @var{num} is
-suitable for use as a base register in operand addresses. It may be
-either a suitable hard register or a pseudo register that has been
-allocated such a hard register.
-
-@findex REGNO_MODE_OK_FOR_BASE_P
-@item REGNO_MODE_OK_FOR_BASE_P (@var{num}, @var{mode})
-A C expression that is just like @code{REGNO_OK_FOR_BASE_P}, except that
-that expression may examine the mode of the memory reference in
-@var{mode}. You should define this macro if the mode of the memory
-reference affects whether a register may be used as a base register. If
-you define this macro, the compiler will use it instead of
-@code{REGNO_OK_FOR_BASE_P}.
-
-@findex REGNO_OK_FOR_INDEX_P
-@item REGNO_OK_FOR_INDEX_P (@var{num})
-A C expression which is nonzero if register number @var{num} is
-suitable for use as an index register in operand addresses. It may be
-either a suitable hard register or a pseudo register that has been
-allocated such a hard register.
-
-The difference between an index register and a base register is that
-the index register may be scaled. If an address involves the sum of
-two registers, neither one of them scaled, then either one may be
-labeled the ``base'' and the other the ``index''; but whichever
-labeling is used must fit the machine's constraints of which registers
-may serve in each capacity. The compiler will try both labelings,
-looking for one that is valid, and will reload one or both registers
-only if neither labeling works.
-
-@findex PREFERRED_RELOAD_CLASS
-@item PREFERRED_RELOAD_CLASS (@var{x}, @var{class})
-A C expression that places additional restrictions on the register class
-to use when it is necessary to copy value @var{x} into a register in class
-@var{class}. The value is a register class; perhaps @var{class}, or perhaps
-another, smaller class. On many machines, the following definition is
-safe:
-
-@example
-#define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS
-@end example
-
-Sometimes returning a more restrictive class makes better code. For
-example, on the 68000, when @var{x} is an integer constant that is in range
-for a @samp{moveq} instruction, the value of this macro is always
-@code{DATA_REGS} as long as @var{class} includes the data registers.
-Requiring a data register guarantees that a @samp{moveq} will be used.
-
-If @var{x} is a @code{const_double}, by returning @code{NO_REGS}
-you can force @var{x} into a memory constant. This is useful on
-certain machines where immediate floating values cannot be loaded into
-certain kinds of registers.
-
-@findex PREFERRED_OUTPUT_RELOAD_CLASS
-@item PREFERRED_OUTPUT_RELOAD_CLASS (@var{x}, @var{class})
-Like @code{PREFERRED_RELOAD_CLASS}, but for output reloads instead of
-input reloads. If you don't define this macro, the default is to use
-@var{class}, unchanged.
-
-@findex LIMIT_RELOAD_CLASS
-@item LIMIT_RELOAD_CLASS (@var{mode}, @var{class})
-A C expression that places additional restrictions on the register class
-to use when it is necessary to be able to hold a value of mode
-@var{mode} in a reload register for which class @var{class} would
-ordinarily be used.
-
-Unlike @code{PREFERRED_RELOAD_CLASS}, this macro should be used when
-there are certain modes that simply can't go in certain reload classes.
-
-The value is a register class; perhaps @var{class}, or perhaps another,
-smaller class.
-
-Don't define this macro unless the target machine has limitations which
-require the macro to do something nontrivial.
-
-@findex SECONDARY_RELOAD_CLASS
-@findex SECONDARY_INPUT_RELOAD_CLASS
-@findex SECONDARY_OUTPUT_RELOAD_CLASS
-@item SECONDARY_RELOAD_CLASS (@var{class}, @var{mode}, @var{x})
-@itemx SECONDARY_INPUT_RELOAD_CLASS (@var{class}, @var{mode}, @var{x})
-@itemx SECONDARY_OUTPUT_RELOAD_CLASS (@var{class}, @var{mode}, @var{x})
-Many machines have some registers that cannot be copied directly to or
-from memory or even from other types of registers. An example is the
-@samp{MQ} register, which on most machines, can only be copied to or
-from general registers, but not memory. Some machines allow copying all
-registers to and from memory, but require a scratch register for stores
-to some memory locations (e.g., those with symbolic address on the RT,
-and those with certain symbolic address on the Sparc when compiling
-PIC). In some cases, both an intermediate and a scratch register are
-required.
-
-You should define these macros to indicate to the reload phase that it may
-need to allocate at least one register for a reload in addition to the
-register to contain the data. Specifically, if copying @var{x} to a
-register @var{class} in @var{mode} requires an intermediate register,
-you should define @code{SECONDARY_INPUT_RELOAD_CLASS} to return the
-largest register class all of whose registers can be used as
-intermediate registers or scratch registers.
-
-If copying a register @var{class} in @var{mode} to @var{x} requires an
-intermediate or scratch register, @code{SECONDARY_OUTPUT_RELOAD_CLASS}
-should be defined to return the largest register class required. If the
-requirements for input and output reloads are the same, the macro
-@code{SECONDARY_RELOAD_CLASS} should be used instead of defining both
-macros identically.
-
-The values returned by these macros are often @code{GENERAL_REGS}.
-Return @code{NO_REGS} if no spare register is needed; i.e., if @var{x}
-can be directly copied to or from a register of @var{class} in
-@var{mode} without requiring a scratch register. Do not define this
-macro if it would always return @code{NO_REGS}.
-
-If a scratch register is required (either with or without an
-intermediate register), you should define patterns for
-@samp{reload_in@var{m}} or @samp{reload_out@var{m}}, as required
-(@pxref{Standard Names}. These patterns, which will normally be
-implemented with a @code{define_expand}, should be similar to the
-@samp{mov@var{m}} patterns, except that operand 2 is the scratch
-register.
-
-Define constraints for the reload register and scratch register that
-contain a single register class. If the original reload register (whose
-class is @var{class}) can meet the constraint given in the pattern, the
-value returned by these macros is used for the class of the scratch
-register. Otherwise, two additional reload registers are required.
-Their classes are obtained from the constraints in the insn pattern.
-
-@var{x} might be a pseudo-register or a @code{subreg} of a
-pseudo-register, which could either be in a hard register or in memory.
-Use @code{true_regnum} to find out; it will return -1 if the pseudo is
-in memory and the hard register number if it is in a register.
-
-These macros should not be used in the case where a particular class of
-registers can only be copied to memory and not to another class of
-registers. In that case, secondary reload registers are not needed and
-would not be helpful. Instead, a stack location must be used to perform
-the copy and the @code{mov@var{m}} pattern should use memory as a
-intermediate storage. This case often occurs between floating-point and
-general registers.
-
-@findex SECONDARY_MEMORY_NEEDED
-@item SECONDARY_MEMORY_NEEDED (@var{class1}, @var{class2}, @var{m})
-Certain machines have the property that some registers cannot be copied
-to some other registers without using memory. Define this macro on
-those machines to be a C expression that is non-zero if objects of mode
-@var{m} in registers of @var{class1} can only be copied to registers of
-class @var{class2} by storing a register of @var{class1} into memory
-and loading that memory location into a register of @var{class2}.
-
-Do not define this macro if its value would always be zero.
-
-@findex SECONDARY_MEMORY_NEEDED_RTX
-@item SECONDARY_MEMORY_NEEDED_RTX (@var{mode})
-Normally when @code{SECONDARY_MEMORY_NEEDED} is defined, the compiler
-allocates a stack slot for a memory location needed for register copies.
-If this macro is defined, the compiler instead uses the memory location
-defined by this macro.
-
-Do not define this macro if you do not define
-@code{SECONDARY_MEMORY_NEEDED}.
-
-@findex SECONDARY_MEMORY_NEEDED_MODE
-@item SECONDARY_MEMORY_NEEDED_MODE (@var{mode})
-When the compiler needs a secondary memory location to copy between two
-registers of mode @var{mode}, it normally allocates sufficient memory to
-hold a quantity of @code{BITS_PER_WORD} bits and performs the store and
-load operations in a mode that many bits wide and whose class is the
-same as that of @var{mode}.
-
-This is right thing to do on most machines because it ensures that all
-bits of the register are copied and prevents accesses to the registers
-in a narrower mode, which some machines prohibit for floating-point
-registers.
-
-However, this default behavior is not correct on some machines, such as
-the DEC Alpha, that store short integers in floating-point registers
-differently than in integer registers. On those machines, the default
-widening will not work correctly and you must define this macro to
-suppress that widening in some cases. See the file @file{alpha.h} for
-details.
-
-Do not define this macro if you do not define
-@code{SECONDARY_MEMORY_NEEDED} or if widening @var{mode} to a mode that
-is @code{BITS_PER_WORD} bits wide is correct for your machine.
-
-@findex SMALL_REGISTER_CLASSES
-@item SMALL_REGISTER_CLASSES
-On some machines, it is risky to let hard registers live across arbitrary
-insns. Typically, these machines have instructions that require values
-to be in specific registers (like an accumulator), and reload will fail
-if the required hard register is used for another purpose across such an
-insn.
-
-Define @code{SMALL_REGISTER_CLASSES} to be an expression with a non-zero
-value on these machines. When this macro has a non-zero value, the
-compiler will try to minimize the lifetime of hard registers.
-
-It is always safe to define this macro with a non-zero value, but if you
-unnecessarily define it, you will reduce the amount of optimizations
-that can be performed in some cases. If you do not define this macro
-with a non-zero value when it is required, the compiler will run out of
-spill registers and print a fatal error message. For most machines, you
-should not define this macro at all.
-
-@findex CLASS_LIKELY_SPILLED_P
-@item CLASS_LIKELY_SPILLED_P (@var{class})
-A C expression whose value is nonzero if pseudos that have been assigned
-to registers of class @var{class} would likely be spilled because
-registers of @var{class} are needed for spill registers.
-
-The default value of this macro returns 1 if @var{class} has exactly one
-register and zero otherwise. On most machines, this default should be
-used. Only define this macro to some other expression if pseudos
-allocated by @file{local-alloc.c} end up in memory because their hard
-registers were needed for spill registers. If this macro returns nonzero
-for those classes, those pseudos will only be allocated by
-@file{global.c}, which knows how to reallocate the pseudo to another
-register. If there would not be another register available for
-reallocation, you should not change the definition of this macro since
-the only effect of such a definition would be to slow down register
-allocation.
-
-@findex CLASS_MAX_NREGS
-@item CLASS_MAX_NREGS (@var{class}, @var{mode})
-A C expression for the maximum number of consecutive registers
-of class @var{class} needed to hold a value of mode @var{mode}.
-
-This is closely related to the macro @code{HARD_REGNO_NREGS}. In fact,
-the value of the macro @code{CLASS_MAX_NREGS (@var{class}, @var{mode})}
-should be the maximum value of @code{HARD_REGNO_NREGS (@var{regno},
-@var{mode})} for all @var{regno} values in the class @var{class}.
-
-This macro helps control the handling of multiple-word values
-in the reload pass.
-
-@item CLASS_CANNOT_CHANGE_SIZE
-If defined, a C expression for a class that contains registers which the
-compiler must always access in a mode that is the same size as the mode
-in which it loaded the register.
-
-For the example, loading 32-bit integer or floating-point objects into
-floating-point registers on the Alpha extends them to 64-bits.
-Therefore loading a 64-bit object and then storing it as a 32-bit object
-does not store the low-order 32-bits, as would be the case for a normal
-register. Therefore, @file{alpha.h} defines this macro as
-@code{FLOAT_REGS}.
-@end table
-
-Three other special macros describe which operands fit which constraint
-letters.
-
-@table @code
-@findex CONST_OK_FOR_LETTER_P
-@item CONST_OK_FOR_LETTER_P (@var{value}, @var{c})
-A C expression that defines the machine-dependent operand constraint
-letters (@samp{I}, @samp{J}, @samp{K}, @dots{} @samp{P}) that specify
-particular ranges of integer values. If @var{c} is one of those
-letters, the expression should check that @var{value}, an integer, is in
-the appropriate range and return 1 if so, 0 otherwise. If @var{c} is
-not one of those letters, the value should be 0 regardless of
-@var{value}.
-
-@findex CONST_DOUBLE_OK_FOR_LETTER_P
-@item CONST_DOUBLE_OK_FOR_LETTER_P (@var{value}, @var{c})
-A C expression that defines the machine-dependent operand constraint
-letters that specify particular ranges of @code{const_double} values
-(@samp{G} or @samp{H}).
-
-If @var{c} is one of those letters, the expression should check that
-@var{value}, an RTX of code @code{const_double}, is in the appropriate
-range and return 1 if so, 0 otherwise. If @var{c} is not one of those
-letters, the value should be 0 regardless of @var{value}.
-
-@code{const_double} is used for all floating-point constants and for
-@code{DImode} fixed-point constants. A given letter can accept either
-or both kinds of values. It can use @code{GET_MODE} to distinguish
-between these kinds.
-
-@findex EXTRA_CONSTRAINT
-@item EXTRA_CONSTRAINT (@var{value}, @var{c})
-A C expression that defines the optional machine-dependent constraint
-letters (@samp{Q}, @samp{R}, @samp{S}, @samp{T}, @samp{U}) that can
-be used to segregate specific types of operands, usually memory
-references, for the target machine. Normally this macro will not be
-defined. If it is required for a particular target machine, it should
-return 1 if @var{value} corresponds to the operand type represented by
-the constraint letter @var{c}. If @var{c} is not defined as an extra
-constraint, the value returned should be 0 regardless of @var{value}.
-
-For example, on the ROMP, load instructions cannot have their output in r0 if
-the memory reference contains a symbolic address. Constraint letter
-@samp{Q} is defined as representing a memory address that does
-@emph{not} contain a symbolic address. An alternative is specified with
-a @samp{Q} constraint on the input and @samp{r} on the output. The next
-alternative specifies @samp{m} on the input and a register class that
-does not include r0 on the output.
-@end table
-
-@node Stack and Calling
-@section Stack Layout and Calling Conventions
-@cindex calling conventions
-
-@c prevent bad page break with this line
-This describes the stack layout and calling conventions.
-
-@menu
-* Frame Layout::
-* Stack Checking::
-* Frame Registers::
-* Elimination::
-* Stack Arguments::
-* Register Arguments::
-* Scalar Return::
-* Aggregate Return::
-* Caller Saves::
-* Function Entry::
-* Profiling::
-@end menu
-
-@node Frame Layout
-@subsection Basic Stack Layout
-@cindex stack frame layout
-@cindex frame layout
-
-@c prevent bad page break with this line
-Here is the basic stack layout.
-
-@table @code
-@findex STACK_GROWS_DOWNWARD
-@item STACK_GROWS_DOWNWARD
-Define this macro if pushing a word onto the stack moves the stack
-pointer to a smaller address.
-
-When we say, ``define this macro if @dots{},'' it means that the
-compiler checks this macro only with @code{#ifdef} so the precise
-definition used does not matter.
-
-@findex FRAME_GROWS_DOWNWARD
-@item FRAME_GROWS_DOWNWARD
-Define this macro if the addresses of local variable slots are at negative
-offsets from the frame pointer.
-
-@findex ARGS_GROW_DOWNWARD
-@item ARGS_GROW_DOWNWARD
-Define this macro if successive arguments to a function occupy decreasing
-addresses on the stack.
-
-@findex STARTING_FRAME_OFFSET
-@item STARTING_FRAME_OFFSET
-Offset from the frame pointer to the first local variable slot to be allocated.
-
-If @code{FRAME_GROWS_DOWNWARD}, find the next slot's offset by
-subtracting the first slot's length from @code{STARTING_FRAME_OFFSET}.
-Otherwise, it is found by adding the length of the first slot to the
-value @code{STARTING_FRAME_OFFSET}.
-@c i'm not sure if the above is still correct.. had to change it to get
-@c rid of an overfull. --mew 2feb93
-
-@findex STACK_POINTER_OFFSET
-@item STACK_POINTER_OFFSET
-Offset from the stack pointer register to the first location at which
-outgoing arguments are placed. If not specified, the default value of
-zero is used. This is the proper value for most machines.
-
-If @code{ARGS_GROW_DOWNWARD}, this is the offset to the location above
-the first location at which outgoing arguments are placed.
-
-@findex FIRST_PARM_OFFSET
-@item FIRST_PARM_OFFSET (@var{fundecl})
-Offset from the argument pointer register to the first argument's
-address. On some machines it may depend on the data type of the
-function.
-
-If @code{ARGS_GROW_DOWNWARD}, this is the offset to the location above
-the first argument's address.
-
-@findex STACK_DYNAMIC_OFFSET
-@item STACK_DYNAMIC_OFFSET (@var{fundecl})
-Offset from the stack pointer register to an item dynamically allocated
-on the stack, e.g., by @code{alloca}.
-
-The default value for this macro is @code{STACK_POINTER_OFFSET} plus the
-length of the outgoing arguments. The default is correct for most
-machines. See @file{function.c} for details.
-
-@findex DYNAMIC_CHAIN_ADDRESS
-@item DYNAMIC_CHAIN_ADDRESS (@var{frameaddr})
-A C expression whose value is RTL representing the address in a stack
-frame where the pointer to the caller's frame is stored. Assume that
-@var{frameaddr} is an RTL expression for the address of the stack frame
-itself.
-
-If you don't define this macro, the default is to return the value
-of @var{frameaddr}---that is, the stack frame address is also the
-address of the stack word that points to the previous frame.
-
-@findex SETUP_FRAME_ADDRESSES
-@item SETUP_FRAME_ADDRESSES
-If defined, a C expression that produces the machine-specific code to
-setup the stack so that arbitrary frames can be accessed. For example,
-on the Sparc, we must flush all of the register windows to the stack
-before we can access arbitrary stack frames. You will seldom need to
-define this macro.
-
-@findex BUILTIN_SETJMP_FRAME_VALUE
-@item BUILTIN_SETJMP_FRAME_VALUE
-If defined, a C expression that contains an rtx that is used to store
-the address of the current frame into the built in @code{setjmp} buffer.
-The default value, @code{virtual_stack_vars_rtx}, is correct for most
-machines. One reason you may need to define this macro is if
-@code{hard_frame_pointer_rtx} is the appropriate value on your machine.
-
-@findex RETURN_ADDR_RTX
-@item RETURN_ADDR_RTX (@var{count}, @var{frameaddr})
-A C expression whose value is RTL representing the value of the return
-address for the frame @var{count} steps up from the current frame, after
-the prologue. @var{frameaddr} is the frame pointer of the @var{count}
-frame, or the frame pointer of the @var{count} @minus{} 1 frame if
-@code{RETURN_ADDR_IN_PREVIOUS_FRAME} is defined.
-
-The value of the expression must always be the correct address when
-@var{count} is zero, but may be @code{NULL_RTX} if there is not way to
-determine the return address of other frames.
-
-@findex RETURN_ADDR_IN_PREVIOUS_FRAME
-@item RETURN_ADDR_IN_PREVIOUS_FRAME
-Define this if the return address of a particular stack frame is accessed
-from the frame pointer of the previous stack frame.
-
-@findex INCOMING_RETURN_ADDR_RTX
-@item INCOMING_RETURN_ADDR_RTX
-A C expression whose value is RTL representing the location of the
-incoming return address at the beginning of any function, before the
-prologue. This RTL is either a @code{REG}, indicating that the return
-value is saved in @samp{REG}, or a @code{MEM} representing a location in
-the stack.
-
-You only need to define this macro if you want to support call frame
-debugging information like that provided by DWARF 2.
-
-@findex INCOMING_FRAME_SP_OFFSET
-@item INCOMING_FRAME_SP_OFFSET
-A C expression whose value is an integer giving the offset, in bytes,
-from the value of the stack pointer register to the top of the stack
-frame at the beginning of any function, before the prologue. The top of
-the frame is defined to be the value of the stack pointer in the
-previous frame, just before the call instruction.
-
-You only need to define this macro if you want to support call frame
-debugging information like that provided by DWARF 2.
-
-@findex ARG_POINTER_CFA_OFFSET
-@item ARG_POINTER_CFA_OFFSET
-A C expression whose value is an integer giving the offset, in bytes,
-from the argument pointer to the canonical frame address (cfa). The
-final value should coincide with that calculated by
-@code{INCOMING_FRAME_SP_OFFSET}. Which is unfortunately not usable
-during virtual register instantiation.
-
-You only need to define this macro if you want to support call frame
-debugging information like that provided by DWARF 2.
-@end table
-
-@node Stack Checking
-@subsection Specifying How Stack Checking is Done
-
-GNU CC will check that stack references are within the boundaries of
-the stack, if the @samp{-fstack-check} is specified, in one of three ways:
-
-@enumerate
-@item
-If the value of the @code{STACK_CHECK_BUILTIN} macro is nonzero, GNU CC
-will assume that you have arranged for stack checking to be done at
-appropriate places in the configuration files, e.g., in
-@code{FUNCTION_PROLOGUE}. GNU CC will do not other special processing.
-
-@item
-If @code{STACK_CHECK_BUILTIN} is zero and you defined a named pattern
-called @code{check_stack} in your @file{md} file, GNU CC will call that
-pattern with one argument which is the address to compare the stack
-value against. You must arrange for this pattern to report an error if
-the stack pointer is out of range.
-
-@item
-If neither of the above are true, GNU CC will generate code to periodically
-``probe'' the stack pointer using the values of the macros defined below.
-@end enumerate
-
-Normally, you will use the default values of these macros, so GNU CC
-will use the third approach.
-
-@table @code
-@findex STACK_CHECK_BUILTIN
-@item STACK_CHECK_BUILTIN
-A nonzero value if stack checking is done by the configuration files in a
-machine-dependent manner. You should define this macro if stack checking
-is require by the ABI of your machine or if you would like to have to stack
-checking in some more efficient way than GNU CC's portable approach.
-The default value of this macro is zero.
-
-@findex STACK_CHECK_PROBE_INTERVAL
-@item STACK_CHECK_PROBE_INTERVAL
-An integer representing the interval at which GNU CC must generate stack
-probe instructions. You will normally define this macro to be no larger
-than the size of the ``guard pages'' at the end of a stack area. The
-default value of 4096 is suitable for most systems.
-
-@findex STACK_CHECK_PROBE_LOAD
-@item STACK_CHECK_PROBE_LOAD
-A integer which is nonzero if GNU CC should perform the stack probe
-as a load instruction and zero if GNU CC should use a store instruction.
-The default is zero, which is the most efficient choice on most systems.
-
-@findex STACK_CHECK_PROTECT
-@item STACK_CHECK_PROTECT
-The number of bytes of stack needed to recover from a stack overflow,
-for languages where such a recovery is supported. The default value of
-75 words should be adequate for most machines.
-
-@findex STACK_CHECK_MAX_FRAME_SIZE
-@item STACK_CHECK_MAX_FRAME_SIZE
-The maximum size of a stack frame, in bytes. GNU CC will generate probe
-instructions in non-leaf functions to ensure at least this many bytes of
-stack are available. If a stack frame is larger than this size, stack
-checking will not be reliable and GNU CC will issue a warning. The
-default is chosen so that GNU CC only generates one instruction on most
-systems. You should normally not change the default value of this macro.
-
-@findex STACK_CHECK_FIXED_FRAME_SIZE
-@item STACK_CHECK_FIXED_FRAME_SIZE
-GNU CC uses this value to generate the above warning message. It
-represents the amount of fixed frame used by a function, not including
-space for any callee-saved registers, temporaries and user variables.
-You need only specify an upper bound for this amount and will normally
-use the default of four words.
-
-@findex STACK_CHECK_MAX_VAR_SIZE
-@item STACK_CHECK_MAX_VAR_SIZE
-The maximum size, in bytes, of an object that GNU CC will place in the
-fixed area of the stack frame when the user specifies
-@samp{-fstack-check}.
-GNU CC computed the default from the values of the above macros and you will
-normally not need to override that default.
-@end table
-
-@need 2000
-@node Frame Registers
-@subsection Registers That Address the Stack Frame
-
-@c prevent bad page break with this line
-This discusses registers that address the stack frame.
-
-@table @code
-@findex STACK_POINTER_REGNUM
-@item STACK_POINTER_REGNUM
-The register number of the stack pointer register, which must also be a
-fixed register according to @code{FIXED_REGISTERS}. On most machines,
-the hardware determines which register this is.
-
-@findex FRAME_POINTER_REGNUM
-@item FRAME_POINTER_REGNUM
-The register number of the frame pointer register, which is used to
-access automatic variables in the stack frame. On some machines, the
-hardware determines which register this is. On other machines, you can
-choose any register you wish for this purpose.
-
-@findex HARD_FRAME_POINTER_REGNUM
-@item HARD_FRAME_POINTER_REGNUM
-On some machines the offset between the frame pointer and starting
-offset of the automatic variables is not known until after register
-allocation has been done (for example, because the saved registers are
-between these two locations). On those machines, define
-@code{FRAME_POINTER_REGNUM} the number of a special, fixed register to
-be used internally until the offset is known, and define
-@code{HARD_FRAME_POINTER_REGNUM} to be the actual hard register number
-used for the frame pointer.
-
-You should define this macro only in the very rare circumstances when it
-is not possible to calculate the offset between the frame pointer and
-the automatic variables until after register allocation has been
-completed. When this macro is defined, you must also indicate in your
-definition of @code{ELIMINABLE_REGS} how to eliminate
-@code{FRAME_POINTER_REGNUM} into either @code{HARD_FRAME_POINTER_REGNUM}
-or @code{STACK_POINTER_REGNUM}.
-
-Do not define this macro if it would be the same as
-@code{FRAME_POINTER_REGNUM}.
-
-@findex ARG_POINTER_REGNUM
-@item ARG_POINTER_REGNUM
-The register number of the arg pointer register, which is used to access
-the function's argument list. On some machines, this is the same as the
-frame pointer register. On some machines, the hardware determines which
-register this is. On other machines, you can choose any register you
-wish for this purpose. If this is not the same register as the frame
-pointer register, then you must mark it as a fixed register according to
-@code{FIXED_REGISTERS}, or arrange to be able to eliminate it
-(@pxref{Elimination}).
-
-@findex RETURN_ADDRESS_POINTER_REGNUM
-@item RETURN_ADDRESS_POINTER_REGNUM
-The register number of the return address pointer register, which is used to
-access the current function's return address from the stack. On some
-machines, the return address is not at a fixed offset from the frame
-pointer or stack pointer or argument pointer. This register can be defined
-to point to the return address on the stack, and then be converted by
-@code{ELIMINABLE_REGS} into either the frame pointer or stack pointer.
-
-Do not define this macro unless there is no other way to get the return
-address from the stack.
-
-@findex STATIC_CHAIN_REGNUM
-@findex STATIC_CHAIN_INCOMING_REGNUM
-@item STATIC_CHAIN_REGNUM
-@itemx STATIC_CHAIN_INCOMING_REGNUM
-Register numbers used for passing a function's static chain pointer. If
-register windows are used, the register number as seen by the called
-function is @code{STATIC_CHAIN_INCOMING_REGNUM}, while the register
-number as seen by the calling function is @code{STATIC_CHAIN_REGNUM}. If
-these registers are the same, @code{STATIC_CHAIN_INCOMING_REGNUM} need
-not be defined.@refill
-
-The static chain register need not be a fixed register.
-
-If the static chain is passed in memory, these macros should not be
-defined; instead, the next two macros should be defined.
-
-@findex STATIC_CHAIN
-@findex STATIC_CHAIN_INCOMING
-@item STATIC_CHAIN
-@itemx STATIC_CHAIN_INCOMING
-If the static chain is passed in memory, these macros provide rtx giving
-@code{mem} expressions that denote where they are stored.
-@code{STATIC_CHAIN} and @code{STATIC_CHAIN_INCOMING} give the locations
-as seen by the calling and called functions, respectively. Often the former
-will be at an offset from the stack pointer and the latter at an offset from
-the frame pointer.@refill
-
-@findex stack_pointer_rtx
-@findex frame_pointer_rtx
-@findex arg_pointer_rtx
-The variables @code{stack_pointer_rtx}, @code{frame_pointer_rtx}, and
-@code{arg_pointer_rtx} will have been initialized prior to the use of these
-macros and should be used to refer to those items.
-
-If the static chain is passed in a register, the two previous macros should
-be defined instead.
-@end table
-
-@node Elimination
-@subsection Eliminating Frame Pointer and Arg Pointer
-
-@c prevent bad page break with this line
-This is about eliminating the frame pointer and arg pointer.
-
-@table @code
-@findex FRAME_POINTER_REQUIRED
-@item FRAME_POINTER_REQUIRED
-A C expression which is nonzero if a function must have and use a frame
-pointer. This expression is evaluated in the reload pass. If its value is
-nonzero the function will have a frame pointer.
-
-The expression can in principle examine the current function and decide
-according to the facts, but on most machines the constant 0 or the
-constant 1 suffices. Use 0 when the machine allows code to be generated
-with no frame pointer, and doing so saves some time or space. Use 1
-when there is no possible advantage to avoiding a frame pointer.
-
-In certain cases, the compiler does not know how to produce valid code
-without a frame pointer. The compiler recognizes those cases and
-automatically gives the function a frame pointer regardless of what
-@code{FRAME_POINTER_REQUIRED} says. You don't need to worry about
-them.@refill
-
-In a function that does not require a frame pointer, the frame pointer
-register can be allocated for ordinary usage, unless you mark it as a
-fixed register. See @code{FIXED_REGISTERS} for more information.
-
-@findex INITIAL_FRAME_POINTER_OFFSET
-@findex get_frame_size
-@item INITIAL_FRAME_POINTER_OFFSET (@var{depth-var})
-A C statement to store in the variable @var{depth-var} the difference
-between the frame pointer and the stack pointer values immediately after
-the function prologue. The value would be computed from information
-such as the result of @code{get_frame_size ()} and the tables of
-registers @code{regs_ever_live} and @code{call_used_regs}.
-
-If @code{ELIMINABLE_REGS} is defined, this macro will be not be used and
-need not be defined. Otherwise, it must be defined even if
-@code{FRAME_POINTER_REQUIRED} is defined to always be true; in that
-case, you may set @var{depth-var} to anything.
-
-@findex ELIMINABLE_REGS
-@item ELIMINABLE_REGS
-If defined, this macro specifies a table of register pairs used to
-eliminate unneeded registers that point into the stack frame. If it is not
-defined, the only elimination attempted by the compiler is to replace
-references to the frame pointer with references to the stack pointer.
-
-The definition of this macro is a list of structure initializations, each
-of which specifies an original and replacement register.
-
-On some machines, the position of the argument pointer is not known until
-the compilation is completed. In such a case, a separate hard register
-must be used for the argument pointer. This register can be eliminated by
-replacing it with either the frame pointer or the argument pointer,
-depending on whether or not the frame pointer has been eliminated.
-
-In this case, you might specify:
-@example
-#define ELIMINABLE_REGS \
-@{@{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM@}, \
- @{ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM@}, \
- @{FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM@}@}
-@end example
-
-Note that the elimination of the argument pointer with the stack pointer is
-specified first since that is the preferred elimination.
-
-@findex CAN_ELIMINATE
-@item CAN_ELIMINATE (@var{from-reg}, @var{to-reg})
-A C expression that returns non-zero if the compiler is allowed to try
-to replace register number @var{from-reg} with register number
-@var{to-reg}. This macro need only be defined if @code{ELIMINABLE_REGS}
-is defined, and will usually be the constant 1, since most of the cases
-preventing register elimination are things that the compiler already
-knows about.
-
-@findex INITIAL_ELIMINATION_OFFSET
-@item INITIAL_ELIMINATION_OFFSET (@var{from-reg}, @var{to-reg}, @var{offset-var})
-This macro is similar to @code{INITIAL_FRAME_POINTER_OFFSET}. It
-specifies the initial difference between the specified pair of
-registers. This macro must be defined if @code{ELIMINABLE_REGS} is
-defined.
-
-@findex LONGJMP_RESTORE_FROM_STACK
-@item LONGJMP_RESTORE_FROM_STACK
-Define this macro if the @code{longjmp} function restores registers from
-the stack frames, rather than from those saved specifically by
-@code{setjmp}. Certain quantities must not be kept in registers across
-a call to @code{setjmp} on such machines.
-@end table
-
-@node Stack Arguments
-@subsection Passing Function Arguments on the Stack
-@cindex arguments on stack
-@cindex stack arguments
-
-The macros in this section control how arguments are passed
-on the stack. See the following section for other macros that
-control passing certain arguments in registers.
-
-@table @code
-@findex PROMOTE_PROTOTYPES
-@item PROMOTE_PROTOTYPES
-Define this macro if an argument declared in a prototype as an
-integral type smaller than @code{int} should actually be passed as an
-@code{int}. In addition to avoiding errors in certain cases of
-mismatch, it also makes for better code on certain machines.
-
-@findex PUSH_ROUNDING
-@item PUSH_ROUNDING (@var{npushed})
-A C expression that is the number of bytes actually pushed onto the
-stack when an instruction attempts to push @var{npushed} bytes.
-
-If the target machine does not have a push instruction, do not define
-this macro. That directs GNU CC to use an alternate strategy: to
-allocate the entire argument block and then store the arguments into
-it.
-
-On some machines, the definition
-
-@example
-#define PUSH_ROUNDING(BYTES) (BYTES)
-@end example
-
-@noindent
-will suffice. But on other machines, instructions that appear
-to push one byte actually push two bytes in an attempt to maintain
-alignment. Then the definition should be
-
-@example
-#define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1)
-@end example
-
-@findex ACCUMULATE_OUTGOING_ARGS
-@findex current_function_outgoing_args_size
-@item ACCUMULATE_OUTGOING_ARGS
-If defined, the maximum amount of space required for outgoing arguments
-will be computed and placed into the variable
-@code{current_function_outgoing_args_size}. No space will be pushed
-onto the stack for each call; instead, the function prologue should
-increase the stack frame size by this amount.
-
-Defining both @code{PUSH_ROUNDING} and @code{ACCUMULATE_OUTGOING_ARGS}
-is not proper.
-
-@findex REG_PARM_STACK_SPACE
-@item REG_PARM_STACK_SPACE (@var{fndecl})
-Define this macro if functions should assume that stack space has been
-allocated for arguments even when their values are passed in
-registers.
-
-The value of this macro is the size, in bytes, of the area reserved for
-arguments passed in registers for the function represented by @var{fndecl}.
-
-This space can be allocated by the caller, or be a part of the
-machine-dependent stack frame: @code{OUTGOING_REG_PARM_STACK_SPACE} says
-which.
-@c above is overfull. not sure what to do. --mew 5feb93 did
-@c something, not sure if it looks good. --mew 10feb93
-
-@findex MAYBE_REG_PARM_STACK_SPACE
-@findex FINAL_REG_PARM_STACK_SPACE
-@item MAYBE_REG_PARM_STACK_SPACE
-@itemx FINAL_REG_PARM_STACK_SPACE (@var{const_size}, @var{var_size})
-Define these macros in addition to the one above if functions might
-allocate stack space for arguments even when their values are passed
-in registers. These should be used when the stack space allocated
-for arguments in registers is not a simple constant independent of the
-function declaration.
-
-The value of the first macro is the size, in bytes, of the area that
-we should initially assume would be reserved for arguments passed in registers.
-
-The value of the second macro is the actual size, in bytes, of the area
-that will be reserved for arguments passed in registers. This takes two
-arguments: an integer representing the number of bytes of fixed sized
-arguments on the stack, and a tree representing the number of bytes of
-variable sized arguments on the stack.
-
-When these macros are defined, @code{REG_PARM_STACK_SPACE} will only be
-called for libcall functions, the current function, or for a function
-being called when it is known that such stack space must be allocated.
-In each case this value can be easily computed.
-
-When deciding whether a called function needs such stack space, and how
-much space to reserve, GNU CC uses these two macros instead of
-@code{REG_PARM_STACK_SPACE}.
-
-@findex OUTGOING_REG_PARM_STACK_SPACE
-@item OUTGOING_REG_PARM_STACK_SPACE
-Define this if it is the responsibility of the caller to allocate the area
-reserved for arguments passed in registers.
-
-If @code{ACCUMULATE_OUTGOING_ARGS} is defined, this macro controls
-whether the space for these arguments counts in the value of
-@code{current_function_outgoing_args_size}.
-
-@findex STACK_PARMS_IN_REG_PARM_AREA
-@item STACK_PARMS_IN_REG_PARM_AREA
-Define this macro if @code{REG_PARM_STACK_SPACE} is defined, but the
-stack parameters don't skip the area specified by it.
-@c i changed this, makes more sens and it should have taken care of the
-@c overfull.. not as specific, tho. --mew 5feb93
-
-Normally, when a parameter is not passed in registers, it is placed on the
-stack beyond the @code{REG_PARM_STACK_SPACE} area. Defining this macro
-suppresses this behavior and causes the parameter to be passed on the
-stack in its natural location.
-
-@findex RETURN_POPS_ARGS
-@item RETURN_POPS_ARGS (@var{fundecl}, @var{funtype}, @var{stack-size})
-A C expression that should indicate the number of bytes of its own
-arguments that a function pops on returning, or 0 if the
-function pops no arguments and the caller must therefore pop them all
-after the function returns.
-
-@var{fundecl} is a C variable whose value is a tree node that describes
-the function in question. Normally it is a node of type
-@code{FUNCTION_DECL} that describes the declaration of the function.
-From this you can obtain the DECL_MACHINE_ATTRIBUTES of the function.
-
-@var{funtype} is a C variable whose value is a tree node that
-describes the function in question. Normally it is a node of type
-@code{FUNCTION_TYPE} that describes the data type of the function.
-From this it is possible to obtain the data types of the value and
-arguments (if known).
-
-When a call to a library function is being considered, @var{fundecl}
-will contain an identifier node for the library function. Thus, if
-you need to distinguish among various library functions, you can do so
-by their names. Note that ``library function'' in this context means
-a function used to perform arithmetic, whose name is known specially
-in the compiler and was not mentioned in the C code being compiled.
-
-@var{stack-size} is the number of bytes of arguments passed on the
-stack. If a variable number of bytes is passed, it is zero, and
-argument popping will always be the responsibility of the calling function.
-
-On the Vax, all functions always pop their arguments, so the definition
-of this macro is @var{stack-size}. On the 68000, using the standard
-calling convention, no functions pop their arguments, so the value of
-the macro is always 0 in this case. But an alternative calling
-convention is available in which functions that take a fixed number of
-arguments pop them but other functions (such as @code{printf}) pop
-nothing (the caller pops all). When this convention is in use,
-@var{funtype} is examined to determine whether a function takes a fixed
-number of arguments.
-@end table
-
-@node Register Arguments
-@subsection Passing Arguments in Registers
-@cindex arguments in registers
-@cindex registers arguments
-
-This section describes the macros which let you control how various
-types of arguments are passed in registers or how they are arranged in
-the stack.
-
-@table @code
-@findex FUNCTION_ARG
-@item FUNCTION_ARG (@var{cum}, @var{mode}, @var{type}, @var{named})
-A C expression that controls whether a function argument is passed
-in a register, and which register.
-
-The arguments are @var{cum}, which summarizes all the previous
-arguments; @var{mode}, the machine mode of the argument; @var{type},
-the data type of the argument as a tree node or 0 if that is not known
-(which happens for C support library functions); and @var{named},
-which is 1 for an ordinary argument and 0 for nameless arguments that
-correspond to @samp{@dots{}} in the called function's prototype.
-
-The value of the expression is usually either a @code{reg} RTX for the
-hard register in which to pass the argument, or zero to pass the
-argument on the stack.
-
-For machines like the Vax and 68000, where normally all arguments are
-pushed, zero suffices as a definition.
-
-The value of the expression can also be a @code{parallel} RTX. This is
-used when an argument is passed in multiple locations. The mode of the
-of the @code{parallel} should be the mode of the entire argument. The
-@code{parallel} holds any number of @code{expr_list} pairs; each one
-describes where part of the argument is passed. In each @code{expr_list},
-the first operand can be either a @code{reg} RTX for the hard register
-in which to pass this part of the argument, or zero to pass the argument
-on the stack. If this operand is a @code{reg}, then the mode indicates
-how large this part of the argument is. The second operand of the
-@code{expr_list} is a @code{const_int} which gives the offset in bytes
-into the entire argument where this part starts.
-
-@cindex @file{stdarg.h} and register arguments
-The usual way to make the ANSI library @file{stdarg.h} work on a machine
-where some arguments are usually passed in registers, is to cause
-nameless arguments to be passed on the stack instead. This is done
-by making @code{FUNCTION_ARG} return 0 whenever @var{named} is 0.
-
-@cindex @code{MUST_PASS_IN_STACK}, and @code{FUNCTION_ARG}
-@cindex @code{REG_PARM_STACK_SPACE}, and @code{FUNCTION_ARG}
-You may use the macro @code{MUST_PASS_IN_STACK (@var{mode}, @var{type})}
-in the definition of this macro to determine if this argument is of a
-type that must be passed in the stack. If @code{REG_PARM_STACK_SPACE}
-is not defined and @code{FUNCTION_ARG} returns non-zero for such an
-argument, the compiler will abort. If @code{REG_PARM_STACK_SPACE} is
-defined, the argument will be computed in the stack and then loaded into
-a register.
-
-@findex MUST_PASS_IN_STACK
-@item MUST_PASS_IN_STACK (@var{mode}, @var{type})
-Define as a C expression that evaluates to nonzero if we do not know how
-to pass TYPE solely in registers. The file @file{expr.h} defines a
-definition that is usually appropriate, refer to @file{expr.h} for additional
-documentation.
-
-@findex FUNCTION_INCOMING_ARG
-@item FUNCTION_INCOMING_ARG (@var{cum}, @var{mode}, @var{type}, @var{named})
-Define this macro if the target machine has ``register windows'', so
-that the register in which a function sees an arguments is not
-necessarily the same as the one in which the caller passed the
-argument.
-
-For such machines, @code{FUNCTION_ARG} computes the register in which
-the caller passes the value, and @code{FUNCTION_INCOMING_ARG} should
-be defined in a similar fashion to tell the function being called
-where the arguments will arrive.
-
-If @code{FUNCTION_INCOMING_ARG} is not defined, @code{FUNCTION_ARG}
-serves both purposes.@refill
-
-@findex FUNCTION_ARG_PARTIAL_NREGS
-@item FUNCTION_ARG_PARTIAL_NREGS (@var{cum}, @var{mode}, @var{type}, @var{named})
-A C expression for the number of words, at the beginning of an
-argument, must be put in registers. The value must be zero for
-arguments that are passed entirely in registers or that are entirely
-pushed on the stack.
-
-On some machines, certain arguments must be passed partially in
-registers and partially in memory. On these machines, typically the
-first @var{n} words of arguments are passed in registers, and the rest
-on the stack. If a multi-word argument (a @code{double} or a
-structure) crosses that boundary, its first few words must be passed
-in registers and the rest must be pushed. This macro tells the
-compiler when this occurs, and how many of the words should go in
-registers.
-
-@code{FUNCTION_ARG} for these arguments should return the first
-register to be used by the caller for this argument; likewise
-@code{FUNCTION_INCOMING_ARG}, for the called function.
-
-@findex FUNCTION_ARG_PASS_BY_REFERENCE
-@item FUNCTION_ARG_PASS_BY_REFERENCE (@var{cum}, @var{mode}, @var{type}, @var{named})
-A C expression that indicates when an argument must be passed by reference.
-If nonzero for an argument, a copy of that argument is made in memory and a
-pointer to the argument is passed instead of the argument itself.
-The pointer is passed in whatever way is appropriate for passing a pointer
-to that type.
-
-On machines where @code{REG_PARM_STACK_SPACE} is not defined, a suitable
-definition of this macro might be
-@smallexample
-#define FUNCTION_ARG_PASS_BY_REFERENCE\
-(CUM, MODE, TYPE, NAMED) \
- MUST_PASS_IN_STACK (MODE, TYPE)
-@end smallexample
-@c this is *still* too long. --mew 5feb93
-
-@findex FUNCTION_ARG_CALLEE_COPIES
-@item FUNCTION_ARG_CALLEE_COPIES (@var{cum}, @var{mode}, @var{type}, @var{named})
-If defined, a C expression that indicates when it is the called function's
-responsibility to make a copy of arguments passed by invisible reference.
-Normally, the caller makes a copy and passes the address of the copy to the
-routine being called. When FUNCTION_ARG_CALLEE_COPIES is defined and is
-nonzero, the caller does not make a copy. Instead, it passes a pointer to the
-``live'' value. The called function must not modify this value. If it can be
-determined that the value won't be modified, it need not make a copy;
-otherwise a copy must be made.
-
-@c CYGNUS LOCAL -- FUNCTION_ARG_KEEP_AS_REFERENCE/meissner
-@findex FUNCTION_ARG_KEEP_AS_REFERENCE
-@item FUNCTION_ARG_KEEP_AS_REFERENCE (@var{cum}, @var{mode}, @var{type}, @var{named})
-If defined, a C expression that indicates when it is more desirable to
-keep an argument passed by invisible reference as a reference, rather
-than copying it to a pseudo register.
-@c END CYGNUS LOCAL -- FUNCTION_ARG_KEEP_AS_REFERENCE/meissner
-
-@findex CUMULATIVE_ARGS
-@item CUMULATIVE_ARGS
-A C type for declaring a variable that is used as the first argument of
-@code{FUNCTION_ARG} and other related values. For some target machines,
-the type @code{int} suffices and can hold the number of bytes of
-argument so far.
-
-There is no need to record in @code{CUMULATIVE_ARGS} anything about the
-arguments that have been passed on the stack. The compiler has other
-variables to keep track of that. For target machines on which all
-arguments are passed on the stack, there is no need to store anything in
-@code{CUMULATIVE_ARGS}; however, the data structure must exist and
-should not be empty, so use @code{int}.
-
-@findex INIT_CUMULATIVE_ARGS
-@item INIT_CUMULATIVE_ARGS (@var{cum}, @var{fntype}, @var{libname}, @var{indirect})
-A C statement (sans semicolon) for initializing the variable @var{cum}
-for the state at the beginning of the argument list. The variable has
-type @code{CUMULATIVE_ARGS}. The value of @var{fntype} is the tree node
-for the data type of the function which will receive the args, or 0
-if the args are to a compiler support library function. The value of
-@var{indirect} is nonzero when processing an indirect call, for example
-a call through a function pointer. The value of @var{indirect} is zero
-for a call to an explicitly named function, a library function call, or when
-@code{INIT_CUMULATIVE_ARGS} is used to find arguments for the function
-being compiled.
-
-When processing a call to a compiler support library function,
-@var{libname} identifies which one. It is a @code{symbol_ref} rtx which
-contains the name of the function, as a string. @var{libname} is 0 when
-an ordinary C function call is being processed. Thus, each time this
-macro is called, either @var{libname} or @var{fntype} is nonzero, but
-never both of them at once.
-
-@findex INIT_CUMULATIVE_INCOMING_ARGS
-@item INIT_CUMULATIVE_INCOMING_ARGS (@var{cum}, @var{fntype}, @var{libname})
-Like @code{INIT_CUMULATIVE_ARGS} but overrides it for the purposes of
-finding the arguments for the function being compiled. If this macro is
-undefined, @code{INIT_CUMULATIVE_ARGS} is used instead.
-
-The value passed for @var{libname} is always 0, since library routines
-with special calling conventions are never compiled with GNU CC. The
-argument @var{libname} exists for symmetry with
-@code{INIT_CUMULATIVE_ARGS}.
-@c could use "this macro" in place of @code{INIT_CUMULATIVE_ARGS}, maybe.
-@c --mew 5feb93 i switched the order of the sentences. --mew 10feb93
-
-@findex FUNCTION_ARG_ADVANCE
-@item FUNCTION_ARG_ADVANCE (@var{cum}, @var{mode}, @var{type}, @var{named})
-A C statement (sans semicolon) to update the summarizer variable
-@var{cum} to advance past an argument in the argument list. The
-values @var{mode}, @var{type} and @var{named} describe that argument.
-Once this is done, the variable @var{cum} is suitable for analyzing
-the @emph{following} argument with @code{FUNCTION_ARG}, etc.@refill
-
-This macro need not do anything if the argument in question was passed
-on the stack. The compiler knows how to track the amount of stack space
-used for arguments without any special help.
-
-@findex FUNCTION_ARG_PADDING
-@item FUNCTION_ARG_PADDING (@var{mode}, @var{type})
-If defined, a C expression which determines whether, and in which direction,
-to pad out an argument with extra space. The value should be of type
-@code{enum direction}: either @code{upward} to pad above the argument,
-@code{downward} to pad below, or @code{none} to inhibit padding.
-
-The @emph{amount} of padding is always just enough to reach the next
-multiple of @code{FUNCTION_ARG_BOUNDARY}; this macro does not control
-it.
-
-This macro has a default definition which is right for most systems.
-For little-endian machines, the default is to pad upward. For
-big-endian machines, the default is to pad downward for an argument of
-constant size shorter than an @code{int}, and upward otherwise.
-
-@findex FUNCTION_ARG_BOUNDARY
-@item FUNCTION_ARG_BOUNDARY (@var{mode}, @var{type})
-If defined, a C expression that gives the alignment boundary, in bits,
-of an argument with the specified mode and type. If it is not defined,
-@code{PARM_BOUNDARY} is used for all arguments.
-
-@findex FUNCTION_ARG_REGNO_P
-@item FUNCTION_ARG_REGNO_P (@var{regno})
-A C expression that is nonzero if @var{regno} is the number of a hard
-register in which function arguments are sometimes passed. This does
-@emph{not} include implicit arguments such as the static chain and
-the structure-value address. On many machines, no registers can be
-used for this purpose since all function arguments are pushed on the
-stack.
-
-@findex LOAD_ARGS_REVERSED
-@item LOAD_ARGS_REVERSED
-If defined, the order in which arguments are loaded into their
-respective argument registers is reversed so that the last
-argument is loaded first. This macro only effects arguments
-passed in registers.
-
-@end table
-
-@node Scalar Return
-@subsection How Scalar Function Values Are Returned
-@cindex return values in registers
-@cindex values, returned by functions
-@cindex scalars, returned as values
-
-This section discusses the macros that control returning scalars as
-values---values that can fit in registers.
-
-@table @code
-@findex TRADITIONAL_RETURN_FLOAT
-@item TRADITIONAL_RETURN_FLOAT
-Define this macro if @samp{-traditional} should not cause functions
-declared to return @code{float} to convert the value to @code{double}.
-
-@findex FUNCTION_VALUE
-@item FUNCTION_VALUE (@var{valtype}, @var{func})
-A C expression to create an RTX representing the place where a
-function returns a value of data type @var{valtype}. @var{valtype} is
-a tree node representing a data type. Write @code{TYPE_MODE
-(@var{valtype})} to get the machine mode used to represent that type.
-On many machines, only the mode is relevant. (Actually, on most
-machines, scalar values are returned in the same place regardless of
-mode).@refill
-
-The value of the expression is usually a @code{reg} RTX for the hard
-register where the return value is stored. The value can also be a
-@code{parallel} RTX, if the return value is in multiple places. See
-@code{FUNCTION_ARG} for an explanation of the @code{parallel} form.
-
-If @code{PROMOTE_FUNCTION_RETURN} is defined, you must apply the same
-promotion rules specified in @code{PROMOTE_MODE} if @var{valtype} is a
-scalar type.
-
-If the precise function being called is known, @var{func} is a tree
-node (@code{FUNCTION_DECL}) for it; otherwise, @var{func} is a null
-pointer. This makes it possible to use a different value-returning
-convention for specific functions when all their calls are
-known.@refill
-
-@code{FUNCTION_VALUE} is not used for return vales with aggregate data
-types, because these are returned in another way. See
-@code{STRUCT_VALUE_REGNUM} and related macros, below.
-
-@findex FUNCTION_OUTGOING_VALUE
-@item FUNCTION_OUTGOING_VALUE (@var{valtype}, @var{func})
-Define this macro if the target machine has ``register windows''
-so that the register in which a function returns its value is not
-the same as the one in which the caller sees the value.
-
-For such machines, @code{FUNCTION_VALUE} computes the register in which
-the caller will see the value. @code{FUNCTION_OUTGOING_VALUE} should be
-defined in a similar fashion to tell the function where to put the
-value.@refill
-
-If @code{FUNCTION_OUTGOING_VALUE} is not defined,
-@code{FUNCTION_VALUE} serves both purposes.@refill
-
-@code{FUNCTION_OUTGOING_VALUE} is not used for return vales with
-aggregate data types, because these are returned in another way. See
-@code{STRUCT_VALUE_REGNUM} and related macros, below.
-
-@findex LIBCALL_VALUE
-@item LIBCALL_VALUE (@var{mode})
-A C expression to create an RTX representing the place where a library
-function returns a value of mode @var{mode}. If the precise function
-being called is known, @var{func} is a tree node
-(@code{FUNCTION_DECL}) for it; otherwise, @var{func} is a null
-pointer. This makes it possible to use a different value-returning
-convention for specific functions when all their calls are
-known.@refill
-
-Note that ``library function'' in this context means a compiler
-support routine, used to perform arithmetic, whose name is known
-specially by the compiler and was not mentioned in the C code being
-compiled.
-
-The definition of @code{LIBRARY_VALUE} need not be concerned aggregate
-data types, because none of the library functions returns such types.
-
-@findex FUNCTION_VALUE_REGNO_P
-@item FUNCTION_VALUE_REGNO_P (@var{regno})
-A C expression that is nonzero if @var{regno} is the number of a hard
-register in which the values of called function may come back.
-
-A register whose use for returning values is limited to serving as the
-second of a pair (for a value of type @code{double}, say) need not be
-recognized by this macro. So for most machines, this definition
-suffices:
-
-@example
-#define FUNCTION_VALUE_REGNO_P(N) ((N) == 0)
-@end example
-
-If the machine has register windows, so that the caller and the called
-function use different registers for the return value, this macro
-should recognize only the caller's register numbers.
-
-@findex APPLY_RESULT_SIZE
-@item APPLY_RESULT_SIZE
-Define this macro if @samp{untyped_call} and @samp{untyped_return}
-need more space than is implied by @code{FUNCTION_VALUE_REGNO_P} for
-saving and restoring an arbitrary return value.
-@end table
-
-@node Aggregate Return
-@subsection How Large Values Are Returned
-@cindex aggregates as return values
-@cindex large return values
-@cindex returning aggregate values
-@cindex structure value address
-
-When a function value's mode is @code{BLKmode} (and in some other
-cases), the value is not returned according to @code{FUNCTION_VALUE}
-(@pxref{Scalar Return}). Instead, the caller passes the address of a
-block of memory in which the value should be stored. This address
-is called the @dfn{structure value address}.
-
-This section describes how to control returning structure values in
-memory.
-
-@table @code
-@findex RETURN_IN_MEMORY
-@item RETURN_IN_MEMORY (@var{type})
-A C expression which can inhibit the returning of certain function
-values in registers, based on the type of value. A nonzero value says
-to return the function value in memory, just as large structures are
-always returned. Here @var{type} will be a C expression of type
-@code{tree}, representing the data type of the value.
-
-Note that values of mode @code{BLKmode} must be explicitly handled
-by this macro. Also, the option @samp{-fpcc-struct-return}
-takes effect regardless of this macro. On most systems, it is
-possible to leave the macro undefined; this causes a default
-definition to be used, whose value is the constant 1 for @code{BLKmode}
-values, and 0 otherwise.
-
-Do not use this macro to indicate that structures and unions should always
-be returned in memory. You should instead use @code{DEFAULT_PCC_STRUCT_RETURN}
-to indicate this.
-
-@findex DEFAULT_PCC_STRUCT_RETURN
-@item DEFAULT_PCC_STRUCT_RETURN
-Define this macro to be 1 if all structure and union return values must be
-in memory. Since this results in slower code, this should be defined
-only if needed for compatibility with other compilers or with an ABI.
-If you define this macro to be 0, then the conventions used for structure
-and union return values are decided by the @code{RETURN_IN_MEMORY} macro.
-
-If not defined, this defaults to the value 1.
-
-@findex STRUCT_VALUE_REGNUM
-@item STRUCT_VALUE_REGNUM
-If the structure value address is passed in a register, then
-@code{STRUCT_VALUE_REGNUM} should be the number of that register.
-
-@findex STRUCT_VALUE
-@item STRUCT_VALUE
-If the structure value address is not passed in a register, define
-@code{STRUCT_VALUE} as an expression returning an RTX for the place
-where the address is passed. If it returns 0, the address is passed as
-an ``invisible'' first argument.
-
-@findex STRUCT_VALUE_INCOMING_REGNUM
-@item STRUCT_VALUE_INCOMING_REGNUM
-On some architectures the place where the structure value address
-is found by the called function is not the same place that the
-caller put it. This can be due to register windows, or it could
-be because the function prologue moves it to a different place.
-
-If the incoming location of the structure value address is in a
-register, define this macro as the register number.
-
-@findex STRUCT_VALUE_INCOMING
-@item STRUCT_VALUE_INCOMING
-If the incoming location is not a register, then you should define
-@code{STRUCT_VALUE_INCOMING} as an expression for an RTX for where the
-called function should find the value. If it should find the value on
-the stack, define this to create a @code{mem} which refers to the frame
-pointer. A definition of 0 means that the address is passed as an
-``invisible'' first argument.
-
-@findex PCC_STATIC_STRUCT_RETURN
-@item PCC_STATIC_STRUCT_RETURN
-Define this macro if the usual system convention on the target machine
-for returning structures and unions is for the called function to return
-the address of a static variable containing the value.
-
-Do not define this if the usual system convention is for the caller to
-pass an address to the subroutine.
-
-This macro has effect in @samp{-fpcc-struct-return} mode, but it does
-nothing when you use @samp{-freg-struct-return} mode.
-@end table
-
-@node Caller Saves
-@subsection Caller-Saves Register Allocation
-
-If you enable it, GNU CC can save registers around function calls. This
-makes it possible to use call-clobbered registers to hold variables that
-must live across calls.
-
-@table @code
-@findex DEFAULT_CALLER_SAVES
-@item DEFAULT_CALLER_SAVES
-Define this macro if function calls on the target machine do not preserve
-any registers; in other words, if @code{CALL_USED_REGISTERS} has 1
-for all registers. When defined, this macro enables @samp{-fcaller-saves}
-by default for all optimization levels. It has no effect for optimization
-levels 2 and higher, where @samp{-fcaller-saves} is the default.
-
-@findex CALLER_SAVE_PROFITABLE
-@item CALLER_SAVE_PROFITABLE (@var{refs}, @var{calls})
-A C expression to determine whether it is worthwhile to consider placing
-a pseudo-register in a call-clobbered hard register and saving and
-restoring it around each function call. The expression should be 1 when
-this is worth doing, and 0 otherwise.
-
-If you don't define this macro, a default is used which is good on most
-machines: @code{4 * @var{calls} < @var{refs}}.
-
-@findex HARD_REGNO_CALLER_SAVE_MODE
-@item HARD_REGNO_CALLER_SAVE_MODE (@var{regno}, @var{nregs})
-A C expression specifying which mode is required for saving @var{nregs}
-of a pseudo-register in call-clobbered hard register @var{regno}. If
-@var{regno} is unsuitable for caller save, @code{VOIDmode} should be
-returned. For most machines this macro need not be defined since GCC
-will select the smallest suitable mode.
-@end table
-
-@node Function Entry
-@subsection Function Entry and Exit
-@cindex function entry and exit
-@cindex prologue
-@cindex epilogue
-
-This section describes the macros that output function entry
-(@dfn{prologue}) and exit (@dfn{epilogue}) code.
-
-@table @code
-@findex FUNCTION_PROLOGUE
-@item FUNCTION_PROLOGUE (@var{file}, @var{size})
-A C compound statement that outputs the assembler code for entry to a
-function. The prologue is responsible for setting up the stack frame,
-initializing the frame pointer register, saving registers that must be
-saved, and allocating @var{size} additional bytes of storage for the
-local variables. @var{size} is an integer. @var{file} is a stdio
-stream to which the assembler code should be output.
-
-The label for the beginning of the function need not be output by this
-macro. That has already been done when the macro is run.
-
-@findex regs_ever_live
-To determine which registers to save, the macro can refer to the array
-@code{regs_ever_live}: element @var{r} is nonzero if hard register
-@var{r} is used anywhere within the function. This implies the function
-prologue should save register @var{r}, provided it is not one of the
-call-used registers. (@code{FUNCTION_EPILOGUE} must likewise use
-@code{regs_ever_live}.)
-
-On machines that have ``register windows'', the function entry code does
-not save on the stack the registers that are in the windows, even if
-they are supposed to be preserved by function calls; instead it takes
-appropriate steps to ``push'' the register stack, if any non-call-used
-registers are used in the function.
-
-@findex frame_pointer_needed
-On machines where functions may or may not have frame-pointers, the
-function entry code must vary accordingly; it must set up the frame
-pointer if one is wanted, and not otherwise. To determine whether a
-frame pointer is in wanted, the macro can refer to the variable
-@code{frame_pointer_needed}. The variable's value will be 1 at run
-time in a function that needs a frame pointer. @xref{Elimination}.
-
-The function entry code is responsible for allocating any stack space
-required for the function. This stack space consists of the regions
-listed below. In most cases, these regions are allocated in the
-order listed, with the last listed region closest to the top of the
-stack (the lowest address if @code{STACK_GROWS_DOWNWARD} is defined, and
-the highest address if it is not defined). You can use a different order
-for a machine if doing so is more convenient or required for
-compatibility reasons. Except in cases where required by standard
-or by a debugger, there is no reason why the stack layout used by GCC
-need agree with that used by other compilers for a machine.
-
-@itemize @bullet
-@item
-@findex current_function_pretend_args_size
-A region of @code{current_function_pretend_args_size} bytes of
-uninitialized space just underneath the first argument arriving on the
-stack. (This may not be at the very start of the allocated stack region
-if the calling sequence has pushed anything else since pushing the stack
-arguments. But usually, on such machines, nothing else has been pushed
-yet, because the function prologue itself does all the pushing.) This
-region is used on machines where an argument may be passed partly in
-registers and partly in memory, and, in some cases to support the
-features in @file{varargs.h} and @file{stdargs.h}.
-
-@item
-An area of memory used to save certain registers used by the function.
-The size of this area, which may also include space for such things as
-the return address and pointers to previous stack frames, is
-machine-specific and usually depends on which registers have been used
-in the function. Machines with register windows often do not require
-a save area.
-
-@item
-A region of at least @var{size} bytes, possibly rounded up to an allocation
-boundary, to contain the local variables of the function. On some machines,
-this region and the save area may occur in the opposite order, with the
-save area closer to the top of the stack.
-
-@item
-@cindex @code{ACCUMULATE_OUTGOING_ARGS} and stack frames
-Optionally, when @code{ACCUMULATE_OUTGOING_ARGS} is defined, a region of
-@code{current_function_outgoing_args_size} bytes to be used for outgoing
-argument lists of the function. @xref{Stack Arguments}.
-@end itemize
-
-Normally, it is necessary for the macros @code{FUNCTION_PROLOGUE} and
-@code{FUNCTION_EPILOGUE} to treat leaf functions specially. The C
-variable @code{leaf_function} is nonzero for such a function.
-
-@findex EXIT_IGNORE_STACK
-@item EXIT_IGNORE_STACK
-Define this macro as a C expression that is nonzero if the return
-instruction or the function epilogue ignores the value of the stack
-pointer; in other words, if it is safe to delete an instruction to
-adjust the stack pointer before a return from the function.
-
-Note that this macro's value is relevant only for functions for which
-frame pointers are maintained. It is never safe to delete a final
-stack adjustment in a function that has no frame pointer, and the
-compiler knows this regardless of @code{EXIT_IGNORE_STACK}.
-
-@findex EPILOGUE_USES
-@item EPILOGUE_USES (@var{regno})
-Define this macro as a C expression that is nonzero for registers are
-used by the epilogue or the @samp{return} pattern. The stack and frame
-pointer registers are already be assumed to be used as needed.
-
-@findex FUNCTION_EPILOGUE
-@item FUNCTION_EPILOGUE (@var{file}, @var{size})
-A C compound statement that outputs the assembler code for exit from a
-function. The epilogue is responsible for restoring the saved
-registers and stack pointer to their values when the function was
-called, and returning control to the caller. This macro takes the
-same arguments as the macro @code{FUNCTION_PROLOGUE}, and the
-registers to restore are determined from @code{regs_ever_live} and
-@code{CALL_USED_REGISTERS} in the same way.
-
-On some machines, there is a single instruction that does all the work
-of returning from the function. On these machines, give that
-instruction the name @samp{return} and do not define the macro
-@code{FUNCTION_EPILOGUE} at all.
-
-Do not define a pattern named @samp{return} if you want the
-@code{FUNCTION_EPILOGUE} to be used. If you want the target switches
-to control whether return instructions or epilogues are used, define a
-@samp{return} pattern with a validity condition that tests the target
-switches appropriately. If the @samp{return} pattern's validity
-condition is false, epilogues will be used.
-
-On machines where functions may or may not have frame-pointers, the
-function exit code must vary accordingly. Sometimes the code for these
-two cases is completely different. To determine whether a frame pointer
-is wanted, the macro can refer to the variable
-@code{frame_pointer_needed}. The variable's value will be 1 when compiling
-a function that needs a frame pointer.
-
-Normally, @code{FUNCTION_PROLOGUE} and @code{FUNCTION_EPILOGUE} must
-treat leaf functions specially. The C variable @code{leaf_function} is
-nonzero for such a function. @xref{Leaf Functions}.
-
-On some machines, some functions pop their arguments on exit while
-others leave that for the caller to do. For example, the 68020 when
-given @samp{-mrtd} pops arguments in functions that take a fixed
-number of arguments.
-
-@findex current_function_pops_args
-Your definition of the macro @code{RETURN_POPS_ARGS} decides which
-functions pop their own arguments. @code{FUNCTION_EPILOGUE} needs to
-know what was decided. The variable that is called
-@code{current_function_pops_args} is the number of bytes of its
-arguments that a function should pop. @xref{Scalar Return}.
-@c what is the "its arguments" in the above sentence referring to, pray
-@c tell? --mew 5feb93
-
-@findex DELAY_SLOTS_FOR_EPILOGUE
-@item DELAY_SLOTS_FOR_EPILOGUE
-Define this macro if the function epilogue contains delay slots to which
-instructions from the rest of the function can be ``moved''. The
-definition should be a C expression whose value is an integer
-representing the number of delay slots there.
-
-@findex ELIGIBLE_FOR_EPILOGUE_DELAY
-@item ELIGIBLE_FOR_EPILOGUE_DELAY (@var{insn}, @var{n})
-A C expression that returns 1 if @var{insn} can be placed in delay
-slot number @var{n} of the epilogue.
-
-The argument @var{n} is an integer which identifies the delay slot now
-being considered (since different slots may have different rules of
-eligibility). It is never negative and is always less than the number
-of epilogue delay slots (what @code{DELAY_SLOTS_FOR_EPILOGUE} returns).
-If you reject a particular insn for a given delay slot, in principle, it
-may be reconsidered for a subsequent delay slot. Also, other insns may
-(at least in principle) be considered for the so far unfilled delay
-slot.
-
-@findex current_function_epilogue_delay_list
-@findex final_scan_insn
-The insns accepted to fill the epilogue delay slots are put in an RTL
-list made with @code{insn_list} objects, stored in the variable
-@code{current_function_epilogue_delay_list}. The insn for the first
-delay slot comes first in the list. Your definition of the macro
-@code{FUNCTION_EPILOGUE} should fill the delay slots by outputting the
-insns in this list, usually by calling @code{final_scan_insn}.
-
-You need not define this macro if you did not define
-@code{DELAY_SLOTS_FOR_EPILOGUE}.
-
-@findex ASM_OUTPUT_MI_THUNK
-@item ASM_OUTPUT_MI_THUNK (@var{file}, @var{thunk_fndecl}, @var{delta}, @var{function})
-A C compound statement that outputs the assembler code for a thunk
-function, used to implement C++ virtual function calls with multiple
-inheritance. The thunk acts as a wrapper around a virtual function,
-adjusting the implicit object parameter before handing control off to
-the real function.
-
-First, emit code to add the integer @var{delta} to the location that
-contains the incoming first argument. Assume that this argument
-contains a pointer, and is the one used to pass the @code{this} pointer
-in C++. This is the incoming argument @emph{before} the function prologue,
-e.g. @samp{%o0} on a sparc. The addition must preserve the values of
-all other incoming arguments.
-
-After the addition, emit code to jump to @var{function}, which is a
-@code{FUNCTION_DECL}. This is a direct pure jump, not a call, and does
-not touch the return address. Hence returning from @var{FUNCTION} will
-return to whoever called the current @samp{thunk}.
-
-The effect must be as if @var{function} had been called directly with
-the adjusted first argument. This macro is responsible for emitting all
-of the code for a thunk function; @code{FUNCTION_PROLOGUE} and
-@code{FUNCTION_EPILOGUE} are not invoked.
-
-The @var{thunk_fndecl} is redundant. (@var{delta} and @var{function}
-have already been extracted from it.) It might possibly be useful on
-some targets, but probably not.
-
-If you do not define this macro, the target-independent code in the C++
-frontend will generate a less efficient heavyweight thunk that calls
-@var{function} instead of jumping to it. The generic approach does
-not support varargs.
-@end table
-
-@node Profiling
-@subsection Generating Code for Profiling
-@cindex profiling, code generation
-
-These macros will help you generate code for profiling.
-
-@table @code
-@findex FUNCTION_PROFILER
-@item FUNCTION_PROFILER (@var{file}, @var{labelno})
-A C statement or compound statement to output to @var{file} some
-assembler code to call the profiling subroutine @code{mcount}.
-Before calling, the assembler code must load the address of a
-counter variable into a register where @code{mcount} expects to
-find the address. The name of this variable is @samp{LP} followed
-by the number @var{labelno}, so you would generate the name using
-@samp{LP%d} in a @code{fprintf}.
-
-@findex mcount
-The details of how the address should be passed to @code{mcount} are
-determined by your operating system environment, not by GNU CC. To
-figure them out, compile a small program for profiling using the
-system's installed C compiler and look at the assembler code that
-results.
-
-@findex PROFILE_BEFORE_PROLOGUE
-@item PROFILE_BEFORE_PROLOGUE
-Define this macro if the code for function profiling should come before
-the function prologue. Normally, the profiling code comes after.
-
-@findex FUNCTION_BLOCK_PROFILER
-@vindex profile_block_flag
-@item FUNCTION_BLOCK_PROFILER (@var{file}, @var{labelno})
-A C statement or compound statement to output to @var{file} some
-assembler code to initialize basic-block profiling for the current
-object module. The global compile flag @code{profile_block_flag}
-distinguishes two profile modes.
-
-@table @code
-@findex __bb_init_func
-@item profile_block_flag != 2
-Output code to call the subroutine @code{__bb_init_func} once per
-object module, passing it as its sole argument the address of a block
-allocated in the object module.
-
-The name of the block is a local symbol made with this statement:
-
-@smallexample
-ASM_GENERATE_INTERNAL_LABEL (@var{buffer}, "LPBX", 0);
-@end smallexample
-
-Of course, since you are writing the definition of
-@code{ASM_GENERATE_INTERNAL_LABEL} as well as that of this macro, you
-can take a short cut in the definition of this macro and use the name
-that you know will result.
-
-The first word of this block is a flag which will be nonzero if the
-object module has already been initialized. So test this word first,
-and do not call @code{__bb_init_func} if the flag is
-nonzero. BLOCK_OR_LABEL contains a unique number which may be used to
-generate a label as a branch destination when @code{__bb_init_func}
-will not be called.
-
-Described in assembler language, the code to be output looks like:
-
-@example
- cmp (LPBX0),0
- bne local_label
- parameter1 <- LPBX0
- call __bb_init_func
-local_label:
-@end example
-
-@findex __bb_init_trace_func
-@item profile_block_flag == 2
-Output code to call the subroutine @code{__bb_init_trace_func}
-and pass two parameters to it. The first parameter is the same as
-for @code{__bb_init_func}. The second parameter is the number of the
-first basic block of the function as given by BLOCK_OR_LABEL. Note
-that @code{__bb_init_trace_func} has to be called, even if the object
-module has been initialized already.
-
-Described in assembler language, the code to be output looks like:
-@example
-parameter1 <- LPBX0
-parameter2 <- BLOCK_OR_LABEL
-call __bb_init_trace_func
-@end example
-@end table
-
-@findex BLOCK_PROFILER
-@vindex profile_block_flag
-@item BLOCK_PROFILER (@var{file}, @var{blockno})
-A C statement or compound statement to output to @var{file} some
-assembler code to increment the count associated with the basic
-block number @var{blockno}. The global compile flag
-@code{profile_block_flag} distinguishes two profile modes.
-
-@table @code
-@item profile_block_flag != 2
-Output code to increment the counter directly. Basic blocks are
-numbered separately from zero within each compilation. The count
-associated with block number @var{blockno} is at index
-@var{blockno} in a vector of words; the name of this array is a local
-symbol made with this statement:
-
-@smallexample
-ASM_GENERATE_INTERNAL_LABEL (@var{buffer}, "LPBX", 2);
-@end smallexample
-
-@c This paragraph is the same as one a few paragraphs up.
-@c That is not an error.
-Of course, since you are writing the definition of
-@code{ASM_GENERATE_INTERNAL_LABEL} as well as that of this macro, you
-can take a short cut in the definition of this macro and use the name
-that you know will result.
-
-Described in assembler language, the code to be output looks like:
-
-@smallexample
-inc (LPBX2+4*BLOCKNO)
-@end smallexample
-
-@vindex __bb
-@findex __bb_trace_func
-@item profile_block_flag == 2
-Output code to initialize the global structure @code{__bb} and
-call the function @code{__bb_trace_func}, which will increment the
-counter.
-
-@code{__bb} consists of two words. In the first word, the current
-basic block number, as given by BLOCKNO, has to be stored. In
-the second word, the address of a block allocated in the object
-module has to be stored. The address is given by the label created
-with this statement:
-
-@smallexample
-ASM_GENERATE_INTERNAL_LABEL (@var{buffer}, "LPBX", 0);
-@end smallexample
-
-Described in assembler language, the code to be output looks like:
-@example
-move BLOCKNO -> (__bb)
-move LPBX0 -> (__bb+4)
-call __bb_trace_func
-@end example
-@end table
-
-@findex FUNCTION_BLOCK_PROFILER_EXIT
-@findex __bb_trace_ret
-@vindex profile_block_flag
-@item FUNCTION_BLOCK_PROFILER_EXIT (@var{file})
-A C statement or compound statement to output to @var{file}
-assembler code to call function @code{__bb_trace_ret}. The
-assembler code should only be output
-if the global compile flag @code{profile_block_flag} == 2. This
-macro has to be used at every place where code for returning from
-a function is generated (e.g. @code{FUNCTION_EPILOGUE}). Although
-you have to write the definition of @code{FUNCTION_EPILOGUE}
-as well, you have to define this macro to tell the compiler, that
-the proper call to @code{__bb_trace_ret} is produced.
-
-@findex MACHINE_STATE_SAVE
-@findex __bb_init_trace_func
-@findex __bb_trace_func
-@findex __bb_trace_ret
-@item MACHINE_STATE_SAVE (@var{id})
-A C statement or compound statement to save all registers, which may
-be clobbered by a function call, including condition codes. The
-@code{asm} statement will be mostly likely needed to handle this
-task. Local labels in the assembler code can be concatenated with the
-string @var{id}, to obtain a unique lable name.
-
-Registers or condition codes clobbered by @code{FUNCTION_PROLOGUE} or
-@code{FUNCTION_EPILOGUE} must be saved in the macros
-@code{FUNCTION_BLOCK_PROFILER}, @code{FUNCTION_BLOCK_PROFILER_EXIT} and
-@code{BLOCK_PROFILER} prior calling @code{__bb_init_trace_func},
-@code{__bb_trace_ret} and @code{__bb_trace_func} respectively.
-
-@findex MACHINE_STATE_RESTORE
-@findex __bb_init_trace_func
-@findex __bb_trace_func
-@findex __bb_trace_ret
-@item MACHINE_STATE_RESTORE (@var{id})
-A C statement or compound statement to restore all registers, including
-condition codes, saved by @code{MACHINE_STATE_SAVE}.
-
-Registers or condition codes clobbered by @code{FUNCTION_PROLOGUE} or
-@code{FUNCTION_EPILOGUE} must be restored in the macros
-@code{FUNCTION_BLOCK_PROFILER}, @code{FUNCTION_BLOCK_PROFILER_EXIT} and
-@code{BLOCK_PROFILER} after calling @code{__bb_init_trace_func},
-@code{__bb_trace_ret} and @code{__bb_trace_func} respectively.
-
-@findex BLOCK_PROFILER_CODE
-@item BLOCK_PROFILER_CODE
-A C function or functions which are needed in the library to
-support block profiling.
-@end table
-
-@node Varargs
-@section Implementing the Varargs Macros
-@cindex varargs implementation
-
-GNU CC comes with an implementation of @file{varargs.h} and
-@file{stdarg.h} that work without change on machines that pass arguments
-on the stack. Other machines require their own implementations of
-varargs, and the two machine independent header files must have
-conditionals to include it.
-
-ANSI @file{stdarg.h} differs from traditional @file{varargs.h} mainly in
-the calling convention for @code{va_start}. The traditional
-implementation takes just one argument, which is the variable in which
-to store the argument pointer. The ANSI implementation of
-@code{va_start} takes an additional second argument. The user is
-supposed to write the last named argument of the function here.
-
-However, @code{va_start} should not use this argument. The way to find
-the end of the named arguments is with the built-in functions described
-below.
-
-@table @code
-@findex __builtin_saveregs
-@item __builtin_saveregs ()
-Use this built-in function to save the argument registers in memory so
-that the varargs mechanism can access them. Both ANSI and traditional
-versions of @code{va_start} must use @code{__builtin_saveregs}, unless
-you use @code{SETUP_INCOMING_VARARGS} (see below) instead.
-
-On some machines, @code{__builtin_saveregs} is open-coded under the
-control of the macro @code{EXPAND_BUILTIN_SAVEREGS}. On other machines,
-it calls a routine written in assembler language, found in
-@file{libgcc2.c}.
-
-Code generated for the call to @code{__builtin_saveregs} appears at the
-beginning of the function, as opposed to where the call to
-@code{__builtin_saveregs} is written, regardless of what the code is.
-This is because the registers must be saved before the function starts
-to use them for its own purposes.
-@c i rewrote the first sentence above to fix an overfull hbox. --mew
-@c 10feb93
-
-@findex __builtin_args_info
-@item __builtin_args_info (@var{category})
-Use this built-in function to find the first anonymous arguments in
-registers.
-
-In general, a machine may have several categories of registers used for
-arguments, each for a particular category of data types. (For example,
-on some machines, floating-point registers are used for floating-point
-arguments while other arguments are passed in the general registers.)
-To make non-varargs functions use the proper calling convention, you
-have defined the @code{CUMULATIVE_ARGS} data type to record how many
-registers in each category have been used so far
-
-@code{__builtin_args_info} accesses the same data structure of type
-@code{CUMULATIVE_ARGS} after the ordinary argument layout is finished
-with it, with @var{category} specifying which word to access. Thus, the
-value indicates the first unused register in a given category.
-
-Normally, you would use @code{__builtin_args_info} in the implementation
-of @code{va_start}, accessing each category just once and storing the
-value in the @code{va_list} object. This is because @code{va_list} will
-have to update the values, and there is no way to alter the
-values accessed by @code{__builtin_args_info}.
-
-@findex __builtin_next_arg
-@item __builtin_next_arg (@var{lastarg})
-This is the equivalent of @code{__builtin_args_info}, for stack
-arguments. It returns the address of the first anonymous stack
-argument, as type @code{void *}. If @code{ARGS_GROW_DOWNWARD}, it
-returns the address of the location above the first anonymous stack
-argument. Use it in @code{va_start} to initialize the pointer for
-fetching arguments from the stack. Also use it in @code{va_start} to
-verify that the second parameter @var{lastarg} is the last named argument
-of the current function.
-
-@findex __builtin_classify_type
-@item __builtin_classify_type (@var{object})
-Since each machine has its own conventions for which data types are
-passed in which kind of register, your implementation of @code{va_arg}
-has to embody these conventions. The easiest way to categorize the
-specified data type is to use @code{__builtin_classify_type} together
-with @code{sizeof} and @code{__alignof__}.
-
-@code{__builtin_classify_type} ignores the value of @var{object},
-considering only its data type. It returns an integer describing what
-kind of type that is---integer, floating, pointer, structure, and so on.
-
-The file @file{typeclass.h} defines an enumeration that you can use to
-interpret the values of @code{__builtin_classify_type}.
-@end table
-
-These machine description macros help implement varargs:
-
-@table @code
-@findex EXPAND_BUILTIN_SAVEREGS
-@item EXPAND_BUILTIN_SAVEREGS (@var{args})
-If defined, is a C expression that produces the machine-specific code
-for a call to @code{__builtin_saveregs}. This code will be moved to the
-very beginning of the function, before any parameter access are made.
-The return value of this function should be an RTX that contains the
-value to use as the return of @code{__builtin_saveregs}.
-
-The argument @var{args} is a @code{tree_list} containing the arguments
-that were passed to @code{__builtin_saveregs}.
-
-If this macro is not defined, the compiler will output an ordinary
-call to the library function @samp{__builtin_saveregs}.
-
-@c !!! a bug in texinfo; how to make the entry on the @item line allow
-@c more than one line of text... help... --mew 10feb93
-@findex SETUP_INCOMING_VARARGS
-@item SETUP_INCOMING_VARARGS (@var{args_so_far}, @var{mode}, @var{type},
-@var{pretend_args_size}, @var{second_time})
-This macro offers an alternative to using @code{__builtin_saveregs} and
-defining the macro @code{EXPAND_BUILTIN_SAVEREGS}. Use it to store the
-anonymous register arguments into the stack so that all the arguments
-appear to have been passed consecutively on the stack. Once this is
-done, you can use the standard implementation of varargs that works for
-machines that pass all their arguments on the stack.
-
-The argument @var{args_so_far} is the @code{CUMULATIVE_ARGS} data
-structure, containing the values that obtain after processing of the
-named arguments. The arguments @var{mode} and @var{type} describe the
-last named argument---its machine mode and its data type as a tree node.
-
-The macro implementation should do two things: first, push onto the
-stack all the argument registers @emph{not} used for the named
-arguments, and second, store the size of the data thus pushed into the
-@code{int}-valued variable whose name is supplied as the argument
-@var{pretend_args_size}. The value that you store here will serve as
-additional offset for setting up the stack frame.
-
-Because you must generate code to push the anonymous arguments at
-compile time without knowing their data types,
-@code{SETUP_INCOMING_VARARGS} is only useful on machines that have just
-a single category of argument register and use it uniformly for all data
-types.
-
-If the argument @var{second_time} is nonzero, it means that the
-arguments of the function are being analyzed for the second time. This
-happens for an inline function, which is not actually compiled until the
-end of the source file. The macro @code{SETUP_INCOMING_VARARGS} should
-not generate any instructions in this case.
-
-@findex STRICT_ARGUMENT_NAMING
-@item STRICT_ARGUMENT_NAMING
-Define this macro to be a nonzero value if the location where a function
-argument is passed depends on whether or not it is a named argument.
-
-This macro controls how the @var{named} argument to @code{FUNCTION_ARG}
-is set for varargs and stdarg functions. If this macro returns a
-nonzero value, the @var{named} argument is always true for named
-arguments, and false for unnamed arguments. If it returns a value of
-zero, but @code{SETUP_INCOMING_VARARGS} is defined, then all arguments
-are treated as named. Otherwise, all named arguments except the last
-are treated as named.
-
-You need not define this macro if it always returns zero.
-@end table
-
-@node Trampolines
-@section Trampolines for Nested Functions
-@cindex trampolines for nested functions
-@cindex nested functions, trampolines for
-
-A @dfn{trampoline} is a small piece of code that is created at run time
-when the address of a nested function is taken. It normally resides on
-the stack, in the stack frame of the containing function. These macros
-tell GNU CC how to generate code to allocate and initialize a
-trampoline.
-
-The instructions in the trampoline must do two things: load a constant
-address into the static chain register, and jump to the real address of
-the nested function. On CISC machines such as the m68k, this requires
-two instructions, a move immediate and a jump. Then the two addresses
-exist in the trampoline as word-long immediate operands. On RISC
-machines, it is often necessary to load each address into a register in
-two parts. Then pieces of each address form separate immediate
-operands.
-
-The code generated to initialize the trampoline must store the variable
-parts---the static chain value and the function address---into the
-immediate operands of the instructions. On a CISC machine, this is
-simply a matter of copying each address to a memory reference at the
-proper offset from the start of the trampoline. On a RISC machine, it
-may be necessary to take out pieces of the address and store them
-separately.
-
-@table @code
-@findex TRAMPOLINE_TEMPLATE
-@item TRAMPOLINE_TEMPLATE (@var{file})
-A C statement to output, on the stream @var{file}, assembler code for a
-block of data that contains the constant parts of a trampoline. This
-code should not include a label---the label is taken care of
-automatically.
-
-If you do not define this macro, it means no template is needed
-for the target. Do not define this macro on systems where the block move
-code to copy the trampoline into place would be larger than the code
-to generate it on the spot.
-
-@findex TRAMPOLINE_SECTION
-@item TRAMPOLINE_SECTION
-The name of a subroutine to switch to the section in which the
-trampoline template is to be placed (@pxref{Sections}). The default is
-a value of @samp{readonly_data_section}, which places the trampoline in
-the section containing read-only data.
-
-@findex TRAMPOLINE_SIZE
-@item TRAMPOLINE_SIZE
-A C expression for the size in bytes of the trampoline, as an integer.
-
-@findex TRAMPOLINE_ALIGNMENT
-@item TRAMPOLINE_ALIGNMENT
-Alignment required for trampolines, in bits.
-
-If you don't define this macro, the value of @code{BIGGEST_ALIGNMENT}
-is used for aligning trampolines.
-
-@findex INITIALIZE_TRAMPOLINE
-@item INITIALIZE_TRAMPOLINE (@var{addr}, @var{fnaddr}, @var{static_chain})
-A C statement to initialize the variable parts of a trampoline.
-@var{addr} is an RTX for the address of the trampoline; @var{fnaddr} is
-an RTX for the address of the nested function; @var{static_chain} is an
-RTX for the static chain value that should be passed to the function
-when it is called.
-
-@findex ALLOCATE_TRAMPOLINE
-@item ALLOCATE_TRAMPOLINE (@var{fp})
-A C expression to allocate run-time space for a trampoline. The
-expression value should be an RTX representing a memory reference to the
-space for the trampoline.
-
-@cindex @code{FUNCTION_EPILOGUE} and trampolines
-@cindex @code{FUNCTION_PROLOGUE} and trampolines
-If this macro is not defined, by default the trampoline is allocated as
-a stack slot. This default is right for most machines. The exceptions
-are machines where it is impossible to execute instructions in the stack
-area. On such machines, you may have to implement a separate stack,
-using this macro in conjunction with @code{FUNCTION_PROLOGUE} and
-@code{FUNCTION_EPILOGUE}.
-
-@var{fp} points to a data structure, a @code{struct function}, which
-describes the compilation status of the immediate containing function of
-the function which the trampoline is for. Normally (when
-@code{ALLOCATE_TRAMPOLINE} is not defined), the stack slot for the
-trampoline is in the stack frame of this containing function. Other
-allocation strategies probably must do something analogous with this
-information.
-@end table
-
-Implementing trampolines is difficult on many machines because they have
-separate instruction and data caches. Writing into a stack location
-fails to clear the memory in the instruction cache, so when the program
-jumps to that location, it executes the old contents.
-
-Here are two possible solutions. One is to clear the relevant parts of
-the instruction cache whenever a trampoline is set up. The other is to
-make all trampolines identical, by having them jump to a standard
-subroutine. The former technique makes trampoline execution faster; the
-latter makes initialization faster.
-
-To clear the instruction cache when a trampoline is initialized, define
-the following macros which describe the shape of the cache.
-
-@table @code
-@findex INSN_CACHE_SIZE
-@item INSN_CACHE_SIZE
-The total size in bytes of the cache.
-
-@findex INSN_CACHE_LINE_WIDTH
-@item INSN_CACHE_LINE_WIDTH
-The length in bytes of each cache line. The cache is divided into cache
-lines which are disjoint slots, each holding a contiguous chunk of data
-fetched from memory. Each time data is brought into the cache, an
-entire line is read at once. The data loaded into a cache line is
-always aligned on a boundary equal to the line size.
-
-@findex INSN_CACHE_DEPTH
-@item INSN_CACHE_DEPTH
-The number of alternative cache lines that can hold any particular memory
-location.
-@end table
-
-Alternatively, if the machine has system calls or instructions to clear
-the instruction cache directly, you can define the following macro.
-
-@table @code
-@findex CLEAR_INSN_CACHE
-@item CLEAR_INSN_CACHE (@var{BEG}, @var{END})
-If defined, expands to a C expression clearing the @emph{instruction
-cache} in the specified interval. If it is not defined, and the macro
-INSN_CACHE_SIZE is defined, some generic code is generated to clear the
-cache. The definition of this macro would typically be a series of
-@code{asm} statements. Both @var{BEG} and @var{END} are both pointer
-expressions.
-@end table
-
-To use a standard subroutine, define the following macro. In addition,
-you must make sure that the instructions in a trampoline fill an entire
-cache line with identical instructions, or else ensure that the
-beginning of the trampoline code is always aligned at the same point in
-its cache line. Look in @file{m68k.h} as a guide.
-
-@table @code
-@findex TRANSFER_FROM_TRAMPOLINE
-@item TRANSFER_FROM_TRAMPOLINE
-Define this macro if trampolines need a special subroutine to do their
-work. The macro should expand to a series of @code{asm} statements
-which will be compiled with GNU CC. They go in a library function named
-@code{__transfer_from_trampoline}.
-
-If you need to avoid executing the ordinary prologue code of a compiled
-C function when you jump to the subroutine, you can do so by placing a
-special label of your own in the assembler code. Use one @code{asm}
-statement to generate an assembler label, and another to make the label
-global. Then trampolines can use that label to jump directly to your
-special assembler code.
-@end table
-
-@node Library Calls
-@section Implicit Calls to Library Routines
-@cindex library subroutine names
-@cindex @file{libgcc.a}
-
-@c prevent bad page break with this line
-Here is an explanation of implicit calls to library routines.
-
-@table @code
-@findex MULSI3_LIBCALL
-@item MULSI3_LIBCALL
-A C string constant giving the name of the function to call for
-multiplication of one signed full-word by another. If you do not
-define this macro, the default name is used, which is @code{__mulsi3},
-a function defined in @file{libgcc.a}.
-
-@findex DIVSI3_LIBCALL
-@item DIVSI3_LIBCALL
-A C string constant giving the name of the function to call for
-division of one signed full-word by another. If you do not define
-this macro, the default name is used, which is @code{__divsi3}, a
-function defined in @file{libgcc.a}.
-
-@findex UDIVSI3_LIBCALL
-@item UDIVSI3_LIBCALL
-A C string constant giving the name of the function to call for
-division of one unsigned full-word by another. If you do not define
-this macro, the default name is used, which is @code{__udivsi3}, a
-function defined in @file{libgcc.a}.
-
-@findex MODSI3_LIBCALL
-@item MODSI3_LIBCALL
-A C string constant giving the name of the function to call for the
-remainder in division of one signed full-word by another. If you do
-not define this macro, the default name is used, which is
-@code{__modsi3}, a function defined in @file{libgcc.a}.
-
-@findex UMODSI3_LIBCALL
-@item UMODSI3_LIBCALL
-A C string constant giving the name of the function to call for the
-remainder in division of one unsigned full-word by another. If you do
-not define this macro, the default name is used, which is
-@code{__umodsi3}, a function defined in @file{libgcc.a}.
-
-@findex MULDI3_LIBCALL
-@item MULDI3_LIBCALL
-A C string constant giving the name of the function to call for
-multiplication of one signed double-word by another. If you do not
-define this macro, the default name is used, which is @code{__muldi3},
-a function defined in @file{libgcc.a}.
-
-@findex DIVDI3_LIBCALL
-@item DIVDI3_LIBCALL
-A C string constant giving the name of the function to call for
-division of one signed double-word by another. If you do not define
-this macro, the default name is used, which is @code{__divdi3}, a
-function defined in @file{libgcc.a}.
-
-@findex UDIVDI3_LIBCALL
-@item UDIVDI3_LIBCALL
-A C string constant giving the name of the function to call for
-division of one unsigned full-word by another. If you do not define
-this macro, the default name is used, which is @code{__udivdi3}, a
-function defined in @file{libgcc.a}.
-
-@findex MODDI3_LIBCALL
-@item MODDI3_LIBCALL
-A C string constant giving the name of the function to call for the
-remainder in division of one signed double-word by another. If you do
-not define this macro, the default name is used, which is
-@code{__moddi3}, a function defined in @file{libgcc.a}.
-
-@findex UMODDI3_LIBCALL
-@item UMODDI3_LIBCALL
-A C string constant giving the name of the function to call for the
-remainder in division of one unsigned full-word by another. If you do
-not define this macro, the default name is used, which is
-@code{__umoddi3}, a function defined in @file{libgcc.a}.
-
-@findex INIT_TARGET_OPTABS
-@item INIT_TARGET_OPTABS
-Define this macro as a C statement that declares additional library
-routines renames existing ones. @code{init_optabs} calls this macro after
-initializing all the normal library routines.
-
-@findex TARGET_EDOM
-@cindex @code{EDOM}, implicit usage
-@item TARGET_EDOM
-The value of @code{EDOM} on the target machine, as a C integer constant
-expression. If you don't define this macro, GNU CC does not attempt to
-deposit the value of @code{EDOM} into @code{errno} directly. Look in
-@file{/usr/include/errno.h} to find the value of @code{EDOM} on your
-system.
-
-If you do not define @code{TARGET_EDOM}, then compiled code reports
-domain errors by calling the library function and letting it report the
-error. If mathematical functions on your system use @code{matherr} when
-there is an error, then you should leave @code{TARGET_EDOM} undefined so
-that @code{matherr} is used normally.
-
-@findex GEN_ERRNO_RTX
-@cindex @code{errno}, implicit usage
-@item GEN_ERRNO_RTX
-Define this macro as a C expression to create an rtl expression that
-refers to the global ``variable'' @code{errno}. (On certain systems,
-@code{errno} may not actually be a variable.) If you don't define this
-macro, a reasonable default is used.
-
-@findex TARGET_MEM_FUNCTIONS
-@cindex @code{bcopy}, implicit usage
-@cindex @code{memcpy}, implicit usage
-@cindex @code{bzero}, implicit usage
-@cindex @code{memset}, implicit usage
-@item TARGET_MEM_FUNCTIONS
-Define this macro if GNU CC should generate calls to the System V
-(and ANSI C) library functions @code{memcpy} and @code{memset}
-rather than the BSD functions @code{bcopy} and @code{bzero}.
-
-@findex LIBGCC_NEEDS_DOUBLE
-@item LIBGCC_NEEDS_DOUBLE
-Define this macro if only @code{float} arguments cannot be passed to
-library routines (so they must be converted to @code{double}). This
-macro affects both how library calls are generated and how the library
-routines in @file{libgcc1.c} accept their arguments. It is useful on
-machines where floating and fixed point arguments are passed
-differently, such as the i860.
-
-@findex FLOAT_ARG_TYPE
-@item FLOAT_ARG_TYPE
-Define this macro to override the type used by the library routines to
-pick up arguments of type @code{float}. (By default, they use a union
-of @code{float} and @code{int}.)
-
-The obvious choice would be @code{float}---but that won't work with
-traditional C compilers that expect all arguments declared as @code{float}
-to arrive as @code{double}. To avoid this conversion, the library routines
-ask for the value as some other type and then treat it as a @code{float}.
-
-On some systems, no other type will work for this. For these systems,
-you must use @code{LIBGCC_NEEDS_DOUBLE} instead, to force conversion of
-the values @code{double} before they are passed.
-
-@findex FLOATIFY
-@item FLOATIFY (@var{passed-value})
-Define this macro to override the way library routines redesignate a
-@code{float} argument as a @code{float} instead of the type it was
-passed as. The default is an expression which takes the @code{float}
-field of the union.
-
-@findex FLOAT_VALUE_TYPE
-@item FLOAT_VALUE_TYPE
-Define this macro to override the type used by the library routines to
-return values that ought to have type @code{float}. (By default, they
-use @code{int}.)
-
-The obvious choice would be @code{float}---but that won't work with
-traditional C compilers gratuitously convert values declared as
-@code{float} into @code{double}.
-
-@findex INTIFY
-@item INTIFY (@var{float-value})
-Define this macro to override the way the value of a
-@code{float}-returning library routine should be packaged in order to
-return it. These functions are actually declared to return type
-@code{FLOAT_VALUE_TYPE} (normally @code{int}).
-
-These values can't be returned as type @code{float} because traditional
-C compilers would gratuitously convert the value to a @code{double}.
-
-A local variable named @code{intify} is always available when the macro
-@code{INTIFY} is used. It is a union of a @code{float} field named
-@code{f} and a field named @code{i} whose type is
-@code{FLOAT_VALUE_TYPE} or @code{int}.
-
-If you don't define this macro, the default definition works by copying
-the value through that union.
-
-@findex nongcc_SI_type
-@item nongcc_SI_type
-Define this macro as the name of the data type corresponding to
-@code{SImode} in the system's own C compiler.
-
-You need not define this macro if that type is @code{long int}, as it usually
-is.
-
-@findex nongcc_word_type
-@item nongcc_word_type
-Define this macro as the name of the data type corresponding to the
-word_mode in the system's own C compiler.
-
-You need not define this macro if that type is @code{long int}, as it usually
-is.
-
-@findex perform_@dots{}
-@item perform_@dots{}
-Define these macros to supply explicit C statements to carry out various
-arithmetic operations on types @code{float} and @code{double} in the
-library routines in @file{libgcc1.c}. See that file for a full list
-of these macros and their arguments.
-
-On most machines, you don't need to define any of these macros, because
-the C compiler that comes with the system takes care of doing them.
-
-@findex NEXT_OBJC_RUNTIME
-@item NEXT_OBJC_RUNTIME
-Define this macro to generate code for Objective C message sending using
-the calling convention of the NeXT system. This calling convention
-involves passing the object, the selector and the method arguments all
-at once to the method-lookup library function.
-
-The default calling convention passes just the object and the selector
-to the lookup function, which returns a pointer to the method.
-@end table
-
-@node Addressing Modes
-@section Addressing Modes
-@cindex addressing modes
-
-@c prevent bad page break with this line
-This is about addressing modes.
-
-@table @code
-@findex HAVE_POST_INCREMENT
-@item HAVE_POST_INCREMENT
-A C expression that is nonzero the machine supports post-increment addressing.
-
-@findex HAVE_PRE_INCREMENT
-@findex HAVE_POST_DECREMENT
-@findex HAVE_PRE_DECREMENT
-@item HAVE_PRE_INCREMENT
-@itemx HAVE_POST_DECREMENT
-@itemx HAVE_PRE_DECREMENT
-Similar for other kinds of addressing.
-
-@findex CONSTANT_ADDRESS_P
-@item CONSTANT_ADDRESS_P (@var{x})
-A C expression that is 1 if the RTX @var{x} is a constant which
-is a valid address. On most machines, this can be defined as
-@code{CONSTANT_P (@var{x})}, but a few machines are more restrictive
-in which constant addresses are supported.
-
-@findex CONSTANT_P
-@code{CONSTANT_P} accepts integer-values expressions whose values are
-not explicitly known, such as @code{symbol_ref}, @code{label_ref}, and
-@code{high} expressions and @code{const} arithmetic expressions, in
-addition to @code{const_int} and @code{const_double} expressions.
-
-@findex MAX_REGS_PER_ADDRESS
-@item MAX_REGS_PER_ADDRESS
-A number, the maximum number of registers that can appear in a valid
-memory address. Note that it is up to you to specify a value equal to
-the maximum number that @code{GO_IF_LEGITIMATE_ADDRESS} would ever
-accept.
-
-@findex GO_IF_LEGITIMATE_ADDRESS
-@item GO_IF_LEGITIMATE_ADDRESS (@var{mode}, @var{x}, @var{label})
-A C compound statement with a conditional @code{goto @var{label};}
-executed if @var{x} (an RTX) is a legitimate memory address on the
-target machine for a memory operand of mode @var{mode}.
-
-It usually pays to define several simpler macros to serve as
-subroutines for this one. Otherwise it may be too complicated to
-understand.
-
-This macro must exist in two variants: a strict variant and a
-non-strict one. The strict variant is used in the reload pass. It
-must be defined so that any pseudo-register that has not been
-allocated a hard register is considered a memory reference. In
-contexts where some kind of register is required, a pseudo-register
-with no hard register must be rejected.
-
-The non-strict variant is used in other passes. It must be defined to
-accept all pseudo-registers in every context where some kind of
-register is required.
-
-@findex REG_OK_STRICT
-Compiler source files that want to use the strict variant of this
-macro define the macro @code{REG_OK_STRICT}. You should use an
-@code{#ifdef REG_OK_STRICT} conditional to define the strict variant
-in that case and the non-strict variant otherwise.
-
-Subroutines to check for acceptable registers for various purposes (one
-for base registers, one for index registers, and so on) are typically
-among the subroutines used to define @code{GO_IF_LEGITIMATE_ADDRESS}.
-Then only these subroutine macros need have two variants; the higher
-levels of macros may be the same whether strict or not.@refill
-
-Normally, constant addresses which are the sum of a @code{symbol_ref}
-and an integer are stored inside a @code{const} RTX to mark them as
-constant. Therefore, there is no need to recognize such sums
-specifically as legitimate addresses. Normally you would simply
-recognize any @code{const} as legitimate.
-
-Usually @code{PRINT_OPERAND_ADDRESS} is not prepared to handle constant
-sums that are not marked with @code{const}. It assumes that a naked
-@code{plus} indicates indexing. If so, then you @emph{must} reject such
-naked constant sums as illegitimate addresses, so that none of them will
-be given to @code{PRINT_OPERAND_ADDRESS}.
-
-@cindex @code{ENCODE_SECTION_INFO} and address validation
-On some machines, whether a symbolic address is legitimate depends on
-the section that the address refers to. On these machines, define the
-macro @code{ENCODE_SECTION_INFO} to store the information into the
-@code{symbol_ref}, and then check for it here. When you see a
-@code{const}, you will have to look inside it to find the
-@code{symbol_ref} in order to determine the section. @xref{Assembler
-Format}.
-
-@findex saveable_obstack
-The best way to modify the name string is by adding text to the
-beginning, with suitable punctuation to prevent any ambiguity. Allocate
-the new name in @code{saveable_obstack}. You will have to modify
-@code{ASM_OUTPUT_LABELREF} to remove and decode the added text and
-output the name accordingly, and define @code{STRIP_NAME_ENCODING} to
-access the original name string.
-
-You can check the information stored here into the @code{symbol_ref} in
-the definitions of the macros @code{GO_IF_LEGITIMATE_ADDRESS} and
-@code{PRINT_OPERAND_ADDRESS}.
-
-@findex REG_OK_FOR_BASE_P
-@item REG_OK_FOR_BASE_P (@var{x})
-A C expression that is nonzero if @var{x} (assumed to be a @code{reg}
-RTX) is valid for use as a base register. For hard registers, it
-should always accept those which the hardware permits and reject the
-others. Whether the macro accepts or rejects pseudo registers must be
-controlled by @code{REG_OK_STRICT} as described above. This usually
-requires two variant definitions, of which @code{REG_OK_STRICT}
-controls the one actually used.
-
-@findex REG_MODE_OK_FOR_BASE_P
-@item REG_MODE_OK_FOR_BASE_P (@var{x}, @var{mode})
-A C expression that is just like @code{REG_OK_FOR_BASE_P}, except that
-that expression may examine the mode of the memory reference in
-@var{mode}. You should define this macro if the mode of the memory
-reference affects whether a register may be used as a base register. If
-you define this macro, the compiler will use it instead of
-@code{REG_OK_FOR_BASE_P}.
-
-@findex REG_OK_FOR_INDEX_P
-@item REG_OK_FOR_INDEX_P (@var{x})
-A C expression that is nonzero if @var{x} (assumed to be a @code{reg}
-RTX) is valid for use as an index register.
-
-The difference between an index register and a base register is that
-the index register may be scaled. If an address involves the sum of
-two registers, neither one of them scaled, then either one may be
-labeled the ``base'' and the other the ``index''; but whichever
-labeling is used must fit the machine's constraints of which registers
-may serve in each capacity. The compiler will try both labelings,
-looking for one that is valid, and will reload one or both registers
-only if neither labeling works.
-
-@findex LEGITIMIZE_ADDRESS
-@item LEGITIMIZE_ADDRESS (@var{x}, @var{oldx}, @var{mode}, @var{win})
-A C compound statement that attempts to replace @var{x} with a valid
-memory address for an operand of mode @var{mode}. @var{win} will be a
-C statement label elsewhere in the code; the macro definition may use
-
-@example
-GO_IF_LEGITIMATE_ADDRESS (@var{mode}, @var{x}, @var{win});
-@end example
-
-@noindent
-to avoid further processing if the address has become legitimate.
-
-@findex break_out_memory_refs
-@var{x} will always be the result of a call to @code{break_out_memory_refs},
-and @var{oldx} will be the operand that was given to that function to produce
-@var{x}.
-
-The code generated by this macro should not alter the substructure of
-@var{x}. If it transforms @var{x} into a more legitimate form, it
-should assign @var{x} (which will always be a C variable) a new value.
-
-It is not necessary for this macro to come up with a legitimate
-address. The compiler has standard ways of doing so in all cases. In
-fact, it is safe for this macro to do nothing. But often a
-machine-dependent strategy can generate better code.
-
-@findex LEGITIMIZE_RELOAD_ADDRESS
-@item LEGITIMIZE_RELOAD_ADDRESS (@var{x}, @var{mode}, @var{opnum}, @var{type}, @var{ind_levels}, @var{win})
-A C compound statement that attempts to replace @var{x}, which is an address
-that needs reloading, with a valid memory address for an operand of mode
-@var{mode}. @var{win} will be a C statement label elsewhere in the code.
-It is not necessary to define this macro, but it might be useful for
-performance reasons.
-
-For example, on the i386, it is sometimes possible to use a single
-reload register instead of two by reloading a sum of two pseudo
-registers into a register. On the other hand, for number of RISC
-processors offsets are limited so that often an intermediate address
-needs to be generated in order to address a stack slot. By defining
-LEGITIMIZE_RELOAD_ADDRESS appropriately, the intermediate addresses
-generated for adjacent some stack slots can be made identical, and thus
-be shared.
-
-@emph{Note}: This macro should be used with caution. It is necessary
-to know something of how reload works in order to effectively use this,
-and it is quite easy to produce macros that build in too much knowledge
-of reload internals.
-
-@emph{Note}: This macro must be able to reload an address created by a
-previous invocation of this macro. If it fails to handle such addresses
-then the compiler may generate incorrect code or abort.
-
-@findex push_reload
-The macro definition should use @code{push_reload} to indicate parts that
-need reloading; @var{opnum}, @var{type} and @var{ind_levels} are usually
-suitable to be passed unaltered to @code{push_reload}.
-
-The code generated by this macro must not alter the substructure of
-@var{x}. If it transforms @var{x} into a more legitimate form, it
-should assign @var{x} (which will always be a C variable) a new value.
-This also applies to parts that you change indirectly by calling
-@code{push_reload}.
-
-@findex strict_memory_address_p
-The macro definition may use @code{strict_memory_address_p} to test if
-the address has become legitimate.
-
-@findex copy_rtx
-If you want to change only a part of @var{x}, one standard way of doing
-this is to use @code{copy_rtx}. Note, however, that is unshares only a
-single level of rtl. Thus, if the part to be changed is not at the
-top level, you'll need to replace first the top leve
-It is not necessary for this macro to come up with a legitimate
-address; but often a machine-dependent strategy can generate better code.
-
-@findex GO_IF_MODE_DEPENDENT_ADDRESS
-@item GO_IF_MODE_DEPENDENT_ADDRESS (@var{addr}, @var{label})
-A C statement or compound statement with a conditional @code{goto
-@var{label};} executed if memory address @var{x} (an RTX) can have
-different meanings depending on the machine mode of the memory
-reference it is used for or if the address is valid for some modes
-but not others.
-
-Autoincrement and autodecrement addresses typically have mode-dependent
-effects because the amount of the increment or decrement is the size
-of the operand being addressed. Some machines have other mode-dependent
-addresses. Many RISC machines have no mode-dependent addresses.
-
-You may assume that @var{addr} is a valid address for the machine.
-
-@findex LEGITIMATE_CONSTANT_P
-@item LEGITIMATE_CONSTANT_P (@var{x})
-A C expression that is nonzero if @var{x} is a legitimate constant for
-an immediate operand on the target machine. You can assume that
-@var{x} satisfies @code{CONSTANT_P}, so you need not check this. In fact,
-@samp{1} is a suitable definition for this macro on machines where
-anything @code{CONSTANT_P} is valid.@refill
-@end table
-
-@node Condition Code
-@section Condition Code Status
-@cindex condition code status
-
-@c prevent bad page break with this line
-This describes the condition code status.
-
-@findex cc_status
-The file @file{conditions.h} defines a variable @code{cc_status} to
-describe how the condition code was computed (in case the interpretation of
-the condition code depends on the instruction that it was set by). This
-variable contains the RTL expressions on which the condition code is
-currently based, and several standard flags.
-
-Sometimes additional machine-specific flags must be defined in the machine
-description header file. It can also add additional machine-specific
-information by defining @code{CC_STATUS_MDEP}.
-
-@table @code
-@findex CC_STATUS_MDEP
-@item CC_STATUS_MDEP
-C code for a data type which is used for declaring the @code{mdep}
-component of @code{cc_status}. It defaults to @code{int}.
-
-This macro is not used on machines that do not use @code{cc0}.
-
-@findex CC_STATUS_MDEP_INIT
-@item CC_STATUS_MDEP_INIT
-A C expression to initialize the @code{mdep} field to ``empty''.
-The default definition does nothing, since most machines don't use
-the field anyway. If you want to use the field, you should probably
-define this macro to initialize it.
-
-This macro is not used on machines that do not use @code{cc0}.
-
-@findex NOTICE_UPDATE_CC
-@item NOTICE_UPDATE_CC (@var{exp}, @var{insn})
-A C compound statement to set the components of @code{cc_status}
-appropriately for an insn @var{insn} whose body is @var{exp}. It is
-this macro's responsibility to recognize insns that set the condition
-code as a byproduct of other activity as well as those that explicitly
-set @code{(cc0)}.
-
-This macro is not used on machines that do not use @code{cc0}.
-
-If there are insns that do not set the condition code but do alter
-other machine registers, this macro must check to see whether they
-invalidate the expressions that the condition code is recorded as
-reflecting. For example, on the 68000, insns that store in address
-registers do not set the condition code, which means that usually
-@code{NOTICE_UPDATE_CC} can leave @code{cc_status} unaltered for such
-insns. But suppose that the previous insn set the condition code
-based on location @samp{a4@@(102)} and the current insn stores a new
-value in @samp{a4}. Although the condition code is not changed by
-this, it will no longer be true that it reflects the contents of
-@samp{a4@@(102)}. Therefore, @code{NOTICE_UPDATE_CC} must alter
-@code{cc_status} in this case to say that nothing is known about the
-condition code value.
-
-The definition of @code{NOTICE_UPDATE_CC} must be prepared to deal
-with the results of peephole optimization: insns whose patterns are
-@code{parallel} RTXs containing various @code{reg}, @code{mem} or
-constants which are just the operands. The RTL structure of these
-insns is not sufficient to indicate what the insns actually do. What
-@code{NOTICE_UPDATE_CC} should do when it sees one is just to run
-@code{CC_STATUS_INIT}.
-
-A possible definition of @code{NOTICE_UPDATE_CC} is to call a function
-that looks at an attribute (@pxref{Insn Attributes}) named, for example,
-@samp{cc}. This avoids having detailed information about patterns in
-two places, the @file{md} file and in @code{NOTICE_UPDATE_CC}.
-
-@findex EXTRA_CC_MODES
-@item EXTRA_CC_MODES
-A list of names to be used for additional modes for condition code
-values in registers (@pxref{Jump Patterns}). These names are added
-to @code{enum machine_mode} and all have class @code{MODE_CC}. By
-convention, they should start with @samp{CC} and end with @samp{mode}.
-
-You should only define this macro if your machine does not use @code{cc0}
-and only if additional modes are required.
-
-@findex EXTRA_CC_NAMES
-@item EXTRA_CC_NAMES
-A list of C strings giving the names for the modes listed in
-@code{EXTRA_CC_MODES}. For example, the Sparc defines this macro and
-@code{EXTRA_CC_MODES} as
-
-@smallexample
-#define EXTRA_CC_MODES CC_NOOVmode, CCFPmode, CCFPEmode
-#define EXTRA_CC_NAMES "CC_NOOV", "CCFP", "CCFPE"
-@end smallexample
-
-This macro is not required if @code{EXTRA_CC_MODES} is not defined.
-
-@findex SELECT_CC_MODE
-@item SELECT_CC_MODE (@var{op}, @var{x}, @var{y})
-Returns a mode from class @code{MODE_CC} to be used when comparison
-operation code @var{op} is applied to rtx @var{x} and @var{y}. For
-example, on the Sparc, @code{SELECT_CC_MODE} is defined as (see
-@pxref{Jump Patterns} for a description of the reason for this
-definition)
-
-@smallexample
-#define SELECT_CC_MODE(OP,X,Y) \
- (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
- ? ((OP == EQ || OP == NE) ? CCFPmode : CCFPEmode) \
- : ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS \
- || GET_CODE (X) == NEG) \
- ? CC_NOOVmode : CCmode))
-@end smallexample
-
-You need not define this macro if @code{EXTRA_CC_MODES} is not defined.
-
-@findex CANONICALIZE_COMPARISON
-@item CANONICALIZE_COMPARISON (@var{code}, @var{op0}, @var{op1})
-One some machines not all possible comparisons are defined, but you can
-convert an invalid comparison into a valid one. For example, the Alpha
-does not have a @code{GT} comparison, but you can use an @code{LT}
-comparison instead and swap the order of the operands.
-
-On such machines, define this macro to be a C statement to do any
-required conversions. @var{code} is the initial comparison code
-and @var{op0} and @var{op1} are the left and right operands of the
-comparison, respectively. You should modify @var{code}, @var{op0}, and
-@var{op1} as required.
-
-GNU CC will not assume that the comparison resulting from this macro is
-valid but will see if the resulting insn matches a pattern in the
-@file{md} file.
-
-You need not define this macro if it would never change the comparison
-code or operands.
-
-@findex REVERSIBLE_CC_MODE
-@item REVERSIBLE_CC_MODE (@var{mode})
-A C expression whose value is one if it is always safe to reverse a
-comparison whose mode is @var{mode}. If @code{SELECT_CC_MODE}
-can ever return @var{mode} for a floating-point inequality comparison,
-then @code{REVERSIBLE_CC_MODE (@var{mode})} must be zero.
-
-You need not define this macro if it would always returns zero or if the
-floating-point format is anything other than @code{IEEE_FLOAT_FORMAT}.
-For example, here is the definition used on the Sparc, where floating-point
-inequality comparisons are always given @code{CCFPEmode}:
-
-@smallexample
-#define REVERSIBLE_CC_MODE(MODE) ((MODE) != CCFPEmode)
-@end smallexample
-
-@end table
-
-@node Costs
-@section Describing Relative Costs of Operations
-@cindex costs of instructions
-@cindex relative costs
-@cindex speed of instructions
-
-These macros let you describe the relative speed of various operations
-on the target machine.
-
-@table @code
-@findex CONST_COSTS
-@item CONST_COSTS (@var{x}, @var{code}, @var{outer_code})
-A part of a C @code{switch} statement that describes the relative costs
-of constant RTL expressions. It must contain @code{case} labels for
-expression codes @code{const_int}, @code{const}, @code{symbol_ref},
-@code{label_ref} and @code{const_double}. Each case must ultimately
-reach a @code{return} statement to return the relative cost of the use
-of that kind of constant value in an expression. The cost may depend on
-the precise value of the constant, which is available for examination in
-@var{x}, and the rtx code of the expression in which it is contained,
-found in @var{outer_code}.
-
-@var{code} is the expression code---redundant, since it can be
-obtained with @code{GET_CODE (@var{x})}.
-
-@findex RTX_COSTS
-@findex COSTS_N_INSNS
-@item RTX_COSTS (@var{x}, @var{code}, @var{outer_code})
-Like @code{CONST_COSTS} but applies to nonconstant RTL expressions.
-This can be used, for example, to indicate how costly a multiply
-instruction is. In writing this macro, you can use the construct
-@code{COSTS_N_INSNS (@var{n})} to specify a cost equal to @var{n} fast
-instructions. @var{outer_code} is the code of the expression in which
-@var{x} is contained.
-
-This macro is optional; do not define it if the default cost assumptions
-are adequate for the target machine.
-
-@findex DEFAULT_RTX_COSTS
-@item DEFAULT_RTX_COSTS (@var{x}, @var{code}, @var{outer_code})
-This macro, if defined, is called for any case not handled by the
-@code{RTX_COSTS} or @code{CONST_COSTS} macros. This eliminates the need
-to put case labels into the macro, but the code, or any functions it
-calls, must assume that the RTL in @var{x} could be of any type that has
-not already been handled. The arguments are the same as for
-@code{RTX_COSTS}, and the macro should execute a return statement giving
-the cost of any RTL expressions that it can handle. The default cost
-calculation is used for any RTL for which this macro does not return a
-value.
-
-This macro is optional; do not define it if the default cost assumptions
-are adequate for the target machine.
-
-@findex ADDRESS_COST
-@item ADDRESS_COST (@var{address})
-An expression giving the cost of an addressing mode that contains
-@var{address}. If not defined, the cost is computed from
-the @var{address} expression and the @code{CONST_COSTS} values.
-
-For most CISC machines, the default cost is a good approximation of the
-true cost of the addressing mode. However, on RISC machines, all
-instructions normally have the same length and execution time. Hence
-all addresses will have equal costs.
-
-In cases where more than one form of an address is known, the form with
-the lowest cost will be used. If multiple forms have the same, lowest,
-cost, the one that is the most complex will be used.
-
-For example, suppose an address that is equal to the sum of a register
-and a constant is used twice in the same basic block. When this macro
-is not defined, the address will be computed in a register and memory
-references will be indirect through that register. On machines where
-the cost of the addressing mode containing the sum is no higher than
-that of a simple indirect reference, this will produce an additional
-instruction and possibly require an additional register. Proper
-specification of this macro eliminates this overhead for such machines.
-
-Similar use of this macro is made in strength reduction of loops.
-
-@var{address} need not be valid as an address. In such a case, the cost
-is not relevant and can be any value; invalid addresses need not be
-assigned a different cost.
-
-On machines where an address involving more than one register is as
-cheap as an address computation involving only one register, defining
-@code{ADDRESS_COST} to reflect this can cause two registers to be live
-over a region of code where only one would have been if
-@code{ADDRESS_COST} were not defined in that manner. This effect should
-be considered in the definition of this macro. Equivalent costs should
-probably only be given to addresses with different numbers of registers
-on machines with lots of registers.
-
-This macro will normally either not be defined or be defined as a
-constant.
-
-@findex REGISTER_MOVE_COST
-@item REGISTER_MOVE_COST (@var{from}, @var{to})
-A C expression for the cost of moving data from a register in class
-@var{from} to one in class @var{to}. The classes are expressed using
-the enumeration values such as @code{GENERAL_REGS}. A value of 2 is the
-default; other values are interpreted relative to that.
-
-It is not required that the cost always equal 2 when @var{from} is the
-same as @var{to}; on some machines it is expensive to move between
-registers if they are not general registers.
-
-If reload sees an insn consisting of a single @code{set} between two
-hard registers, and if @code{REGISTER_MOVE_COST} applied to their
-classes returns a value of 2, reload does not check to ensure that the
-constraints of the insn are met. Setting a cost of other than 2 will
-allow reload to verify that the constraints are met. You should do this
-if the @samp{mov@var{m}} pattern's constraints do not allow such copying.
-
-@findex MEMORY_MOVE_COST
-@item MEMORY_MOVE_COST (@var{mode}, @var{class}, @var{in})
-A C expression for the cost of moving data of mode @var{mode} between a
-register of class @var{class} and memory; @var{in} is zero if the value
-is to be written to memory, non-zero if it is to be read in. This cost
-is relative to those in @code{REGISTER_MOVE_COST}. If moving between
-registers and memory is more expensive than between two registers, you
-should define this macro to express the relative cost.
-
-If you do not define this macro, GNU CC uses a default cost of 4 plus
-the cost of copying via a secondary reload register, if one is
-needed. If your machine requires a secondary reload register to copy
-between memory and a register of @var{class} but the reload mechanism is
-more complex than copying via an intermediate, define this macro to
-reflect the actual cost of the move.
-
-GNU CC defines the function @code{memory_move_secondary_cost} if
-secondary reloads are needed. It computes the costs due to copying via
-a secondary register. If your machine copies from memory using a
-secondary register in the conventional way but the default base value of
-4 is not correct for your machine, define this macro to add some other
-value to the result of that function. The arguments to that function
-are the same as to this macro.
-
-@findex BRANCH_COST
-@item BRANCH_COST
-A C expression for the cost of a branch instruction. A value of 1 is
-the default; other values are interpreted relative to that.
-@end table
-
-Here are additional macros which do not specify precise relative costs,
-but only that certain actions are more expensive than GNU CC would
-ordinarily expect.
-
-@table @code
-@findex SLOW_BYTE_ACCESS
-@item SLOW_BYTE_ACCESS
-Define this macro as a C expression which is nonzero if accessing less
-than a word of memory (i.e. a @code{char} or a @code{short}) is no
-faster than accessing a word of memory, i.e., if such access
-require more than one instruction or if there is no difference in cost
-between byte and (aligned) word loads.
-
-When this macro is not defined, the compiler will access a field by
-finding the smallest containing object; when it is defined, a fullword
-load will be used if alignment permits. Unless bytes accesses are
-faster than word accesses, using word accesses is preferable since it
-may eliminate subsequent memory access if subsequent accesses occur to
-other fields in the same word of the structure, but to different bytes.
-
-@findex SLOW_ZERO_EXTEND
-@item SLOW_ZERO_EXTEND
-Define this macro if zero-extension (of a @code{char} or @code{short}
-to an @code{int}) can be done faster if the destination is a register
-that is known to be zero.
-
-If you define this macro, you must have instruction patterns that
-recognize RTL structures like this:
-
-@smallexample
-(set (strict_low_part (subreg:QI (reg:SI @dots{}) 0)) @dots{})
-@end smallexample
-
-@noindent
-and likewise for @code{HImode}.
-
-@findex SLOW_UNALIGNED_ACCESS
-@item SLOW_UNALIGNED_ACCESS
-Define this macro to be the value 1 if unaligned accesses have a cost
-many times greater than aligned accesses, for example if they are
-emulated in a trap handler.
-
-When this macro is non-zero, the compiler will act as if
-@code{STRICT_ALIGNMENT} were non-zero when generating code for block
-moves. This can cause significantly more instructions to be produced.
-Therefore, do not set this macro non-zero if unaligned accesses only add a
-cycle or two to the time for a memory access.
-
-If the value of this macro is always zero, it need not be defined.
-
-@findex DONT_REDUCE_ADDR
-@item DONT_REDUCE_ADDR
-Define this macro to inhibit strength reduction of memory addresses.
-(On some machines, such strength reduction seems to do harm rather
-than good.)
-
-@findex MOVE_RATIO
-@item MOVE_RATIO
-The threshold of number of scalar memory-to-memory move insns, @emph{below}
-which a sequence of insns should be generated instead of a
-string move insn or a library call. Increasing the value will always
-make code faster, but eventually incurs high cost in increased code size.
-
-Note that on machines with no memory-to-memory move insns, this macro denotes
-the corresponding number of memory-to-memory @emph{sequences}.
-
-If you don't define this, a reasonable default is used.
-
-@findex MOVE_BY_PIECES_P
-@item MOVE_BY_PIECES_P (@var{size}, @var{alignment})
-A C expression used to determine whether @code{move_by_pieces} will be used to
-copy a chunk of memory, or whether some other block move mechanism
-will be used. Defaults to 1 if @code{move_by_pieces_ninsns} returns less
-than @code{MOVE_RATIO}.
-
-@findex MOVE_MAX_PIECES
-@item MOVE_MAX_PIECES
-A C expression used by @code{move_by_pieces} to determine the largest unit
-a load or store used to copy memory is. Defaults to @code{MOVE_MAX}.
-
-@findex USE_LOAD_POST_INCREMENT
-@item USE_LOAD_POST_INCREMENT (@var{mode})
-A C expression used to determine whether a load postincrement is
-a good thing for @code{move_by_pieces} to use for a given mode. Defaults
-to the value of @code{HAVE_POST_INCREMENT}.
-
-@findex USE_LOAD_PRE_INCREMENT
-@item USE_LOAD_PRE_INCREMENT (@var{mode})
-A C expression used to determine whether a load preincrement is
-a good thing for @code{move_by_pieces} to use for a given mode. Defaults
-to the value of @code{HAVE_PRE_INCREMENT}.
-
-@findex USE_STORE_POST_INCREMENT
-@item USE_STORE_POST_INCREMENT (@var{mode})
-A C expression used to determine whether a store postincrement is
-a good thing for @code{move_by_pieces} to use for a given mode. Defaults
-to the value of @code{HAVE_POST_INCREMENT}.
-
-@findex USE_STORE_PRE_INCREMENT
-@item USE_STORE_PRE_INCREMENT (@var{mode})
-This macro is used to determine whether a store preincrement is
-a good thing for @code{move_by_pieces} to use for a given mode. Defaults
-to the value of @code{HAVE_PRE_INCREMENT}.
-
-@findex NO_FUNCTION_CSE
-@item NO_FUNCTION_CSE
-Define this macro if it is as good or better to call a constant
-function address than to call an address kept in a register.
-
-@findex NO_RECURSIVE_FUNCTION_CSE
-@item NO_RECURSIVE_FUNCTION_CSE
-Define this macro if it is as good or better for a function to call
-itself with an explicit address than to call an address kept in a
-register.
-
-@findex ADJUST_COST
-@item ADJUST_COST (@var{insn}, @var{link}, @var{dep_insn}, @var{cost})
-A C statement (sans semicolon) to update the integer variable @var{cost}
-based on the relationship between @var{insn} that is dependent on
-@var{dep_insn} through the dependence @var{link}. The default is to
-make no adjustment to @var{cost}. This can be used for example to
-specify to the scheduler that an output- or anti-dependence does not
-incur the same cost as a data-dependence.
-
-@findex ADJUST_PRIORITY
-@item ADJUST_PRIORITY (@var{insn})
-A C statement (sans semicolon) to update the integer scheduling
-priority @code{INSN_PRIORITY(@var{insn})}. Reduce the priority
-to execute the @var{insn} earlier, increase the priority to execute
-@var{insn} later. Do not define this macro if you do not need to
-adjust the scheduling priorities of insns.
-@end table
-
-@node Sections
-@section Dividing the Output into Sections (Texts, Data, @dots{})
-@c the above section title is WAY too long. maybe cut the part between
-@c the (...)? --mew 10feb93
-
-An object file is divided into sections containing different types of
-data. In the most common case, there are three sections: the @dfn{text
-section}, which holds instructions and read-only data; the @dfn{data
-section}, which holds initialized writable data; and the @dfn{bss
-section}, which holds uninitialized data. Some systems have other kinds
-of sections.
-
-The compiler must tell the assembler when to switch sections. These
-macros control what commands to output to tell the assembler this. You
-can also define additional sections.
-
-@table @code
-@findex TEXT_SECTION_ASM_OP
-@item TEXT_SECTION_ASM_OP
-A C expression whose value is a string containing the assembler
-operation that should precede instructions and read-only data. Normally
-@code{".text"} is right.
-
-@findex DATA_SECTION_ASM_OP
-@item DATA_SECTION_ASM_OP
-A C expression whose value is a string containing the assembler
-operation to identify the following data as writable initialized data.
-Normally @code{".data"} is right.
-
-@findex SHARED_SECTION_ASM_OP
-@item SHARED_SECTION_ASM_OP
-If defined, a C expression whose value is a string containing the
-assembler operation to identify the following data as shared data. If
-not defined, @code{DATA_SECTION_ASM_OP} will be used.
-
-@findex BSS_SECTION_ASM_OP
-@item BSS_SECTION_ASM_OP
-If defined, a C expression whose value is a string containing the
-assembler operation to identify the following data as uninitialized global
-data. If not defined, and neither @code{ASM_OUTPUT_BSS} nor
-@code{ASM_OUTPUT_ALIGNED_BSS} are defined, uninitialized global data will be
-output in the data section if @samp{-fno-common} is passed, otherwise
-@code{ASM_OUTPUT_COMMON} will be used.
-
-@findex SHARED_BSS_SECTION_ASM_OP
-@item SHARED_BSS_SECTION_ASM_OP
-If defined, a C expression whose value is a string containing the
-assembler operation to identify the following data as uninitialized global
-shared data. If not defined, and @code{BSS_SECTION_ASM_OP} is, the latter
-will be used.
-
-@findex INIT_SECTION_ASM_OP
-@item INIT_SECTION_ASM_OP
-If defined, a C expression whose value is a string containing the
-assembler operation to identify the following data as initialization
-code. If not defined, GNU CC will assume such a section does not
-exist.
-
-@findex EXTRA_SECTIONS
-@findex in_text
-@findex in_data
-@item EXTRA_SECTIONS
-A list of names for sections other than the standard two, which are
-@code{in_text} and @code{in_data}. You need not define this macro
-on a system with no other sections (that GCC needs to use).
-
-@findex EXTRA_SECTION_FUNCTIONS
-@findex text_section
-@findex data_section
-@item EXTRA_SECTION_FUNCTIONS
-One or more functions to be defined in @file{varasm.c}. These
-functions should do jobs analogous to those of @code{text_section} and
-@code{data_section}, for your additional sections. Do not define this
-macro if you do not define @code{EXTRA_SECTIONS}.
-
-@findex READONLY_DATA_SECTION
-@item READONLY_DATA_SECTION
-On most machines, read-only variables, constants, and jump tables are
-placed in the text section. If this is not the case on your machine,
-this macro should be defined to be the name of a function (either
-@code{data_section} or a function defined in @code{EXTRA_SECTIONS}) that
-switches to the section to be used for read-only items.
-
-If these items should be placed in the text section, this macro should
-not be defined.
-
-@findex SELECT_SECTION
-@item SELECT_SECTION (@var{exp}, @var{reloc})
-A C statement or statements to switch to the appropriate section for
-output of @var{exp}. You can assume that @var{exp} is either a
-@code{VAR_DECL} node or a constant of some sort. @var{reloc}
-indicates whether the initial value of @var{exp} requires link-time
-relocations. Select the section by calling @code{text_section} or one
-of the alternatives for other sections.
-
-Do not define this macro if you put all read-only variables and
-constants in the read-only data section (usually the text section).
-
-@findex SELECT_RTX_SECTION
-@item SELECT_RTX_SECTION (@var{mode}, @var{rtx})
-A C statement or statements to switch to the appropriate section for
-output of @var{rtx} in mode @var{mode}. You can assume that @var{rtx}
-is some kind of constant in RTL. The argument @var{mode} is redundant
-except in the case of a @code{const_int} rtx. Select the section by
-calling @code{text_section} or one of the alternatives for other
-sections.
-
-Do not define this macro if you put all constants in the read-only
-data section.
-
-@findex JUMP_TABLES_IN_TEXT_SECTION
-@item JUMP_TABLES_IN_TEXT_SECTION
-Define this macro to be an expression with a non-zero value if jump
-tables (for @code{tablejump} insns) should be output in the text
-section, along with the assembler instructions. Otherwise, the
-readonly data section is used.
-
-This macro is irrelevant if there is no separate readonly data section.
-
-@findex ENCODE_SECTION_INFO
-@item ENCODE_SECTION_INFO (@var{decl})
-Define this macro if references to a symbol must be treated differently
-depending on something about the variable or function named by the
-symbol (such as what section it is in).
-
-The macro definition, if any, is executed immediately after the rtl for
-@var{decl} has been created and stored in @code{DECL_RTL (@var{decl})}.
-The value of the rtl will be a @code{mem} whose address is a
-@code{symbol_ref}.
-
-@cindex @code{SYMBOL_REF_FLAG}, in @code{ENCODE_SECTION_INFO}
-The usual thing for this macro to do is to record a flag in the
-@code{symbol_ref} (such as @code{SYMBOL_REF_FLAG}) or to store a
-modified name string in the @code{symbol_ref} (if one bit is not enough
-information).
-
-@findex STRIP_NAME_ENCODING
-@item STRIP_NAME_ENCODING (@var{var}, @var{sym_name})
-Decode @var{sym_name} and store the real name part in @var{var}, sans
-the characters that encode section info. Define this macro if
-@code{ENCODE_SECTION_INFO} alters the symbol's name string.
-
-@findex UNIQUE_SECTION_P
-@item UNIQUE_SECTION_P (@var{decl})
-A C expression which evaluates to true if @var{decl} should be placed
-into a unique section for some target-specific reason. If you do not
-define this macro, the default is @samp{0}. Note that the flag
-@samp{-ffunction-sections} will also cause functions to be placed into
-unique sections.
-
-@findex UNIQUE_SECTION
-@item UNIQUE_SECTION (@var{decl}, @var{reloc})
-A C statement to build up a unique section name, expressed as a
-STRING_CST node, and assign it to @samp{DECL_SECTION_NAME (@var{decl})}.
-@var{reloc} indicates whether the initial value of @var{exp} requires
-link-time relocations. If you do not define this macro, GNU CC will use
-the symbol name prefixed by @samp{.} as the section name.
-@end table
-
-@node PIC
-@section Position Independent Code
-@cindex position independent code
-@cindex PIC
-
-This section describes macros that help implement generation of position
-independent code. Simply defining these macros is not enough to
-generate valid PIC; you must also add support to the macros
-@code{GO_IF_LEGITIMATE_ADDRESS} and @code{PRINT_OPERAND_ADDRESS}, as
-well as @code{LEGITIMIZE_ADDRESS}. You must modify the definition of
-@samp{movsi} to do something appropriate when the source operand
-contains a symbolic address. You may also need to alter the handling of
-switch statements so that they use relative addresses.
-@c i rearranged the order of the macros above to try to force one of
-@c them to the next line, to eliminate an overfull hbox. --mew 10feb93
-
-@table @code
-@findex PIC_OFFSET_TABLE_REGNUM
-@item PIC_OFFSET_TABLE_REGNUM
-The register number of the register used to address a table of static
-data addresses in memory. In some cases this register is defined by a
-processor's ``application binary interface'' (ABI). When this macro
-is defined, RTL is generated for this register once, as with the stack
-pointer and frame pointer registers. If this macro is not defined, it
-is up to the machine-dependent files to allocate such a register (if
-necessary).
-
-@findex PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
-@item PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
-Define this macro if the register defined by
-@code{PIC_OFFSET_TABLE_REGNUM} is clobbered by calls. Do not define
-this macro if @code{PIC_OFFSET_TABLE_REGNUM} is not defined.
-
-@findex FINALIZE_PIC
-@item FINALIZE_PIC
-By generating position-independent code, when two different programs (A
-and B) share a common library (libC.a), the text of the library can be
-shared whether or not the library is linked at the same address for both
-programs. In some of these environments, position-independent code
-requires not only the use of different addressing modes, but also
-special code to enable the use of these addressing modes.
-
-The @code{FINALIZE_PIC} macro serves as a hook to emit these special
-codes once the function is being compiled into assembly code, but not
-before. (It is not done before, because in the case of compiling an
-inline function, it would lead to multiple PIC prologues being
-included in functions which used inline functions and were compiled to
-assembly language.)
-
-@findex LEGITIMATE_PIC_OPERAND_P
-@item LEGITIMATE_PIC_OPERAND_P (@var{x})
-A C expression that is nonzero if @var{x} is a legitimate immediate
-operand on the target machine when generating position independent code.
-You can assume that @var{x} satisfies @code{CONSTANT_P}, so you need not
-check this. You can also assume @var{flag_pic} is true, so you need not
-check it either. You need not define this macro if all constants
-(including @code{SYMBOL_REF}) can be immediate operands when generating
-position independent code.
-@end table
-
-@node Assembler Format
-@section Defining the Output Assembler Language
-
-This section describes macros whose principal purpose is to describe how
-to write instructions in assembler language--rather than what the
-instructions do.
-
-@menu
-* File Framework:: Structural information for the assembler file.
-* Data Output:: Output of constants (numbers, strings, addresses).
-* Uninitialized Data:: Output of uninitialized variables.
-* Label Output:: Output and generation of labels.
-* Initialization:: General principles of initialization
- and termination routines.
-* Macros for Initialization::
- Specific macros that control the handling of
- initialization and termination routines.
-* Instruction Output:: Output of actual instructions.
-* Dispatch Tables:: Output of jump tables.
-* Exception Region Output:: Output of exception region code.
-* Alignment Output:: Pseudo ops for alignment and skipping data.
-@end menu
-
-@node File Framework
-@subsection The Overall Framework of an Assembler File
-@cindex assembler format
-@cindex output of assembler code
-
-@c prevent bad page break with this line
-This describes the overall framework of an assembler file.
-
-@table @code
-@findex ASM_FILE_START
-@item ASM_FILE_START (@var{stream})
-A C expression which outputs to the stdio stream @var{stream}
-some appropriate text to go at the start of an assembler file.
-
-Normally this macro is defined to output a line containing
-@samp{#NO_APP}, which is a comment that has no effect on most
-assemblers but tells the GNU assembler that it can save time by not
-checking for certain assembler constructs.
-
-On systems that use SDB, it is necessary to output certain commands;
-see @file{attasm.h}.
-
-@findex ASM_FILE_END
-@item ASM_FILE_END (@var{stream})
-A C expression which outputs to the stdio stream @var{stream}
-some appropriate text to go at the end of an assembler file.
-
-If this macro is not defined, the default is to output nothing
-special at the end of the file. Most systems don't require any
-definition.
-
-On systems that use SDB, it is necessary to output certain commands;
-see @file{attasm.h}.
-
-@findex ASM_IDENTIFY_GCC
-@item ASM_IDENTIFY_GCC (@var{file})
-A C statement to output assembler commands which will identify
-the object file as having been compiled with GNU CC (or another
-GNU compiler).
-
-If you don't define this macro, the string @samp{gcc_compiled.:}
-is output. This string is calculated to define a symbol which,
-on BSD systems, will never be defined for any other reason.
-GDB checks for the presence of this symbol when reading the
-symbol table of an executable.
-
-On non-BSD systems, you must arrange communication with GDB in
-some other fashion. If GDB is not used on your system, you can
-define this macro with an empty body.
-
-@findex ASM_COMMENT_START
-@item ASM_COMMENT_START
-A C string constant describing how to begin a comment in the target
-assembler language. The compiler assumes that the comment will end at
-the end of the line.
-
-@findex ASM_APP_ON
-@item ASM_APP_ON
-A C string constant for text to be output before each @code{asm}
-statement or group of consecutive ones. Normally this is
-@code{"#APP"}, which is a comment that has no effect on most
-assemblers but tells the GNU assembler that it must check the lines
-that follow for all valid assembler constructs.
-
-@findex ASM_APP_OFF
-@item ASM_APP_OFF
-A C string constant for text to be output after each @code{asm}
-statement or group of consecutive ones. Normally this is
-@code{"#NO_APP"}, which tells the GNU assembler to resume making the
-time-saving assumptions that are valid for ordinary compiler output.
-
-@findex ASM_OUTPUT_SOURCE_FILENAME
-@item ASM_OUTPUT_SOURCE_FILENAME (@var{stream}, @var{name})
-A C statement to output COFF information or DWARF debugging information
-which indicates that filename @var{name} is the current source file to
-the stdio stream @var{stream}.
-
-This macro need not be defined if the standard form of output
-for the file format in use is appropriate.
-
-@findex OUTPUT_QUOTED_STRING
-@item OUTPUT_QUOTED_STRING (@var{stream}, @var{name})
-A C statement to output the string @var{string} to the stdio stream
-@var{stream}. If you do not call the function @code{output_quoted_string}
-in your config files, GNU CC will only call it to output filenames to
-the assembler source. So you can use it to canonicalize the format
-of the filename using this macro.
-
-@findex ASM_OUTPUT_SOURCE_LINE
-@item ASM_OUTPUT_SOURCE_LINE (@var{stream}, @var{line})
-A C statement to output DBX or SDB debugging information before code
-for line number @var{line} of the current source file to the
-stdio stream @var{stream}.
-
-This macro need not be defined if the standard form of debugging
-information for the debugger in use is appropriate.
-
-@findex ASM_OUTPUT_IDENT
-@item ASM_OUTPUT_IDENT (@var{stream}, @var{string})
-A C statement to output something to the assembler file to handle a
-@samp{#ident} directive containing the text @var{string}. If this
-macro is not defined, nothing is output for a @samp{#ident} directive.
-
-@findex ASM_OUTPUT_SECTION_NAME
-@item ASM_OUTPUT_SECTION_NAME (@var{stream}, @var{decl}, @var{name}, @var{reloc})
-A C statement to output something to the assembler file to switch to section
-@var{name} for object @var{decl} which is either a @code{FUNCTION_DECL}, a
-@code{VAR_DECL} or @code{NULL_TREE}. @var{reloc}
-indicates whether the initial value of @var{exp} requires link-time
-relocations. Some target formats do not support
-arbitrary sections. Do not define this macro in such cases.
-
-At present this macro is only used to support section attributes.
-When this macro is undefined, section attributes are disabled.
-
-@findex OBJC_PROLOGUE
-@item OBJC_PROLOGUE
-A C statement to output any assembler statements which are required to
-precede any Objective C object definitions or message sending. The
-statement is executed only when compiling an Objective C program.
-@end table
-
-@need 2000
-@node Data Output
-@subsection Output of Data
-
-@c prevent bad page break with this line
-This describes data output.
-
-@table @code
-@findex ASM_OUTPUT_LONG_DOUBLE
-@findex ASM_OUTPUT_DOUBLE
-@findex ASM_OUTPUT_FLOAT
-@item ASM_OUTPUT_LONG_DOUBLE (@var{stream}, @var{value})
-@itemx ASM_OUTPUT_DOUBLE (@var{stream}, @var{value})
-@itemx ASM_OUTPUT_FLOAT (@var{stream}, @var{value})
-@itemx ASM_OUTPUT_THREE_QUARTER_FLOAT (@var{stream}, @var{value})
-@itemx ASM_OUTPUT_SHORT_FLOAT (@var{stream}, @var{value})
-@itemx ASM_OUTPUT_BYTE_FLOAT (@var{stream}, @var{value})
-A C statement to output to the stdio stream @var{stream} an assembler
-instruction to assemble a floating-point constant of @code{TFmode},
-@code{DFmode}, @code{SFmode}, @code{TQFmode}, @code{HFmode}, or
-@code{QFmode}, respectively, whose value is @var{value}. @var{value}
-will be a C expression of type @code{REAL_VALUE_TYPE}. Macros such as
-@code{REAL_VALUE_TO_TARGET_DOUBLE} are useful for writing these
-definitions.
-
-@findex ASM_OUTPUT_QUADRUPLE_INT
-@findex ASM_OUTPUT_DOUBLE_INT
-@findex ASM_OUTPUT_INT
-@findex ASM_OUTPUT_SHORT
-@findex ASM_OUTPUT_CHAR
-@findex output_addr_const
-@item ASM_OUTPUT_QUADRUPLE_INT (@var{stream}, @var{exp})
-@itemx ASM_OUTPUT_DOUBLE_INT (@var{stream}, @var{exp})
-@itemx ASM_OUTPUT_INT (@var{stream}, @var{exp})
-@itemx ASM_OUTPUT_SHORT (@var{stream}, @var{exp})
-@itemx ASM_OUTPUT_CHAR (@var{stream}, @var{exp})
-A C statement to output to the stdio stream @var{stream} an assembler
-instruction to assemble an integer of 16, 8, 4, 2 or 1 bytes,
-respectively, whose value is @var{value}. The argument @var{exp} will
-be an RTL expression which represents a constant value. Use
-@samp{output_addr_const (@var{stream}, @var{exp})} to output this value
-as an assembler expression.@refill
-
-For sizes larger than @code{UNITS_PER_WORD}, if the action of a macro
-would be identical to repeatedly calling the macro corresponding to
-a size of @code{UNITS_PER_WORD}, once for each word, you need not define
-the macro.
-
-@findex ASM_OUTPUT_BYTE
-@item ASM_OUTPUT_BYTE (@var{stream}, @var{value})
-A C statement to output to the stdio stream @var{stream} an assembler
-instruction to assemble a single byte containing the number @var{value}.
-
-@findex ASM_BYTE_OP
-@item ASM_BYTE_OP
-A C string constant giving the pseudo-op to use for a sequence of
-single-byte constants. If this macro is not defined, the default is
-@code{"byte"}.
-
-@findex ASM_OUTPUT_ASCII
-@item ASM_OUTPUT_ASCII (@var{stream}, @var{ptr}, @var{len})
-A C statement to output to the stdio stream @var{stream} an assembler
-instruction to assemble a string constant containing the @var{len}
-bytes at @var{ptr}. @var{ptr} will be a C expression of type
-@code{char *} and @var{len} a C expression of type @code{int}.
-
-If the assembler has a @code{.ascii} pseudo-op as found in the
-Berkeley Unix assembler, do not define the macro
-@code{ASM_OUTPUT_ASCII}.
-
-@findex CONSTANT_POOL_BEFORE_FUNCTION
-@item CONSTANT_POOL_BEFORE_FUNCTION
-You may define this macro as a C expression. You should define the
-expression to have a non-zero value if GNU CC should output the constant
-pool for a function before the code for the function, or a zero value if
-GNU CC should output the constant pool after the function. If you do
-not define this macro, the usual case, GNU CC will output the constant
-pool before the function.
-
-@findex ASM_OUTPUT_POOL_PROLOGUE
-@item ASM_OUTPUT_POOL_PROLOGUE (@var{file} @var{funname} @var{fundecl} @var{size})
-A C statement to output assembler commands to define the start of the
-constant pool for a function. @var{funname} is a string giving
-the name of the function. Should the return type of the function
-be required, it can be obtained via @var{fundecl}. @var{size}
-is the size, in bytes, of the constant pool that will be written
-immediately after this call.
-
-If no constant-pool prefix is required, the usual case, this macro need
-not be defined.
-
-@findex ASM_OUTPUT_SPECIAL_POOL_ENTRY
-@item ASM_OUTPUT_SPECIAL_POOL_ENTRY (@var{file}, @var{x}, @var{mode}, @var{align}, @var{labelno}, @var{jumpto})
-A C statement (with or without semicolon) to output a constant in the
-constant pool, if it needs special treatment. (This macro need not do
-anything for RTL expressions that can be output normally.)
-
-The argument @var{file} is the standard I/O stream to output the
-assembler code on. @var{x} is the RTL expression for the constant to
-output, and @var{mode} is the machine mode (in case @var{x} is a
-@samp{const_int}). @var{align} is the required alignment for the value
-@var{x}; you should output an assembler directive to force this much
-alignment.
-
-The argument @var{labelno} is a number to use in an internal label for
-the address of this pool entry. The definition of this macro is
-responsible for outputting the label definition at the proper place.
-Here is how to do this:
-
-@example
-ASM_OUTPUT_INTERNAL_LABEL (@var{file}, "LC", @var{labelno});
-@end example
-
-When you output a pool entry specially, you should end with a
-@code{goto} to the label @var{jumpto}. This will prevent the same pool
-entry from being output a second time in the usual manner.
-
-You need not define this macro if it would do nothing.
-
-@findex CONSTANT_AFTER_FUNCTION_P
-@item CONSTANT_AFTER_FUNCTION_P (@var{exp})
-Define this macro as a C expression which is nonzero if the constant
-@var{exp}, of type @code{tree}, should be output after the code for a
-function. The compiler will normally output all constants before the
-function; you need not define this macro if this is OK.
-
-@findex ASM_OUTPUT_POOL_EPILOGUE
-@item ASM_OUTPUT_POOL_EPILOGUE (@var{file} @var{funname} @var{fundecl} @var{size})
-A C statement to output assembler commands to at the end of the constant
-pool for a function. @var{funname} is a string giving the name of the
-function. Should the return type of the function be required, you can
-obtain it via @var{fundecl}. @var{size} is the size, in bytes, of the
-constant pool that GNU CC wrote immediately before this call.
-
-If no constant-pool epilogue is required, the usual case, you need not
-define this macro.
-
-@findex IS_ASM_LOGICAL_LINE_SEPARATOR
-@item IS_ASM_LOGICAL_LINE_SEPARATOR (@var{C})
-Define this macro as a C expression which is nonzero if @var{C} is
-used as a logical line separator by the assembler.
-
-If you do not define this macro, the default is that only
-the character @samp{;} is treated as a logical line separator.
-
-
-@findex ASM_OPEN_PAREN
-@findex ASM_CLOSE_PAREN
-@item ASM_OPEN_PAREN
-@itemx ASM_CLOSE_PAREN
-These macros are defined as C string constant, describing the syntax
-in the assembler for grouping arithmetic expressions. The following
-definitions are correct for most assemblers:
-
-@example
-#define ASM_OPEN_PAREN "("
-#define ASM_CLOSE_PAREN ")"
-@end example
-@end table
-
- These macros are provided by @file{real.h} for writing the definitions
-of @code{ASM_OUTPUT_DOUBLE} and the like:
-
-@table @code
-@item REAL_VALUE_TO_TARGET_SINGLE (@var{x}, @var{l})
-@itemx REAL_VALUE_TO_TARGET_DOUBLE (@var{x}, @var{l})
-@itemx REAL_VALUE_TO_TARGET_LONG_DOUBLE (@var{x}, @var{l})
-@findex REAL_VALUE_TO_TARGET_SINGLE
-@findex REAL_VALUE_TO_TARGET_DOUBLE
-@findex REAL_VALUE_TO_TARGET_LONG_DOUBLE
-These translate @var{x}, of type @code{REAL_VALUE_TYPE}, to the target's
-floating point representation, and store its bit pattern in the array of
-@code{long int} whose address is @var{l}. The number of elements in the
-output array is determined by the size of the desired target floating
-point data type: 32 bits of it go in each @code{long int} array
-element. Each array element holds 32 bits of the result, even if
-@code{long int} is wider than 32 bits on the host machine.
-
-The array element values are designed so that you can print them out
-using @code{fprintf} in the order they should appear in the target
-machine's memory.
-
-@item REAL_VALUE_TO_DECIMAL (@var{x}, @var{format}, @var{string})
-@findex REAL_VALUE_TO_DECIMAL
-This macro converts @var{x}, of type @code{REAL_VALUE_TYPE}, to a
-decimal number and stores it as a string into @var{string}.
-You must pass, as @var{string}, the address of a long enough block
-of space to hold the result.
-
-The argument @var{format} is a @code{printf}-specification that serves
-as a suggestion for how to format the output string.
-@end table
-
-@node Uninitialized Data
-@subsection Output of Uninitialized Variables
-
-Each of the macros in this section is used to do the whole job of
-outputting a single uninitialized variable.
-
-@table @code
-@findex ASM_OUTPUT_COMMON
-@item ASM_OUTPUT_COMMON (@var{stream}, @var{name}, @var{size}, @var{rounded})
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} the assembler definition of a common-label named
-@var{name} whose size is @var{size} bytes. The variable @var{rounded}
-is the size rounded up to whatever alignment the caller wants.
-
-Use the expression @code{assemble_name (@var{stream}, @var{name})} to
-output the name itself; before and after that, output the additional
-assembler syntax for defining the name, and a newline.
-
-This macro controls how the assembler definitions of uninitialized
-common global variables are output.
-
-@findex ASM_OUTPUT_ALIGNED_COMMON
-@item ASM_OUTPUT_ALIGNED_COMMON (@var{stream}, @var{name}, @var{size}, @var{alignment})
-Like @code{ASM_OUTPUT_COMMON} except takes the required alignment as a
-separate, explicit argument. If you define this macro, it is used in
-place of @code{ASM_OUTPUT_COMMON}, and gives you more flexibility in
-handling the required alignment of the variable. The alignment is specified
-as the number of bits.
-
-@c CYGNUS LOCAL v850/nickc
-@findex ASM_OUTPUT_DECL_COMMON
-@item ASM_OUTPUT_DECL_COMMON (@var{stream}, @var{decl}, @var{name}, @var{size}, @var{alignment})
-Like @code{ASM_OUTPUT_ALIGNED_COMMON} except that it takes an additional
-argument - the @var{decl} of the variable to be output, if there is one.
-This macro can be called with @var{decl} == NULL_TREE. If you define
-this macro, it is used in place of both @code{ASM_OUTPUT_COMMON} and
-@code{ASM_OUTPUT_ALIGNED_COMMON}, and gives you more flexibility in
-handling the destination of the variable.
-@c END CYGNUS LOCAL
-
-@findex ASM_OUTPUT_SHARED_COMMON
-@item ASM_OUTPUT_SHARED_COMMON (@var{stream}, @var{name}, @var{size}, @var{rounded})
-If defined, it is similar to @code{ASM_OUTPUT_COMMON}, except that it
-is used when @var{name} is shared. If not defined, @code{ASM_OUTPUT_COMMON}
-will be used.
-
-@findex ASM_OUTPUT_BSS
-@item ASM_OUTPUT_BSS (@var{stream}, @var{decl}, @var{name}, @var{size}, @var{rounded})
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} the assembler definition of uninitialized global @var{decl} named
-@var{name} whose size is @var{size} bytes. The variable @var{rounded}
-is the size rounded up to whatever alignment the caller wants.
-
-Try to use function @code{asm_output_bss} defined in @file{varasm.c} when
-defining this macro. If unable, use the expression
-@code{assemble_name (@var{stream}, @var{name})} to output the name itself;
-before and after that, output the additional assembler syntax for defining
-the name, and a newline.
-
-This macro controls how the assembler definitions of uninitialized global
-variables are output. This macro exists to properly support languages like
-@code{c++} which do not have @code{common} data. However, this macro currently
-is not defined for all targets. If this macro and
-@code{ASM_OUTPUT_ALIGNED_BSS} are not defined then @code{ASM_OUTPUT_COMMON}
-or @code{ASM_OUTPUT_ALIGNED_COMMON}
-@c CYGNUS LOCAL v850/nickc
-or @code{ASM_OUTPUT_DECL_COMMON}
-@c END CYGNUS LOCAL
-is used.
-
-@findex ASM_OUTPUT_ALIGNED_BSS
-@item ASM_OUTPUT_ALIGNED_BSS (@var{stream}, @var{decl}, @var{name}, @var{size}, @var{alignment})
-Like @code{ASM_OUTPUT_BSS} except takes the required alignment as a
-separate, explicit argument. If you define this macro, it is used in
-place of @code{ASM_OUTPUT_BSS}, and gives you more flexibility in
-handling the required alignment of the variable. The alignment is specified
-as the number of bits.
-
-Try to use function @code{asm_output_aligned_bss} defined in file
-@file{varasm.c} when defining this macro.
-
-@findex ASM_OUTPUT_SHARED_BSS
-@item ASM_OUTPUT_SHARED_BSS (@var{stream}, @var{decl}, @var{name}, @var{size}, @var{rounded})
-If defined, it is similar to @code{ASM_OUTPUT_BSS}, except that it
-is used when @var{name} is shared. If not defined, @code{ASM_OUTPUT_BSS}
-will be used.
-
-@findex ASM_OUTPUT_UNIQUE_BSS
-@item ASM_OUTPUT_UNIQUE_BSS (@var{stream}, @var{decl}, @var{name}, @var{size})
-If defined, it is similar to @code{ASM_OUTPUT_BSS}, except that it
-is used when @var{name} should be placed in its own uniquely named
-section so that it can be subject to linker garbage collection. If not
-defined, @code{ASM_OUTPUT_BSS} will be used.
-
-@findex ASM_OUTPUT_LOCAL
-@item ASM_OUTPUT_LOCAL (@var{stream}, @var{name}, @var{size}, @var{rounded})
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} the assembler definition of a local-common-label named
-@var{name} whose size is @var{size} bytes. The variable @var{rounded}
-is the size rounded up to whatever alignment the caller wants.
-
-Use the expression @code{assemble_name (@var{stream}, @var{name})} to
-output the name itself; before and after that, output the additional
-assembler syntax for defining the name, and a newline.
-
-This macro controls how the assembler definitions of uninitialized
-static variables are output.
-
-@findex ASM_OUTPUT_ALIGNED_LOCAL
-@item ASM_OUTPUT_ALIGNED_LOCAL (@var{stream}, @var{name}, @var{size}, @var{alignment})
-Like @code{ASM_OUTPUT_LOCAL} except takes the required alignment as a
-separate, explicit argument. If you define this macro, it is used in
-place of @code{ASM_OUTPUT_LOCAL}, and gives you more flexibility in
-handling the required alignment of the variable. The alignment is specified
-as the number of bits.
-
-@c CYGNUS LOCAL v850/nickc
-@findex ASM_OUTPUT_DECL_LOCAL
-@item ASM_OUTPUT_DECL_LOCAL (@var{stream}, @var{decl}, @var{name}, @var{size}, @var{alignment})
-Like @code{ASM_OUTPUT_ALIGNED_LOCAL} except that it takes an additional
-parameter - the @var{decl} of variable to be output, if there is one.
-This macro can be called with @var{decl} == NULL_TREE. If you define this
-macro, it is used in place of @code{ASM_OUTPUT_LOCAL} and
-@code{ASM_OUTPUT_ALIGNED_LOCAL}, and gives you more flexibility in
-handling the destination of the variable.
-@c END CYGNUS LOCAL
-
-@findex ASM_OUTPUT_SHARED_LOCAL
-@item ASM_OUTPUT_SHARED_LOCAL (@var{stream}, @var{name}, @var{size}, @var{rounded})
-If defined, it is similar to @code{ASM_OUTPUT_LOCAL}, except that it
-is used when @var{name} is shared. If not defined, @code{ASM_OUTPUT_LOCAL}
-will be used.
-
-@findex ASM_OUTPUT_UNIQUE_LOCAL
-@item ASM_OUTPUT_UNIQUE_LOCAL (@var{stream}, @var{decl}, @var{name}, @var{size})
-If defined, it is similar to @code{ASM_OUTPUT_LOCAL}, except that it
-is used when @var{name} should be placed in its own uniquely named
-section so that it can be subject to linker garbage collection. If not
-defined, @code{ASM_OUTPUT_LOCAL} will be used.
-
-@end table
-
-@node Label Output
-@subsection Output and Generation of Labels
-
-@c prevent bad page break with this line
-This is about outputting labels.
-
-@table @code
-@findex ASM_OUTPUT_LABEL
-@findex assemble_name
-@item ASM_OUTPUT_LABEL (@var{stream}, @var{name})
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} the assembler definition of a label named @var{name}.
-Use the expression @code{assemble_name (@var{stream}, @var{name})} to
-output the name itself; before and after that, output the additional
-assembler syntax for defining the name, and a newline.
-
-@findex ASM_DECLARE_FUNCTION_NAME
-@item ASM_DECLARE_FUNCTION_NAME (@var{stream}, @var{name}, @var{decl})
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} any text necessary for declaring the name @var{name} of a
-function which is being defined. This macro is responsible for
-outputting the label definition (perhaps using
-@code{ASM_OUTPUT_LABEL}). The argument @var{decl} is the
-@code{FUNCTION_DECL} tree node representing the function.
-
-If this macro is not defined, then the function name is defined in the
-usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
-
-@findex ASM_DECLARE_FUNCTION_SIZE
-@item ASM_DECLARE_FUNCTION_SIZE (@var{stream}, @var{name}, @var{decl})
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} any text necessary for declaring the size of a function
-which is being defined. The argument @var{name} is the name of the
-function. The argument @var{decl} is the @code{FUNCTION_DECL} tree node
-representing the function.
-
-If this macro is not defined, then the function size is not defined.
-
-@findex ASM_DECLARE_OBJECT_NAME
-@item ASM_DECLARE_OBJECT_NAME (@var{stream}, @var{name}, @var{decl})
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} any text necessary for declaring the name @var{name} of an
-initialized variable which is being defined. This macro must output the
-label definition (perhaps using @code{ASM_OUTPUT_LABEL}). The argument
-@var{decl} is the @code{VAR_DECL} tree node representing the variable.
-
-If this macro is not defined, then the variable name is defined in the
-usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
-
-@findex ASM_FINISH_DECLARE_OBJECT
-@item ASM_FINISH_DECLARE_OBJECT (@var{stream}, @var{decl}, @var{toplevel}, @var{atend})
-A C statement (sans semicolon) to finish up declaring a variable name
-once the compiler has processed its initializer fully and thus has had a
-chance to determine the size of an array when controlled by an
-initializer. This is used on systems where it's necessary to declare
-something about the size of the object.
-
-If you don't define this macro, that is equivalent to defining it to do
-nothing.
-
-@findex ASM_GLOBALIZE_LABEL
-@item ASM_GLOBALIZE_LABEL (@var{stream}, @var{name})
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} some commands that will make the label @var{name} global;
-that is, available for reference from other files. Use the expression
-@code{assemble_name (@var{stream}, @var{name})} to output the name
-itself; before and after that, output the additional assembler syntax
-for making that name global, and a newline.
-
-@findex ASM_WEAKEN_LABEL
-@item ASM_WEAKEN_LABEL
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} some commands that will make the label @var{name} weak;
-that is, available for reference from other files but only used if
-no other definition is available. Use the expression
-@code{assemble_name (@var{stream}, @var{name})} to output the name
-itself; before and after that, output the additional assembler syntax
-for making that name weak, and a newline.
-
-If you don't define this macro, GNU CC will not support weak
-symbols and you should not define the @code{SUPPORTS_WEAK} macro.
-
-@findex SUPPORTS_WEAK
-@item SUPPORTS_WEAK
-A C expression which evaluates to true if the target supports weak symbols.
-
-If you don't define this macro, @file{defaults.h} provides a default
-definition. If @code{ASM_WEAKEN_LABEL} is defined, the default
-definition is @samp{1}; otherwise, it is @samp{0}. Define this macro if
-you want to control weak symbol support with a compiler flag such as
-@samp{-melf}.
-
-@findex MAKE_DECL_ONE_ONLY (@var{decl})
-@item MAKE_DECL_ONE_ONLY
-A C statement (sans semicolon) to mark @var{decl} to be emitted as a
-public symbol such that extra copies in multiple translation units will
-be discarded by the linker. Define this macro if your object file
-format provides support for this concept, such as the @samp{COMDAT}
-section flags in the Microsoft Windows PE/COFF format, and this support
-requires changes to @var{decl}, such as putting it in a separate section.
-
-@findex SUPPORTS_ONE_ONLY
-@item SUPPORTS_ONE_ONLY
-A C expression which evaluates to true if the target supports one-only
-semantics.
-
-If you don't define this macro, @file{varasm.c} provides a default
-definition. If @code{MAKE_DECL_ONE_ONLY} is defined, the default
-definition is @samp{1}; otherwise, it is @samp{0}. Define this macro if
-you want to control one-only symbol support with a compiler flag, or if
-setting the @code{DECL_ONE_ONLY} flag is enough to mark a declaration to
-be emitted as one-only.
-
-@findex ASM_OUTPUT_EXTERNAL
-@item ASM_OUTPUT_EXTERNAL (@var{stream}, @var{decl}, @var{name})
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} any text necessary for declaring the name of an external
-symbol named @var{name} which is referenced in this compilation but
-not defined. The value of @var{decl} is the tree node for the
-declaration.
-
-This macro need not be defined if it does not need to output anything.
-The GNU assembler and most Unix assemblers don't require anything.
-
-@findex ASM_OUTPUT_EXTERNAL_LIBCALL
-@item ASM_OUTPUT_EXTERNAL_LIBCALL (@var{stream}, @var{symref})
-A C statement (sans semicolon) to output on @var{stream} an assembler
-pseudo-op to declare a library function name external. The name of the
-library function is given by @var{symref}, which has type @code{rtx} and
-is a @code{symbol_ref}.
-
-This macro need not be defined if it does not need to output anything.
-The GNU assembler and most Unix assemblers don't require anything.
-
-@findex ASM_OUTPUT_LABELREF
-@item ASM_OUTPUT_LABELREF (@var{stream}, @var{name})
-A C statement (sans semicolon) to output to the stdio stream
-@var{stream} a reference in assembler syntax to a label named
-@var{name}. This should add @samp{_} to the front of the name, if that
-is customary on your operating system, as it is in most Berkeley Unix
-systems. This macro is used in @code{assemble_name}.
-
-@ignore @c Seems not to exist anymore.
-@findex ASM_OUTPUT_LABELREF_AS_INT
-@item ASM_OUTPUT_LABELREF_AS_INT (@var{file}, @var{label})
-Define this macro for systems that use the program @code{collect2}.
-The definition should be a C statement to output a word containing
-a reference to the label @var{label}.
-@end ignore
-
-@findex ASM_OUTPUT_INTERNAL_LABEL
-@item ASM_OUTPUT_INTERNAL_LABEL (@var{stream}, @var{prefix}, @var{num})
-A C statement to output to the stdio stream @var{stream} a label whose
-name is made from the string @var{prefix} and the number @var{num}.
-
-It is absolutely essential that these labels be distinct from the labels
-used for user-level functions and variables. Otherwise, certain programs
-will have name conflicts with internal labels.
-
-It is desirable to exclude internal labels from the symbol table of the
-object file. Most assemblers have a naming convention for labels that
-should be excluded; on many systems, the letter @samp{L} at the
-beginning of a label has this effect. You should find out what
-convention your system uses, and follow it.
-
-The usual definition of this macro is as follows:
-
-@example
-fprintf (@var{stream}, "L%s%d:\n", @var{prefix}, @var{num})
-@end example
-
-@findex ASM_GENERATE_INTERNAL_LABEL
-@item ASM_GENERATE_INTERNAL_LABEL (@var{string}, @var{prefix}, @var{num})
-A C statement to store into the string @var{string} a label whose name
-is made from the string @var{prefix} and the number @var{num}.
-
-This string, when output subsequently by @code{assemble_name}, should
-produce the output that @code{ASM_OUTPUT_INTERNAL_LABEL} would produce
-with the same @var{prefix} and @var{num}.
-
-If the string begins with @samp{*}, then @code{assemble_name} will
-output the rest of the string unchanged. It is often convenient for
-@code{ASM_GENERATE_INTERNAL_LABEL} to use @samp{*} in this way. If the
-string doesn't start with @samp{*}, then @code{ASM_OUTPUT_LABELREF} gets
-to output the string, and may change it. (Of course,
-@code{ASM_OUTPUT_LABELREF} is also part of your machine description, so
-you should know what it does on your machine.)
-
-@findex ASM_FORMAT_PRIVATE_NAME
-@item ASM_FORMAT_PRIVATE_NAME (@var{outvar}, @var{name}, @var{number})
-A C expression to assign to @var{outvar} (which is a variable of type
-@code{char *}) a newly allocated string made from the string
-@var{name} and the number @var{number}, with some suitable punctuation
-added. Use @code{alloca} to get space for the string.
-
-The string will be used as an argument to @code{ASM_OUTPUT_LABELREF} to
-produce an assembler label for an internal static variable whose name is
-@var{name}. Therefore, the string must be such as to result in valid
-assembler code. The argument @var{number} is different each time this
-macro is executed; it prevents conflicts between similarly-named
-internal static variables in different scopes.
-
-Ideally this string should not be a valid C identifier, to prevent any
-conflict with the user's own symbols. Most assemblers allow periods
-or percent signs in assembler symbols; putting at least one of these
-between the name and the number will suffice.
-
-@findex ASM_OUTPUT_DEF
-@item ASM_OUTPUT_DEF (@var{stream}, @var{name}, @var{value})
-A C statement to output to the stdio stream @var{stream} assembler code
-which defines (equates) the symbol @var{name} to have the value @var{value}.
-
-If SET_ASM_OP is defined, a default definition is provided which is
-correct for most systems.
-
-@findex ASM_OUTPUT_DEF_FROM_DECLS
-@item ASM_OUTPUT_DEF (@var{stream}, @var{decl_of_name}, @var{decl_of_value})
-A C statement to output to the stdio stream @var{stream} assembler code
-which defines (equates) the symbol whoes tree node is @var{decl_of_name}
-to have the value of the tree node @var{decl_of_value}. This macro will
-be used in preference to @samp{ASM_OUTPUT_DEF} if it is defined and if
-the tree nodes are available.
-
-@findex ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
-@item ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL (@var{stream}, @var{symbol}, @var{high}, @var{low})
-A C statement to output to the stdio stream @var{stream} assembler code
-which defines (equates) the symbol @var{symbol} to have a value equal to
-the difference of the two symbols @var{high} and @var{low}, i.e.
-@var{high} minus @var{low}. GNU CC guarantees that the symbols @var{high}
-and @var{low} are already known by the assembler so that the difference
-resolves into a constant.
-
-If SET_ASM_OP is defined, a default definition is provided which is
-correct for most systems.
-
-@findex ASM_OUTPUT_WEAK_ALIAS
-@item ASM_OUTPUT_WEAK_ALIAS (@var{stream}, @var{name}, @var{value})
-A C statement to output to the stdio stream @var{stream} assembler code
-which defines (equates) the weak symbol @var{name} to have the value
-@var{value}.
-
-Define this macro if the target only supports weak aliases; define
-ASM_OUTPUT_DEF instead if possible.
-
-@findex OBJC_GEN_METHOD_LABEL
-@item OBJC_GEN_METHOD_LABEL (@var{buf}, @var{is_inst}, @var{class_name}, @var{cat_name}, @var{sel_name})
-Define this macro to override the default assembler names used for
-Objective C methods.
-
-The default name is a unique method number followed by the name of the
-class (e.g.@: @samp{_1_Foo}). For methods in categories, the name of
-the category is also included in the assembler name (e.g.@:
-@samp{_1_Foo_Bar}).
-
-These names are safe on most systems, but make debugging difficult since
-the method's selector is not present in the name. Therefore, particular
-systems define other ways of computing names.
-
-@var{buf} is an expression of type @code{char *} which gives you a
-buffer in which to store the name; its length is as long as
-@var{class_name}, @var{cat_name} and @var{sel_name} put together, plus
-50 characters extra.
-
-The argument @var{is_inst} specifies whether the method is an instance
-method or a class method; @var{class_name} is the name of the class;
-@var{cat_name} is the name of the category (or NULL if the method is not
-in a category); and @var{sel_name} is the name of the selector.
-
-On systems where the assembler can handle quoted names, you can use this
-macro to provide more human-readable names.
-@end table
-
-@node Initialization
-@subsection How Initialization Functions Are Handled
-@cindex initialization routines
-@cindex termination routines
-@cindex constructors, output of
-@cindex destructors, output of
-
-The compiled code for certain languages includes @dfn{constructors}
-(also called @dfn{initialization routines})---functions to initialize
-data in the program when the program is started. These functions need
-to be called before the program is ``started''---that is to say, before
-@code{main} is called.
-
-Compiling some languages generates @dfn{destructors} (also called
-@dfn{termination routines}) that should be called when the program
-terminates.
-
-To make the initialization and termination functions work, the compiler
-must output something in the assembler code to cause those functions to
-be called at the appropriate time. When you port the compiler to a new
-system, you need to specify how to do this.
-
-There are two major ways that GCC currently supports the execution of
-initialization and termination functions. Each way has two variants.
-Much of the structure is common to all four variations.
-
-@findex __CTOR_LIST__
-@findex __DTOR_LIST__
-The linker must build two lists of these functions---a list of
-initialization functions, called @code{__CTOR_LIST__}, and a list of
-termination functions, called @code{__DTOR_LIST__}.
-
-Each list always begins with an ignored function pointer (which may hold
-0, @minus{}1, or a count of the function pointers after it, depending on
-the environment). This is followed by a series of zero or more function
-pointers to constructors (or destructors), followed by a function
-pointer containing zero.
-
-Depending on the operating system and its executable file format, either
-@file{crtstuff.c} or @file{libgcc2.c} traverses these lists at startup
-time and exit time. Constructors are called in reverse order of the
-list; destructors in forward order.
-
-The best way to handle static constructors works only for object file
-formats which provide arbitrarily-named sections. A section is set
-aside for a list of constructors, and another for a list of destructors.
-Traditionally these are called @samp{.ctors} and @samp{.dtors}. Each
-object file that defines an initialization function also puts a word in
-the constructor section to point to that function. The linker
-accumulates all these words into one contiguous @samp{.ctors} section.
-Termination functions are handled similarly.
-
-To use this method, you need appropriate definitions of the macros
-@code{ASM_OUTPUT_CONSTRUCTOR} and @code{ASM_OUTPUT_DESTRUCTOR}. Usually
-you can get them by including @file{svr4.h}.
-
-When arbitrary sections are available, there are two variants, depending
-upon how the code in @file{crtstuff.c} is called. On systems that
-support an @dfn{init} section which is executed at program startup,
-parts of @file{crtstuff.c} are compiled into that section. The
-program is linked by the @code{gcc} driver like this:
-
-@example
-ld -o @var{output_file} crtbegin.o @dots{} crtend.o -lgcc
-@end example
-
-The head of a function (@code{__do_global_ctors}) appears in the init
-section of @file{crtbegin.o}; the remainder of the function appears in
-the init section of @file{crtend.o}. The linker will pull these two
-parts of the section together, making a whole function. If any of the
-user's object files linked into the middle of it contribute code, then that
-code will be executed as part of the body of @code{__do_global_ctors}.
-
-To use this variant, you must define the @code{INIT_SECTION_ASM_OP}
-macro properly.
-
-If no init section is available, do not define
-@code{INIT_SECTION_ASM_OP}. Then @code{__do_global_ctors} is built into
-the text section like all other functions, and resides in
-@file{libgcc.a}. When GCC compiles any function called @code{main}, it
-inserts a procedure call to @code{__main} as the first executable code
-after the function prologue. The @code{__main} function, also defined
-in @file{libgcc2.c}, simply calls @file{__do_global_ctors}.
-
-In file formats that don't support arbitrary sections, there are again
-two variants. In the simplest variant, the GNU linker (GNU @code{ld})
-and an `a.out' format must be used. In this case,
-@code{ASM_OUTPUT_CONSTRUCTOR} is defined to produce a @code{.stabs}
-entry of type @samp{N_SETT}, referencing the name @code{__CTOR_LIST__},
-and with the address of the void function containing the initialization
-code as its value. The GNU linker recognizes this as a request to add
-the value to a ``set''; the values are accumulated, and are eventually
-placed in the executable as a vector in the format described above, with
-a leading (ignored) count and a trailing zero element.
-@code{ASM_OUTPUT_DESTRUCTOR} is handled similarly. Since no init
-section is available, the absence of @code{INIT_SECTION_ASM_OP} causes
-the compilation of @code{main} to call @code{__main} as above, starting
-the initialization process.
-
-The last variant uses neither arbitrary sections nor the GNU linker.
-This is preferable when you want to do dynamic linking and when using
-file formats which the GNU linker does not support, such as `ECOFF'. In
-this case, @code{ASM_OUTPUT_CONSTRUCTOR} does not produce an
-@code{N_SETT} symbol; initialization and termination functions are
-recognized simply by their names. This requires an extra program in the
-linkage step, called @code{collect2}. This program pretends to be the
-linker, for use with GNU CC; it does its job by running the ordinary
-linker, but also arranges to include the vectors of initialization and
-termination functions. These functions are called via @code{__main} as
-described above.
-
-Choosing among these configuration options has been simplified by a set
-of operating-system-dependent files in the @file{config} subdirectory.
-These files define all of the relevant parameters. Usually it is
-sufficient to include one into your specific machine-dependent
-configuration file. These files are:
-
-@table @file
-@item aoutos.h
-For operating systems using the `a.out' format.
-
-@item next.h
-For operating systems using the `MachO' format.
-
-@item svr3.h
-For System V Release 3 and similar systems using `COFF' format.
-
-@item svr4.h
-For System V Release 4 and similar systems using `ELF' format.
-
-@item vms.h
-For the VMS operating system.
-@end table
-
-@ifinfo
-The following section describes the specific macros that control and
-customize the handling of initialization and termination functions.
-@end ifinfo
-
-@node Macros for Initialization
-@subsection Macros Controlling Initialization Routines
-
-Here are the macros that control how the compiler handles initialization
-and termination functions:
-
-@table @code
-@findex INIT_SECTION_ASM_OP
-@item INIT_SECTION_ASM_OP
-If defined, a C string constant for the assembler operation to identify
-the following data as initialization code. If not defined, GNU CC will
-assume such a section does not exist. When you are using special
-sections for initialization and termination functions, this macro also
-controls how @file{crtstuff.c} and @file{libgcc2.c} arrange to run the
-initialization functions.
-
-@item HAS_INIT_SECTION
-@findex HAS_INIT_SECTION
-If defined, @code{main} will not call @code{__main} as described above.
-This macro should be defined for systems that control the contents of the
-init section on a symbol-by-symbol basis, such as OSF/1, and should not
-be defined explicitly for systems that support
-@code{INIT_SECTION_ASM_OP}.
-
-@item LD_INIT_SWITCH
-@findex LD_INIT_SWITCH
-If defined, a C string constant for a switch that tells the linker that
-the following symbol is an initialization routine.
-
-@item LD_FINI_SWITCH
-@findex LD_FINI_SWITCH
-If defined, a C string constant for a switch that tells the linker that
-the following symbol is a finalization routine.
-
-@item INVOKE__main
-@findex INVOKE__main
-If defined, @code{main} will call @code{__main} despite the presence of
-@code{INIT_SECTION_ASM_OP}. This macro should be defined for systems
-where the init section is not actually run automatically, but is still
-useful for collecting the lists of constructors and destructors.
-
-@item ASM_OUTPUT_CONSTRUCTOR (@var{stream}, @var{name})
-@findex ASM_OUTPUT_CONSTRUCTOR
-Define this macro as a C statement to output on the stream @var{stream}
-the assembler code to arrange to call the function named @var{name} at
-initialization time.
-
-Assume that @var{name} is the name of a C function generated
-automatically by the compiler. This function takes no arguments. Use
-the function @code{assemble_name} to output the name @var{name}; this
-performs any system-specific syntactic transformations such as adding an
-underscore.
-
-If you don't define this macro, nothing special is output to arrange to
-call the function. This is correct when the function will be called in
-some other manner---for example, by means of the @code{collect2} program,
-which looks through the symbol table to find these functions by their
-names.
-
-@item ASM_OUTPUT_DESTRUCTOR (@var{stream}, @var{name})
-@findex ASM_OUTPUT_DESTRUCTOR
-This is like @code{ASM_OUTPUT_CONSTRUCTOR} but used for termination
-functions rather than initialization functions.
-@end table
-
-If your system uses @code{collect2} as the means of processing
-constructors, then that program normally uses @code{nm} to scan an
-object file for constructor functions to be called. On certain kinds of
-systems, you can define these macros to make @code{collect2} work faster
-(and, in some cases, make it work at all):
-
-@table @code
-@findex OBJECT_FORMAT_COFF
-@item OBJECT_FORMAT_COFF
-Define this macro if the system uses COFF (Common Object File Format)
-object files, so that @code{collect2} can assume this format and scan
-object files directly for dynamic constructor/destructor functions.
-
-@findex OBJECT_FORMAT_ROSE
-@item OBJECT_FORMAT_ROSE
-Define this macro if the system uses ROSE format object files, so that
-@code{collect2} can assume this format and scan object files directly
-for dynamic constructor/destructor functions.
-
-These macros are effective only in a native compiler; @code{collect2} as
-part of a cross compiler always uses @code{nm} for the target machine.
-
-@findex REAL_NM_FILE_NAME
-@item REAL_NM_FILE_NAME
-Define this macro as a C string constant containing the file name to use
-to execute @code{nm}. The default is to search the path normally for
-@code{nm}.
-
-If your system supports shared libraries and has a program to list the
-dynamic dependencies of a given library or executable, you can define
-these macros to enable support for running initialization and
-termination functions in shared libraries:
-
-@findex LDD_SUFFIX
-@item LDD_SUFFIX
-Define this macro to a C string constant containing the name of the
-program which lists dynamic dependencies, like @code{"ldd"} under SunOS 4.
-
-@findex PARSE_LDD_OUTPUT
-@item PARSE_LDD_OUTPUT (@var{PTR})
-Define this macro to be C code that extracts filenames from the output
-of the program denoted by @code{LDD_SUFFIX}. @var{PTR} is a variable
-of type @code{char *} that points to the beginning of a line of output
-from @code{LDD_SUFFIX}. If the line lists a dynamic dependency, the
-code must advance @var{PTR} to the beginning of the filename on that
-line. Otherwise, it must set @var{PTR} to @code{NULL}.
-
-@end table
-
-@node Instruction Output
-@subsection Output of Assembler Instructions
-
-@c prevent bad page break with this line
-This describes assembler instruction output.
-
-@table @code
-@findex REGISTER_NAMES
-@item REGISTER_NAMES
-A C initializer containing the assembler's names for the machine
-registers, each one as a C string constant. This is what translates
-register numbers in the compiler into assembler language.
-
-@findex ADDITIONAL_REGISTER_NAMES
-@item ADDITIONAL_REGISTER_NAMES
-If defined, a C initializer for an array of structures containing a name
-and a register number. This macro defines additional names for hard
-registers, thus allowing the @code{asm} option in declarations to refer
-to registers using alternate names.
-
-@findex ASM_OUTPUT_OPCODE
-@item ASM_OUTPUT_OPCODE (@var{stream}, @var{ptr})
-Define this macro if you are using an unusual assembler that
-requires different names for the machine instructions.
-
-The definition is a C statement or statements which output an
-assembler instruction opcode to the stdio stream @var{stream}. The
-macro-operand @var{ptr} is a variable of type @code{char *} which
-points to the opcode name in its ``internal'' form---the form that is
-written in the machine description. The definition should output the
-opcode name to @var{stream}, performing any translation you desire, and
-increment the variable @var{ptr} to point at the end of the opcode
-so that it will not be output twice.
-
-In fact, your macro definition may process less than the entire opcode
-name, or more than the opcode name; but if you want to process text
-that includes @samp{%}-sequences to substitute operands, you must take
-care of the substitution yourself. Just be sure to increment
-@var{ptr} over whatever text should not be output normally.
-
-@findex recog_operand
-If you need to look at the operand values, they can be found as the
-elements of @code{recog_operand}.
-
-If the macro definition does nothing, the instruction is output
-in the usual way.
-
-@findex FINAL_PRESCAN_INSN
-@item FINAL_PRESCAN_INSN (@var{insn}, @var{opvec}, @var{noperands})
-If defined, a C statement to be executed just prior to the output of
-assembler code for @var{insn}, to modify the extracted operands so
-they will be output differently.
-
-Here the argument @var{opvec} is the vector containing the operands
-extracted from @var{insn}, and @var{noperands} is the number of
-elements of the vector which contain meaningful data for this insn.
-The contents of this vector are what will be used to convert the insn
-template into assembler code, so you can change the assembler output
-by changing the contents of the vector.
-
-This macro is useful when various assembler syntaxes share a single
-file of instruction patterns; by defining this macro differently, you
-can cause a large class of instructions to be output differently (such
-as with rearranged operands). Naturally, variations in assembler
-syntax affecting individual insn patterns ought to be handled by
-writing conditional output routines in those patterns.
-
-If this macro is not defined, it is equivalent to a null statement.
-
-@findex FINAL_PRESCAN_LABEL
-@item FINAL_PRESCAN_LABEL
-If defined, @code{FINAL_PRESCAN_INSN} will be called on each
-@code{CODE_LABEL}. In that case, @var{opvec} will be a null pointer and
-@var{noperands} will be zero.
-
-@findex PRINT_OPERAND
-@item PRINT_OPERAND (@var{stream}, @var{x}, @var{code})
-A C compound statement to output to stdio stream @var{stream} the
-assembler syntax for an instruction operand @var{x}. @var{x} is an
-RTL expression.
-
-@var{code} is a value that can be used to specify one of several ways
-of printing the operand. It is used when identical operands must be
-printed differently depending on the context. @var{code} comes from
-the @samp{%} specification that was used to request printing of the
-operand. If the specification was just @samp{%@var{digit}} then
-@var{code} is 0; if the specification was @samp{%@var{ltr}
-@var{digit}} then @var{code} is the ASCII code for @var{ltr}.
-
-@findex reg_names
-If @var{x} is a register, this macro should print the register's name.
-The names can be found in an array @code{reg_names} whose type is
-@code{char *[]}. @code{reg_names} is initialized from
-@code{REGISTER_NAMES}.
-
-When the machine description has a specification @samp{%@var{punct}}
-(a @samp{%} followed by a punctuation character), this macro is called
-with a null pointer for @var{x} and the punctuation character for
-@var{code}.
-
-@findex PRINT_OPERAND_PUNCT_VALID_P
-@item PRINT_OPERAND_PUNCT_VALID_P (@var{code})
-A C expression which evaluates to true if @var{code} is a valid
-punctuation character for use in the @code{PRINT_OPERAND} macro. If
-@code{PRINT_OPERAND_PUNCT_VALID_P} is not defined, it means that no
-punctuation characters (except for the standard one, @samp{%}) are used
-in this way.
-
-@findex PRINT_OPERAND_ADDRESS
-@item PRINT_OPERAND_ADDRESS (@var{stream}, @var{x})
-A C compound statement to output to stdio stream @var{stream} the
-assembler syntax for an instruction operand that is a memory reference
-whose address is @var{x}. @var{x} is an RTL expression.
-
-@cindex @code{ENCODE_SECTION_INFO} usage
-On some machines, the syntax for a symbolic address depends on the
-section that the address refers to. On these machines, define the macro
-@code{ENCODE_SECTION_INFO} to store the information into the
-@code{symbol_ref}, and then check for it here. @xref{Assembler Format}.
-
-@findex DBR_OUTPUT_SEQEND
-@findex dbr_sequence_length
-@item DBR_OUTPUT_SEQEND(@var{file})
-A C statement, to be executed after all slot-filler instructions have
-been output. If necessary, call @code{dbr_sequence_length} to
-determine the number of slots filled in a sequence (zero if not
-currently outputting a sequence), to decide how many no-ops to output,
-or whatever.
-
-Don't define this macro if it has nothing to do, but it is helpful in
-reading assembly output if the extent of the delay sequence is made
-explicit (e.g. with white space).
-
-@findex final_sequence
-Note that output routines for instructions with delay slots must be
-prepared to deal with not being output as part of a sequence (i.e.
-when the scheduling pass is not run, or when no slot fillers could be
-found.) The variable @code{final_sequence} is null when not
-processing a sequence, otherwise it contains the @code{sequence} rtx
-being output.
-
-@findex REGISTER_PREFIX
-@findex LOCAL_LABEL_PREFIX
-@findex USER_LABEL_PREFIX
-@findex IMMEDIATE_PREFIX
-@findex asm_fprintf
-@item REGISTER_PREFIX
-@itemx LOCAL_LABEL_PREFIX
-@itemx USER_LABEL_PREFIX
-@itemx IMMEDIATE_PREFIX
-If defined, C string expressions to be used for the @samp{%R}, @samp{%L},
-@samp{%U}, and @samp{%I} options of @code{asm_fprintf} (see
-@file{final.c}). These are useful when a single @file{md} file must
-support multiple assembler formats. In that case, the various @file{tm.h}
-files can define these macros differently.
-
-@findex ASSEMBLER_DIALECT
-@item ASSEMBLER_DIALECT
-If your target supports multiple dialects of assembler language (such as
-different opcodes), define this macro as a C expression that gives the
-numeric index of the assembler language dialect to use, with zero as the
-first variant.
-
-If this macro is defined, you may use constructs of the form
-@samp{@{option0|option1|option2@dots{}@}} in the output
-templates of patterns (@pxref{Output Template}) or in the first argument
-of @code{asm_fprintf}. This construct outputs @samp{option0},
-@samp{option1} or @samp{option2}, etc., if the value of
-@code{ASSEMBLER_DIALECT} is zero, one or two, etc. Any special
-characters within these strings retain their usual meaning.
-
-If you do not define this macro, the characters @samp{@{}, @samp{|} and
-@samp{@}} do not have any special meaning when used in templates or
-operands to @code{asm_fprintf}.
-
-Define the macros @code{REGISTER_PREFIX}, @code{LOCAL_LABEL_PREFIX},
-@code{USER_LABEL_PREFIX} and @code{IMMEDIATE_PREFIX} if you can express
-the variations in assembler language syntax with that mechanism. Define
-@code{ASSEMBLER_DIALECT} and use the @samp{@{option0|option1@}} syntax
-if the syntax variant are larger and involve such things as different
-opcodes or operand order.
-
-@findex ASM_OUTPUT_REG_PUSH
-@item ASM_OUTPUT_REG_PUSH (@var{stream}, @var{regno})
-A C expression to output to @var{stream} some assembler code
-which will push hard register number @var{regno} onto the stack.
-The code need not be optimal, since this macro is used only when
-profiling.
-
-@findex ASM_OUTPUT_REG_POP
-@item ASM_OUTPUT_REG_POP (@var{stream}, @var{regno})
-A C expression to output to @var{stream} some assembler code
-which will pop hard register number @var{regno} off of the stack.
-The code need not be optimal, since this macro is used only when
-profiling.
-@end table
-
-@node Dispatch Tables
-@subsection Output of Dispatch Tables
-
-@c prevent bad page break with this line
-This concerns dispatch tables.
-
-@table @code
-@cindex dispatch table
-@findex ASM_OUTPUT_ADDR_DIFF_ELT
-@item ASM_OUTPUT_ADDR_DIFF_ELT (@var{stream}, @var{body}, @var{value}, @var{rel})
-A C statement to output to the stdio stream @var{stream} an assembler
-pseudo-instruction to generate a difference between two labels.
-@var{value} and @var{rel} are the numbers of two internal labels. The
-definitions of these labels are output using
-@code{ASM_OUTPUT_INTERNAL_LABEL}, and they must be printed in the same
-way here. For example,
-
-@example
-fprintf (@var{stream}, "\t.word L%d-L%d\n",
- @var{value}, @var{rel})
-@end example
-
-You must provide this macro on machines where the addresses in a
-dispatch table are relative to the table's own address. If defined, GNU
-CC will also use this macro on all machines when producing PIC.
-@var{body} is the body of the ADDR_DIFF_VEC; it is provided so that the
-mode and flags can be read.
-
-@findex ASM_OUTPUT_ADDR_VEC_ELT
-@item ASM_OUTPUT_ADDR_VEC_ELT (@var{stream}, @var{value})
-This macro should be provided on machines where the addresses
-in a dispatch table are absolute.
-
-The definition should be a C statement to output to the stdio stream
-@var{stream} an assembler pseudo-instruction to generate a reference to
-a label. @var{value} is the number of an internal label whose
-definition is output using @code{ASM_OUTPUT_INTERNAL_LABEL}.
-For example,
-
-@example
-fprintf (@var{stream}, "\t.word L%d\n", @var{value})
-@end example
-
-@findex ASM_OUTPUT_CASE_LABEL
-@item ASM_OUTPUT_CASE_LABEL (@var{stream}, @var{prefix}, @var{num}, @var{table})
-Define this if the label before a jump-table needs to be output
-specially. The first three arguments are the same as for
-@code{ASM_OUTPUT_INTERNAL_LABEL}; the fourth argument is the
-jump-table which follows (a @code{jump_insn} containing an
-@code{addr_vec} or @code{addr_diff_vec}).
-
-This feature is used on system V to output a @code{swbeg} statement
-for the table.
-
-If this macro is not defined, these labels are output with
-@code{ASM_OUTPUT_INTERNAL_LABEL}.
-
-@findex ASM_OUTPUT_CASE_END
-@item ASM_OUTPUT_CASE_END (@var{stream}, @var{num}, @var{table})
-Define this if something special must be output at the end of a
-jump-table. The definition should be a C statement to be executed
-after the assembler code for the table is written. It should write
-the appropriate code to stdio stream @var{stream}. The argument
-@var{table} is the jump-table insn, and @var{num} is the label-number
-of the preceding label.
-
-If this macro is not defined, nothing special is output at the end of
-the jump-table.
-@end table
-
-@node Exception Region Output
-@subsection Assembler Commands for Exception Regions
-
-@c prevent bad page break with this line
-
-This describes commands marking the start and the end of an exception
-region.
-
-@table @code
-@findex ASM_OUTPUT_EH_REGION_BEG
-@item ASM_OUTPUT_EH_REGION_BEG ()
-A C expression to output text to mark the start of an exception region.
-
-This macro need not be defined on most platforms.
-
-@findex ASM_OUTPUT_EH_REGION_END
-@item ASM_OUTPUT_EH_REGION_END ()
-A C expression to output text to mark the end of an exception region.
-
-This macro need not be defined on most platforms.
-
-@findex EXCEPTION_SECTION
-@item EXCEPTION_SECTION ()
-A C expression to switch to the section in which the main
-exception table is to be placed (@pxref{Sections}). The default is a
-section named @code{.gcc_except_table} on machines that support named
-sections via @code{ASM_OUTPUT_SECTION_NAME}, otherwise if @samp{-fpic}
-or @samp{-fPIC} is in effect, the @code{data_section}, otherwise the
-@code{readonly_data_section}.
-
-@findex EH_FRAME_SECTION_ASM_OP
-@item EH_FRAME_SECTION_ASM_OP
-If defined, a C string constant for the assembler operation to switch to
-the section for exception handling frame unwind information. If not
-defined, GNU CC will provide a default definition if the target supports
-named sections. @file{crtstuff.c} uses this macro to switch to the
-appropriate section.
-
-You should define this symbol if your target supports DWARF 2 frame
-unwind information and the default definition does not work.
-
-@findex OMIT_EH_TABLE
-@item OMIT_EH_TABLE ()
-A C expression that is nonzero if the normal exception table output
-should be omitted.
-
-This macro need not be defined on most platforms.
-
-@findex EH_TABLE_LOOKUP
-@item EH_TABLE_LOOKUP ()
-Alternate runtime support for looking up an exception at runtime and
-finding the associated handler, if the default method won't work.
-
-This macro need not be defined on most platforms.
-
-@findex DOESNT_NEED_UNWINDER
-@item DOESNT_NEED_UNWINDER
-A C expression that decides whether or not the current function needs to
-have a function unwinder generated for it. See the file @code{except.c}
-for details on when to define this, and how.
-
-@findex MASK_RETURN_ADDR
-@item MASK_RETURN_ADDR
-An rtx used to mask the return address found via RETURN_ADDR_RTX, so
-that it does not contain any extraneous set bits in it.
-
-@findex DWARF2_UNWIND_INFO
-@item DWARF2_UNWIND_INFO
-Define this macro to 0 if your target supports DWARF 2 frame unwind
-information, but it does not yet work with exception handling.
-Otherwise, if your target supports this information (if it defines
-@samp{INCOMING_RETURN_ADDR_RTX} and either @samp{UNALIGNED_INT_ASM_OP}
-or @samp{OBJECT_FORMAT_ELF}), GCC will provide a default definition of
-1.
-
-If this macro is defined to 1, the DWARF 2 unwinder will be the default
-exception handling mechanism; otherwise, setjmp/longjmp will be used by
-default.
-
-If this macro is defined to anything, the DWARF 2 unwinder will be used
-instead of inline unwinders and __unwind_function in the non-setjmp case.
-
-@end table
-
-@node Alignment Output
-@subsection Assembler Commands for Alignment
-
-@c prevent bad page break with this line
-This describes commands for alignment.
-
-@table @code
-@findex LABEL_ALIGN_AFTER_BARRIER
-@item LABEL_ALIGN_AFTER_BARRIER (@var{label})
-The alignment (log base 2) to put in front of @var{label}, which follows
-a BARRIER.
-
-This macro need not be defined if you don't want any special alignment
-to be done at such a time. Most machine descriptions do not currently
-define the macro.
-
-@findex LOOP_ALIGN
-@item LOOP_ALIGN (@var{label})
-The alignment (log base 2) to put in front of @var{label}, which follows
-a NOTE_INSN_LOOP_BEG note.
-
-This macro need not be defined if you don't want any special alignment
-to be done at such a time. Most machine descriptions do not currently
-define the macro.
-
-@findex LABEL_ALIGN
-@item LABEL_ALIGN (@var{label})
-The alignment (log base 2) to put in front of @var{label}.
-If LABEL_ALIGN_AFTER_BARRIER / LOOP_ALIGN specify a different alignment,
-the maximum of the specified values is used.
-
-@findex ASM_OUTPUT_SKIP
-@item ASM_OUTPUT_SKIP (@var{stream}, @var{nbytes})
-A C statement to output to the stdio stream @var{stream} an assembler
-instruction to advance the location counter by @var{nbytes} bytes.
-Those bytes should be zero when loaded. @var{nbytes} will be a C
-expression of type @code{int}.
-
-@findex ASM_NO_SKIP_IN_TEXT
-@item ASM_NO_SKIP_IN_TEXT
-Define this macro if @code{ASM_OUTPUT_SKIP} should not be used in the
-text section because it fails to put zeros in the bytes that are skipped.
-This is true on many Unix systems, where the pseudo--op to skip bytes
-produces no-op instructions rather than zeros when used in the text
-section.
-
-@findex ASM_OUTPUT_ALIGN
-@item ASM_OUTPUT_ALIGN (@var{stream}, @var{power})
-A C statement to output to the stdio stream @var{stream} an assembler
-command to advance the location counter to a multiple of 2 to the
-@var{power} bytes. @var{power} will be a C expression of type @code{int}.
-
-@findex ASM_OUTPUT_MAX_SKIP_ALIGN
-@item ASM_OUTPUT_MAX_SKIP_ALIGN (@var{stream}, @var{power}, @var{max_skip})
-A C statement to output to the stdio stream @var{stream} an assembler
-command to advance the location counter to a multiple of 2 to the
-@var{power} bytes, but only if @var{max_skip} or fewer bytes are needed to
-satisfy the alignment request. @var{power} and @var{max_skip} will be
-a C expression of type @code{int}.
-@end table
-
-@need 3000
-@node Debugging Info
-@section Controlling Debugging Information Format
-
-@c prevent bad page break with this line
-This describes how to specify debugging information.
-
-@menu
-* All Debuggers:: Macros that affect all debugging formats uniformly.
-* DBX Options:: Macros enabling specific options in DBX format.
-* DBX Hooks:: Hook macros for varying DBX format.
-* File Names and DBX:: Macros controlling output of file names in DBX format.
-* SDB and DWARF:: Macros for SDB (COFF) and DWARF formats.
-@end menu
-
-@node All Debuggers
-@subsection Macros Affecting All Debugging Formats
-
-@c prevent bad page break with this line
-These macros affect all debugging formats.
-
-@table @code
-@findex DBX_REGISTER_NUMBER
-@item DBX_REGISTER_NUMBER (@var{regno})
-A C expression that returns the DBX register number for the compiler
-register number @var{regno}. In simple cases, the value of this
-expression may be @var{regno} itself. But sometimes there are some
-registers that the compiler knows about and DBX does not, or vice
-versa. In such cases, some register may need to have one number in
-the compiler and another for DBX.
-
-If two registers have consecutive numbers inside GNU CC, and they can be
-used as a pair to hold a multiword value, then they @emph{must} have
-consecutive numbers after renumbering with @code{DBX_REGISTER_NUMBER}.
-Otherwise, debuggers will be unable to access such a pair, because they
-expect register pairs to be consecutive in their own numbering scheme.
-
-If you find yourself defining @code{DBX_REGISTER_NUMBER} in way that
-does not preserve register pairs, then what you must do instead is
-redefine the actual register numbering scheme.
-
-@findex DEBUGGER_AUTO_OFFSET
-@item DEBUGGER_AUTO_OFFSET (@var{x})
-A C expression that returns the integer offset value for an automatic
-variable having address @var{x} (an RTL expression). The default
-computation assumes that @var{x} is based on the frame-pointer and
-gives the offset from the frame-pointer. This is required for targets
-that produce debugging output for DBX or COFF-style debugging output
-for SDB and allow the frame-pointer to be eliminated when the
-@samp{-g} options is used.
-
-@findex DEBUGGER_ARG_OFFSET
-@item DEBUGGER_ARG_OFFSET (@var{offset}, @var{x})
-A C expression that returns the integer offset value for an argument
-having address @var{x} (an RTL expression). The nominal offset is
-@var{offset}.
-
-@findex PREFERRED_DEBUGGING_TYPE
-@item PREFERRED_DEBUGGING_TYPE
-A C expression that returns the type of debugging output GNU CC should
-produce when the user specifies just @samp{-g}. Define
-this if you have arranged for GNU CC to support more than one format of
-debugging output. Currently, the allowable values are @code{DBX_DEBUG},
-@code{SDB_DEBUG}, @code{DWARF_DEBUG}, @code{DWARF2_DEBUG}, and
-@code{XCOFF_DEBUG}.
-
-When the user specifies @samp{-ggdb}, GNU CC normally also uses the
-value of this macro to select the debugging output format, but with two
-exceptions. If @code{DWARF2_DEBUGGING_INFO} is defined and
-@code{LINKER_DOES_NOT_WORK_WITH_DWARF2} is not defined, GNU CC uses the
-value @code{DWARF2_DEBUG}. Otherwise, if @code{DBX_DEBUGGING_INFO} is
-defined, GNU CC uses @code{DBX_DEBUG}.
-
-The value of this macro only affects the default debugging output; the
-user can always get a specific type of output by using @samp{-gstabs},
-@samp{-gcoff}, @samp{-gdwarf-1}, @samp{-gdwarf-2}, or @samp{-gxcoff}.
-@end table
-
-@node DBX Options
-@subsection Specific Options for DBX Output
-
-@c prevent bad page break with this line
-These are specific options for DBX output.
-
-@table @code
-@findex DBX_DEBUGGING_INFO
-@item DBX_DEBUGGING_INFO
-Define this macro if GNU CC should produce debugging output for DBX
-in response to the @samp{-g} option.
-
-@findex XCOFF_DEBUGGING_INFO
-@item XCOFF_DEBUGGING_INFO
-Define this macro if GNU CC should produce XCOFF format debugging output
-in response to the @samp{-g} option. This is a variant of DBX format.
-
-@findex DEFAULT_GDB_EXTENSIONS
-@item DEFAULT_GDB_EXTENSIONS
-Define this macro to control whether GNU CC should by default generate
-GDB's extended version of DBX debugging information (assuming DBX-format
-debugging information is enabled at all). If you don't define the
-macro, the default is 1: always generate the extended information
-if there is any occasion to.
-
-@findex DEBUG_SYMS_TEXT
-@item DEBUG_SYMS_TEXT
-Define this macro if all @code{.stabs} commands should be output while
-in the text section.
-
-@findex ASM_STABS_OP
-@item ASM_STABS_OP
-A C string constant naming the assembler pseudo op to use instead of
-@code{.stabs} to define an ordinary debugging symbol. If you don't
-define this macro, @code{.stabs} is used. This macro applies only to
-DBX debugging information format.
-
-@findex ASM_STABD_OP
-@item ASM_STABD_OP
-A C string constant naming the assembler pseudo op to use instead of
-@code{.stabd} to define a debugging symbol whose value is the current
-location. If you don't define this macro, @code{.stabd} is used.
-This macro applies only to DBX debugging information format.
-
-@findex ASM_STABN_OP
-@item ASM_STABN_OP
-A C string constant naming the assembler pseudo op to use instead of
-@code{.stabn} to define a debugging symbol with no name. If you don't
-define this macro, @code{.stabn} is used. This macro applies only to
-DBX debugging information format.
-
-@findex DBX_NO_XREFS
-@item DBX_NO_XREFS
-Define this macro if DBX on your system does not support the construct
-@samp{xs@var{tagname}}. On some systems, this construct is used to
-describe a forward reference to a structure named @var{tagname}.
-On other systems, this construct is not supported at all.
-
-@findex DBX_CONTIN_LENGTH
-@item DBX_CONTIN_LENGTH
-A symbol name in DBX-format debugging information is normally
-continued (split into two separate @code{.stabs} directives) when it
-exceeds a certain length (by default, 80 characters). On some
-operating systems, DBX requires this splitting; on others, splitting
-must not be done. You can inhibit splitting by defining this macro
-with the value zero. You can override the default splitting-length by
-defining this macro as an expression for the length you desire.
-
-@findex DBX_CONTIN_CHAR
-@item DBX_CONTIN_CHAR
-Normally continuation is indicated by adding a @samp{\} character to
-the end of a @code{.stabs} string when a continuation follows. To use
-a different character instead, define this macro as a character
-constant for the character you want to use. Do not define this macro
-if backslash is correct for your system.
-
-@findex DBX_STATIC_STAB_DATA_SECTION
-@item DBX_STATIC_STAB_DATA_SECTION
-Define this macro if it is necessary to go to the data section before
-outputting the @samp{.stabs} pseudo-op for a non-global static
-variable.
-
-@findex DBX_TYPE_DECL_STABS_CODE
-@item DBX_TYPE_DECL_STABS_CODE
-The value to use in the ``code'' field of the @code{.stabs} directive
-for a typedef. The default is @code{N_LSYM}.
-
-@findex DBX_STATIC_CONST_VAR_CODE
-@item DBX_STATIC_CONST_VAR_CODE
-The value to use in the ``code'' field of the @code{.stabs} directive
-for a static variable located in the text section. DBX format does not
-provide any ``right'' way to do this. The default is @code{N_FUN}.
-
-@findex DBX_REGPARM_STABS_CODE
-@item DBX_REGPARM_STABS_CODE
-The value to use in the ``code'' field of the @code{.stabs} directive
-for a parameter passed in registers. DBX format does not provide any
-``right'' way to do this. The default is @code{N_RSYM}.
-
-@findex DBX_REGPARM_STABS_LETTER
-@item DBX_REGPARM_STABS_LETTER
-The letter to use in DBX symbol data to identify a symbol as a parameter
-passed in registers. DBX format does not customarily provide any way to
-do this. The default is @code{'P'}.
-
-@findex DBX_MEMPARM_STABS_LETTER
-@item DBX_MEMPARM_STABS_LETTER
-The letter to use in DBX symbol data to identify a symbol as a stack
-parameter. The default is @code{'p'}.
-
-@findex DBX_FUNCTION_FIRST
-@item DBX_FUNCTION_FIRST
-Define this macro if the DBX information for a function and its
-arguments should precede the assembler code for the function. Normally,
-in DBX format, the debugging information entirely follows the assembler
-code.
-
-@findex DBX_LBRAC_FIRST
-@item DBX_LBRAC_FIRST
-Define this macro if the @code{N_LBRAC} symbol for a block should
-precede the debugging information for variables and functions defined in
-that block. Normally, in DBX format, the @code{N_LBRAC} symbol comes
-first.
-
-@findex DBX_BLOCKS_FUNCTION_RELATIVE
-@item DBX_BLOCKS_FUNCTION_RELATIVE
-Define this macro if the value of a symbol describing the scope of a
-block (@code{N_LBRAC} or @code{N_RBRAC}) should be relative to the start
-of the enclosing function. Normally, GNU C uses an absolute address.
-
-@findex DBX_USE_BINCL
-@item DBX_USE_BINCL
-Define this macro if GNU C should generate @code{N_BINCL} and
-@code{N_EINCL} stabs for included header files, as on Sun systems. This
-macro also directs GNU C to output a type number as a pair of a file
-number and a type number within the file. Normally, GNU C does not
-generate @code{N_BINCL} or @code{N_EINCL} stabs, and it outputs a single
-number for a type number.
-@end table
-
-@node DBX Hooks
-@subsection Open-Ended Hooks for DBX Format
-
-@c prevent bad page break with this line
-These are hooks for DBX format.
-
-@table @code
-@findex DBX_OUTPUT_LBRAC
-@item DBX_OUTPUT_LBRAC (@var{stream}, @var{name})
-Define this macro to say how to output to @var{stream} the debugging
-information for the start of a scope level for variable names. The
-argument @var{name} is the name of an assembler symbol (for use with
-@code{assemble_name}) whose value is the address where the scope begins.
-
-@findex DBX_OUTPUT_RBRAC
-@item DBX_OUTPUT_RBRAC (@var{stream}, @var{name})
-Like @code{DBX_OUTPUT_LBRAC}, but for the end of a scope level.
-
-@findex DBX_OUTPUT_ENUM
-@item DBX_OUTPUT_ENUM (@var{stream}, @var{type})
-Define this macro if the target machine requires special handling to
-output an enumeration type. The definition should be a C statement
-(sans semicolon) to output the appropriate information to @var{stream}
-for the type @var{type}.
-
-@findex DBX_OUTPUT_FUNCTION_END
-@item DBX_OUTPUT_FUNCTION_END (@var{stream}, @var{function})
-Define this macro if the target machine requires special output at the
-end of the debugging information for a function. The definition should
-be a C statement (sans semicolon) to output the appropriate information
-to @var{stream}. @var{function} is the @code{FUNCTION_DECL} node for
-the function.
-
-@findex DBX_OUTPUT_STANDARD_TYPES
-@item DBX_OUTPUT_STANDARD_TYPES (@var{syms})
-Define this macro if you need to control the order of output of the
-standard data types at the beginning of compilation. The argument
-@var{syms} is a @code{tree} which is a chain of all the predefined
-global symbols, including names of data types.
-
-Normally, DBX output starts with definitions of the types for integers
-and characters, followed by all the other predefined types of the
-particular language in no particular order.
-
-On some machines, it is necessary to output different particular types
-first. To do this, define @code{DBX_OUTPUT_STANDARD_TYPES} to output
-those symbols in the necessary order. Any predefined types that you
-don't explicitly output will be output afterward in no particular order.
-
-Be careful not to define this macro so that it works only for C. There
-are no global variables to access most of the built-in types, because
-another language may have another set of types. The way to output a
-particular type is to look through @var{syms} to see if you can find it.
-Here is an example:
-
-@smallexample
-@{
- tree decl;
- for (decl = syms; decl; decl = TREE_CHAIN (decl))
- if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)),
- "long int"))
- dbxout_symbol (decl);
- @dots{}
-@}
-@end smallexample
-
-@noindent
-This does nothing if the expected type does not exist.
-
-See the function @code{init_decl_processing} in @file{c-decl.c} to find
-the names to use for all the built-in C types.
-
-Here is another way of finding a particular type:
-
-@c this is still overfull. --mew 10feb93
-@smallexample
-@{
- tree decl;
- for (decl = syms; decl; decl = TREE_CHAIN (decl))
- if (TREE_CODE (decl) == TYPE_DECL
- && (TREE_CODE (TREE_TYPE (decl))
- == INTEGER_CST)
- && TYPE_PRECISION (TREE_TYPE (decl)) == 16
- && TYPE_UNSIGNED (TREE_TYPE (decl)))
-@group
- /* @r{This must be @code{unsigned short}.} */
- dbxout_symbol (decl);
- @dots{}
-@}
-@end group
-@end smallexample
-
-@findex NO_DBX_FUNCTION_END
-@item NO_DBX_FUNCTION_END
-Some stabs encapsulation formats (in particular ECOFF), cannot handle the
-@code{.stabs "",N_FUN,,0,0,Lscope-function-1} gdb dbx extention construct.
-On those machines, define this macro to turn this feature off without
-disturbing the rest of the gdb extensions.
-
-@end table
-
-@node File Names and DBX
-@subsection File Names in DBX Format
-
-@c prevent bad page break with this line
-This describes file names in DBX format.
-
-@table @code
-@findex DBX_WORKING_DIRECTORY
-@item DBX_WORKING_DIRECTORY
-Define this if DBX wants to have the current directory recorded in each
-object file.
-
-Note that the working directory is always recorded if GDB extensions are
-enabled.
-
-@findex DBX_OUTPUT_MAIN_SOURCE_FILENAME
-@item DBX_OUTPUT_MAIN_SOURCE_FILENAME (@var{stream}, @var{name})
-A C statement to output DBX debugging information to the stdio stream
-@var{stream} which indicates that file @var{name} is the main source
-file---the file specified as the input file for compilation.
-This macro is called only once, at the beginning of compilation.
-
-This macro need not be defined if the standard form of output
-for DBX debugging information is appropriate.
-
-@findex DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
-@item DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (@var{stream}, @var{name})
-A C statement to output DBX debugging information to the stdio stream
-@var{stream} which indicates that the current directory during
-compilation is named @var{name}.
-
-This macro need not be defined if the standard form of output
-for DBX debugging information is appropriate.
-
-@findex DBX_OUTPUT_MAIN_SOURCE_FILE_END
-@item DBX_OUTPUT_MAIN_SOURCE_FILE_END (@var{stream}, @var{name})
-A C statement to output DBX debugging information at the end of
-compilation of the main source file @var{name}.
-
-If you don't define this macro, nothing special is output at the end
-of compilation, which is correct for most machines.
-
-@findex DBX_OUTPUT_SOURCE_FILENAME
-@item DBX_OUTPUT_SOURCE_FILENAME (@var{stream}, @var{name})
-A C statement to output DBX debugging information to the stdio stream
-@var{stream} which indicates that file @var{name} is the current source
-file. This output is generated each time input shifts to a different
-source file as a result of @samp{#include}, the end of an included file,
-or a @samp{#line} command.
-
-This macro need not be defined if the standard form of output
-for DBX debugging information is appropriate.
-@end table
-
-@need 2000
-@node SDB and DWARF
-@subsection Macros for SDB and DWARF Output
-
-@c prevent bad page break with this line
-Here are macros for SDB and DWARF output.
-
-@table @code
-@findex SDB_DEBUGGING_INFO
-@item SDB_DEBUGGING_INFO
-Define this macro if GNU CC should produce COFF-style debugging output
-for SDB in response to the @samp{-g} option.
-
-@findex DWARF_DEBUGGING_INFO
-@item DWARF_DEBUGGING_INFO
-Define this macro if GNU CC should produce dwarf format debugging output
-in response to the @samp{-g} option.
-
-@findex DWARF2_DEBUGGING_INFO
-@item DWARF2_DEBUGGING_INFO
-Define this macro if GNU CC should produce dwarf version 2 format
-debugging output in response to the @samp{-g} option.
-
-To support optional call frame debugging information, you must also
-define @code{INCOMING_RETURN_ADDR_RTX} and either set
-@code{RTX_FRAME_RELATED_P} on the prologue insns if you use RTL for the
-prologue, or call @code{dwarf2out_def_cfa} and @code{dwarf2out_reg_save}
-as appropriate from @code{FUNCTION_PROLOGUE} if you don't.
-
-@findex DWARF2_FRAME_INFO
-@item DWARF2_FRAME_INFO
-Define this macro to a nonzero value if GNU CC should always output
-Dwarf 2 frame information. If @code{DWARF2_UNWIND_INFO}
-(@pxref{Exception Region Output} is nonzero, GNU CC will output this
-information not matter how you define @code{DWARF2_FRAME_INFO}.
-
-@findex LINKER_DOES_NOT_WORK_WITH_DWARF2
-@item LINKER_DOES_NOT_WORK_WITH_DWARF2
-Define this macro if the linker does not work with Dwarf version 2.
-Normally, if the user specifies only @samp{-ggdb} GNU CC will use Dwarf
-version 2 if available; this macro disables this. See the description
-of the @code{PREFERRED_DEBUGGING_TYPE} macro for more details.
-
-@findex PUT_SDB_@dots{}
-@item PUT_SDB_@dots{}
-Define these macros to override the assembler syntax for the special
-SDB assembler directives. See @file{sdbout.c} for a list of these
-macros and their arguments. If the standard syntax is used, you need
-not define them yourself.
-
-@findex SDB_DELIM
-@item SDB_DELIM
-Some assemblers do not support a semicolon as a delimiter, even between
-SDB assembler directives. In that case, define this macro to be the
-delimiter to use (usually @samp{\n}). It is not necessary to define
-a new set of @code{PUT_SDB_@var{op}} macros if this is the only change
-required.
-
-@findex SDB_GENERATE_FAKE
-@item SDB_GENERATE_FAKE
-Define this macro to override the usual method of constructing a dummy
-name for anonymous structure and union types. See @file{sdbout.c} for
-more information.
-
-@findex SDB_ALLOW_UNKNOWN_REFERENCES
-@item SDB_ALLOW_UNKNOWN_REFERENCES
-Define this macro to allow references to unknown structure,
-union, or enumeration tags to be emitted. Standard COFF does not
-allow handling of unknown references, MIPS ECOFF has support for
-it.
-
-@findex SDB_ALLOW_FORWARD_REFERENCES
-@item SDB_ALLOW_FORWARD_REFERENCES
-Define this macro to allow references to structure, union, or
-enumeration tags that have not yet been seen to be handled. Some
-assemblers choke if forward tags are used, while some require it.
-@end table
-
-@node Cross-compilation
-@section Cross Compilation and Floating Point
-@cindex cross compilation and floating point
-@cindex floating point and cross compilation
-
-While all modern machines use 2's complement representation for integers,
-there are a variety of representations for floating point numbers. This
-means that in a cross-compiler the representation of floating point numbers
-in the compiled program may be different from that used in the machine
-doing the compilation.
-
-@findex atof
-Because different representation systems may offer different amounts of
-range and precision, the cross compiler cannot safely use the host
-machine's floating point arithmetic. Therefore, floating point constants
-must be represented in the target machine's format. This means that the
-cross compiler cannot use @code{atof} to parse a floating point constant;
-it must have its own special routine to use instead. Also, constant
-folding must emulate the target machine's arithmetic (or must not be done
-at all).
-
-The macros in the following table should be defined only if you are cross
-compiling between different floating point formats.
-
-Otherwise, don't define them. Then default definitions will be set up which
-use @code{double} as the data type, @code{==} to test for equality, etc.
-
-You don't need to worry about how many times you use an operand of any
-of these macros. The compiler never uses operands which have side effects.
-
-@table @code
-@findex REAL_VALUE_TYPE
-@item REAL_VALUE_TYPE
-A macro for the C data type to be used to hold a floating point value
-in the target machine's format. Typically this would be a
-@code{struct} containing an array of @code{int}.
-
-@findex REAL_VALUES_EQUAL
-@item REAL_VALUES_EQUAL (@var{x}, @var{y})
-A macro for a C expression which compares for equality the two values,
-@var{x} and @var{y}, both of type @code{REAL_VALUE_TYPE}.
-
-@findex REAL_VALUES_LESS
-@item REAL_VALUES_LESS (@var{x}, @var{y})
-A macro for a C expression which tests whether @var{x} is less than
-@var{y}, both values being of type @code{REAL_VALUE_TYPE} and
-interpreted as floating point numbers in the target machine's
-representation.
-
-@findex REAL_VALUE_LDEXP
-@findex ldexp
-@item REAL_VALUE_LDEXP (@var{x}, @var{scale})
-A macro for a C expression which performs the standard library
-function @code{ldexp}, but using the target machine's floating point
-representation. Both @var{x} and the value of the expression have
-type @code{REAL_VALUE_TYPE}. The second argument, @var{scale}, is an
-integer.
-
-@findex REAL_VALUE_FIX
-@item REAL_VALUE_FIX (@var{x})
-A macro whose definition is a C expression to convert the target-machine
-floating point value @var{x} to a signed integer. @var{x} has type
-@code{REAL_VALUE_TYPE}.
-
-@findex REAL_VALUE_UNSIGNED_FIX
-@item REAL_VALUE_UNSIGNED_FIX (@var{x})
-A macro whose definition is a C expression to convert the target-machine
-floating point value @var{x} to an unsigned integer. @var{x} has type
-@code{REAL_VALUE_TYPE}.
-
-@findex REAL_VALUE_RNDZINT
-@item REAL_VALUE_RNDZINT (@var{x})
-A macro whose definition is a C expression to round the target-machine
-floating point value @var{x} towards zero to an integer value (but still
-as a floating point number). @var{x} has type @code{REAL_VALUE_TYPE},
-and so does the value.
-
-@findex REAL_VALUE_UNSIGNED_RNDZINT
-@item REAL_VALUE_UNSIGNED_RNDZINT (@var{x})
-A macro whose definition is a C expression to round the target-machine
-floating point value @var{x} towards zero to an unsigned integer value
-(but still represented as a floating point number). @var{x} has type
-@code{REAL_VALUE_TYPE}, and so does the value.
-
-@findex REAL_VALUE_ATOF
-@item REAL_VALUE_ATOF (@var{string}, @var{mode})
-A macro for a C expression which converts @var{string}, an expression of
-type @code{char *}, into a floating point number in the target machine's
-representation for mode @var{mode}. The value has type
-@code{REAL_VALUE_TYPE}.
-
-@findex REAL_INFINITY
-@item REAL_INFINITY
-Define this macro if infinity is a possible floating point value, and
-therefore division by 0 is legitimate.
-
-@findex REAL_VALUE_ISINF
-@findex isinf
-@item REAL_VALUE_ISINF (@var{x})
-A macro for a C expression which determines whether @var{x}, a floating
-point value, is infinity. The value has type @code{int}.
-By default, this is defined to call @code{isinf}.
-
-@findex REAL_VALUE_ISNAN
-@findex isnan
-@item REAL_VALUE_ISNAN (@var{x})
-A macro for a C expression which determines whether @var{x}, a floating
-point value, is a ``nan'' (not-a-number). The value has type
-@code{int}. By default, this is defined to call @code{isnan}.
-@end table
-
-@cindex constant folding and floating point
-Define the following additional macros if you want to make floating
-point constant folding work while cross compiling. If you don't
-define them, cross compilation is still possible, but constant folding
-will not happen for floating point values.
-
-@table @code
-@findex REAL_ARITHMETIC
-@item REAL_ARITHMETIC (@var{output}, @var{code}, @var{x}, @var{y})
-A macro for a C statement which calculates an arithmetic operation of
-the two floating point values @var{x} and @var{y}, both of type
-@code{REAL_VALUE_TYPE} in the target machine's representation, to
-produce a result of the same type and representation which is stored
-in @var{output} (which will be a variable).
-
-The operation to be performed is specified by @var{code}, a tree code
-which will always be one of the following: @code{PLUS_EXPR},
-@code{MINUS_EXPR}, @code{MULT_EXPR}, @code{RDIV_EXPR},
-@code{MAX_EXPR}, @code{MIN_EXPR}.@refill
-
-@cindex overflow while constant folding
-The expansion of this macro is responsible for checking for overflow.
-If overflow happens, the macro expansion should execute the statement
-@code{return 0;}, which indicates the inability to perform the
-arithmetic operation requested.
-
-@findex REAL_VALUE_NEGATE
-@item REAL_VALUE_NEGATE (@var{x})
-A macro for a C expression which returns the negative of the floating
-point value @var{x}. Both @var{x} and the value of the expression
-have type @code{REAL_VALUE_TYPE} and are in the target machine's
-floating point representation.
-
-There is no way for this macro to report overflow, since overflow
-can't happen in the negation operation.
-
-@findex REAL_VALUE_TRUNCATE
-@item REAL_VALUE_TRUNCATE (@var{mode}, @var{x})
-A macro for a C expression which converts the floating point value
-@var{x} to mode @var{mode}.
-
-Both @var{x} and the value of the expression are in the target machine's
-floating point representation and have type @code{REAL_VALUE_TYPE}.
-However, the value should have an appropriate bit pattern to be output
-properly as a floating constant whose precision accords with mode
-@var{mode}.
-
-There is no way for this macro to report overflow.
-
-@findex REAL_VALUE_TO_INT
-@item REAL_VALUE_TO_INT (@var{low}, @var{high}, @var{x})
-A macro for a C expression which converts a floating point value
-@var{x} into a double-precision integer which is then stored into
-@var{low} and @var{high}, two variables of type @var{int}.
-
-@item REAL_VALUE_FROM_INT (@var{x}, @var{low}, @var{high}, @var{mode})
-@findex REAL_VALUE_FROM_INT
-A macro for a C expression which converts a double-precision integer
-found in @var{low} and @var{high}, two variables of type @var{int},
-into a floating point value which is then stored into @var{x}.
-The value is in the target machine's representation for mode @var{mode}
-and has the type @code{REAL_VALUE_TYPE}.
-@end table
-
-@node Misc
-@section Miscellaneous Parameters
-@cindex parameters, miscellaneous
-
-@c prevent bad page break with this line
-Here are several miscellaneous parameters.
-
-@table @code
-@item PREDICATE_CODES
-@findex PREDICATE_CODES
-Define this if you have defined special-purpose predicates in the file
-@file{@var{machine}.c}. This macro is called within an initializer of an
-array of structures. The first field in the structure is the name of a
-predicate and the second field is an array of rtl codes. For each
-predicate, list all rtl codes that can be in expressions matched by the
-predicate. The list should have a trailing comma. Here is an example
-of two entries in the list for a typical RISC machine:
-
-@smallexample
-#define PREDICATE_CODES \
- @{"gen_reg_rtx_operand", @{SUBREG, REG@}@}, \
- @{"reg_or_short_cint_operand", @{SUBREG, REG, CONST_INT@}@},
-@end smallexample
-
-Defining this macro does not affect the generated code (however,
-incorrect definitions that omit an rtl code that may be matched by the
-predicate can cause the compiler to malfunction). Instead, it allows
-the table built by @file{genrecog} to be more compact and efficient,
-thus speeding up the compiler. The most important predicates to include
-in the list specified by this macro are those used in the most insn
-patterns.
-
-@findex CASE_VECTOR_MODE
-@item CASE_VECTOR_MODE
-An alias for a machine mode name. This is the machine mode that
-elements of a jump-table should have.
-
-@findex CASE_VECTOR_SHORTEN_MODE
-@item CASE_VECTOR_SHORTEN_MODE (@var{min_offset}, @var{max_offset}, @var{body})
-Optional: return the preferred mode for an @code{addr_diff_vec}
-when the minimum and maximum offset are known. If you define this,
-it enables extra code in branch shortening to deal with @code{addr_diff_vec}.
-To make this work, you also have to define INSN_ALIGN and
-make the alignment for @code{addr_diff_vec} explicit.
-The @var{body} argument is provided so that the offset_unsigned and scale
-flags can be updated.
-
-@findex CASE_VECTOR_PC_RELATIVE
-@item CASE_VECTOR_PC_RELATIVE
-Define this macro to be a C expression to indicate when jump-tables
-should contain relative addresses. If jump-tables never contain
-relative addresses, then you need not define this macro.
-
-@findex CASE_DROPS_THROUGH
-@item CASE_DROPS_THROUGH
-Define this if control falls through a @code{case} insn when the index
-value is out of range. This means the specified default-label is
-actually ignored by the @code{case} insn proper.
-
-@findex CASE_VALUES_THRESHOLD
-@item CASE_VALUES_THRESHOLD
-Define this to be the smallest number of different values for which it
-is best to use a jump-table instead of a tree of conditional branches.
-The default is four for machines with a @code{casesi} instruction and
-five otherwise. This is best for most machines.
-
-@c CYGNUS LOCAL -- meissner/loop test
-@findex LOOP_TEST_THRESHOLD
-@item LOOP_TEST_THRESHOLD
-Define this to be the maximum number of insns to move around when moving
-a loop test from the top of a loop to the bottom
-and seeing whether to duplicate it. The default is thirty.
-@c END CYGNUS LOCAL -- meissner/loop test
-
-@findex WORD_REGISTER_OPERATIONS
-@item WORD_REGISTER_OPERATIONS
-Define this macro if operations between registers with integral mode
-smaller than a word are always performed on the entire register.
-Most RISC machines have this property and most CISC machines do not.
-
-@findex LOAD_EXTEND_OP
-@item LOAD_EXTEND_OP (@var{mode})
-Define this macro to be a C expression indicating when insns that read
-memory in @var{mode}, an integral mode narrower than a word, set the
-bits outside of @var{mode} to be either the sign-extension or the
-zero-extension of the data read. Return @code{SIGN_EXTEND} for values
-of @var{mode} for which the
-insn sign-extends, @code{ZERO_EXTEND} for which it zero-extends, and
-@code{NIL} for other modes.
-
-This macro is not called with @var{mode} non-integral or with a width
-greater than or equal to @code{BITS_PER_WORD}, so you may return any
-value in this case. Do not define this macro if it would always return
-@code{NIL}. On machines where this macro is defined, you will normally
-define it as the constant @code{SIGN_EXTEND} or @code{ZERO_EXTEND}.
-
-@findex SHORT_IMMEDIATES_SIGN_EXTEND
-@item SHORT_IMMEDIATES_SIGN_EXTEND
-Define this macro if loading short immediate values into registers sign
-extends.
-
-@findex IMPLICIT_FIX_EXPR
-@item IMPLICIT_FIX_EXPR
-An alias for a tree code that should be used by default for conversion
-of floating point values to fixed point. Normally,
-@code{FIX_ROUND_EXPR} is used.@refill
-
-@findex FIXUNS_TRUNC_LIKE_FIX_TRUNC
-@item FIXUNS_TRUNC_LIKE_FIX_TRUNC
-Define this macro if the same instructions that convert a floating
-point number to a signed fixed point number also convert validly to an
-unsigned one.
-
-@findex EASY_DIV_EXPR
-@item EASY_DIV_EXPR
-An alias for a tree code that is the easiest kind of division to
-compile code for in the general case. It may be
-@code{TRUNC_DIV_EXPR}, @code{FLOOR_DIV_EXPR}, @code{CEIL_DIV_EXPR} or
-@code{ROUND_DIV_EXPR}. These four division operators differ in how
-they round the result to an integer. @code{EASY_DIV_EXPR} is used
-when it is permissible to use any of those kinds of division and the
-choice should be made on the basis of efficiency.@refill
-
-@findex MOVE_MAX
-@item MOVE_MAX
-The maximum number of bytes that a single instruction can move quickly
-between memory and registers or between two memory locations.
-
-@findex MAX_MOVE_MAX
-@item MAX_MOVE_MAX
-The maximum number of bytes that a single instruction can move quickly
-between memory and registers or between two memory locations. If this
-is undefined, the default is @code{MOVE_MAX}. Otherwise, it is the
-constant value that is the largest value that @code{MOVE_MAX} can have
-at run-time.
-
-@findex SHIFT_COUNT_TRUNCATED
-@item SHIFT_COUNT_TRUNCATED
-A C expression that is nonzero if on this machine the number of bits
-actually used for the count of a shift operation is equal to the number
-of bits needed to represent the size of the object being shifted. When
-this macro is non-zero, the compiler will assume that it is safe to omit
-a sign-extend, zero-extend, and certain bitwise `and' instructions that
-truncates the count of a shift operation. On machines that have
-instructions that act on bitfields at variable positions, which may
-include `bit test' instructions, a nonzero @code{SHIFT_COUNT_TRUNCATED}
-also enables deletion of truncations of the values that serve as
-arguments to bitfield instructions.
-
-If both types of instructions truncate the count (for shifts) and
-position (for bitfield operations), or if no variable-position bitfield
-instructions exist, you should define this macro.
-
-However, on some machines, such as the 80386 and the 680x0, truncation
-only applies to shift operations and not the (real or pretended)
-bitfield operations. Define @code{SHIFT_COUNT_TRUNCATED} to be zero on
-such machines. Instead, add patterns to the @file{md} file that include
-the implied truncation of the shift instructions.
-
-You need not define this macro if it would always have the value of zero.
-
-@findex TRULY_NOOP_TRUNCATION
-@item TRULY_NOOP_TRUNCATION (@var{outprec}, @var{inprec})
-A C expression which is nonzero if on this machine it is safe to
-``convert'' an integer of @var{inprec} bits to one of @var{outprec}
-bits (where @var{outprec} is smaller than @var{inprec}) by merely
-operating on it as if it had only @var{outprec} bits.
-
-On many machines, this expression can be 1.
-
-@c rearranged this, removed the phrase "it is reported that". this was
-@c to fix an overfull hbox. --mew 10feb93
-When @code{TRULY_NOOP_TRUNCATION} returns 1 for a pair of sizes for
-modes for which @code{MODES_TIEABLE_P} is 0, suboptimal code can result.
-If this is the case, making @code{TRULY_NOOP_TRUNCATION} return 0 in
-such cases may improve things.
-
-@findex STORE_FLAG_VALUE
-@item STORE_FLAG_VALUE
-A C expression describing the value returned by a comparison operator
-with an integral mode and stored by a store-flag instruction
-(@samp{s@var{cond}}) when the condition is true. This description must
-apply to @emph{all} the @samp{s@var{cond}} patterns and all the
-comparison operators whose results have a @code{MODE_INT} mode.
-
-A value of 1 or -1 means that the instruction implementing the
-comparison operator returns exactly 1 or -1 when the comparison is true
-and 0 when the comparison is false. Otherwise, the value indicates
-which bits of the result are guaranteed to be 1 when the comparison is
-true. This value is interpreted in the mode of the comparison
-operation, which is given by the mode of the first operand in the
-@samp{s@var{cond}} pattern. Either the low bit or the sign bit of
-@code{STORE_FLAG_VALUE} be on. Presently, only those bits are used by
-the compiler.
-
-If @code{STORE_FLAG_VALUE} is neither 1 or -1, the compiler will
-generate code that depends only on the specified bits. It can also
-replace comparison operators with equivalent operations if they cause
-the required bits to be set, even if the remaining bits are undefined.
-For example, on a machine whose comparison operators return an
-@code{SImode} value and where @code{STORE_FLAG_VALUE} is defined as
-@samp{0x80000000}, saying that just the sign bit is relevant, the
-expression
-
-@smallexample
-(ne:SI (and:SI @var{x} (const_int @var{power-of-2})) (const_int 0))
-@end smallexample
-
-@noindent
-can be converted to
-
-@smallexample
-(ashift:SI @var{x} (const_int @var{n}))
-@end smallexample
-
-@noindent
-where @var{n} is the appropriate shift count to move the bit being
-tested into the sign bit.
-
-There is no way to describe a machine that always sets the low-order bit
-for a true value, but does not guarantee the value of any other bits,
-but we do not know of any machine that has such an instruction. If you
-are trying to port GNU CC to such a machine, include an instruction to
-perform a logical-and of the result with 1 in the pattern for the
-comparison operators and let us know
-@ifset USING
-(@pxref{Bug Reporting,,How to Report Bugs}).
-@end ifset
-@ifclear USING
-(@pxref{Bug Reporting,,How to Report Bugs,gcc.info,Using GCC}).
-@end ifclear
-
-Often, a machine will have multiple instructions that obtain a value
-from a comparison (or the condition codes). Here are rules to guide the
-choice of value for @code{STORE_FLAG_VALUE}, and hence the instructions
-to be used:
-
-@itemize @bullet
-@item
-Use the shortest sequence that yields a valid definition for
-@code{STORE_FLAG_VALUE}. It is more efficient for the compiler to
-``normalize'' the value (convert it to, e.g., 1 or 0) than for the
-comparison operators to do so because there may be opportunities to
-combine the normalization with other operations.
-
-@item
-For equal-length sequences, use a value of 1 or -1, with -1 being
-slightly preferred on machines with expensive jumps and 1 preferred on
-other machines.
-
-@item
-As a second choice, choose a value of @samp{0x80000001} if instructions
-exist that set both the sign and low-order bits but do not define the
-others.
-
-@item
-Otherwise, use a value of @samp{0x80000000}.
-@end itemize
-
-Many machines can produce both the value chosen for
-@code{STORE_FLAG_VALUE} and its negation in the same number of
-instructions. On those machines, you should also define a pattern for
-those cases, e.g., one matching
-
-@smallexample
-(set @var{A} (neg:@var{m} (ne:@var{m} @var{B} @var{C})))
-@end smallexample
-
-Some machines can also perform @code{and} or @code{plus} operations on
-condition code values with less instructions than the corresponding
-@samp{s@var{cond}} insn followed by @code{and} or @code{plus}. On those
-machines, define the appropriate patterns. Use the names @code{incscc}
-and @code{decscc}, respectively, for the patterns which perform
-@code{plus} or @code{minus} operations on condition code values. See
-@file{rs6000.md} for some examples. The GNU Superoptizer can be used to
-find such instruction sequences on other machines.
-
-You need not define @code{STORE_FLAG_VALUE} if the machine has no store-flag
-instructions.
-
-@findex FLOAT_STORE_FLAG_VALUE
-@item FLOAT_STORE_FLAG_VALUE
-A C expression that gives a non-zero floating point value that is
-returned when comparison operators with floating-point results are true.
-Define this macro on machine that have comparison operations that return
-floating-point values. If there are no such operations, do not define
-this macro.
-
-@findex Pmode
-@item Pmode
-An alias for the machine mode for pointers. On most machines, define
-this to be the integer mode corresponding to the width of a hardware
-pointer; @code{SImode} on 32-bit machine or @code{DImode} on 64-bit machines.
-On some machines you must define this to be one of the partial integer
-modes, such as @code{PSImode}.
-
-The width of @code{Pmode} must be at least as large as the value of
-@code{POINTER_SIZE}. If it is not equal, you must define the macro
-@code{POINTERS_EXTEND_UNSIGNED} to specify how pointers are extended
-to @code{Pmode}.
-
-@findex FUNCTION_MODE
-@item FUNCTION_MODE
-An alias for the machine mode used for memory references to functions
-being called, in @code{call} RTL expressions. On most machines this
-should be @code{QImode}.
-
-@findex INTEGRATE_THRESHOLD
-@item INTEGRATE_THRESHOLD (@var{decl})
-A C expression for the maximum number of instructions above which the
-function @var{decl} should not be inlined. @var{decl} is a
-@code{FUNCTION_DECL} node.
-
-The default definition of this macro is 64 plus 8 times the number of
-arguments that the function accepts. Some people think a larger
-threshold should be used on RISC machines.
-
-@findex SCCS_DIRECTIVE
-@item SCCS_DIRECTIVE
-Define this if the preprocessor should ignore @code{#sccs} directives
-and print no error message.
-
-@findex NO_IMPLICIT_EXTERN_C
-@item NO_IMPLICIT_EXTERN_C
-Define this macro if the system header files support C++ as well as C.
-This macro inhibits the usual method of using system header files in
-C++, which is to pretend that the file's contents are enclosed in
-@samp{extern "C" @{@dots{}@}}.
-
-@findex HANDLE_PRAGMA
-@findex #pragma
-@findex pragma
-@item HANDLE_PRAGMA (@var{getc}, @var{ungetc}, @var{name})
-Define this macro if you want to implement any pragmas. If defined, it
-is a C expression whose value is 1 if the pragma was handled by the
-macro, zero otherwise. The argument @var{getc} is a function of type
-@samp{int (*)(void)} which will return the next character in the input
-stream, or EOF if no characters are left. The argument @var{ungetc} is
-a function of type @samp{void (*)(int)} which will push a character back
-into the input stream. The argument @var{name} is the word following
-#pragma in the input stream. The input stream pointer will be pointing
-just beyond the end of this word. The input stream should be left
-undistrubed if the expression returns zero, otherwise it should be
-pointing at the next character after the end of the pragma. Any
-characters remaining on the line will be ignored.
-
-It is generally a bad idea to implement new uses of @code{#pragma}. The
-only reason to define this macro is for compatibility with other
-compilers that do support @code{#pragma} for the sake of any user
-programs which already use it.
-
-If the pragma can be implemented by atttributes then the macro
-@samp{INSERT_ATTRIBUTES} might be a useful one to define as well.
-
-Note: older versions of this macro only had two arguments: @var{stream}
-and @var{token}. The macro was changed in order to allow it to work
-when gcc is built both with and without a cpp library.
-
-@findex HANDLE_SYSV_PRAGMA
-@findex #pragma
-@findex pragma
-@item HANDLE_SYSV_PRAGMA
-Define this macro (to a value of 1) if you want the System V style
-pragmas @samp{#pragma pack(<n>)} and @samp{#pragma weak <name>
-[=<value>]} to be supported by gcc.
-
-The pack pragma specifies the maximum alignment (in bytes) of fields
-within a structure, in much the same way as the @samp{__aligned__} and
-@samp{__packed__} @code{__attribute__}s do. A pack value of zero resets
-the behaviour to the default.
-
-The weak pragma only works if @code{SUPPORTS_WEAK} and
-@code{ASM_WEAKEN_LABEL} are defined. If enabled it allows the creation
-of specifically named weak labels, optionally with a value.
-
-@findex HANDLE_PRAGMA_PACK_PUSH_POP
-@findex #pragma
-@findex pragma
-@item HANDLE_PRAGMA_PACK_PUSH_POP
-Define this macro (to a value of 1) if you want to support the Win32
-style pragmas @samp{#pragma pack(push,<n>)} and @samp{#pragma
-pack(pop)}. The pack(push,<n>) pragma specifies the maximum alignment
-(in bytes) of fields within a structure, in much the same way as the
-@samp{__aligned__} and @samp{__packed__} @code{__attribute__}s do. A
-pack value of zero resets the behaviour to the default. Successive
-invocations of this pragma cause the previous values to be stacked, so
-that invocations of @samp{#pragma pack(pop)} will return to the previous
-value.
-
-@findex VALID_MACHINE_DECL_ATTRIBUTE
-@item VALID_MACHINE_DECL_ATTRIBUTE (@var{decl}, @var{attributes}, @var{identifier}, @var{args})
-If defined, a C expression whose value is nonzero if @var{identifier} with
-arguments @var{args} is a valid machine specific attribute for @var{decl}.
-The attributes in @var{attributes} have previously been assigned to @var{decl}.
-
-@findex VALID_MACHINE_TYPE_ATTRIBUTE
-@item VALID_MACHINE_TYPE_ATTRIBUTE (@var{type}, @var{attributes}, @var{identifier}, @var{args})
-If defined, a C expression whose value is nonzero if @var{identifier} with
-arguments @var{args} is a valid machine specific attribute for @var{type}.
-The attributes in @var{attributes} have previously been assigned to @var{type}.
-
-@findex COMP_TYPE_ATTRIBUTES
-@item COMP_TYPE_ATTRIBUTES (@var{type1}, @var{type2})
-If defined, a C expression whose value is zero if the attributes on
-@var{type1} and @var{type2} are incompatible, one if they are compatible,
-and two if they are nearly compatible (which causes a warning to be
-generated).
-
-@c CYGNUS LOCAL nickc/ghs
-@findex SET_DEFAULT_TYPE_ATTRIBUTES
-@item SET_DEFAULT_TYPE_ATTRIBUTES (@var{type})
-If defined, a C statement that assigns default attributes to
-newly defined @var{type}.
-@c END CYGNUS LOCAL
-
-@findex MERGE_MACHINE_TYPE_ATTRIBUTES
-@item MERGE_MACHINE_TYPE_ATTRIBUTES (@var{type1}, @var{type2})
-Define this macro if the merging of type attributes needs special handling.
-If defined, the result is a list of the combined TYPE_ATTRIBUTES of
-@var{type1} and @var{type2}. It is assumed that comptypes has already been
-called and returned 1.
-
-@findex MERGE_MACHINE_DECL_ATTRIBUTES
-@item MERGE_MACHINE_DECL_ATTRIBUTES (@var{olddecl}, @var{newdecl})
-Define this macro if the merging of decl attributes needs special handling.
-If defined, the result is a list of the combined DECL_MACHINE_ATTRIBUTES of
-@var{olddecl} and @var{newdecl}. @var{newdecl} is a duplicate declaration
-of @var{olddecl}. Examples of when this is needed are when one attribute
-overrides another, or when an attribute is nullified by a subsequent
-definition.
-
-@findex INSERT_ATTRIBUTES
-@item INSERT_ATTRIBUTES (@var{node}, @var{attr_ptr}, @var{prefix_ptr})
-Define this macro if you want to be able to add attributes to a decl
-when it is being created. This is normally useful for backends which
-wish to implement a pragma by using the attributes which correspond to
-the pragma's effect. The @var{node} argument is the decl which is being
-created. The @var{attr_ptr} argument is a pointer to the attribute list
-for this decl. The @var{prefix_ptr} is a pointer to the list of
-attributes that have appeared after the specifiers and modifiers of the
-declaration, but before the declaration proper.
-
-@findex SET_DEFAULT_DECL_ATTRIBUTES
-@item SET_DEFAULT_DECL_ATTRIBUTES (@var{decl}, @var{attributes})
-If defined, a C statement that assigns default attributes to
-newly defined @var{decl}.
-
-@findex DOLLARS_IN_IDENTIFIERS
-@item DOLLARS_IN_IDENTIFIERS
-Define this macro to control use of the character @samp{$} in identifier
-names. 0 means @samp{$} is not allowed by default; 1 means it is allowed.
-1 is the default; there is no need to define this macro in that case.
-This macro controls the compiler proper; it does not affect the preprocessor.
-
-@findex NO_DOLLAR_IN_LABEL
-@item NO_DOLLAR_IN_LABEL
-Define this macro if the assembler does not accept the character
-@samp{$} in label names. By default constructors and destructors in
-G++ have @samp{$} in the identifiers. If this macro is defined,
-@samp{.} is used instead.
-
-@findex NO_DOT_IN_LABEL
-@item NO_DOT_IN_LABEL
-Define this macro if the assembler does not accept the character
-@samp{.} in label names. By default constructors and destructors in G++
-have names that use @samp{.}. If this macro is defined, these names
-are rewritten to avoid @samp{.}.
-
-@findex DEFAULT_MAIN_RETURN
-@item DEFAULT_MAIN_RETURN
-Define this macro if the target system expects every program's @code{main}
-function to return a standard ``success'' value by default (if no other
-value is explicitly returned).
-
-The definition should be a C statement (sans semicolon) to generate the
-appropriate rtl instructions. It is used only when compiling the end of
-@code{main}.
-
-@item HAVE_ATEXIT
-@findex HAVE_ATEXIT
-Define this if the target system supports the function
-@code{atexit} from the ANSI C standard. If this is not defined,
-and @code{INIT_SECTION_ASM_OP} is not defined, a default
-@code{exit} function will be provided to support C++.
-
-@item EXIT_BODY
-@findex EXIT_BODY
-Define this if your @code{exit} function needs to do something
-besides calling an external function @code{_cleanup} before
-terminating with @code{_exit}. The @code{EXIT_BODY} macro is
-only needed if neither @code{HAVE_ATEXIT} nor
-@code{INIT_SECTION_ASM_OP} are defined.
-
-@findex INSN_SETS_ARE_DELAYED
-@item INSN_SETS_ARE_DELAYED (@var{insn})
-Define this macro as a C expression that is nonzero if it is safe for the
-delay slot scheduler to place instructions in the delay slot of @var{insn},
-even if they appear to use a resource set or clobbered in @var{insn}.
-@var{insn} is always a @code{jump_insn} or an @code{insn}; GNU CC knows that
-every @code{call_insn} has this behavior. On machines where some @code{insn}
-or @code{jump_insn} is really a function call and hence has this behavior,
-you should define this macro.
-
-You need not define this macro if it would always return zero.
-
-@findex INSN_REFERENCES_ARE_DELAYED
-@item INSN_REFERENCES_ARE_DELAYED (@var{insn})
-Define this macro as a C expression that is nonzero if it is safe for the
-delay slot scheduler to place instructions in the delay slot of @var{insn},
-even if they appear to set or clobber a resource referenced in @var{insn}.
-@var{insn} is always a @code{jump_insn} or an @code{insn}. On machines where
-some @code{insn} or @code{jump_insn} is really a function call and its operands
-are registers whose use is actually in the subroutine it calls, you should
-define this macro. Doing so allows the delay slot scheduler to move
-instructions which copy arguments into the argument registers into the delay
-slot of @var{insn}.
-
-You need not define this macro if it would always return zero.
-
-@findex MACHINE_DEPENDENT_REORG
-@item MACHINE_DEPENDENT_REORG (@var{insn})
-In rare cases, correct code generation requires extra machine
-dependent processing between the second jump optimization pass and
-delayed branch scheduling. On those machines, define this macro as a C
-statement to act on the code starting at @var{insn}.
-
-@findex MULTIPLE_SYMBOL_SPACES
-@item MULTIPLE_SYMBOL_SPACES
-Define this macro if in some cases global symbols from one translation
-unit may not be bound to undefined symbols in another translation unit
-without user intervention. For instance, under Microsoft Windows
-symbols must be explicitly imported from shared libraries (DLLs).
-
-@c CYGNUS LOCAL -- conditional execution/meissner
-@findex MAX_CONDITIONAL_EXECUTE
-@item MAX_CONDITIONAL_EXECUTE
-A C expression for the maximum number of instructions to execute via
-conditional execution instructions instead of a branch. A value of
-@code{BRANCH_COST}+1 is the default if the machine does not use
-@code{cc0}, and 1 if it does use @code{cc0}.
-@c END CYGNUS LOCAL -- conditional execution/meissner
-
-@findex ISSUE_RATE
-@item ISSUE_RATE
-A C expression that returns how many instructions can be issued at the
-same time if the machine is a superscalar machine. This is only used by
-the @samp{Haifa} scheduler, and not the traditional scheduler.
-
-@findex MD_SCHED_INIT
-@item MD_SCHED_INIT (@var{file}, @var{verbose}
-A C statement which is executed by the @samp{Haifa} scheduler at the
-beginning of each block of instructions that are to be scheduled.
-@var{file} is either a null pointer, or a stdio stream to write any
-debug output to. @var{verbose} is the verbose level provided by
-@samp{-fsched-verbose-}@var{n}.
-
-@findex MD_SCHED_REORDER
-@item MD_SCHED_REORDER (@var{file}, @var{verbose}, @var{ready}, @var{n_ready})
-A C statement which is executed by the @samp{Haifa} scheduler after it
-has scheduled the ready list to allow the machine description to reorder
-it (for example to combine two small instructions together on
-@samp{VLIW} machines). @var{file} is either a null pointer, or a stdio
-stream to write any debug output to. @var{verbose} is the verbose level
-provided by @samp{-fsched-verbose-}@var{n}. @var{ready} is a pointer to
-the ready list of instructions that are ready to be scheduled.
-@var{n_ready} is the number of elements in the ready list. The
-scheduler reads the ready list in reverse order, starting with
-@var{ready}[@var{n_ready}-1] and going to @var{ready}[0].
-
-@findex MD_SCHED_VARIABLE_ISSUE
-@item MD_SCHED_VARIABLE_ISSUE (@var{file}, @var{verbose}, @var{insn}, @var{more})
-A C statement which is executed by the @samp{Haifa} scheduler after it
-has scheduled an insn from the ready list. @var{file} is either a null
-pointer, or a stdio stream to write any debug output to. @var{verbose}
-is the verbose level provided by @samp{-fsched-verbose-}@var{n}.
-@var{insn} is the instruction that was scheduled. @var{more} is the
-number of instructions that can be issued in the current cycle. The
-@samp{MD_SCHED_VARIABLE_ISSUE} macro is responsible for updating the
-value of @var{more} (typically by @var{more}--).
-
-@findex MAX_INTEGER_COMPUTATION_MODE
-@item MAX_INTEGER_COMPUTATION_MODE
-Define this to the largest integer machine mode which can be used for
-operations other than load, store and copy operations.
-
-You need only define this macro if the target holds values larger than
-@code{word_mode} in general purpose registers. Most targets should not define
-this macro.
-
-@findex MATH_LIBRARY
-@item MATH_LIBRARY
-Define this macro as a C string constant for the linker argument to link
-in the system math library, or @samp{""} if the target does not have a
-separate math library.
-
-You need only define this macro if the default of @samp{"-lm"} is wrong.
-@end table
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 8e0d511..cc652c1 100755
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -78,7 +78,6 @@ extern int size_directive_output;
extern tree last_assemble_variable_decl;
extern void check_line_directive();
-extern void cpplib_init();
extern char *init_parse (char *);
extern void finish_parse ();
@@ -569,15 +568,6 @@ int flag_verbose_asm = 0;
int flag_debug_asm = 0;
-/* -fgnu-linker specifies use of the GNU linker for initializations.
- (Or, more generally, a linker that handles initializations.)
- -fno-gnu-linker says that collect2 will be used. */
-#ifdef USE_COLLECT2
-int flag_gnu_linker = 0;
-#else
-int flag_gnu_linker = 1;
-#endif
-
/* CYGNUS LOCAL unaligned-struct-hack */
/* This is a hack. Disable the effect of SLOW_BYTE_ACCESS, so that references
to aligned fields inside of unaligned structures can work. That is, we
@@ -755,8 +745,6 @@ lang_independent_options f_options[] =
"place data items into their own section" },
{"verbose-asm", &flag_verbose_asm, 1,
"Add extra commentry to assembler output"},
- {"gnu-linker", &flag_gnu_linker, 1,
- "Output GNU ld formatted global initialisers"},
/* CYGNUS LOCAL unaligned-struct-hack */
{"unaligned-struct-hack", &flag_unaligned_struct_hack, 1,
"Assume structure fields may be unaligned" },
@@ -797,8 +785,8 @@ lang_independent_options f_options[] =
static struct lang_opt
{
- char * option;
- char * description;
+ char *option;
+ char *description;
}
documented_lang_options[] =
{
@@ -815,10 +803,6 @@ documented_lang_options[] =
{ "-funsigned-bitfields","Make bitfields by unsigned by default" },
{ "-fno-signed-bitfields", "" },
{ "-fno-unsigned-bitfields","" },
- { "-fsigned-char", "Make 'char' be signed by default"},
- { "-funsigned-char", "Make 'char' be unsigned by default"},
- { "-fno-signed-char", "" },
- { "-fno-unsigned-char", "" },
{ "-ftraditional", "" },
{ "-traditional", "Attempt to support traditional K&R style C"},
@@ -836,8 +820,6 @@ documented_lang_options[] =
{ "-fno-freestanding", "" },
{ "-fcond-mismatch", "Allow different types as args of ? operator"},
{ "-fno-cond-mismatch", "" },
- { "-fdollars-in-identifiers", "Allow the use of $ inside indentifiers" },
- { "-fno-dollars-in-identifiers", "" },
{ "-fident", "" },
{ "-fno-ident", "Ignore #ident directives" },
{ "-fshort-double", "Use the same size for double as for float" },
@@ -899,42 +881,14 @@ documented_lang_options[] =
{ "-Wno-redundant-decls", "" },
{ "-Wsign-compare", "Warn about signed/unsigned comparisons" },
{ "-Wno-sign-compare", "" },
- { "-Wunknown-pragmas", "Warn about unrecognised pragmas" },
- { "-Wno-unknown-pragmas", "" },
{ "-Wstrict-prototypes", "Warn about non-prototyped function decls" },
{ "-Wno-strict-prototypes", "" },
{ "-Wtraditional", "Warn about constructs whose meaning change in ANSI C"},
{ "-Wno-traditional", "" },
- { "-Wtrigraphs", "Warn when trigraphs are encountered" },
- { "-Wno-trigraphs", "" },
{ "-Wundef", "" },
{ "-Wno-undef", "" },
{ "-Wwrite-strings", "Mark strings as 'const char *'"},
{ "-Wno-write-strings", "" },
-
- /* These are for languages with USE_CPPLIB. */
- /* These options are already documented in cpplib.c */
- { "--help", "" },
- { "-A", "" },
- { "-D", "" },
- { "-I", "" },
- { "-U", "" },
- { "-H", "" },
- { "-idirafter", "" },
- { "-imacros", "" },
- { "-include", "" },
- { "-iprefix", "" },
- { "-isystem", "" },
- { "-iwithprefix", "" },
- { "-iwithprefixbefore", "" },
- { "-lang-c", "" },
- { "-lang-c89", "" },
- { "-lang-c++", "" },
- { "-remap", "" },
- { "-nostdinc", "" },
- { "-nostdinc++", "" },
- { "-trigraphs", "" },
- { "-undef", "" }
};
/* Here is a table, controlled by the tm.h file, listing each -m switch
@@ -3679,6 +3633,8 @@ display_help ()
unsigned long i;
char * lang;
+ printf ("Usage: %s input [switches]\n", progname);
+ printf ("Switches:\n");
printf (" -ffixed-<register> Mark <register> as being unavailable to the compiler\n");
printf (" -fcall-used-<register> Mark <register> as being corrupted by function calls\n");
printf (" -fcall-saved-<register> Mark <register> as being preserved across functions\n");
@@ -3944,15 +3900,11 @@ main (argc, argv)
decl_printable_name = decl_name;
lang_expand_expr = (lang_expand_expr_t) do_abort;
- /* Initialize whether `char' is signed. */
- flag_signed_char = DEFAULT_SIGNED_CHAR;
#ifdef DEFAULT_SHORT_ENUMS
/* Initialize how much space enums occupy, by default. */
flag_short_enums = DEFAULT_SHORT_ENUMS;
#endif
- cpplib_init();
-
/* Scan to see what optimization level has been specified. That will
determine the default value of many flags. */
for (i = 1; i < argc; i++)
@@ -4035,6 +3987,12 @@ main (argc, argv)
for (i = 1; i < argc; i++)
{
+ if (!strcmp (argv[i], "--help"))
+ {
+ display_help ();
+ exit (0);
+ }
+
size_t j;
/* If this is a language-specific option,
@@ -4045,16 +4003,7 @@ main (argc, argv)
if (j != (size_t)-1)
{
- int strings_processed = c_decode_option (argc - i, argv + i);
-
- if (!strcmp (argv[i], "--help"))
- {
- display_help ();
- exit (0);
- }
-
- if (strings_processed != 0)
- i += strings_processed - 1;
+ c_decode_option (argv[i]);
}
else if (argv[i][0] == '-' && argv[i][1] != 0)
{
@@ -4571,7 +4520,9 @@ print_version (file, indent)
{
fprintf (file, "%s%s%s version %s", indent, *indent != 0 ? " " : "",
language_string, version_string);
- fprintf (file, " (%s)", TARGET_NAME);
+
+ char *target_name = "thumb-elf";
+ fprintf (file, " (%s)", target_name);
#ifdef __GNUC__
#ifndef __VERSION__
#define __VERSION__ "[unknown]"
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 906b272..c62cae0 100755
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -42,7 +42,6 @@ Boston, MA 02111-1307, USA. */
#include "real.h"
#include "toplev.h"
#include "obstack.h"
-#include "c-pragma.h"
#ifndef TRAMPOLINE_ALIGNMENT
@@ -4087,25 +4086,9 @@ declare_weak (decl)
/* Emit any pending weak declarations. */
-#ifdef HANDLE_PRAGMA_WEAK
-struct weak_syms * weak_decls;
-#endif
-
void
weak_finish ()
{
-#ifdef HANDLE_PRAGMA_WEAK
- if (HANDLE_PRAGMA_WEAK)
- {
- struct weak_syms *t;
- for (t = weak_decls; t; t = t->next)
- {
- ASM_WEAKEN_LABEL (asm_out_file, t->name);
- if (t->value)
- ASM_OUTPUT_DEF (asm_out_file, t->name, t->value);
- }
- }
-#endif
}
void