diff options
author | YamaArashi <shadow962@live.com> | 2016-04-25 02:51:34 -0700 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2016-04-25 02:51:34 -0700 |
commit | 346ed7678fc0a02c1c93c066140f819789f039d9 (patch) | |
tree | fdd46f22c809c5c44fdd7fb10070fd5320078b85 /gcc | |
parent | fa618cd10b1985bae42882f82346b646783892c6 (diff) |
remove driver and cpp
Diffstat (limited to 'gcc')
-rwxr-xr-x | gcc/.cvsignore | 95 | ||||
-rwxr-xr-x | gcc/INSTALL | 2188 | ||||
-rwxr-xr-x | gcc/LANGUAGES | 91 | ||||
-rwxr-xr-x | gcc/LITERATURE | 101 | ||||
-rw-r--r-- | gcc/Makefile | 484 | ||||
-rwxr-xr-x | gcc/Makefile.in | 1773 | ||||
-rwxr-xr-x | gcc/NEWS | 1078 | ||||
-rwxr-xr-x | gcc/PROBLEMS | 117 | ||||
-rwxr-xr-x | gcc/PROJECTS | 435 | ||||
-rwxr-xr-x | gcc/README | 26 | ||||
-rwxr-xr-x | gcc/TESTS.FLUNK | 39 | ||||
-rwxr-xr-x | gcc/acconfig.h | 96 | ||||
-rwxr-xr-x | gcc/aclocal.m4 | 237 | ||||
-rwxr-xr-x | gcc/build-make | 35 | ||||
-rwxr-xr-x | gcc/c-aux-info.c | 61 | ||||
-rwxr-xr-x | gcc/c-common.c | 148 | ||||
-rwxr-xr-x | gcc/c-decl.c | 146 | ||||
-rwxr-xr-x | gcc/c-lex.c | 324 | ||||
-rw-r--r-- | gcc/c-parse.c | 4 | ||||
-rwxr-xr-x | gcc/c-pragma.c | 452 | ||||
-rwxr-xr-x | gcc/c-pragma.h | 100 | ||||
-rwxr-xr-x | gcc/c-tree.h | 14 | ||||
-rwxr-xr-x | gcc/config.guess | 4 | ||||
-rwxr-xr-x | gcc/config.in | 240 | ||||
-rwxr-xr-x | gcc/config.sub | 1225 | ||||
-rwxr-xr-x | gcc/config/arm/thumb.h | 14 | ||||
-rwxr-xr-x | gcc/configure | 4451 | ||||
-rwxr-xr-x | gcc/configure.bat | 21 | ||||
-rwxr-xr-x | gcc/configure.frag | 77 | ||||
-rwxr-xr-x | gcc/configure.in | 1656 | ||||
-rwxr-xr-x | gcc/configure.lang | 233 | ||||
-rwxr-xr-x | gcc/cpp.1 | 1 | ||||
-rwxr-xr-x | gcc/cpp.cps | 66 | ||||
-rwxr-xr-x | gcc/cpp.fns | 94 | ||||
-rwxr-xr-x | gcc/cpp.texi | 2936 | ||||
-rwxr-xr-x | gcc/cppalloc.c | 81 | ||||
-rwxr-xr-x | gcc/cpperror.c | 149 | ||||
-rwxr-xr-x | gcc/cppexp.c | 1001 | ||||
-rwxr-xr-x | gcc/cppfiles.c | 1065 | ||||
-rwxr-xr-x | gcc/cpphash.c | 200 | ||||
-rwxr-xr-x | gcc/cpphash.h | 53 | ||||
-rwxr-xr-x | gcc/cpplib.c | 5902 | ||||
-rwxr-xr-x | gcc/cpplib.h | 737 | ||||
-rwxr-xr-x | gcc/cppmain.c | 112 | ||||
-rwxr-xr-x | gcc/cross-make | 14 | ||||
-rwxr-xr-x | gcc/cstamp-h.in | 1 | ||||
-rwxr-xr-x | gcc/dwarf2out.c | 11 | ||||
-rwxr-xr-x | gcc/extend.texi | 3747 | ||||
-rwxr-xr-x | gcc/fixcpp | 109 | ||||
-rwxr-xr-x | gcc/flags.h | 16 | ||||
-rwxr-xr-x | gcc/gcc.1 | 4191 | ||||
-rwxr-xr-x | gcc/gcc.c | 5093 | ||||
-rwxr-xr-x | gcc/gcc.cps | 1964 | ||||
-rwxr-xr-x | gcc/gcc.texi | 4735 | ||||
-rwxr-xr-x | gcc/genmultilib | 269 | ||||
-rw-r--r-- | gcc/ginclude/limits.h | 10 | ||||
-rwxr-xr-x | gcc/hash.h | 4 | ||||
-rwxr-xr-x | gcc/install.texi | 2381 | ||||
-rwxr-xr-x | gcc/install1.texi | 15 | ||||
-rwxr-xr-x | gcc/invoke.texi | 7000 | ||||
-rwxr-xr-x | gcc/listing | 227 | ||||
-rwxr-xr-x | gcc/mbchar.c | 290 | ||||
-rwxr-xr-x | gcc/mbchar.h | 41 | ||||
-rwxr-xr-x | gcc/md.texi | 4217 | ||||
-rwxr-xr-x | gcc/mkinstalldirs | 40 | ||||
-rwxr-xr-x | gcc/obstack.c | 427 | ||||
-rwxr-xr-x | gcc/obstack.h | 594 | ||||
-rwxr-xr-x | gcc/prefix.c | 317 | ||||
-rwxr-xr-x | gcc/prefix.h | 28 | ||||
-rwxr-xr-x | gcc/rtl.texi | 2946 | ||||
-rwxr-xr-x | gcc/splay-tree.c | 329 | ||||
-rwxr-xr-x | gcc/splay-tree.h | 102 | ||||
-rwxr-xr-x | gcc/system.h | 5 | ||||
-rwxr-xr-x | gcc/texinfo.tex | 5298 | ||||
-rwxr-xr-x | gcc/tm.texi | 7699 | ||||
-rwxr-xr-x | gcc/toplev.c | 77 | ||||
-rwxr-xr-x | gcc/varasm.c | 17 |
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(¯o_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(¯o_mark); - cpp_pop_buffer(pfile); - parse_set_mark(¯o_mark, pfile); - } - else - break; - } - } - if (!is_macro_call) - { - parse_goto_mark(¯o_mark, pfile); - if (macbuf_whitespace) - CPP_PUTC(pfile, ' '); - } - parse_clear_mark(¯o_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 @@ -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, ®_key); - - if (res == ERROR_SUCCESS) - res = RegOpenKeyExA (reg_key, "Free Software Foundation", 0, - KEY_READ, ®_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\}\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 |