diff options
author | David E. O'Brien <obrien@FreeBSD.org> | 2002-05-12 21:50:48 +0000 |
---|---|---|
committer | David E. O'Brien <obrien@FreeBSD.org> | 2002-05-12 21:50:48 +0000 |
commit | f4603a02f970cde1167a7b0208e9500f7ee2f1c7 (patch) | |
tree | fb9e5c8f6a275c09cb3f77d4c3fda42fef054ef6 | |
parent | 641c89aab9592a1b042122c5abafcb081cfce429 (diff) | |
download | src-f4603a02f970cde1167a7b0208e9500f7ee2f1c7.tar.gz src-f4603a02f970cde1167a7b0208e9500f7ee2f1c7.zip |
Remove files not part of GCC 3.1.
Notes
Notes:
svn path=/vendor/gcc/dist/; revision=96480
204 files changed, 0 insertions, 80672 deletions
diff --git a/contrib/gcc/BUGS b/contrib/gcc/BUGS deleted file mode 100644 index 2d875a092efb..000000000000 --- a/contrib/gcc/BUGS +++ /dev/null @@ -1,27 +0,0 @@ -If you think you may have found a bug in GCC, please -read the Bugs section of the GCC manual for advice on - -(1) how to tell when to report a bug, -(2) where to send your bug report, and -(3) how to write a useful bug report and what information -it needs to have. - -There are three ways to read the Bugs section. - -(1) In a printed copy of the GCC manual. You can order one from the -Free Software Foundation; see the file ORDERS. But if you don't have -a copy on hand and you think you have found a bug, you shouldn't wait -to get a printed manual; you should read the section right away as -described below. - -(2) With Info. Start Emacs, do C-h i to enter Info, -then m gcc RET to get to the GCC manual, then m Bugs RET -to get to the section on bugs. Or use standalone Info in -a like manner. (Standalone Info is part of the Texinfo distribution.) - -(3) By hand. Search for the chapter "Reporting Bugs" in gcc.texi, or - cat /usr/local/info/gcc* | more "+/^File: gcc.info, Node: Bugs," - -You may also want to take a look at the GCC FAQ, in which there are -additional instructions for submitting bug reports: - http://www.gnu.org/software/gcc/faq.html#bugreport diff --git a/contrib/gcc/NEWS b/contrib/gcc/NEWS deleted file mode 100644 index 5023a93b5214..000000000000 --- a/contrib/gcc/NEWS +++ /dev/null @@ -1,1539 +0,0 @@ -This file contains information about GCC releases which has been -generated automatically from the online release notes. This file -covers releases of GCC (and the former EGCS project) since EGCS 1.0, -on the line of development that led to GCC 3; for information on GCC -2.8.1 and older releases of GCC 2, see ONEWS. - -====================================================================== -http://gcc.gnu.org/gcc-2.95/gcc-2.95.3.html - - GCC 2.95.3 - - March 16, 2001 - - The GNU project and the GCC developers are pleased to announce the - release of GCC version 2.95.3. GCC used to stand for the GNU C - Compiler, but since the compiler supports several other languages - aside from C, it now stands for the GNU Compiler Collection. - - This is a minor release to address several bugs in the [1]GCC version - 2.95.2 release. - - * Generic bugfixes and improvements - + Fix numerous problems that caused incorrect optimization in - the register reloading code. - + Fix numerous problems that caused incorrect optimization in - the loop optimizer. - + Fix aborts in the functions build_insn_chain and scan_loops - under some circumstances. - + Fix an alias analysis bug. - + Fix an infinite compilation bug in the combiner. - + A few problems with complex number support have been fixed. - + It is no longer possible for gcc to act as a fork bomb when - installed incorrectly. - + The -fpack-struct option should be recognized now. - + Fixed a bug that caused incorrect code to be generated due to - a lost stack adjustment. - * Platform specific bugfixes and improvements - + Support building ARM toolchains hosted on Windows. - + Fix attribute calculations in ARM toolchains. - + arm-linux support has been improved. - + Fix a PIC failure on sparc targets. - + On ix86 targets, the regparm attribute should now work - reliably. - + Several updates for the h8300 port. - - The whole suite has been extensively [2]regression tested and - [3]package tested. It should be reliable and suitable for widespread - use. - - The GCC 2.95 release has several new optimizations, new targets, new - languages and other new features as compared to EGCS 1.1 or GCC 2.8. - See the [4]new features page for a more complete list of new features - found in the GCC 2.95 releases. - - The sources include installation instructions in both HTML and - plaintext forms in the install directory in the distribution. However, - the most up to date [5]installation instructions and [6]build/test - status are on the web pages. We will update those pages as new - information becomes available. - - The GCC developers would like to thank the numerous people that have - contributed new features, test results, bugfixes, etc to GCC. This - [7]amazing group of volunteers is what makes GCC successful. - - And finally, we can't in good conscience fail to mention some - [8]caveats to using GCC 2.95.3. - - Download GCC 2.95.3 from the [9]GNU FTP server (ftp://ftp.gnu.org) - Download GCC 2.95.3 from the [10]GCC FTP server (ftp://gcc.gnu.org) - [11]Find a GNU mirror site - [12]Find a GCC mirror site - - For additional information about GCC please see the [13]GCC project - web server or contact the [14]GCC development mailing list. - _________________________________________________________________ - - - [15]The GCC team - Last modified 2001-03-16 - -References - - 1. http://gcc.gnu.org/gcc-2.95/gcc-2.95.2.html - 2. http://gcc.gnu.org/gcc-2.95/regress.html - 3. http://gcc.gnu.org/gcc-2.95/othertest.html - 4. http://gcc.gnu.org/gcc-2.95/features.html - 5. http://gcc.gnu.org/install/index.html - 6. http://gcc.gnu.org/gcc-2.95/buildstat.html - 7. http://gcc.gnu.org/thanks.html - 8. http://gcc.gnu.org/gcc-2.95/caveats.html - 9. ftp://ftp.gnu.org/pub/gnu/gcc/ - 10. ftp://gcc.gnu.org/pub/gcc/releases/index.html - 11. http://www.gnu.org/order/ftp.html - 12. http://gcc.gnu.org/mirrors.html - 13. http://gcc.gnu.org/index.html - 14. mailto:gcc@gcc.gnu.org - 15. http://gcc.gnu.org/about.html -====================================================================== -http://gcc.gnu.org/gcc-2.95/gcc-2.95.2.html - - GCC 2.95.2 - - October 27, 1999 - - The GNU project and the GCC developers are pleased to announce the - release of GCC version 2.95.2. GCC used to stand for the GNU C - Compiler, but since the compiler supports several other languages - aside from C, it now stands for the GNU Compiler Collection. - - This is a minor release to address several bugs in the GCC version - 2.95.1 release. - - The -fstrict-aliasing is not enabled by default for GCC 2.95.2. While - the optimizations performed by -fstrict-aliasing are valid according - to the C and C++ standards, the optimization have caused some - problems, particularly with old non-conforming code. - - The GCC developers are experimenting with ways to warn users about - code which violates the C/C++ standards, but those warnings are not - ready for widespread use at this time. Rather than wait for those - warnings the GCC developers have chosen to disable -fstrict-aliasing - by default for the GCC 2.95.2 release. - - We strongly encourage developers to find and fix code which violates - the C/C++ standards as -fstrict-aliasing may be enabled by default in - future releases. Use the option -fstrict-aliasing to re-enable these - optimizations. - - * Generic bugfixes and improvements - + Fix incorrectly optimized memory reference in global common - subexpression elimination (GCSE) optimization pass. - + Fix code generation bug in regmove.c in which it could - incorrectly change a "const" value. - + Fix bug in optimization of conditionals involving volatile - memory references. - + Avoid over-allocation of stack space for some procedures. - + Fixed bug in the compiler which caused incorrect optimization - of an obscure series of bit manipulations, shifts and - arithmetic. - + Fixed register allocator bug which caused teTeX to be - mis-compiled on Sparc targets. - + Avoid incorrect optimization of degenerate case statements - for certain targets such as the ARM. - + Fix out of range memory reference in the jump optimizer. - + Avoid dereferencing null pointer in fix-header. - + Fix test for GCC specific features so that it is possible to - bootstrap with gcc-2.6.2 and older versions of GCC. - + Fix typo in scheduler which could potentially cause out of - range memory accesses. - + Avoid incorrect loop reversal which caused incorrect code for - certain loops on PowerPC targets. - + Avoid incorrect optimization of switch statements on certain - targets (for example the ARM). - * Platform specific bugfixes and improvements - + Work around bug in Sun V5.0 compilers which caused bootstrap - comparison failures on Sparc targets. - + Fix Sparc backend bug which caused aborts in final.c. - + Fix sparc-hal-solaris2* configuration fragments. - + Fix bug in sparc block profiling. - + Fix obscure code generation bug for the PARISC targets. - + Define __STDC_EXT__ for HPUX configurations. - + Various POWERPC64 code generation bugfixes. - + Fix abort for PPC targets using ELF (ex GNU/Linux). - + Fix collect2 problems for AIX targets. - + Correct handling of .file directive for PPC targets. - + Fix bug in fix_trunc x86 patterns. - + Fix x86 port to correctly pop the FP stack for functions that - return structures in memory. - + Fix minor bug in strlen x86 pattern. - + Use stabs debugging instead of dwarf1 for x86-solaris - targets. - + Fix template repository code to handle leading underscore in - mangled names. - + Fix weak/weak alias support for OpenBSD. - + GNU/Linux for the ARM has C++ compatible include files. - * Language & Runtime specific fixes. - + Fix handling of constructor attribute in the C front-end - which caused problems building the Chill runtime library on - some targets. - + Fix minor problem merging type qualifiers in the C front-end. - + Fix aliasing bug for pointers and references (C/C++). - + Fix incorrect "non-constant initializer bug" when - -traditional or -fwritable-strings is enabled. - + Fix build error for Chill front-end on SunOS. - + Do not complain about duplicate instantiations when using - -frepo (C++) - + Fix array bounds handling in C++ front-end which caused - problems with dwarf debugging information in some - circumstances. - + Fix minor namespace problem. - + Fix problem linking java programs. - - The whole suite has been extensively [1]regression tested and - [2]package tested. It should be reliable and suitable for widespread - use. - - The GCC 2.95 release has several new optimizations, new targets, new - languages and other new features as compared to EGCS 1.1 or GCC 2.8. - See the [3]new features page for a more complete list of new features - found in the GCC 2.95 releases. - - The sources include installation instructions in both HTML and - plaintext forms in the install directory in the distribution. However, - the most up to date [4]installation instructions and [5]build/test - status are on the web pages. We will update those pages as new - information becomes available. - - The GCC developers would like to thank the numerous people that have - contributed new features, test results, bugfixes, etc to GCC. This - [6]amazing group of volunteers is what makes GCC successful. - - And finally, we can't in good conscience fail to mention some - [7]caveats to using GCC 2.95.2. - - Download GCC 2.95.2 from the [8]GNU FTP server (ftp://ftp.gnu.org) - Download GCC 2.95.2 from the [9]GCC/EGCS FTP server - (ftp://gcc.gnu.org) - [10]Find a GNU mirror site - [11]Find a GCC/EGCS mirror site - - For additional information about GCC please see the [12]GCC project - web server or contact the [13]GCC development mailing list. - _________________________________________________________________ - - - [14]The GCC team - Last modified 2001-02-12 - -References - - 1. http://gcc.gnu.org/gcc-2.95/regress.html - 2. http://gcc.gnu.org/gcc-2.95/othertest.html - 3. http://gcc.gnu.org/gcc-2.95/features.html - 4. http://gcc.gnu.org/install/index.html - 5. http://gcc.gnu.org/gcc-2.95/buildstat.html - 6. http://gcc.gnu.org/thanks.html - 7. http://gcc.gnu.org/gcc-2.95/caveats.html - 8. ftp://ftp.gnu.org/pub/gnu/gcc/ - 9. ftp://gcc.gnu.org/pub/gcc/releases/index.html - 10. http://www.gnu.org/order/ftp.html - 11. http://gcc.gnu.org/mirrors.html - 12. http://gcc.gnu.org/index.html - 13. mailto:gcc@gcc.gnu.org - 14. http://gcc.gnu.org/about.html -====================================================================== -http://gcc.gnu.org/gcc-2.95/gcc-2.95.1.html - - GCC 2.95.1 - - August 19, 1999 - - The GNU project and the GCC/EGCS developers are pleased to announce - the release of GCC version 2.95.1. GCC used to stand for the GNU C - Compiler, but since the compiler supports several other languages - aside from C, it now stands for the GNU Compiler Collection. - - This is a minor release to address several bugs in the GCC version - 2.95 release. - - * Generic bugfixes and improvements - + Various documentation fixes related to the GCC/EGCS merger. - + Fix memory management bug which could lead to spurious - aborts, core dumps or random parsing errors in the compiler. - + Fix a couple bugs in the dwarf1 and dwarf2 debug record - support. - + Fix infinite loop in the CSE optimizer. - + Avoid undefined behavior in compiler FP emulation code - + Fix install problem when prefix is overridden on the make - install command. - + Fix problem with unwanted installation of assert.h on some - systems. - + Fix problem with finding the wrong assembler in a single tree - build. - + Avoid increasing the known alignment of a register that is - already known to be a pointer. - * Platform specific bugfixes and improvements - + Codegen bugfix for prologue/epilogue for cpu32 target. - + Fix long long code generation bug for the Coldfire target. - + Fix various aborts in the SH compiler. - + Fix bugs in libgcc support library for the SH. - + Fix alpha ev6 code generation bug. - + Fix problems with EXIT_SUCCESS/EXIT_FAILURE redefinitions on - AIX platforms. - + Fix -fpic code generation bug for rs6000/ppc svr4 targets. - + Fix varargs/stdarg code generation bug for rs6000/ppc svr4 - targets. - + Fix weak symbol handling for rs6000/ppc svr4 targets. - + Fix various problems with 64bit code generation for the - rs6000/ppc port. - + Fix codegen bug which caused tetex to be mis-compiled on the - x86 - + Fix compiler abort in new cfg code exposed by x86 port. - + Fix out of range array reference in code convert flat - registers to the x87 stacked FP register file. - + Fix minor vxworks configuration bug - + Fix return type of bsearch for SunOS 4.x. - * Language & Runtime specific fixes. - + The G++ signature extension has been deprecated. It will be - removed in the next major release of G++. Use of signatures - will result in a warning from the compiler. - + Several bugs relating to templates and namespaces were fixed. - + A bug that caused crashes when combining templates with -g on - DWARF1 platforms was fixed. - + Pointers-to-members, virtual functions, and multiple - inheritance should now work together correctly. - + Some code-generation bugs relating to function try blocks - were fixed. - + G++ is a little bit more lenient with certain archaic - constructs than in GCC 2.95. - + Fix to prevent shared library version #s from bring truncated - to 1 digit - + Fix missing std:: in the libstdc++ library. - + Fix stream locking problems in libio. - + Fix problem in java compiler driver. - - The whole suite has been extensively [1]regression tested and - [2]package tested. It should be reliable and suitable for widespread - use. - - The compiler has several new optimizations, new targets, new languages - and other new features. See the [3]new features page for a more - complete list of new features found in the GCC 2.95 releases. - - The sources include installation instructions in both HTML and - plaintext forms in the install directory in the distribution. However, - the most up to date [4]installation instructions and [5]build/test - status are on the web pages. We will update those pages as new - information becomes available. - - The GCC developers would like to thank the numerous people that have - contributed new features, test results, bugfixes, etc to GCC. This - [6]amazing group of volunteers is what makes GCC successful. - - And finally, we can't in good conscience fail to mention some - [7]caveats to using GCC 2.95.1. - - Download GCC 2.95.1 from the [8]GNU FTP server (ftp://ftp.gnu.org) - Download GCC 2.95.1 from the [9]GCC/EGCS FTP server - (ftp://go.cygnus.com) - [10]Find a GNU mirror site - [11]Find a GCC/EGCS mirror site - - For additional information about GCC please see the [12]GCC project - web server or contact the [13]GCC development mailing list. - _________________________________________________________________ - - - [14]The GCC team - Last modified 2001-02-12 - -References - - 1. http://gcc.gnu.org/gcc-2.95/regress.html - 2. http://gcc.gnu.org/gcc-2.95/othertest.html - 3. http://gcc.gnu.org/gcc-2.95/features.html - 4. http://gcc.gnu.org/install/index.html - 5. http://gcc.gnu.org/gcc-2.95/buildstat.html - 6. http://gcc.gnu.org/thanks.html - 7. http://gcc.gnu.org/gcc-2.95/caveats.html - 8. ftp://ftp.gnu.org/pub/gnu/gcc/ - 9. ftp://go.cygnus.com/pub/sourceware.cygnus.com/pub/egcs/releases/index.html - 10. http://www.gnu.org/order/ftp.html - 11. http://gcc.gnu.org/mirrors.html - 12. http://gcc.gnu.org/index.html - 13. mailto:gcc@gcc.gnu.org - 14. http://gcc.gnu.org/about.html -====================================================================== -http://gcc.gnu.org/gcc-2.95/gcc-2.95.html - - GCC 2.95 - - July 31, 1999 - - The GNU project and the GCC/EGCS developers are pleased to announce - the release of GCC version 2.95. GCC used to stand for the GNU C - Compiler, but since the compiler supports several other languages - aside from C, it now stands for the GNU Compiler Collection. - - This is the first release of GCC since the April 1999 GCC/EGCS - reunification and includes nearly a year's worth of new development - and bugfixes. - - The whole suite has been extensively [1]regression tested and - [2]package tested. It should be reliable and suitable for widespread - use. - - The compiler has several new optimizations, new targets, new languages - and other new features. See the [3]new features page for a more - complete list of new features found in the GCC 2.95 releases. - - The sources include installation instructions in both HTML and - plaintext forms in the install directory in the distribution. However, - the most up to date [4]installation instructions and [5]build/test - status are on the web pages. We will update those pages as new - information becomes available. - - The GCC developers would like to thank the numerous people that have - contributed new features, test results, bugfixes, etc to GCC. This - [6]amazing group of volunteers is what makes GCC successful. - - And finally, we can't in good conscience fail to mention some - [7]caveats to using GCC 2.95. - - Download GCC 2.95 from the [8]GNU FTP server (ftp://ftp.gnu.org) - Download GCC 2.95 from the [9]GCC/EGCS FTP server - (ftp://go.cygnus.com) - [10]Find a GNU mirror site - [11]Find a GCC/EGCS mirror site - - For additional information about GCC please see the [12]GCC project - web server or contact the [13]GCC development mailing list. - _________________________________________________________________ - - - [14]The GCC team - Last modified 2001-02-12 - -References - - 1. http://gcc.gnu.org/gcc-2.95/regress.html - 2. http://gcc.gnu.org/gcc-2.95/othertest.html - 3. http://gcc.gnu.org/gcc-2.95/features.html - 4. http://gcc.gnu.org/install/index.html - 5. http://gcc.gnu.org/gcc-2.95/buildstat.html - 6. http://gcc.gnu.org/thanks.html - 7. http://gcc.gnu.org/gcc-2.95/caveats.html - 8. ftp://ftp.gnu.org/pub/gnu/gcc/ - 9. ftp://go.cygnus.com/pub/sourceware.cygnus.com/pub/egcs/releases/index.html - 10. http://www.gnu.org/order/ftp.html - 11. http://gcc.gnu.org/mirrors.html - 12. http://gcc.gnu.org/index.html - 13. mailto:gcc@gcc.gnu.org - 14. http://gcc.gnu.org/about.html -====================================================================== -http://gcc.gnu.org/gcc-2.95/features.html - - GCC 2.95 New Features - - * General Optimizer Improvements: - + [1]Localized register spilling to improve speed and code - density especially on small register class machines. - + [2]Global CSE using lazy code motion algorithms. - + [3]Improved global constant/copy propagation. - + [4]Improved control flow graph analysis and manipulation. - + [5]Local dead store elimination. - + [6]Memory Load hoisting/store sinking in loops. - + [7]Type based alias analysis is enabled by default. Note this - feature will expose bugs in the Linux kernel. Please refer to - the [8]FAQ for additional information on this issue. - + Major revamp of GIV detection, combination and simplification - to improve loop performance. - + Major improvements to register allocation and reloading. - * New Languages and Language specific improvements - + [9]Many C++ improvements. - + [10]Many Fortran improvements. - + [11]Java front-end has been integrated. A [12]runtime library - is available separately. - + [13]ISO C99 support - + [14]Chill front-end and runtime has been integrated. - + Boehm garbage collector support in libobjc. - + More support for various pragmas which appear in vendor - include files - * New Targets and Target Specific Improvements - + [15]Sparc backend rewrite. - + -mschedule=8000 will optimize code for PA8000 class - processors; -mpa-risc-2-0 will generate code for PA2.0 - processors - + Various micro-optimizations for the ia32 port. K6 - optimizations - + Compiler will attempt to align doubles in the stack on the - ia32 port - + Alpha EV6 support - + PowerPC 750 - + RS6000/PowerPC: -mcpu=401 was added as an alias for - -mcpu=403. -mcpu=e603e was added to do -mcpu=603e and - -msoft-float. - + c3x, c4x - + HyperSparc - + SparcLite86x - + sh4 - + Support for new systems (OpenBSD, FreeBSD, UWIN, Interix, - arm-linux) - + vxWorks targets include support for vxWorks threads - + StrongARM 110 and ARM9 support added. ARM Scheduling - parameters rewritten. - + Various changes to the MIPS port to avoid assembler macros, - which - + Various performance improvements to the i960 port. - + Major rewrite of ns32k port in turn improves performance - * Other significant improvements - + [16]Ability to dump cfg information and display it using vcg. - + The new faster scheme for fixing vendor header files is - enabled by default. - + Experimental internationalization support. - + multibyte character support - + Some compile-time speedups for pathological problems - + Better support for complex types - * Plus the usual mountain of bugfixes - * Core compiler is based on the gcc2 development tree from Sept 30, - 1998, so we have all of the [17]features found in GCC 2.8. - _________________________________________________________________ - - - [18]The GCC team - Last modified 2001-02-12 - -References - - 1. http://gcc.gnu.org/news/spill.html - 2. http://gcc.gnu.org/news/lcm.html - 3. http://gcc.gnu.org/news/cprop.html - 4. http://gcc.gnu.org/news/cfg.html - 5. http://gcc.gnu.org/news/dse.html - 6. http://gcc.gnu.org/news/hoist.html - 7. http://gcc.gnu.org/news/alias.html - 8. http://gcc.gnu.org/fom_serv/cache/24.html - 9. http://gcc.gnu.org/gcc-2.95/c++features.html - 10. http://gcc.gnu.org/onlinedocs/g77_news.html - 11. http://sources.redhat.com/java/gcj-announce.txt - 12. http://gcc.gnu.org/javaannounce.html - 13. http://gcc.gnu.org/c99status.html - 14. http://gcc.gnu.org/news/chill.html - 15. http://gcc.gnu.org/news/sparc.html - 16. http://gcc.gnu.org/news/egcs-vcg.html - 17. http://gcc.gnu.org/egcs-1.0/features-2.8.html - 18. http://gcc.gnu.org/about.html -====================================================================== -http://gcc.gnu.org/gcc-2.95/caveats.html - - GCC 2.95 Caveats - - * GCC 2.95 will issue an error for invalid asm statements that had - been silently accepted by earlier versions of the compiler. This - is particularly noticeable when compiling older versions of the - Linux kernel (2.0.xx). Please refer to the [1]FAQ for more - information on this issue. - * GCC 2.95 implements type based alias analysis to disambiguate - memory references. Some programs, particularly the Linux kernel - violate ANSI/ISO aliasing rules and therefore may not operate - correctly when compiled with GCC 2.95. Please refer to the [2]FAQ - for more information on this issue. - * GCC 2.95 has a known bug in its handling of complex variables for - 64bit targets. Instead of silently generating incorrect code, GCC - 2.95 will issue a fatal error for situations it can not handle. - This primarily affects the Fortran community as Fortran makes more - use of complex variables than C or C++. - * GCC 2.95 has an integrated libstdc++, but does not have an - integrated libg++. Furthermore old libg++ releases will not work - with GCC 2.95. You can retrieve a recent copy of libg++ from the - [3]GCC ftp server. - Note most C++ programs only need libstdc++. - * Exception handling may not work with shared libraries, - particularly on alphas, hppas, rs6000/powerpc and mips based - platforms. Exception handling is known to work on x86 GNU/Linux - platforms with shared libraries. - * In general, GCC 2.95 is more rigorous about rejecting invalid C++ - code or deprecated C++ constructs than G++ 2.7, G++ 2.8, EGCS 1.0, - or EGCS 1.1. As a result it may be necessary to fix C++ code - before it will compile with GCC 2.95. - * G++ is also converting toward the ISO C++ standard; as a result - code which was previously valid (and thus accepted by other - compilers and older versions of g++) may no longer be accepted. - The flag -fpermissive may allow some non-conforming code to - compile with GCC 2.95. - * GCC 2.95 compiled C++ code is not binary compatible with EGCS - 1.1.x, EGCS 1.0.x or GCC 2.8.x. - * GCC 2.95 does not have changes from the GCC 2.8 tree that were - made between Sept 30, 1998 and April 30, 1999 (the official end of - the GCC 2.8 project). Future GCC releases will include all the - changes from the defunct GCC 2.8 sources. - _________________________________________________________________ - - - [4]The GCC team - Last modified 2001-02-12 - -References - - 1. http://gcc.gnu.org/faq.html#asmclobber - 2. http://gcc.gnu.org/fom_serv/cache/24.html - 3. ftp://gcc.gnu.org/pub/gcc/infrastructure/libg++-2.8.1.3.tar.gz - 4. http://gcc.gnu.org/about.html -====================================================================== -http://gcc.gnu.org/egcs-1.1/egcs-1.1.2.html - - EGCS 1.1.2 - - March 15, 1999 - - We are pleased to announce the release of EGCS 1.1.2. - - EGCS is a collaborative effort involving several groups of hackers - using an open development model to accelerate development and testing - of GNU compilers and runtime libraries. - - EGCS 1.1.2 is a minor update to the EGCS 1.1.1 compiler to fix several - serious problems in EGCS 1.1.1. - * General improvements and fixes - + Fix bug in loop optimizer which caused the SPARC (and - potentially other) ports to segfault. - + Fix infinite recursion in alias analysis and combiner code. - + Fix bug in regclass preferencing. - + Fix incorrect loop reversal which caused incorrect code to be - generated for several targets. - + Fix return value for builtin memcpy. - + Reduce compile time for certain loops which exposed quadratic - behavior in the loop optimizer. - + Fix bug which caused volatile memory to be written multiple - times when only one write was needed/desired. - + Fix compiler abort in caller-save.c - + Fix combiner bug which caused incorrect code generation for - certain division by constant operations. - + Fix incorrect code generation due to a bug in range check - optimizations. - + Fix incorrect code generation due to mis-handling of - clobbered values in CSE. - + Fix compiler abort/segfault due to incorrect register - splitting when unrolling loops. - + Fix code generation involving autoincremented addresses with - ternary operators. - + Work around bug in the scheduler which caused qt to be - mis-compiled on some platforms. - + Fix code generation problems with -fshort-enums. - + Tighten security for temporary files. - + Improve compile time for codes which make heavy use of - overloaded functions. - + Fix multiply defined constructor/destructor symbol problems. - + Avoid setting bogus RPATH environemnt variable during - bootstrap. - + Avoid GNU-make dependencies in the texinfo subdir. - + Install CPP wrapper script in $(prefix)/bin if --enable-cpp. - --enable-cpp= can be used to specify an additional install - directory for the cpp wrapper script. - + Fix CSE bug which caused incorrect label-label refs to appear - on some platforms. - + Avoid linking in EH routines from libgcc if they are not - needed. - + Avoid obscure bug in aliasing code. - + Fix bug in weak symbol handling. - * Platform-specific improvements and fixes - + Fix detection of PPro/PII on Unixware 7. - + Fix compiler segfault when building spec99 and other programs - for SPARC targets. - + Fix code-generation bugs for integer and floating point - conditional move instructions on the PPro/PII. - + Use fixincludes to fix byteorder problems on i?86-*-sysv. - + Fix build failure for the arc port. - + Fix floating point format configuration for i?86-gnu port - + Fix problems with hppa1.0-hp-hpux10.20 configuration when - threads are enabled - + Fix coldfire code generation bugs. - + Fix "unrecognized insn" problems for Alpha and PPC ports. - + Fix h8/300 code generation problem with floating point values - in memory. - + Fix unrecognized insn problems for the m68k port. - + Fix namespace-pollution problem for the x86 port. - + Fix problems with old assembler on x86 NeXT systems. - + Fix PIC code-generation problems for the SPARC port. - + Fix minor bug with LONG_CALLS in PowerPC SVR4 support. - + Fix minor ISO namespace violation in Alpha varargs/stdarg - support. - + Fix incorrect "braf" instruction usage for the SH port. - + Fix minor bug in va-sh which prevented its use with -ansi. - + Fix problems recognizing and supporting FreeBSD. - + Handle OpenBSD systems correctly. - + Minor fixincludes fix for Digital UNIX 4.0B. - + Fix problems with ctors/dtors in SCO shared libraries. - + Abort instead of generating incorrect code for PPro/PII - floating point conditional moves. - + Avoid multiply defined symbols on Linux/GNU systems using - libc-5.4.xx. - + Fix abort in alpha compiler. - - Fortran-specific fixes - * Fix the IDate intrinsic (VXT) (in libg2c) so the returned year is - in the documented, non-Y2K-compliant range of 0-99, instead of - being returned as 100 in the year 2000. - * Fix the `Date_and_Time' intrinsic (in libg2c) to return the - milliseconds value properly in Values(8). - * Fix the `LStat' intrinsic (in libg2c) to return device-ID - information properly in SArray(7). - - An important goal of EGCS is to allow wide scale testing of new - features and optimizations which are still under development. However, - EGCS has been carefully tested and should be comparable in quality to - most gcc releases. - - EGCS 1.1.2 is based on the June 6, 1998 snapshot of the GCC 2.8 - development sources; it contains all of the new features found in GCC - 2.8.1 as well as all new development from gcc2 up to June 6, 1998. - - See the [1]new features page for a more complete list of new features - found in EGCS 1.1 releases. - - The EGCS 1.1.2 release includes installation instructions in both HTML - and plaintext forms (see the INSTALL directory in the toplevel - directory of the EGCS 1.1.2 distribution). However, we also keep the - most up to date [2]installation instructions and [3]build/test status - on our web page. We will update those pages as new information becomes - available. - - The EGCS project would like to thank the numerous people that have - contributed new features, test results, bugfixes, etc. This [4]amazing - group of volunteers is what makes EGCS successful. - - And finally, we can't in good conscience fail to mention some - [5]caveats to using EGCS 1.1.2. [6]Download EGCS 1.1.2 from - egcs.cygnus.com (USA California) --> - - [7]Download EGCS 1.1.2 from go.cygnus.com (USA California - High speed - link provided by Stanford) - - The EGCS 1.1.2 release is also available on many [8]mirror sites. - _________________________________________________________________ - - Last modified on July 28, 1999. - -References - - 1. http://gcc.gnu.org/egcs-1.1/features.html - 2. http://gcc.gnu.org/install/index.html - 3. http://gcc.gnu.org/egcs-1.1/buildstat.html - 4. http://gcc.gnu.org/thanks.html - 5. http://gcc.gnu.org/egcs-1.1/caveats.html - 6. ftp://egcs.cygnus.com/pub/egcs/releases/index.html - 7. ftp://go.cygnus.com/pub/sourceware.cygnus.com/pub/egcs/releases/index.html - 8. http://gcc.gnu.org/mirrors.html -====================================================================== -http://gcc.gnu.org/egcs-1.1/egcs-1.1.1.html - - EGCS 1.1.1 - - December 1, 1998 - - We are pleased to announce the release of EGCS 1.1.1. - - EGCS is a collaborative effort involving several groups of hackers - using an open development model to accelerate development and testing - of GNU compilers and runtime libraries. - - EGCS 1.1.1 is a minor update to the EGCS 1.1 compiler to fix several - serious problems in EGCS 1.1. - * General improvements and fixes - + Avoid some stack overflows when compiling large functions. - + Avoid incorrect loop invariant code motions. - + Fix some core dumps on Linux kernel code. - + Bring back the imake -Di386 and friends fix from EGCS 1.0.2. - + Fix code generation problem in gcse. - + Various documentation related fixes. - * g++/libstdc++ improvements and fixes - + MT safe EH fix for setjmp/longjmp based exception handling. - + Fix a few bad interactions between optimization and exception - handling. - + Fixes for demangling of template names starting with "__". - + Fix a bug that would fail to run destructors in some cases - with -O2. - + Fix 'new' of classes with virtual bases. - + Fix crash building Qt on the Alpha. - + Fix failure compiling WIFEXITED macro on GNU/Linux. - + Fix some -frepo failures. - * g77 and libf2c improvements and fixes - + Various documentation fixes. - + Avoid compiler crash on RAND intrinsic. - + Fix minor bugs in makefiles exposed by BSD make programs. - + Define _XOPEN_SOURCE for libI77 build to avoid potential - problems on some 64-bit systems. - + Fix problem with implicit endfile on rewind. - + Fix spurious recursive I/O errors. - * platform specific improvements and fixes - + Match all versions of UnixWare7. - + Do not assume x86 SVR4 or UnixWare targets can handle stabs - + Fix PPC/RS6000 LEGITIMIZE_ADDRESS macro and bug in conversion - from unsigned ints to double precision floats. - + Fix ARM ABI issue with NetBSD. - + Fix a few arm code generation bugs. - + Fixincludes will fix additional broken SCO OpenServer header - files. - + Fix a m68k backend bug which caused invalid offsets in reg+d - addresses. - + Fix problems with 64bit AIX 4.3 support. - + Fix handling of long longs for varargs/stdarg functions on - the ppc. - + Minor fixes to CPP predefines for Windows. - + Fix code generation problems with gpr<->fpr copies for 64bit - ppc - + Fix a few coldfire code generation bugs. - + Fix some more header file problems on SunOS 4.x - + Fix assert.h handling for RTEMS. - + Fix Windows handling of TREE_SYMBOL_REFERENCED. - + Fix x86 compiler abort in reg-stack pass. - + Fix cygwin/windows problem with section attributes. - + Fix Alpha code generation problem exposed by SMP Linux - kernels. - + Fix typo in m68k 32->64bit integer conversion. - + Make sure target libraries build with -fPIC for PPC & Alpha - targets. - - An important goal of EGCS is to allow wide scale testing of new - features and optimizations which are still under development. However, - EGCS has been carefully tested and should be comparable in quality to - most gcc releases. - - EGCS 1.1.1 is based on the June 6, 1998 snapshot of the GCC 2.8 - development sources; it contains all of the new features found in GCC - 2.8.1 as well as all new development from gcc2 up to June 6, 1998. - - See the [1]new features page for a more complete list of new features - found in EGCS 1.1 releases. - - The EGCS 1.1.1 release includes installation instructions in both HTML - and plaintext forms (see the INSTALL directory in the toplevel - directory of the EGCS 1.1.1 distribution). However, we also keep the - most up to date [2]installation instructions and [3]build/test status - on our web page. We will update those pages as new information becomes - available. - - The EGCS project would like to thank the numerous people that have - contributed new features, test results, bugfixes, etc. This [4]amazing - group of volunteers is what makes EGCS successful. - - And finally, we can't in good conscience fail to mention some - [5]caveats to using EGCS 1.1.1. - - [6]Download EGCS 1.1.1 from egcs.cygnus.com (USA California) - - The EGCS 1.1.1 release is also available on many mirror sites. - [7]Goto mirror list to find a closer site - _________________________________________________________________ - - Last modified on July 28, 1999. - -References - - 1. http://gcc.gnu.org/egcs-1.1/features.html - 2. http://gcc.gnu.org/install/index.html - 3. http://gcc.gnu.org/egcs-1.1/buildstat.html - 4. http://gcc.gnu.org/thanks.html - 5. http://gcc.gnu.org/egcs-1.1/caveats.html - 6. ftp://egcs.cygnus.com/pub/egcs/releases/index.html - 7. http://gcc.gnu.org/mirrors.html -====================================================================== -http://gcc.gnu.org/egcs-1.1/egcs-1.1.html - - EGCS 1.1 - - September 3, 1998 - - We are pleased to announce the release of EGCS 1.1. - - EGCS is a free software project to further the development of the GNU - compilers using an open development environment. - - EGCS 1.1 is a major new release of the EGCS compiler system. It has - been [1]extensively tested and is believed to be stable and suitable - for widespread use. - - EGCS 1.1 is based on an June 6, 1998 snapshot of the GCC 2.8 - development sources; it contains all of the new features found in GCC - 2.8.1 as well as all new development from GCC up to June 6, 1998. - - EGCS also contains many improvements and features not found in GCC or - in older versions of EGCS. - * Global common subexpression elimination and global constant/copy - propagation (aka [2]gcse) - * Ongoing improvements to the [3]alias analysis support to allow for - better optimizations throughout the compiler. - * Vastly improved [4]C++ compiler and integrated C++ runtime - libraries. - * Fixes for the /tmp symlink race security problems. - * New targets including mips16, arm-thumb and 64 bit PowerPC. - * Improvements to GNU Fortran (g77) compiler and runtime library - made since [5]g77 version 0.5.23. - - See the [6]new features page for a more complete list of new features - found in EGCS 1.1 releases. - - The EGCS 1.1 release includes installation instructions in both HTML - and plaintext forms (see the INSTALL directory in the toplevel - directory of the EGCS 1.1 distribution). However, we also keep the - most up to date [7]installation instructions and [8]build/test status - on our web page. We will update those pages as new information becomes - available. - - The EGCS project would like to thank the numerous people that have - contributed new features, test results, bugfixes, etc. This [9]amazing - group of volunteers is what makes EGCS successful. - - And finally, we can't in good conscience fail to mention some - [10]caveats to using EGCS 1.1. - - [11]Download EGCS 1.1 from egcs.cygnus.com (USA California) - - [12]Download EGCS 1.1 from go.cygnus.com (USA California -- High speed - link provided by Stanford) - - The EGCS 1.1 release is also available on many mirror sites. - [13]Goto mirror list to find a closer site - _________________________________________________________________ - - Last modified on September 4, 1999. - -References - - 1. http://gcc.gnu.org/egcs-1.1/egcs-1.1-test.html - 2. http://gcc.gnu.org/news/gcse.html - 3. http://gcc.gnu.org/news/alias.html - 4. http://gcc.gnu.org/egcs-1.1/c++features.html - 5. http://gcc.gnu.org/onlinedocs/g77_news.html - 6. http://gcc.gnu.org/egcs-1.1/features.html - 7. http://gcc.gnu.org/install/index.html - 8. http://gcc.gnu.org/egcs-1.1/buildstat.html - 9. http://gcc.gnu.org/thanks.html - 10. http://gcc.gnu.org/egcs-1.1/caveats.html - 11. ftp://egcs.cygnus.com/pub/egcs/releases/index.html - 12. ftp://go.cygnus.com/pub/sourceware.cygnus.com/pub/egcs/releases/index.html - 13. http://gcc.gnu.org/mirrors.html -====================================================================== -http://gcc.gnu.org/egcs-1.1/features.html - - EGCS 1.1 new features - - * Integrated GNU Fortran (g77) compiler and runtime library with - improvements, based on [1]g77 version 0.5.23. - * Vast improvements in the C++ compiler; so many they have [2]page - of their own! - * Compiler implements [3]global common subexpression elimination and - global copy/constant propagation. - * More major improvements in the [4]alias analysis code. - * More major improvements in the exception handling code to improve - performance, lower static overhead and provide the infrastructure - for future improvements. - * The infamous /tmp symlink race security problems have been fixed. - * The regmove optimization pass has been nearly completely rewritten - to improve performance of generated code. - * The compiler now recomputes register usage information before - local register allocation. By providing more accurate information - to the priority based allocator, we get better register - allocation. - * The register reloading phase of the compiler optimizes spill code - much better than in previous releases. - * Some bad interactions between the register allocator and - instruction scheduler have been fixed, resulting in much better - code for certain programs. Additionally, we have tuned the - scheduler in various ways to improve performance of generated code - for some architectures. - * The compiler's branch shortening algorithms have been - significantly improved to work better on targets which align jump - targets. - * The compiler now supports -Os to prefer optimizing for code space - over optimizing for code speed. - * The compiler will now totally eliminate library calls which - compute constant values. This primarily helps targets with no - integer div/mul support and targets without floating point - support. - * The compiler now supports an extensive "--help" option. - * cpplib has been greatly improved and may be suitable for limited - use. - * Memory footprint for the compiler has been significantly reduced - for some pathological cases. - * The time to build EGCS has been improved for certain targets - (particularly the alpha and mips platforms). - * Many infrastructure improvements throughout the compiler, plus the - usual mountain of bugfixes and minor improvements. - * Target dependent improvements: - + SPARC port now includes V8 plus and V9 support as well as - performance tuning for Ultra class machines. The SPARC port - now uses the Haifa scheduler. - + Alpha port has been tuned for the EV6 processor and has an - optimized expansion of memcpy/bzero. The Alpha port now uses - the Haifa scheduler. - + RS6000/PowerPC: EGCS 1.1 includes support for the Power64 - architecture and aix4.3 support. The RS6000/PowerPC port now - uses the Haifa scheduler. - + x86: Alignment of static store data and jump targets is per - Intel recommendations now. Various improvements throughout - the x86 port to improve performance on Pentium processors. - Conditional move support has been fixed and enabled for PPro - processors. The x86 port also better supports 64bit - operations now. - + MIPS has improved multiply/multiply-add support and now - includes mips16 ISA support. - + M68k has many micro-optimizations and Coldfire fixes. - * Core compiler is based on the GCC development tree from June 9, - 1998, so we have all of the [5]features found in GCC 2.8. - - [6]Return to the EGCS home page - - Last modified: September 4, 1999 - -References - - 1. http://gcc.gnu.org/onlinedocs/g77_news.html - 2. http://gcc.gnu.org/egcs-1.1/c++features.html - 3. http://gcc.gnu.org/news/gcse.html - 4. http://gcc.gnu.org/news/alias.html - 5. http://gcc.gnu.org/egcs-1.0/features-2.8.html - 6. http://gcc.gnu.org/index.html -====================================================================== -http://gcc.gnu.org/egcs-1.1/caveats.html - - EGCS 1.1 Caveats - - * EGCS has an integrated libstdc++, but does not have an integrated - libg++. Furthermore old libg++ releases will not work with EGCS; - HJ Lu has made a [1]libg++ snapshot available which may work with - EGCS. - Note most C++ programs only need libstdc++. - * Exception handling may not work with shared libraries, - particularly on alphas, hppas, rs6000/powerpc and mips based - platforms. Exception handling is known to work on x86-linux - platforms with shared libraries. - * Some versions of the Linux kernel have bugs which prevent them - from being compiled or from running when compiled by EGCS. See - [2]the FAQ for additional information. - * In general, EGCS is more rigorous about rejecting invalid C++ code - or deprecated C++ constructs than g++-2.7, g++-2.8 or EGCS 1.0. As - a result it may be necessary to fix C++ code before it will - compile with EGCS. - * G++ is also converting toward the ISO C++ standard; as a result - code which was previously valid (and thus accepted by other - compilers and older versions of g++) may no longer be accepted. - * EGCS 1.1 compiled C++ code is not binary compatible with EGCS - 1.0.x or GCC 2.8.x due to changes necessary to support thread safe - exception handling. - - [3]Return to the GCC home page - - Last modified: July 28, 1999 - -References - - 1. ftp://ftp.yggdrasil.com/private/hjl/libg++-2.8.1.2.tar.gz - 2. http://gcc.gnu.org/fom_serv/cache/24.html - 3. http://gcc.gnu.org/index.html -====================================================================== -http://gcc.gnu.org/egcs-1.0/egcs-1.0.3.html - - EGCS 1.0.3 - - May 15, 1998 - - We are pleased to announce the release of EGCS 1.0.3. - - EGCS is a collaborative effort involving several groups of hackers - using an open development model to accelerate development and testing - of GNU compilers and runtime libraries. - - EGCS 1.0.3 is a minor update to the EGCS 1.0.2 compiler to fix a few - problems reported by Red Hat for builds of Red Hat 5.1. - * Generic bugfixes: - + Fix a typo in the libio library which resulted in incorrect - behavior of istream::get. - + Fix the Fortran negative array index problem. - + Fix a major problem with the ObjC runtime thread support - exposed by glibc2. - + Reduce memory consumption of the Haifa scheduler. - * Target specific bugfixes: - + Fix one x86 floating point code generation bug exposed by - glibc2 builds. - + Fix one x86 internal compiler error exposed by glibc2 builds. - + Fix profiling bugs on the Alpha. - + Fix ImageMagick & emacs 20.2 build problems on the Alpha. - + Fix rs6000/ppc bug when converting values from integer types - to floating point types. - - An important goal of EGCS is to allow wide scale testing of new - features and optimizations which are still under development. However, - EGCS has been carefully tested and should be comparable in quality to - most GCC releases. - - EGCS 1.0.3 is based on an August 2, 1997 snapshot of the GCC 2.8 - development sources; it contains nearly all of the new features found - in GCC 2.8. - - EGCS also contains many improvements and features not found in GCC 2.7 - or GCC 2.8. - * Integrated C++ runtime libraries, including support for most major - GNU/Linux systems! - * The integrated libstdc++ library includes a verbatim copy of - [1]SGI's STL release instead of a modified copy. - * Integrated GNU Fortran compiler - * New instruction scheduler - * New alias analysis code - - See the [2]new features page for a more complete list of new features - found in EGCS 1.0.x releases. - - The EGCS 1.0.3 release includes installation instructions in both HTML - and plaintext forms (see the INSTALL directory in the toplevel - directory of the EGCS 1.0.3 distribution). However, we also keep the - most up to date [3]installation instructions and [4]build/test status - on our web page. We will update those pages as new information becomes - available. - - And, we can't in good conscience fail to mention some [5]caveats to - using EGCS. - - Update: Big thanks to Stanford for providing a high speed link for - downloading EGCS (go.cygnus.com)! - - [6]Download EGCS 1.0.3 from ftp.cygnus.com (USA California) - - [7]Download EGCS 1.0.3 from go.cygnus.com (USA California -- High - speed link provided by Stanford) - - The EGCS 1.0.3 release is also available on many mirror sites. - [8]Goto mirror list to find a closer site - - We'd like to thank the numerous people that have contributed new - features, test results, bugfixes, etc. Unfortunately, they're far too - numerous to mention by name. - _________________________________________________________________ - - Last modified on February 22, 1999. - -References - - 1. http://www.sgi.com/Technology/STL - 2. http://gcc.gnu.org/egcs-1.0/features.html - 3. http://gcc.gnu.org/install/index.html - 4. http://gcc.gnu.org/egcs-1.0/buildstat.html - 5. http://gcc.gnu.org/egcs-1.0/caveats.html - 6. ftp://egcs.cygnus.com/pub/egcs/releases/index.html - 7. ftp://go.cygnus.com/pub/sourceware.cygnus.com/pub/egcs/releases/index.html - 8. http://gcc.gnu.org/mirrors.html -====================================================================== -http://gcc.gnu.org/egcs-1.0/egcs-1.0.2.html - - EGCS 1.0.2 - - March 16, 1998 - - We are pleased to announce the release of EGCS 1.0.2. - - EGCS is a collaborative effort involving several groups of hackers - using an open development model to accelerate development and testing - of GNU compilers and runtime libraries. - - EGCS 1.0.2 is a minor update to the EGCS 1.0.1 compiler to fix several - serious problems in EGCS 1.0.1. - * General improvements and fixes - + Memory consumption significantly reduced, especially for - templates and inline functions. - + Fix various problems with glibc2.1. - + Fix loop optimization bug exposed by rs6000/ppc port. - + Fix to avoid potential code generation problems in jump.c. - + Fix some undefined symbol problems in dwarf1 debug support. - * g++/libstdc++ improvements and fixes - + libstdc++ in the EGCS release has been updated and should be - link compatible with libstdc++-2.8. - + Various fixes in libio/libstdc++ to work better on Linux - systems. - + Fix problems with duplicate symbols on systems that do not - support weak symbols. - + Memory corruption bug and undefined symbols in bastring have - been fixed. - + Various exception handling fixes. - + Fix compiler abort for very long thunk names. - * g77 improvements and fixes - + Fix compiler crash for omitted bound in Fortran CASE - statement. - + Add missing entries to g77 lang-options. - + Fix problem with -fpedantic in the g77 compiler. - + Fix "backspace" problem with g77 on alphas. - + Fix x86 backend problem with Fortran literals and -fpic. - + Fix some of the problems with negative subscripts for g77 on - alphas. - + Fixes for Fortran builds on cygwin32/mingw32. - * platform specific improvements and fixes - + Fix long double problems on x86 (exposed by glibc) - + x86 ports define i386 again to keep imake happy. - + Fix exception handling support on NetBSD ports. - + Several changes to collect2 to fix many problems with AIX. - + Define __ELF__ for rs6000/linux. - + Fix -mcall-linux problem on rs6000/linux. - + Fix stdarg/vararg problem for rs6000/linux. - + Allow autoconf to select a proper install problem on AIX 3.1. - + m68k port support includes -mcpu32 option as well as cpu32 - multilibs. - + Fix stdarg bug for irix6. - + Allow EGCS to build on irix5 without the gnu assembler. - + Fix problem with static linking on sco5. - + Fix bootstrap on sco5 with native compiler. - + Fix for abort building newlib on H8 target. - + Fix fixincludes handling of math.h on SunOS. - + Minor fix for motorola 3300 m68k systems. - - An important goal of EGCS is to allow wide scale testing of new - features and optimizations which are still under development. However, - EGCS has been carefully tested and should be comparable in quality to - most GCC releases. - - EGCS 1.0.2 is based on an August 2, 1997 snapshot of the GCC 2.8 - development sources; it contains nearly all of the new features found - in GCC 2.8. - - EGCS also contains many improvements and features not found in GCC 2.7 - or GCC 2.8. - * Integrated C++ runtime libraries, including support for most major - linux systems! - * The integrated libstdc++ library includes a verbatim copy of - [1]SGI's STL release. - * Integrated GNU Fortran compiler - * New instruction scheduler - * New alias analysis code - - See the [2]new features page for a more complete list of new features - found in EGCS 1.0.x releases. - - The EGCS 1.0.2 release includes installation instructions in both HTML - and plaintext forms (see the INSTALL directory in the toplevel - directory of the EGCS 1.0.2 distribution). However, we also keep the - most up to date [3]installation instructions and [4]build/test status - on our web page. We will update those pages as new information becomes - available. - - And, we can't in good conscience fail to mention some [5]caveats to - using EGCS. - - Update: Big thanks to Stanford for providing a high speed link for - downloading EGCS (go.cygnus.com)! - - [6]Download EGCS 1.0.2 from ftp.cygnus.com (USA California) - - [7]Download EGCS 1.0.2 from go.cygnus.com (USA California -- High - speed link provided by Stanford) - - The EGCS 1.0.2 release is also available on many mirror sites. - [8]Goto mirror list to find a closer site - - We'd like to thank the numerous people that have contributed new - features, test results, bugfixes, etc. Unfortunately, they're far too - numerous to mention by name. - _________________________________________________________________ - - Last modified on July 28, 1999. - -References - - 1. http://www.sgi.com/Technology/STL/ - 2. http://gcc.gnu.org/egcs-1.0/features.html - 3. http://gcc.gnu.org/install/index.html - 4. http://gcc.gnu.org/egcs-1.0/buildstat.html - 5. http://gcc.gnu.org/egcs-1.0/caveats.html - 6. ftp://egcs.cygnus.com/pub/egcs/releases/index.html - 7. ftp://go.cygnus.com/pub/sourceware.cygnus.com/pub/egcs/releases/index.html - 8. http://gcc.gnu.org/mirrors.html -====================================================================== -http://gcc.gnu.org/egcs-1.0/egcs-1.0.1.html - - EGCS 1.0.1 - - January 6, 1998 - - We are pleased to announce the release of EGCS 1.0.1. - - EGCS is a collaborative effort involving several groups of hackers - using an open development model to accelerate development and testing - of GNU compilers and runtime libraries. - - EGCS 1.0.1 is a minor update to the EGCS 1.0 compiler to fix a few - critical bugs and add support for Red Hat 5.0 Linux. Changes since the - EGCS 1.0 release: - * Add support for Red Hat 5.0 Linux and better support for Linux - systems using glibc2. - Many programs failed to link when compiled with EGCS 1.0 on Red - Hat 5.0 or on systems with newer versions of glibc2. EGCS 1.0.1 - should fix these problems. - * Compatability with both EGCS 1.0 and GCC 2.8 libgcc exception - handling interfaces. - To avoid future compatibility problems, we strongly urge anyone - who is planning on distributing shared libraries that contain C++ - code to upgrade to EGCS 1.0.1 first. - Soon after EGCS 1.0 was released, the GCC developers made some - incompatible changes in libgcc's exception handling interfaces. - These changes were needed to solve problems on some platforms. - This means that GCC 2.8.0, when released, will not be seamlessly - compatible with shared libraries built by EGCS 1.0. The reason is - that the libgcc.a in GCC 2.8.0 will not contain a function needed - by the old interface. - The result of this is that there may be compatibility problems - with shared libraries built by EGCS 1.0 when used with GCC 2.8.0. - With EGCS 1.0.1, generated code uses the new (GCC 2.8.0) - interface, and libgcc.a has the support routines for both the old - and the new interfaces (so EGCS 1.0.1 and EGCS 1.0 code can be - freely mixed, and EGCS 1.0.1 and GCC 2.8.0 code can be freely - mixed). - The maintainers of GCC 2.x have decided against including seamless - support for the old interface in 2.8.0, since it was never - "official", so to avoid future compatibility problems we recommend - against distributing any shared libraries built by EGCS 1.0 that - contain C++ code (upgrade to 1.0.1 and use that). - * Various bugfixes in the x86, hppa, mips, and rs6000/ppc backends. - The x86 changes fix code generation errors exposed when building - glibc2 and the Linux dynamic linker (ld.so). - The hppa change fixes a compiler abort when configured for use - with RTEMS. - The MIPS changes fix problems with the definition of LONG_MAX on - newer systems, allow for command line selection of the target ABI, - and fix one code generation problem. - The rs6000/ppc change fixes some problems with passing structures - to varargs/stdarg functions. - * A few machine independent bugfixes, mostly to fix code generation - errors when building Linux kernels or glibc. - * Fix a few critical exception handling and template bugs in the C++ - compiler. - * Fix Fortran namelist bug on alphas. - * Fix build problems on x86-solaris systems. - - An important goal of EGCS is to allow wide scale testing of new - features and optimizations which are still under development. However, - EGCS has been carefully tested and should be comparable in quality to - most GCC releases. - - EGCS 1.0.1 is based on an August 2, 1997 snapshot of the GCC 2.8 - development sources; it contains nearly all of the new features found - in GCC 2.8. - - EGCS also contains many improvements and features not found in GCC 2.7 - and even the soon to be released GCC 2.8 compilers. - * Integrated C++ runtime libraries, including support for most major - linux systems! - * The integrated libstdc++ library includes a verbatim copy of - [1]SGI's STL release. - * Integrated GNU Fortran compiler - * New instruction scheduler - * New alias analysis code - - See the [2]new features page for a more complete list of new features - found in EGCS 1.0.x releases. - - The EGCS 1.0.1 release includes installation instructions in both HTML - and plaintext forms (see the INSTALL directory in the toplevel - directory of the EGCS 1.0.1 distribution). However, we also keep the - most up to date [3]installation instructions and [4]build/test status - on our web page. We will update those pages as new information becomes - available. - - And, we can't in good conscience fail to mention some [5]caveats to - using EGCS. - - Update: Big thanks to Stanford for providing a high speed link for - downloading EGCS (go.cygnus.com)! - - [6]Download EGCS 1.0.1 from ftp.cygnus.com (USA California) - - [7]Download EGCS 1.0.1 from go.cygnus.com (USA California -- High - speed link provided by Stanford) - - The EGCS 1.0.1 release is also available on many mirror sites. - [8]Goto mirror list to find a closer site - - We'd like to thank the numerous people that have contributed new - features, test results, bugfixes, etc. Unfortunately, they're far too - numerous to mention by name. - _________________________________________________________________ - - Last modified on July 28, 1999. - -References - - 1. http://www.sgi.com/Technology/STL/ - 2. http://gcc.gnu.org/egcs-1.0/features.html - 3. http://gcc.gnu.org/install/index.html - 4. http://gcc.gnu.org/egcs-1.0/buildstat.html - 5. http://gcc.gnu.org/egcs-1.0/caveats.html - 6. ftp://egcs.cygnus.com/pub/egcs/releases/index.html - 7. ftp://go.cygnus.com/pub/sourceware.cygnus.com/pub/egcs/releases/index.html - 8. http://gcc.gnu.org/mirrors.html -====================================================================== -http://gcc.gnu.org/egcs-1.0/egcs-1.0.html - - EGCS 1.0 - - December 3, 1997 - - We are pleased to announce the release of EGCS 1.0. - - EGCS is a collaborative effort involving several groups of hackers - using an open development model to accelerate development and testing - of GNU compilers and runtime libraries. - - An important goal of EGCS is to allow wide scale testing of - experimental features and optimizations; therefore, EGCS contains some - features and optimizations which are still under development. However, - EGCS has been carefully tested and should be comparable in quality to - most GCC releases. - - EGCS 1.0 is based on an August 2, 1997 snapshot of the GCC 2.8 - development sources; it contains nearly all of the new features found - in GCC 2.8. - - EGCS 1.0 also contains many improvements and features not found in GCC - 2.7 and even the soon to be released GCC 2.8 compilers. - * Integrated C++ runtime libraries, including support for most major - linux systems! - * The integrated libstdc++ library includes a verbatim copy of - [1]SGI's STL release. - * Integrated GNU Fortran compiler - * New instruction scheduler - * New alias analysis code - - See the [2]new features page for a more complete list of new features. - - The EGCS 1.0 release includes installation instructions in both HTML - and plaintext forms (see the INSTALL directory in the toplevel - directory of the EGCS 1.0 distribution). However, we also keep the - most up to date [3]installation instructions and [4]build/test status - on our web page. We will update those pages as new information becomes - available. - - And, we can't in good conscience fail to mention some [5]caveats to - using EGCS. - - Update: The T1 into our main California offices has been 100% - saturated since shortly after the release. We've added an EGCS 1.0 - mirror at our Massachusetts office to help share the load. We also - encourage folks to use the many mirrors available throughout the - world. - - Update: Big thanks to Stanford for providing a high speed link for - downloading EGCS! (go.cygnus.com) - - [6]Download EGCS 1.0 from ftp.cygnus.com (USA California) - - [7]Download EGCS 1.0 from go.cygnus.com (USA California -- High speed - link provided by Stanford) - - The EGCS 1.0 release should be available on most mirror sites by now. - [8]Goto mirror list to find a closer site - - We'd like to thank the numerous people that have contributed new - features, test results, bugfixes, etc. Unfortunately, they're far too - numerous to mention by name. - _________________________________________________________________ - - Last modified on July 28, 1999. - -References - - 1. http://www.sgi.com/Technology/STL - 2. http://gcc.gnu.org/egcs-1.0/features.html - 3. http://gcc.gnu.org/install/index.html - 4. http://gcc.gnu.org/egcs-1.0/buildstat.html - 5. http://gcc.gnu.org/egcs-1.0/caveats.html - 6. ftp://egcs.cygnus.com/pub/egcs/releases/index.html - 7. ftp://go.cygnus.com/pub/sourceware.cygnus.com/pub/egcs/releases/index.html - 8. http://gcc.gnu.org/mirrors.html -====================================================================== -http://gcc.gnu.org/egcs-1.0/features.html - - EGCS 1.0 features - - * Core compiler is based on the gcc2 development tree from Aug 2, - 1997, so we have most of the [1]features found in GCC 2.8. - * Integrated GNU Fortran compiler based on g77-0.5.22-19970929. - * Vast improvements in the C++ compiler; so many they have [2]page - of their own! - * Integrated C++ runtime libraries, including support for most major - linux systems! - * New instruction scheduler from IBM Haifa which includes support - for function wide instruction scheduling as well as superscalar - scheduling. - * Significantly improved alias analysis code. - * Improved register allocation for two address machines. - * Significant code generation improvements for Fortran code on - Alphas - * Various optimizations from the g77 project as well as improved - loop optimizations. - * Dwarf2 debug format support for some targets. - * egcs libstdc++ includes the SGI STL implementation without - changes. - * As a result of these and other changes, egcs libstc++ is not - binary compatible with previous releases of libstdc++. - * Various new ports -- UltraSPARC, Irix6.2 & Irix6.3 support, The - SCO Openserver 5 family (5.0.{0,2,4} and Internet FastStart 1.0 - and 1.1), Support for RTEMS on several embedded targets, Support - for arm-linux, Mitsubishi M32R, Hitachi H8/S, Matsushita MN102 and - MN103, NEC V850, Sparclet, Solaris & Linux on PowerPCs, etc. - * Integrated testsuites for gcc, g++, g77, libstdc++ and libio. - * RS6000/PowerPC ports generate code which can run on all - RS6000/PowerPC variants by default. - * -mcpu= and -march= switches for the x86 port to allow better - control over how the x86 port generates code. - * Includes the template repository patch (aka repo patch); note the - new template code makes repo obsolete for ELF systems using gnu-ld - such as Linux. - * Plus the usual assortment of bugfixes and improvements. - - [3]Return to the egcs home page - - Last modified: July 28, 1999 - -References - - 1. http://gcc.gnu.org/egcs-1.0/features-2.8.html - 2. http://gcc.gnu.org/egcs-1.0/c++features.html - 3. http://gcc.gnu.org/index.html -====================================================================== -http://gcc.gnu.org/egcs-1.0/caveats.html - - EGCS 1.0 Caveats - - * EGCS has an integrated libstdc++, but does not have an integrated - libg++. Furthermore old libg++ releases will not work with egc; HJ - Lu has made a [1]libg++ snapshot available which may work with - EGCS. - Note most C++ programs only need libstdc++. - * Note that using -pedantic or -Wreturn-type can cause an explosion - in the amount of memory needed for template-heavy C++ code, such - as code that uses STL. Also note that -Wall includes - -Wreturn-type, so if you use -Wall you will need to specify - -Wno-return-type to turn it off. - * Exception handling may not work with shared libraries, - particularly on alphas, hppas, and mips based platforms. Exception - handling is known to work on x86-linux platforms with shared - libraries. - * Some versions of the Linux kernel have bugs which prevent them - from being compiled or from running when compiled by EGCS. See - [2]the FAQ for additional information. - * In general, EGCS is more rigorous about rejecting invalid C++ code - or deprecated C++ constructs than G++ 2.7. As a result it may be - necessary to fix C++ code before it will compile with EGCS. - * G++ is also aggressively tracking the C++ standard; as a result - code which was previously valid (and thus accepted by other - compilers and older versions of G++) may no longer be accepted. - * EGCS 1.0 may not work with Red Hat Linux 5.0 on all targets. EGCS - 1.0.x and later releases should work with Red Hat Linux 5.0. - - [3]Return to the GCC home page - - Last modified: August 27, 1998 - -References - - 1. ftp://ftp.yggdrasil.com/private/hjl/libg++-2.8.1.2.tar.gz - 2. http://gcc.gnu.org/fom_serv/cache/24.html - 3. http://gcc.gnu.org/index.html -====================================================================== diff --git a/contrib/gcc/PROBLEMS b/contrib/gcc/PROBLEMS deleted file mode 100644 index bc532e641a8d..000000000000 --- a/contrib/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/contrib/gcc/PROJECTS b/contrib/gcc/PROJECTS deleted file mode 100644 index 2c2111a2a6e3..000000000000 --- a/contrib/gcc/PROJECTS +++ /dev/null @@ -1,449 +0,0 @@ -C++ template friend functions (mmitchell@usa.net) - -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. - -* Smarter reload pass. - -The reload pass as currently written can reload values only into registers -that are reserved for reloading. This means that in order to use a -register for reloading it must spill everything out of that register. - -It would be straightforward, though complicated, for reload1.c to keep -track, during its scan, of which hard registers were available at each -point in the function, and use for reloading even registers that were -free only at the point they were needed. This would avoid much spilling -and make better code. - -* 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/contrib/gcc/README b/contrib/gcc/README deleted file mode 100644 index a12bf7594630..000000000000 --- a/contrib/gcc/README +++ /dev/null @@ -1,26 +0,0 @@ -This directory contains the GNU Compiler Collection (GCC) version 2.95. -It includes all of the support for compiling C, C++, Objective C, Fortran, -Java, and Chill. - -The GNU Compiler Collection 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/contrib/gcc/README-bugs b/contrib/gcc/README-bugs deleted file mode 100644 index 06e15bb8af70..000000000000 --- a/contrib/gcc/README-bugs +++ /dev/null @@ -1,144 +0,0 @@ -The purpose of GCC pretesting is to verify that the new GCC -distribution, about to be released, works properly on your system *with -no change whatever*, when installed following the precise -recommendations that come with the distribution. - -Here are some guidelines on how to do pretesting so as to make it -helpful. All of them follow from common sense together with the -nature of the purpose and the situation. - -* It is absolutely vital that you mention even the smallest change or -departure from the standard sources and installation procedure. - -Otherwise, you are not testing the same program that I wrote. Testing -a different program is usually of no use whatever. It can even cause -trouble if you fail to tell me that you tested some other program -instead of what I know as GCC. I might think that GCC works, when in -fact it has not been properly tried, and might have a glaring fault. - -* Even changing the compilation options counts as a change in the -program. The GCC sources specify which compilation options to use. -Some of them are specified in makefiles, and some in machine-specific -configuration files. - -You have ways to override this--but if you do, then you are not -testing what ordinary users will do. Therefore, when pretesting, it -is vital to test with the default compilation options. - -(It is okay to test with nonstandard options as well as testing with -the standard ones.) - -* The machine and system configuration files of GCC are parts of -GCC. So when you test GCC, you need to do it with the -configuration files that come with GCC. - -If GCC does not come with configuration files for a certain machine, -and you test it with configuration files that don't come with GCC, -this is effectively changing GCC. Because the crucial fact about -the planned release is that, without changes, it doesn't work on that -machine. - -To make GCC work on that machine, I would need to install new -configuration files. That is not out of the question, since it is -safe--it certainly won't break any other machines that already work. -But you will have to rush me the legal papers to give the FSF -permission to use a large piece of text. - -* Look for recommendations for your system. - -You can find these recommendations in the Installation node of the -manual, and in the file INSTALL. (These two files have the same text.) - -These files say which configuration name to use for your machine, so -use the ones that are recommended. If you guess, you might guess -wrong and encounter spurious difficulties. What's more, if you don't -follow the recommendations then you aren't helping to test that its -recommendations are valid. - -These files may describe other things that you need to do to make GCC -work on your machine. If so, you should follow these recommendations -also, for the same reason. - -Also look at the Trouble chapter of the manual for items that -pertain to your machine. - -* Don't delay sending information. - -When you find a problem, please double check it if you can do so -quickly. But don't spend a long time double-checking. A good rule is -always to tell me about every problem on the same day you encounter -it, even if that means you can't find a solution before you report the -problem. - -I'd much rather hear about a problem today and a solution tomorrow -than get both of them tomorrow at the same time. - -* Make each bug report self-contained. - -If you refer back to another message, whether from you or from someone -else, then it will be necessary for anyone who wants to investigate -the bug to find the other message. This may be difficult, it is -probably time-consuming. - -To help me save time, simply copy the relevant parts of any previous -messages into your own bug report. - -In particular, if I ask you for more information because a bug report -was incomplete, it is best to send me the *entire* collection of -relevant information, all together. If you send just the additional -information, that makes me do extra work. There is even a risk that -I won't remember what question you are sending me the answer to. - -* Always be precise when talking about changes you have made. Show -things rather than describing them. Use exact filenames (relative to -the main directory of the distribution), not partial ones. For -example, say "I changed Makefile" rather than "I changed the -makefile". Instead of saying "I defined the MUMBLE macro", send a -diff that shows your change. - -* Always use `diff -c' to make diffs. If you don't include context, -it may be hard for me to figure out where you propose to make the -changes. I might have to ignore your patch because I can't tell what -it means. - -* When you write a fix, keep in mind that I can't install a change -that would break other systems. - -People often suggest fixing a problem by changing machine-independent -files such as toplev.c to do something special that a particular -system needs. Sometimes it is totally obvious that such changes would -break GCC for almost all users. I can't possibly make a change like -that. All I can do is send it back to you and ask you to find a fix -that is safe to install. - -Sometimes people send fixes that *might* be an improvement in -general--but it is hard to be sure of this. I can install such -changes some of the time, but not during pretest, when I am trying to -get a new version to work reliably as quickly as possible. - -The safest changes for me to install are changes to the configuration -files for a particular machine. At least I know those can't create -bugs on other machines. - -* Don't try changing GCC unless it fails to work if you don't change it. - -* Don't even suggest changes that would only make GCC cleaner. -Every change I install could introduce a bug, so I won't install -a change unless I see it is necessary. - -* If you would like to suggest changes for purposes other than fixing -serious bugs, don't wait till pretest time. Instead, send them just -after I make a release. That's the best time for me to install them. - -* In some cases, if you don't follow these guidelines, your -information might still be useful, but I might have to do more work to -make use of it. Unfortunately, I am so far behind in my work that I -just can't get the job done unless you help me to do it efficiently. - - - Thank you - rms - -Local Variables: -mode: text -End: diff --git a/contrib/gcc/README.DWARF b/contrib/gcc/README.DWARF deleted file mode 100644 index 97459508b3c4..000000000000 --- a/contrib/gcc/README.DWARF +++ /dev/null @@ -1,574 +0,0 @@ -Notes on the GNU Implementation of DWARF Debugging Information --------------------------------------------------------------- -Last Updated: Sun Jul 17 08:17:42 PDT 1994 by rfg@segfault.us.com ------------------------------------------------------------- - -This file describes special and unique aspects of the GNU implementation -of the DWARF debugging information language, as provided in the GNU version -2.x compiler(s). - -For general information about the DWARF debugging information language, -you should obtain the DWARF version 1 specification document (and perhaps -also the DWARF version 2 draft specification document) developed by the -UNIX International Programming Languages Special Interest Group. A copy -of the DWARF version 1 specification (in PostScript form) may be -obtained either from me <rfg@netcom.com> or from the main Data General -FTP server. (See below.) The file you are looking at now only describes -known deviations from the DWARF version 1 specification, together with -those things which are allowed by the DWARF version 1 specification but -which are known to cause interoperability problems (e.g. with SVR4 SDB). - -To obtain a copy of the DWARF Version 1 and/or DWARF Version 2 specification -from Data General's FTP server, use the following procedure: - ---------------------------------------------------------------------------- - ftp to machine: "dg-rtp.dg.com" (128.222.1.2). - - Log in as "ftp". - cd to "plsig" - get any of the following file you are interested in: - - dwarf.1.0.3.ps - dwarf.2.0.0.index.ps - dwarf.2.0.0.ps ---------------------------------------------------------------------------- - -The generation of DWARF debugging information by the GNU version 2.x C -compiler has now been tested rather extensively for m88k, i386, i860, and -Sparc targets. The DWARF output of the GNU C compiler appears to inter- -operate well with the standard SVR4 SDB debugger on these kinds of target -systems (but of course, there are no guarantees). - -DWARF generation for the GNU g++ compiler is still not operable. This is -due primarily to the many remaining cases where the g++ front end does not -conform to the conventions used in the GNU C front end for representing -various kinds of declarations in the TREE data structure. It is not clear -at this time how these problems will be addressed. - -Future plans for the dwarfout.c module of the GNU compiler(s) includes the -addition of full support for GNU FORTRAN. (This should, in theory, be a -lot simpler to add than adding support for g++... but we'll see.) - -Many features of the DWARF version 2 specification have been adapted to -(and used in) the GNU implementation of DWARF (version 1). In most of -these cases, a DWARF version 2 approach is used in place of (or in addition -to) DWARF version 1 stuff simply because it is apparent that DWARF version -1 is not sufficiently expressive to provide the kinds of information which -may be necessary to support really robust debugging. In all of these cases -however, the use of DWARF version 2 features should not interfere in any -way with the interoperability (of GNU compilers) with generally available -"classic" (pre version 1) DWARF consumer tools (e.g. SVR4 SDB). - -The DWARF generation enhancement for the GNU compiler(s) was initially -donated to the Free Software Foundation by Network Computing Devices. -(Thanks NCD!) Additional development and maintenance of dwarfout.c has -been largely supported (i.e. funded) by Intel Corporation. (Thanks Intel!) - -If you have questions or comments about the DWARF generation feature, please -send mail to me <rfg@netcom.com>. I will be happy to investigate any bugs -reported and I may even provide fixes (but of course, I can make no promises). - -The DWARF debugging information produced by GCC may deviate in a few minor -(but perhaps significant) respects from the DWARF debugging information -currently produced by other C compilers. A serious attempt has been made -however to conform to the published specifications, to existing practice, -and to generally accepted norms in the GNU implementation of DWARF. - - ** IMPORTANT NOTE ** ** IMPORTANT NOTE ** ** IMPORTANT NOTE ** - -Under normal circumstances, the DWARF information generated by the GNU -compilers (in an assembly language file) is essentially impossible for -a human being to read. This fact can make it very difficult to debug -certain DWARF-related problems. In order to overcome this difficulty, -a feature has been added to dwarfout.c (enabled by the -fverbose-asm -option) which causes additional comments to be placed into the assembly -language output file, out to the right-hand side of most bits of DWARF -material. The comments indicate (far more clearly that the obscure -DWARF hex codes do) what is actually being encoded in DWARF. Thus, the --fverbose-asm option can be highly useful for those who must study the -DWARF output from the GNU compilers in detail. - ---------- - -(Footnote: Within this file, the term `Debugging Information Entry' will -be abbreviated as `DIE'.) - - -Release Notes (aka known bugs) -------------------------------- - -In one very obscure case involving dynamically sized arrays, the DWARF -"location information" for such an array may make it appear that the -array has been totally optimized out of existence, when in fact it -*must* actually exist. (This only happens when you are using *both* -g -*and* -O.) This is due to aggressive dead store elimination in the -compiler, and to the fact that the DECL_RTL expressions associated with -variables are not always updated to correctly reflect the effects of -GCC's aggressive dead store elimination. - -------------------------------- - -When attempting to set a breakpoint at the "start" of a function compiled -with -g1, the debugger currently has no way of knowing exactly where the -end of the prologue code for the function is. Thus, for most targets, -all the debugger can do is to set the breakpoint at the AT_low_pc address -for the function. But if you stop there and then try to look at one or -more of the formal parameter values, they may not have been "homed" yet, -so you may get inaccurate answers (or perhaps even addressing errors). - -Some people may consider this simply a non-feature, but I consider it a -bug, and I hope to provide some GNU-specific attributes (on function -DIEs) which will specify the address of the end of the prologue and the -address of the beginning of the epilogue in a future release. - -------------------------------- - -It is believed at this time that old bugs relating to the AT_bit_offset -values for bit-fields have been fixed. - -There may still be some very obscure bugs relating to the DWARF description -of type `long long' bit-fields for target machines (e.g. 80x86 machines) -where the alignment of type `long long' data objects is different from -(and less than) the size of a type `long long' data object. - -Please report any problems with the DWARF description of bit-fields as you -would any other GCC bug. (Procedures for bug reporting are given in the -GNU C compiler manual.) - --------------------------------- - -At this time, GCC does not know how to handle the GNU C "nested functions" -extension. (See the GCC manual for more info on this extension to ANSI C.) - --------------------------------- - -The GNU compilers now represent inline functions (and inlined instances -thereof) in exactly the manner described by the current DWARF version 2 -(draft) specification. The version 1 specification for handling inline -functions (and inlined instances) was known to be brain-damaged (by the -PLSIG) when the version 1 spec was finalized, but it was simply too late -in the cycle to get it removed before the version 1 spec was formally -released to the public (by UI). - --------------------------------- - -At this time, GCC does not generate the kind of really precise information -about the exact declared types of entities with signed integral types which -is required by the current DWARF draft specification. - -Specifically, the current DWARF draft specification seems to require that -the type of an non-unsigned integral bit-field member of a struct or union -type be represented as either a "signed" type or as a "plain" type, -depending upon the exact set of keywords that were used in the -type specification for the given bit-field member. It was felt (by the -UI/PLSIG) that this distinction between "plain" and "signed" integral types -could have some significance (in the case of bit-fields) because ANSI C -does not constrain the signedness of a plain bit-field, whereas it does -constrain the signedness of an explicitly "signed" bit-field. For this -reason, the current DWARF specification calls for compilers to produce -type information (for *all* integral typed entities... not just bit-fields) -which explicitly indicates the signedness of the relevant type to be -"signed" or "plain" or "unsigned". - -Unfortunately, the GNU DWARF implementation is currently incapable of making -such distinctions. - --------------------------------- - - -Known Interoperability Problems -------------------------------- - -Although the GNU implementation of DWARF conforms (for the most part) with -the current UI/PLSIG DWARF version 1 specification (with many compatible -version 2 features added in as "vendor specific extensions" just for good -measure) there are a few known cases where GCC's DWARF output can cause -some confusion for "classic" (pre version 1) DWARF consumers such as the -System V Release 4 SDB debugger. These cases are described in this section. - --------------------------------- - -The DWARF version 1 specification includes the fundamental type codes -FT_ext_prec_float, FT_complex, FT_dbl_prec_complex, and FT_ext_prec_complex. -Since GNU C is only a C compiler (and since C doesn't provide any "complex" -data types) the only one of these fundamental type codes which GCC ever -generates is FT_ext_prec_float. This fundamental type code is generated -by GCC for the `long double' data type. Unfortunately, due to an apparent -bug in the SVR4 SDB debugger, SDB can become very confused wherever any -attempt is made to print a variable, parameter, or field whose type was -given in terms of FT_ext_prec_float. - -(Actually, SVR4 SDB fails to understand *any* of the four fundamental type -codes mentioned here. This will fact will cause additional problems when -there is a GNU FORTRAN front-end.) - --------------------------------- - -In general, it appears that SVR4 SDB is not able to effectively ignore -fundamental type codes in the "implementation defined" range. This can -cause problems when a program being debugged uses the `long long' data -type (or the signed or unsigned varieties thereof) because these types -are not defined by ANSI C, and thus, GCC must use its own private fundamental -type codes (from the implementation-defined range) to represent these types. - --------------------------------- - - -General GNU DWARF extensions ----------------------------- - -In the current DWARF version 1 specification, no mechanism is specified by -which accurate information about executable code from include files can be -properly (and fully) described. (The DWARF version 2 specification *does* -specify such a mechanism, but it is about 10 times more complicated than -it needs to be so I'm not terribly anxious to try to implement it right -away.) - -In the GNU implementation of DWARF version 1, a fully downward-compatible -extension has been implemented which permits the GNU compilers to specify -which executable lines come from which files. This extension places -additional information (about source file names) in GNU-specific sections -(which should be totally ignored by all non-GNU DWARF consumers) so that -this extended information can be provided (to GNU DWARF consumers) in a way -which is totally transparent (and invisible) to non-GNU DWARF consumers -(e.g. the SVR4 SDB debugger). The additional information is placed *only* -in specialized GNU-specific sections, where it should never even be seen -by non-GNU DWARF consumers. - -To understand this GNU DWARF extension, imagine that the sequence of entries -in the .lines section is broken up into several subsections. Each contiguous -sequence of .line entries which relates to a sequence of lines (or statements) -from one particular file (either a `base' file or an `include' file) could -be called a `line entries chunk' (LEC). - -For each LEC there is one entry in the .debug_srcinfo section. - -Each normal entry in the .debug_srcinfo section consists of two 4-byte -words of data as follows: - - (1) The starting address (relative to the entire .line section) - of the first .line entry in the relevant LEC. - - (2) The starting address (relative to the entire .debug_sfnames - section) of a NUL terminated string representing the - relevant filename. (This filename name be either a - relative or an absolute filename, depending upon how the - given source file was located during compilation.) - -Obviously, each .debug_srcinfo entry allows you to find the relevant filename, -and it also points you to the first .line entry that was generated as a result -of having compiled a given source line from the given source file. - -Each subsequent .line entry should also be assumed to have been produced -as a result of compiling yet more lines from the same file. The end of -any given LEC is easily found by looking at the first 4-byte pointer in -the *next* .debug_srcinfo entry. That next .debug_srcinfo entry points -to a new and different LEC, so the preceding LEC (implicitly) must have -ended with the last .line section entry which occurs at the 2 1/2 words -just before the address given in the first pointer of the new .debug_srcinfo -entry. - -The following picture may help to clarify this feature. Let's assume that -`LE' stands for `.line entry'. Also, assume that `* 'stands for a pointer. - - - .line section .debug_srcinfo section .debug_sfnames section - ---------------------------------------------------------------- - - LE <---------------------- * - LE * -----------------> "foobar.c" <--- - LE | - LE | - LE <---------------------- * | - LE * -----------------> "foobar.h" <| | - LE | | - LE | | - LE <---------------------- * | | - LE * -----------------> "inner.h" | | - LE | | - LE <---------------------- * | | - LE * ------------------------------- | - LE | - LE | - LE | - LE | - LE <---------------------- * | - LE * ----------------------------------- - LE - LE - LE - -In effect, each entry in the .debug_srcinfo section points to *both* a -filename (in the .debug_sfnames section) and to the start of a block of -consecutive LEs (in the .line section). - -Note that just like in the .line section, there are specialized first and -last entries in the .debug_srcinfo section for each object file. These -special first and last entries for the .debug_srcinfo section are very -different from the normal .debug_srcinfo section entries. They provide -additional information which may be helpful to a debugger when it is -interpreting the data in the .debug_srcinfo, .debug_sfnames, and .line -sections. - -The first entry in the .debug_srcinfo section for each compilation unit -consists of five 4-byte words of data. The contents of these five words -should be interpreted (by debuggers) as follows: - - (1) The starting address (relative to the entire .line section) - of the .line section for this compilation unit. - - (2) The starting address (relative to the entire .debug_sfnames - section) of the .debug_sfnames section for this compilation - unit. - - (3) The starting address (in the execution virtual address space) - of the .text section for this compilation unit. - - (4) The ending address plus one (in the execution virtual address - space) of the .text section for this compilation unit. - - (5) The date/time (in seconds since midnight 1/1/70) at which the - compilation of this compilation unit occurred. This value - should be interpreted as an unsigned quantity because gcc - might be configured to generate a default value of 0xffffffff - in this field (in cases where it is desired to have object - files created at different times from identical source files - be byte-for-byte identical). By default, these timestamps - are *not* generated by dwarfout.c (so that object files - compiled at different times will be byte-for-byte identical). - If you wish to enable this "timestamp" feature however, you - can simply place a #define for the symbol `DWARF_TIMESTAMPS' - in your target configuration file and then rebuild the GNU - compiler(s). - -Note that the first string placed into the .debug_sfnames section for each -compilation unit is the name of the directory in which compilation occurred. -This string ends with a `/' (to help indicate that it is the pathname of a -directory). Thus, the second word of each specialized initial .debug_srcinfo -entry for each compilation unit may be used as a pointer to the (string) -name of the compilation directory, and that string may in turn be used to -"absolutize" any relative pathnames which may appear later on in the -.debug_sfnames section entries for the same compilation unit. - -The fifth and last word of each specialized starting entry for a compilation -unit in the .debug_srcinfo section may (depending upon your configuration) -indicate the date/time of compilation, and this may be used (by a debugger) -to determine if any of the source files which contributed code to this -compilation unit are newer than the object code for the compilation unit -itself. If so, the debugger may wish to print an "out-of-date" warning -about the compilation unit. - -The .debug_srcinfo section associated with each compilation will also have -a specialized terminating entry. This terminating .debug_srcinfo section -entry will consist of the following two 4-byte words of data: - - (1) The offset, measured from the start of the .line section to - the beginning of the terminating entry for the .line section. - - (2) A word containing the value 0xffffffff. - --------------------------------- - -In the current DWARF version 1 specification, no mechanism is specified by -which information about macro definitions and un-definitions may be provided -to the DWARF consumer. - -The DWARF version 2 (draft) specification does specify such a mechanism. -That specification was based on the GNU ("vendor specific extension") -which provided some support for macro definitions and un-definitions, -but the "official" DWARF version 2 (draft) specification mechanism for -handling macros and the GNU implementation have diverged somewhat. I -plan to update the GNU implementation to conform to the "official" -DWARF version 2 (draft) specification as soon as I get time to do that. - -Note that in the GNU implementation, additional information about macro -definitions and un-definitions is *only* provided when the -g3 level of -debug-info production is selected. (The default level is -g2 and the -plain old -g option is considered to be identical to -g2.) - -GCC records information about macro definitions and undefinitions primarily -in a section called the .debug_macinfo section. Normal entries in the -.debug_macinfo section consist of the following three parts: - - (1) A special "type" byte. - - (2) A 3-byte line-number/filename-offset field. - - (3) A NUL terminated string. - -The interpretation of the second and third parts is dependent upon the -value of the leading (type) byte. - -The type byte may have one of four values depending upon the type of the -.debug_macinfo entry which follows. The 1-byte MACINFO type codes presently -used, and their meanings are as follows: - - MACINFO_start A base file or an include file starts here. - MACINFO_resume The current base or include file ends here. - MACINFO_define A #define directive occurs here. - MACINFO_undef A #undef directive occur here. - -(Note that the MACINFO_... codes mentioned here are simply symbolic names -for constants which are defined in the GNU dwarf.h file.) - -For MACINFO_define and MACINFO_undef entries, the second (3-byte) field -contains the number of the source line (relative to the start of the current -base source file or the current include files) when the #define or #undef -directive appears. For a MACINFO_define entry, the following string field -contains the name of the macro which is defined, followed by its definition. -Note that the definition is always separated from the name of the macro -by at least one whitespace character. For a MACINFO_undef entry, the -string which follows the 3-byte line number field contains just the name -of the macro which is being undef'ed. - -For a MACINFO_start entry, the 3-byte field following the type byte contains -the offset, relative to the start of the .debug_sfnames section for the -current compilation unit, of a string which names the new source file which -is beginning its inclusion at this point. Following that 3-byte field, -each MACINFO_start entry always contains a zero length NUL terminated -string. - -For a MACINFO_resume entry, the 3-byte field following the type byte contains -the line number WITHIN THE INCLUDING FILE at which the inclusion of the -current file (whose inclusion ends here) was initiated. Following that -3-byte field, each MACINFO_resume entry always contains a zero length NUL -terminated string. - -Each set of .debug_macinfo entries for each compilation unit is terminated -by a special .debug_macinfo entry consisting of a 4-byte zero value followed -by a single NUL byte. - --------------------------------- - -In the current DWARF draft specification, no provision is made for providing -a separate level of (limited) debugging information necessary to support -tracebacks (only) through fully-debugged code (e.g. code in system libraries). - -A proposal to define such a level was submitted (by me) to the UI/PLSIG. -This proposal was rejected by the UI/PLSIG for inclusion into the DWARF -version 1 specification for two reasons. First, it was felt (by the PLSIG) -that the issues involved in supporting a "traceback only" subset of DWARF -were not well understood. Second, and perhaps more importantly, the PLSIG -is already having enough trouble agreeing on what it means to be "conforming" -to the DWARF specification, and it was felt that trying to specify multiple -different *levels* of conformance would only complicate our discussions of -this already divisive issue. Nonetheless, the GNU implementation of DWARF -provides an abbreviated "traceback only" level of debug-info production for -use with fully-debugged "system library" code. This level should only be -used for fully debugged system library code, and even then, it should only -be used where there is a very strong need to conserve disk space. This -abbreviated level of debug-info production can be used by specifying the --g1 option on the compilation command line. - --------------------------------- - -As mentioned above, the GNU implementation of DWARF currently uses the DWARF -version 2 (draft) approach for inline functions (and inlined instances -thereof). This is used in preference to the version 1 approach because -(quite simply) the version 1 approach is highly brain-damaged and probably -unworkable. - --------------------------------- - - -GNU DWARF Representation of GNU C Extensions to ANSI C ------------------------------------------------------- - -The file dwarfout.c has been designed and implemented so as to provide -some reasonable DWARF representation for each and every declarative -construct which is accepted by the GNU C compiler. Since the GNU C -compiler accepts a superset of ANSI C, this means that there are some -cases in which the DWARF information produced by GCC must take some -liberties in improvising DWARF representations for declarations which -are only valid in (extended) GNU C. - -In particular, GNU C provides at least three significant extensions to -ANSI C when it comes to declarations. These are (1) inline functions, -and (2) dynamic arrays, and (3) incomplete enum types. (See the GCC -manual for more information on these GNU extensions to ANSI C.) When -used, these GNU C extensions are represented (in the generated DWARF -output of GCC) in the most natural and intuitively obvious ways. - -In the case of inline functions, the DWARF representation is exactly as -called for in the DWARF version 2 (draft) specification for an identical -function written in C++; i.e. we "reuse" the representation of inline -functions which has been defined for C++ to support this GNU C extension. - -In the case of dynamic arrays, we use the most obvious representational -mechanism available; i.e. an array type in which the upper bound of -some dimension (usually the first and only dimension) is a variable -rather than a constant. (See the DWARF version 1 specification for more -details.) - -In the case of incomplete enum types, such types are represented simply -as TAG_enumeration_type DIEs which DO NOT contain either AT_byte_size -attributes or AT_element_list attributes. - --------------------------------- - - -Future Directions ------------------ - -The codes, formats, and other paraphernalia necessary to provide proper -support for symbolic debugging for the C++ language are still being worked -on by the UI/PLSIG. The vast majority of the additions to DWARF which will -be needed to completely support C++ have already been hashed out and agreed -upon, but a few small issues (e.g. anonymous unions, access declarations) -are still being discussed. Also, we in the PLSIG are still discussing -whether or not we need to do anything special for C++ templates. (At this -time it is not yet clear whether we even need to do anything special for -these.) - -Unfortunately, as mentioned above, there are quite a few problems in the -g++ front end itself, and these are currently responsible for severely -restricting the progress which can be made on adding DWARF support -specifically for the g++ front-end. Furthermore, Richard Stallman has -expressed the view that C++ friendships might not be important enough to -describe (in DWARF). This view directly conflicts with both the DWARF -version 1 and version 2 (draft) specifications, so until this small -misunderstanding is cleared up, DWARF support for g++ is unlikely. - -With regard to FORTRAN, the UI/PLSIG has defined what is believed to be a -complete and sufficient set of codes and rules for adequately representing -all of FORTRAN 77, and most of Fortran 90 in DWARF. While some support for -this has been implemented in dwarfout.c, further implementation and testing -will have to await the arrival of the GNU Fortran front-end (which is -currently in early alpha test as of this writing). - -GNU DWARF support for other languages (i.e. Pascal and Modula) is a moot -issue until there are GNU front-ends for these other languages. - -GNU DWARF support for DWARF version 2 will probably not be attempted until -such time as the version 2 specification is finalized. (More work needs -to be done on the version 2 specification to make the new "abbreviations" -feature of version 2 more easily implementable. Until then, it will be -a royal pain the ass to implement version 2 "abbreviations".) For the -time being, version 2 features will be added (in a version 1 compatible -manner) when and where these features seem necessary or extremely desirable. - -As currently defined, DWARF only describes a (binary) language which can -be used to communicate symbolic debugging information from a compiler -through an assembler and a linker, to a debugger. There is no clear -specification of what processing should be (or must be) done by the -assembler and/or the linker. Fortunately, the role of the assembler -is easily inferred (by anyone knowledgeable about assemblers) just by -looking at examples of assembly-level DWARF code. Sadly though, the -allowable (or required) processing steps performed by a linker are -harder to infer and (perhaps) even harder to agree upon. There are -several forms of very useful `post-processing' steps which intelligent -linkers *could* (in theory) perform on object files containing DWARF, -but any and all such link-time transformations are currently both disallowed -and unspecified. - -In particular, possible link-time transformations of DWARF code which could -provide significant benefits include (but are not limited to): - - Commonization of duplicate DIEs obtained from multiple input - (object) files. - - Cross-compilation type checking based upon DWARF type information - for objects and functions. - - Other possible `compacting' transformations designed to save disk - space and to reduce linker & debugger I/O activity. diff --git a/contrib/gcc/README.TRAD b/contrib/gcc/README.TRAD deleted file mode 100644 index 07ccd16437b1..000000000000 --- a/contrib/gcc/README.TRAD +++ /dev/null @@ -1,55 +0,0 @@ -This is a partial list of how `gcc -traditional' disagrees with -traditional C compilers (perhaps only some of them). Most of these -differences are not bugs. - ---------------------------------------------------------------------------- -K&R-1 (2.4.3) says: - - "If the character following a backslash is not one of those - specified {in the table above}, the backslash is ignored." - -Up until recently, `gcc -traditional' complained about \x \a and \v -appearing in a character or string literal. I believe however that -this non-feature has been eliminated (recently). - ---------------------------------------------------------------------------- -When in -traditional mode, gcc allows the following erroneous pair of -declarations to appear together in a given scope: - - typedef int foo; - typedef foo foo; - ---------------------------------------------------------------------------- -K&R-1 (8.5) says: - - "No field may be wider than a word." - -Gcc however allows: - - struct S { int i:33; }; - ---------------------------------------------------------------------------- -In K&R-1 there is no restriction against comments crossing include file -boundaries. Gcc however doesn't allow this, even when in -traditional mode. - ---------------------------------------------------------------------------- -Regarding the length of identifiers, K&R-1 (2.2) says: - - "No more than the first eight characters are significant, - although more may be used." - -Gcc treats all characters of identifiers as significant, even when in --traditional mode. - ---------------------------------------------------------------------------- -K&R-1 (2.2) says: - - "An identifier is a sequence of letters and digits; the first - character must be a letter. The underscore _ counts as a letter." - -Gcc also allows dollar signs in identifiers. (This may also be an issue -for the -pedantic option.) - ---------------------------------------------------------------------------- - - diff --git a/contrib/gcc/TESTS.FLUNK b/contrib/gcc/TESTS.FLUNK deleted file mode 100644 index 04641e3c8fb8..000000000000 --- a/contrib/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/contrib/gcc/assert.h b/contrib/gcc/assert.h deleted file mode 100644 index ecc02ee99912..000000000000 --- a/contrib/gcc/assert.h +++ /dev/null @@ -1,54 +0,0 @@ -/* Allow this file to be included multiple times - with different settings of NDEBUG. */ -#undef assert -#undef __assert - -#ifdef NDEBUG -#define assert(ignore) ((void) 0) -#else - -#ifndef __GNUC__ - -#define assert(expression) \ - ((void) ((expression) ? 0 : __assert (expression, __FILE__, __LINE__))) - -#define __assert(expression, file, lineno) \ - (printf ("%s:%u: failed assertion\n", file, lineno), \ - abort (), 0) - -#else - -#if defined(__STDC__) || defined (__cplusplus) - -/* Defined in libgcc.a */ -#ifdef __cplusplus -extern "C" { -extern void __eprintf (const char *, const char *, unsigned, const char *) - __attribute__ ((noreturn)); -} -#else -extern void __eprintf (const char *, const char *, unsigned, const char *) - __attribute__ ((noreturn)); -#endif - -#define assert(expression) \ - ((void) ((expression) ? 0 : __assert (#expression, __FILE__, __LINE__))) - -#define __assert(expression, file, line) \ - (__eprintf ("%s:%u: failed assertion `%s'\n", \ - file, line, expression), 0) - -#else /* no __STDC__ and not C++; i.e. -traditional. */ - -extern void __eprintf () __attribute__ ((noreturn)); /* Defined in libgcc.a */ - -#define assert(expression) \ - ((void) ((expression) ? 0 : __assert (expression, __FILE__, __LINE__))) - -#define __assert(expression, file, lineno) \ - (__eprintf ("%s:%u: failed assertion `%s'\n", \ - file, lineno, "expression"), 0) - -#endif /* no __STDC__ and not C++; i.e. -traditional. */ -#endif /* no __GNU__; i.e., /bin/cc. */ -#endif diff --git a/contrib/gcc/build-make b/contrib/gcc/build-make deleted file mode 100644 index f9049ae0db96..000000000000 --- a/contrib/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/contrib/gcc/c-iterate.c b/contrib/gcc/c-iterate.c deleted file mode 100644 index dc0cc8a84af4..000000000000 --- a/contrib/gcc/c-iterate.c +++ /dev/null @@ -1,604 +0,0 @@ -/* Build expressions with type checking for C compiler. - Copyright (C) 1987, 88, 89, 92, 93, 96, 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. */ - - -/* This file is part of the C front end. - It is responsible for implementing iterators, - both their declarations and the expansion of statements using them. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "c-tree.h" -#include "flags.h" -#include "obstack.h" -#include "rtl.h" -#include "toplev.h" -#include "expr.h" - -/* - KEEPING TRACK OF EXPANSIONS - - In order to clean out expansions corresponding to statements inside - "{(...)}" constructs we have to keep track of all expansions. The - cleanup is needed when an automatic, or implicit, expansion on - iterator, say X, happens to a statement which contains a {(...)} - form with a statement already expanded on X. In this case we have - to go back and cleanup the inner expansion. This can be further - complicated by the fact that {(...)} can be nested. - - To make this cleanup possible, we keep lists of all expansions, and - to make it work for nested constructs, we keep a stack. The list at - the top of the stack (ITER_STACK.CURRENT_LEVEL) corresponds to the - currently parsed level. All expansions of the levels below the - current one are kept in one list whose head is pointed to by - ITER_STACK.SUBLEVEL_FIRST (SUBLEVEL_LAST is there for making merges - easy). The process works as follows: - - -- On "({" a new node is added to the stack by PUSH_ITERATOR_STACK. - The sublevel list is not changed at this point. - - -- On "})" the list for the current level is appended to the sublevel - list. - - -- On ";" sublevel lists are appended to the current level lists. - The reason is this: if they have not been superseded by the - expansion at the current level, they still might be - superseded later by the expansion on the higher level. - The levels do not have to distinguish levels below, so we - can merge the lists together. */ - -struct ixpansion -{ - tree ixdecl; /* Iterator decl */ - rtx ixprologue_start; /* First insn of epilogue. NULL means */ - /* explicit (FOR) expansion*/ - rtx ixprologue_end; - rtx ixepilogue_start; - rtx ixepilogue_end; - struct ixpansion *next; /* Next in the list */ -}; - -struct iter_stack_node -{ - struct ixpansion *first; /* Head of list of ixpansions */ - struct ixpansion *last; /* Last node in list of ixpansions */ - struct iter_stack_node *next; /* Next level iterator stack node */ -}; - -struct iter_stack_node *iter_stack; -struct iter_stack_node sublevel_ixpansions; - -/* A special obstack, and a pointer to the start of - all the data in it (so we can free everything easily). */ -static struct obstack ixp_obstack; -static char *ixp_firstobj; - -/* During collect_iterators, a list of SAVE_EXPRs already scanned. */ -static tree save_exprs; - -static void expand_stmt_with_iterators_1 PROTO((tree, tree)); -static tree collect_iterators PROTO((tree, tree)); -static void iterator_loop_prologue PROTO((tree, rtx *, rtx *)); -static void iterator_loop_epilogue PROTO((tree, rtx *, rtx *)); -static int top_level_ixpansion_p PROTO((void)); -static void isn_append PROTO((struct iter_stack_node *, - struct iter_stack_node *)); -static void istack_sublevel_to_current PROTO((void)); -static void add_ixpansion PROTO((tree, rtx, rtx, rtx, rtx)); -static void delete_ixpansion PROTO((tree)); - -/* Initialize our obstack once per compilation. */ - -void -init_iterators () -{ - gcc_obstack_init (&ixp_obstack); - ixp_firstobj = (char *) obstack_alloc (&ixp_obstack, 0); -} - -/* Handle the start of an explicit `for' loop for iterator IDECL. */ - -void -iterator_for_loop_start (idecl) - tree idecl; -{ - ITERATOR_BOUND_P (idecl) = 1; - add_ixpansion (idecl, 0, 0, 0, 0); - iterator_loop_prologue (idecl, 0, 0); -} - -/* Handle the end of an explicit `for' loop for iterator IDECL. */ - -void -iterator_for_loop_end (idecl) - tree idecl; -{ - iterator_loop_epilogue (idecl, 0, 0); - ITERATOR_BOUND_P (idecl) = 0; -} - -/* - ITERATOR RTL EXPANSIONS - - Expanding simple statements with iterators is straightforward: - collect the list of all free iterators in the statement, and - generate a loop for each of them. - - An iterator is "free" if it has not been "bound" by a FOR - operator. The DECL_RTL of the iterator is the loop counter. */ - -/* Expand a statement STMT, possibly containing iterator usage, into RTL. */ - -void -iterator_expand (stmt) - tree stmt; -{ - tree iter_list; - save_exprs = NULL_TREE; - iter_list = collect_iterators (stmt, NULL_TREE); - expand_stmt_with_iterators_1 (stmt, iter_list); - istack_sublevel_to_current (); -} - - -static void -expand_stmt_with_iterators_1 (stmt, iter_list) - tree stmt, iter_list; -{ - if (iter_list == 0) - expand_expr_stmt (stmt); - else - { - tree current_iterator = TREE_VALUE (iter_list); - tree iter_list_tail = TREE_CHAIN (iter_list); - rtx p_start, p_end, e_start, e_end; - - iterator_loop_prologue (current_iterator, &p_start, &p_end); - expand_stmt_with_iterators_1 (stmt, iter_list_tail); - iterator_loop_epilogue (current_iterator, &e_start, &e_end); - - /** Delete all inner expansions based on current_iterator **/ - /** before adding the outer one. **/ - - delete_ixpansion (current_iterator); - add_ixpansion (current_iterator, p_start, p_end, e_start, e_end); - } -} - - -/* Return a list containing all the free (i.e. not bound by a - containing `for' statement) iterators mentioned in EXP, plus those - in LIST. Do not add duplicate entries to the list. */ - -static tree -collect_iterators (exp, list) - tree exp, list; -{ - if (exp == 0) return list; - - switch (TREE_CODE (exp)) - { - case VAR_DECL: - if (! ITERATOR_P (exp) || ITERATOR_BOUND_P (exp)) - return list; - if (value_member (exp, list)) - return list; - return tree_cons (NULL_TREE, exp, list); - - case TREE_LIST: - { - tree tail; - for (tail = exp; tail; tail = TREE_CHAIN (tail)) - list = collect_iterators (TREE_VALUE (tail), list); - return list; - } - - case SAVE_EXPR: - /* In each scan, scan a given save_expr only once. */ - if (value_member (exp, save_exprs)) - return list; - - save_exprs = tree_cons (NULL_TREE, exp, save_exprs); - return collect_iterators (TREE_OPERAND (exp, 0), list); - - /* we do not automatically iterate blocks -- one must */ - /* use the FOR construct to do that */ - - case BLOCK: - return list; - - default: - switch (TREE_CODE_CLASS (TREE_CODE (exp))) - { - case '1': - return collect_iterators (TREE_OPERAND (exp, 0), list); - - case '2': - case '<': - return collect_iterators (TREE_OPERAND (exp, 0), - collect_iterators (TREE_OPERAND (exp, 1), - list)); - - case 'e': - case 'r': - { - int num_args = tree_code_length[(int) TREE_CODE (exp)]; - int i; - - /* Some tree codes have RTL, not trees, as operands. */ - switch (TREE_CODE (exp)) - { - case CALL_EXPR: - num_args = 2; - break; - case METHOD_CALL_EXPR: - num_args = 3; - break; - case WITH_CLEANUP_EXPR: - num_args = 1; - break; - case RTL_EXPR: - return list; - default: - break; - } - - for (i = 0; i < num_args; i++) - list = collect_iterators (TREE_OPERAND (exp, i), list); - return list; - } - default: - return list; - } - } -} - -/* Emit rtl for the start of a loop for iterator IDECL. - - If necessary, create loop counter rtx and store it as DECL_RTL of IDECL. - - The prologue normally starts and ends with notes, which are returned - by this function in *START_NOTE and *END_NODE. - If START_NOTE and END_NODE are 0, we don't make those notes. */ - -static void -iterator_loop_prologue (idecl, start_note, end_note) - tree idecl; - rtx *start_note, *end_note; -{ - tree expr; - - /* Force the save_expr in DECL_INITIAL to be calculated - if it hasn't been calculated yet. */ - expand_expr (DECL_INITIAL (idecl), const0_rtx, VOIDmode, - EXPAND_NORMAL); - - if (DECL_RTL (idecl) == 0) - expand_decl (idecl); - - if (start_note) - *start_note = emit_note (0, NOTE_INSN_DELETED); - - /* Initialize counter. */ - expr = build (MODIFY_EXPR, TREE_TYPE (idecl), idecl, integer_zero_node); - TREE_SIDE_EFFECTS (expr) = 1; - expand_expr (expr, const0_rtx, VOIDmode, EXPAND_NORMAL); - - expand_start_loop_continue_elsewhere (1); - - ITERATOR_BOUND_P (idecl) = 1; - - if (end_note) - *end_note = emit_note (0, NOTE_INSN_DELETED); -} - -/* Similar to the previous function, but for the end of the loop. - - DECL_RTL is zeroed unless we are inside "({...})". The reason for that is - described below. - - When we create two (or more) loops based on the same IDECL, and - both inside the same "({...})" construct, we must be prepared to - delete both of the loops and create a single one on the level - above, i.e. enclosing the "({...})". The new loop has to use the - same counter rtl because the references to the iterator decl - (IDECL) have already been expanded as references to the counter - rtl. - - It is incorrect to use the same counter reg in different functions, - and it is desirable to use different counters in disjoint loops - when we know there's no need to combine them (because then they can - get allocated separately). */ - -static void -iterator_loop_epilogue (idecl, start_note, end_note) - tree idecl; - rtx *start_note, *end_note; -{ - tree test, incr; - - if (start_note) - *start_note = emit_note (0, NOTE_INSN_DELETED); - expand_loop_continue_here (); - incr = build_binary_op (PLUS_EXPR, idecl, integer_one_node, 0); - incr = build (MODIFY_EXPR, TREE_TYPE (idecl), idecl, incr); - TREE_SIDE_EFFECTS (incr) = 1; - expand_expr (incr, const0_rtx, VOIDmode, EXPAND_NORMAL); - test = build_binary_op (LT_EXPR, idecl, DECL_INITIAL (idecl), 0); - expand_exit_loop_if_false (0, test); - expand_end_loop (); - - ITERATOR_BOUND_P (idecl) = 0; - /* we can reset rtl since there is not chance that this expansion */ - /* would be superseded by a higher level one */ - /* but don't do this if the decl is static, since we need to share */ - /* the same decl in that case. */ - if (top_level_ixpansion_p () && ! TREE_STATIC (idecl)) - DECL_RTL (idecl) = 0; - if (end_note) - *end_note = emit_note (0, NOTE_INSN_DELETED); -} - -/* Return true if we are not currently inside a "({...})" construct. */ - -static int -top_level_ixpansion_p () -{ - return iter_stack == 0; -} - -/* Given two chains of iter_stack_nodes, - append the nodes in X into Y. */ - -static void -isn_append (x, y) - struct iter_stack_node *x, *y; -{ - if (x->first == 0) - return; - - if (y->first == 0) - { - y->first = x->first; - y->last = x->last; - } - else - { - y->last->next = x->first; - y->last = x->last; - } -} - -/** Make X empty **/ - -#define ISN_ZERO(X) (X).first=(X).last=0 - -/* Move the ixpansions in sublevel_ixpansions into the current - node on the iter_stack, or discard them if the iter_stack is empty. - We do this at the end of a statement. */ - -static void -istack_sublevel_to_current () -{ - /* At the top level we can throw away sublevel's expansions **/ - /* because there is nobody above us to ask for a cleanup **/ - if (iter_stack != 0) - /** Merging with empty sublevel list is a no-op **/ - if (sublevel_ixpansions.last) - isn_append (&sublevel_ixpansions, iter_stack); - - if (iter_stack == 0) - obstack_free (&ixp_obstack, ixp_firstobj); - - ISN_ZERO (sublevel_ixpansions); -} - -/* Push a new node on the iter_stack, when we enter a ({...}). */ - -void -push_iterator_stack () -{ - struct iter_stack_node *new_top - = (struct iter_stack_node *) - obstack_alloc (&ixp_obstack, sizeof (struct iter_stack_node)); - - new_top->first = 0; - new_top->last = 0; - new_top->next = iter_stack; - iter_stack = new_top; -} - -/* Pop iter_stack, moving the ixpansions in the node being popped - into sublevel_ixpansions. */ - -void -pop_iterator_stack () -{ - if (iter_stack == 0) - abort (); - - isn_append (iter_stack, &sublevel_ixpansions); - /** Pop current level node: */ - iter_stack = iter_stack->next; -} - - -/* Record an iterator expansion ("ixpansion") for IDECL. - The remaining parameters are the notes in the loop entry - and exit rtl. */ - -static void -add_ixpansion (idecl, pro_start, pro_end, epi_start, epi_end) - tree idecl; - rtx pro_start, pro_end, epi_start, epi_end; -{ - struct ixpansion *newix; - - /* Do nothing if we are not inside "({...})", - as in that case this expansion can't need subsequent RTL modification. */ - if (iter_stack == 0) - return; - - newix = (struct ixpansion *) obstack_alloc (&ixp_obstack, - sizeof (struct ixpansion)); - newix->ixdecl = idecl; - newix->ixprologue_start = pro_start; - newix->ixprologue_end = pro_end; - newix->ixepilogue_start = epi_start; - newix->ixepilogue_end = epi_end; - - newix->next = iter_stack->first; - iter_stack->first = newix; - if (iter_stack->last == 0) - iter_stack->last = newix; -} - -/* Delete the RTL for all ixpansions for iterator IDECL - in our sublevels. We do this when we make a larger - containing expansion for IDECL. */ - -static void -delete_ixpansion (idecl) - tree idecl; -{ - struct ixpansion *previx = 0, *ix; - - for (ix = sublevel_ixpansions.first; ix; ix = ix->next) - if (ix->ixdecl == idecl) - { - /** zero means that this is a mark for FOR -- **/ - /** we do not delete anything, just issue an error. **/ - - if (ix->ixprologue_start == 0) - error_with_decl (idecl, - "`for (%s)' appears within implicit iteration"); - else - { - rtx insn; - /* We delete all insns, including notes because leaving loop */ - /* notes and barriers produced by iterator expansion would */ - /* be misleading to other phases */ - - for (insn = NEXT_INSN (ix->ixprologue_start); - insn != ix->ixprologue_end; - insn = NEXT_INSN (insn)) - delete_insn (insn); - for (insn = NEXT_INSN (ix->ixepilogue_start); - insn != ix->ixepilogue_end; - insn = NEXT_INSN (insn)) - delete_insn (insn); - } - - /* Delete this ixpansion from sublevel_ixpansions. */ - if (previx) - previx->next = ix->next; - else - sublevel_ixpansions.first = ix->next; - if (sublevel_ixpansions.last == ix) - sublevel_ixpansions.last = previx; - } - else - previx = ix; -} - -#ifdef DEBUG_ITERATORS - -/* The functions below are for use from source level debugger. - They print short forms of iterator lists and the iterator stack. */ - -/* Print the name of the iterator D. */ - -void -prdecl (d) - tree d; -{ - if (d) - { - if (TREE_CODE (d) == VAR_DECL) - { - tree tname = DECL_NAME (d); - char *dname = IDENTIFIER_POINTER (tname); - fprintf (stderr, dname); - } - else - fprintf (stderr, "<<?>>"); - } - else - fprintf (stderr, "<<0>>"); -} - -/* Print Iterator List -- names only */ - -tree -pil (head) - tree head; -{ - tree current, next; - for (current = head; current; current = next) - { - tree node = TREE_VALUE (current); - prdecl (node); - next = TREE_CHAIN (current); - if (next) fprintf (stderr, ","); - } - fprintf (stderr, "\n"); -} - -/* Print IXpansion List */ - -struct ixpansion * -pixl (head) - struct ixpansion *head; -{ - struct ixpansion *current, *next; - fprintf (stderr, "> "); - if (head == 0) - fprintf (stderr, "(empty)"); - - for (current=head; current; current = next) - { - tree node = current->ixdecl; - prdecl (node); - next = current->next; - if (next) - fprintf (stderr, ","); - } - fprintf (stderr, "\n"); - return head; -} - -/* Print Iterator Stack. */ - -void -pis () -{ - struct iter_stack_node *stack_node; - - fprintf (stderr, "--SubLevel: "); - pixl (sublevel_ixpansions.first); - fprintf (stderr, "--Stack:--\n"); - for (stack_node = iter_stack; - stack_node; - stack_node = stack_node->next) - pixl (stack_node->first); -} - -#endif /* DEBUG_ITERATORS */ diff --git a/contrib/gcc/c-parse.gperf b/contrib/gcc/c-parse.gperf deleted file mode 100644 index 888eee9ebe1f..000000000000 --- a/contrib/gcc/c-parse.gperf +++ /dev/null @@ -1,88 +0,0 @@ -%{ -/* Command-line: gperf -L KR-C -F ', 0, 0' -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ -%} -struct resword { const char *name; short token; enum rid rid; }; -%% -@class, CLASS, NORID -@compatibility_alias, ALIAS, NORID -@defs, DEFS, NORID -@encode, ENCODE, NORID -@end, END, NORID -@implementation, IMPLEMENTATION, NORID -@interface, INTERFACE, NORID -@private, PRIVATE, NORID -@protected, PROTECTED, NORID -@protocol, PROTOCOL, NORID -@public, PUBLIC, NORID -@selector, SELECTOR, NORID -__alignof, ALIGNOF, NORID -__alignof__, ALIGNOF, NORID -__asm, ASM_KEYWORD, NORID -__asm__, ASM_KEYWORD, NORID -__attribute, ATTRIBUTE, NORID -__attribute__, ATTRIBUTE, NORID -__complex, TYPESPEC, RID_COMPLEX -__complex__, TYPESPEC, RID_COMPLEX -__const, TYPE_QUAL, RID_CONST -__const__, TYPE_QUAL, RID_CONST -__extension__, EXTENSION, NORID -__imag, IMAGPART, NORID -__imag__, IMAGPART, NORID -__inline, SCSPEC, RID_INLINE -__inline__, SCSPEC, RID_INLINE -__iterator, SCSPEC, RID_ITERATOR -__iterator__, SCSPEC, RID_ITERATOR -__label__, LABEL, NORID -__real, REALPART, NORID -__real__, REALPART, NORID -__restrict, TYPE_QUAL, RID_RESTRICT -__restrict__, TYPE_QUAL, RID_RESTRICT -__signed, TYPESPEC, RID_SIGNED -__signed__, TYPESPEC, RID_SIGNED -__typeof, TYPEOF, NORID -__typeof__, TYPEOF, NORID -__volatile, TYPE_QUAL, RID_VOLATILE -__volatile__, TYPE_QUAL, RID_VOLATILE -asm, ASM_KEYWORD, NORID -auto, SCSPEC, RID_AUTO -break, BREAK, NORID -bycopy, TYPE_QUAL, RID_BYCOPY -byref, TYPE_QUAL, RID_BYREF -case, CASE, NORID -char, TYPESPEC, RID_CHAR -const, TYPE_QUAL, RID_CONST -continue, CONTINUE, NORID -default, DEFAULT, NORID -do, DO, NORID -double, TYPESPEC, RID_DOUBLE -else, ELSE, NORID -enum, ENUM, NORID -extern, SCSPEC, RID_EXTERN -float, TYPESPEC, RID_FLOAT -for, FOR, NORID -goto, GOTO, NORID -id, OBJECTNAME, RID_ID -if, IF, NORID -in, TYPE_QUAL, RID_IN -inout, TYPE_QUAL, RID_INOUT -inline, SCSPEC, RID_INLINE -int, TYPESPEC, RID_INT -long, TYPESPEC, RID_LONG -oneway, TYPE_QUAL, RID_ONEWAY -out, TYPE_QUAL, RID_OUT -register, SCSPEC, RID_REGISTER -restrict, TYPE_QUAL, RID_RESTRICT -return, RETURN, NORID -short, TYPESPEC, RID_SHORT -signed, TYPESPEC, RID_SIGNED -sizeof, SIZEOF, NORID -static, SCSPEC, RID_STATIC -struct, STRUCT, NORID -switch, SWITCH, NORID -typedef, SCSPEC, RID_TYPEDEF -typeof, TYPEOF, NORID -union, UNION, NORID -unsigned, TYPESPEC, RID_UNSIGNED -void, TYPESPEC, RID_VOID -volatile, TYPE_QUAL, RID_VOLATILE -while, WHILE, NORID diff --git a/contrib/gcc/cccp.c b/contrib/gcc/cccp.c deleted file mode 100644 index 023502fbde41..000000000000 --- a/contrib/gcc/cccp.c +++ /dev/null @@ -1,11136 +0,0 @@ -/* C Compatible Compiler Preprocessor (CCCP) - Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000 Free Software Foundation, Inc. - Written 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" -#include <signal.h> - -#ifdef HAVE_SYS_RESOURCE_H -# include <sys/resource.h> -#endif - -typedef unsigned char U_CHAR; - -#include "pcp.h" -#include "intl.h" -#include "prefix.h" - -#ifdef MULTIBYTE_CHARS -#include "mbchar.h" -#include <locale.h> -#endif /* MULTIBYTE_CHARS */ - -#ifndef GET_ENV_PATH_LIST -#define GET_ENV_PATH_LIST(VAR,NAME) do { (VAR) = getenv (NAME); } while (0) -#endif - -#ifndef STANDARD_INCLUDE_DIR -# define STANDARD_INCLUDE_DIR "/usr/include" -#endif - -/* By default, colon separates directories in a path. */ -#ifndef PATH_SEPARATOR -# define PATH_SEPARATOR ':' -#endif - -/* By default, a slash separates directory names. */ -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -#endif - -/* By default, the suffix for object files is ".o". */ -#ifdef OBJECT_SUFFIX -# define HAVE_OBJECT_SUFFIX -#else -# define OBJECT_SUFFIX ".o" -#endif - -/* VMS-specific definitions */ -#ifdef VMS -#include <descrip.h> -#include <ssdef.h> -#include <syidef.h> -#define open(fname,mode,prot) VMS_open (fname,mode,prot) -#define fopen(fname,mode) VMS_fopen (fname,mode) -#define freopen(fname,mode,ofile) VMS_freopen (fname,mode,ofile) -#define fstat(fd,stbuf) VMS_fstat (fd,stbuf) -static int VMS_fstat (), VMS_stat (); -static int VMS_open (); -static FILE *VMS_fopen (); -static FILE *VMS_freopen (); -static int hack_vms_include_specification (); -#define INO_T_EQ(a, b) (!bcmp((char *) &(a), (char *) &(b), sizeof (a))) -#define INO_T_HASH(a) 0 -#define INCLUDE_LEN_FUDGE 12 /* leave room for VMS syntax conversion */ -#endif /* VMS */ - -/* Windows does not natively support inodes, and neither does MSDOS. */ -#if (defined (_WIN32) && ! defined (__CYGWIN__) && ! defined (_UWIN)) \ - || defined (__MSDOS__) -#define INO_T_EQ(a, b) 0 -#endif - -#ifndef INO_T_EQ -#define INO_T_EQ(a, b) ((a) == (b)) -#endif - -#ifndef INO_T_HASH -#define INO_T_HASH(a) (a) -#endif - -#ifndef INCLUDE_LEN_FUDGE -#define INCLUDE_LEN_FUDGE 0 -#endif - -/* External declarations. */ - -extern char *version_string; -HOST_WIDEST_INT parse_escape PROTO((char **, HOST_WIDEST_INT)); -HOST_WIDEST_INT parse_c_expression PROTO((char *, int)); - -/* Name under which this program was invoked. */ - -static char *progname; - -/* Nonzero means use extra default include directories for C++. */ - -static int cplusplus; - -/* Nonzero means handle cplusplus style comments */ - -static int cplusplus_comments; - -/* Nonzero means handle #import, for objective C. */ - -static int objc; - -/* Nonzero means this is an assembly file, and allow - unknown directives, which could be comments. */ - -static int lang_asm; - -/* Current maximum length of directory names in the search path - for include files. (Altered as we get more of them.) */ - -static int max_include_len; - -/* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */ - -static int for_lint = 0; - -/* Nonzero means copy comments into the output file. */ - -static int put_out_comments = 0; - -/* Nonzero means don't process the ANSI trigraph sequences. */ - -static int no_trigraphs = 0; - -/* Nonzero means print the names of included files rather than - the preprocessed output. 1 means just the #include "...", - 2 means #include <...> as well. */ - -static int print_deps = 0; - -/* Nonzero if missing .h files in -M output are assumed to be generated - files and not errors. */ - -static int print_deps_missing_files = 0; - -/* Nonzero means print names of header files (-H). */ - -static int print_include_names = 0; - -/* Nonzero means don't output line number information. */ - -static int no_line_directives; - -/* Nonzero means output the text in failing conditionals, - inside #failed ... #endfailed. */ - -static int output_conditionals; - -/* 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 -*/ - -static enum {dump_none, dump_only, dump_names, dump_definitions} - dump_macros = dump_none; - -/* 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. */ -static int debug_output = 0; - -/* Nonzero means pass #include lines through to the output, - even if they are ifdefed out. */ -static int dump_includes; - -/* Nonzero indicates special processing used by the pcp program. The - special effects of this mode are: - - Inhibit all macro expansion, except those inside #if directives. - - Process #define directives normally, and output their contents - to the output file. - - Output preconditions to pcp_outfile indicating all the relevant - preconditions for use of this file in a later cpp run. -*/ -static FILE *pcp_outfile; - -/* 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. */ -static int pcp_inside_if; - -/* Nonzero means never to include precompiled files. - This is 1 since there's no way now to make precompiled files, - so it's not worth testing for them. */ -static int no_precomp = 1; - -/* Nonzero means give all the error messages the ANSI standard requires. */ - -int pedantic; - -/* Nonzero means try to make failure to fit ANSI C an error. */ - -static int pedantic_errors; - -/* Nonzero means don't print warning messages. -w. */ - -static int inhibit_warnings = 0; - -/* Nonzero means warn if slash-star appears in a slash-star comment, - or if newline-backslash appears in a slash-slash comment. */ - -static int warn_comments; - -/* Nonzero means warn if a macro argument is (or would be) - stringified with -traditional. */ - -static int warn_stringify; - -/* Nonzero means warn if there are any trigraphs. */ - -static int warn_trigraphs; - -/* Nonzero means warn if undefined identifiers are evaluated in an #if. */ - -static int warn_undef; - -/* Nonzero means warn if #import is used. */ - -static int warn_import = 1; - -/* Nonzero means turn warnings into errors. */ - -static int warnings_are_errors; - -/* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */ - -int traditional; - -/* Nonzero for the 1989 C Standard, including corrigenda and amendments. */ - -int c89; - -/* Nonzero for the 199x C Standard. */ - -int c9x; - -/* Nonzero causes output not to be done, - but directives such as #define that have side effects - are still obeyed. */ - -static int no_output; - -/* Nonzero means we should look for header.gcc files that remap file names. */ -static int remap; - -/* Nonzero means this file was included with a -imacros or -include - command line and should not be recorded as an include file. */ - -static int no_record_file; - -/* Nonzero means that we have finished processing the command line options. - This flag is used to decide whether or not to issue certain errors - and/or warnings. */ - -static int done_initializing = 0; - -/* Line where a newline was first seen in a string constant. */ - -static int multiline_string_line = 0; - -/* I/O buffer structure. - The `fname' field is nonzero for source files and #include files - and for the dummy text used for -D and -U. - It is zero for rescanning results of macro expansion - and for expanding macro arguments. */ -#define INPUT_STACK_MAX 400 -static struct file_buf { - char *fname; - /* Filename specified with #line directive. */ - char *nominal_fname; - /* The length of nominal_fname, which may contain embedded NULs. */ - size_t nominal_fname_len; - /* Include file description. */ - struct include_file *inc; - /* Record where in the search path this file was found. - For #include_next. */ - struct file_name_list *dir; - int lineno; - int length; - U_CHAR *buf; - U_CHAR *bufp; - /* Macro that this level is the expansion of. - Included so that we can reenable the macro - at the end of this level. */ - struct hashnode *macro; - /* Value of if_stack at start of this file. - Used to prohibit unmatched #endif (etc) in an include file. */ - struct if_stack *if_stack; - /* Object to be freed at end of input at this level. */ - U_CHAR *free_ptr; - /* True if this is a system header file; see is_system_include. */ - char system_header_p; -} instack[INPUT_STACK_MAX]; - -static int last_error_tick; /* Incremented each time we print it. */ -static int input_file_stack_tick; /* Incremented when the status changes. */ - -/* Current nesting level of input sources. - `instack[indepth]' is the level currently being read. */ -static int indepth = -1; -#define CHECK_DEPTH(code) \ - if (indepth >= (INPUT_STACK_MAX - 1)) \ - { \ - error_with_line (line_for_error (instack[indepth].lineno), \ - "macro or `#include' recursion too deep"); \ - code; \ - } - -/* Current depth in #include directives that use <...>. */ -static int system_include_depth = 0; - -typedef struct file_buf FILE_BUF; - -/* The output buffer. Its LENGTH field is the amount of room allocated - for the buffer, not the number of chars actually present. To get - that, subtract outbuf.buf from outbuf.bufp. */ - -#define OUTBUF_SIZE 10 /* initial size of output buffer */ -static FILE_BUF outbuf; - -/* Grow output buffer OBUF points at - so it can hold at least NEEDED more chars. */ - -#define check_expand(OBUF, NEEDED) \ - (((OBUF)->length - ((OBUF)->bufp - (OBUF)->buf) <= (NEEDED)) \ - ? grow_outbuf ((OBUF), (NEEDED)) : 0) - -struct file_name_list - { - struct file_name_list *next; - /* If the following is 1, it is a C-language system include - directory. */ - int c_system_include_path; - /* Mapping of file names for this directory. */ - struct file_name_map *name_map; - /* Non-zero if name_map is valid. */ - int got_name_map; - /* The include directory status. */ - struct stat st; - /* The include prefix: "" denotes the working directory, - otherwise fname must end in '/'. - The actual size is dynamically allocated. */ - char fname[1]; - }; - -/* #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++. */ - int included; /* Set if the directory is acceptable. */ -} include_defaults_array[] -#ifdef INCLUDE_DEFAULTS - = INCLUDE_DEFAULTS; -#else - = { - /* Pick up GNU C++ specific include files. */ - { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1, 0 }, -#ifdef CROSS_COMPILE - /* This is the dir for fixincludes. Put it just before - the files that we fix. */ - { GCC_INCLUDE_DIR, "GCC", 0, 0, 0 }, - /* For cross-compilation, this dir name is generated - automatically in Makefile.in. */ - { CROSS_INCLUDE_DIR, "GCC", 0, 0, 0 }, -#ifdef TOOL_INCLUDE_DIR - /* This is another place that the target system's headers might be. */ - { TOOL_INCLUDE_DIR, "BINUTILS", 0, 0, 0 }, -#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, 0 }, -#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, 0, 0 }, -#endif - /* This is the dir for fixincludes. Put it just before - the files that we fix. */ - { GCC_INCLUDE_DIR, "GCC", 0, 0, 0 }, - /* Some systems have an extra dir of include files. */ -#ifdef SYSTEM_INCLUDE_DIR - { SYSTEM_INCLUDE_DIR, 0, 0, 0, 0 }, -#endif -#ifndef STANDARD_INCLUDE_COMPONENT -#define STANDARD_INCLUDE_COMPONENT 0 -#endif - { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 0 }, -#endif /* not CROSS_COMPILE */ - { 0, 0, 0, 0, 0 } - }; -#endif /* no INCLUDE_DEFAULTS */ - -/* 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. */ -static struct default_include *include_defaults = include_defaults_array; - -static struct file_name_list *include = 0; /* First dir to search */ - /* First dir to search for <file> */ -/* This is the first element to use for #include <...>. - If it is 0, use the entire chain for such includes. */ -static struct file_name_list *first_bracket_include = 0; -/* This is the first element in the chain that corresponds to - a directory of system header files. */ -static struct file_name_list *first_system_include = 0; -static struct file_name_list *last_include = 0; /* Last in chain */ - -/* Chain of include directories to put at the end of the other chain. */ -static struct file_name_list *after_include = 0; -static struct file_name_list *last_after_include = 0; /* Last in chain */ - -/* Chain to put at the start of the system include files. */ -static struct file_name_list *before_system = 0; -static struct file_name_list *last_before_system = 0; /* Last in chain */ - -/* Directory prefix that should replace `/usr' in the standard - include file directories. */ -static char *include_prefix; - -/* Maintain and search list of included files. */ - -struct include_file { - struct include_file *next; /* for include_hashtab */ - struct include_file *next_ino; /* for include_ino_hashtab */ - char *fname; - /* If the following is the empty string, it means #pragma once - was seen in this include file, or #import was applied to the file. - Otherwise, if it is nonzero, it is a macro name. - Don't include the file again if that macro is defined. */ - U_CHAR *control_macro; - /* Nonzero if the dependency on this include file has been output. */ - int deps_output; - struct stat st; -}; - -/* Hash tables of files already included with #include or #import. - include_hashtab is by full name; include_ino_hashtab is by inode number. */ - -#define INCLUDE_HASHSIZE 61 -static struct include_file *include_hashtab[INCLUDE_HASHSIZE]; -static struct include_file *include_ino_hashtab[INCLUDE_HASHSIZE]; - -/* Global list of strings read in from precompiled files. This list - is kept in the order the strings are read in, with new strings being - added at the end through stringlist_tailp. We use this list to output - the strings at the end of the run. -*/ -static STRINGDEF *stringlist; -static STRINGDEF **stringlist_tailp = &stringlist; - - -/* Structure returned by create_definition */ -typedef struct macrodef MACRODEF; -struct macrodef -{ - struct definition *defn; - U_CHAR *symnam; - int symlen; -}; - -enum sharp_token_type { - NO_SHARP_TOKEN = 0, /* token not present */ - - SHARP_TOKEN = '#', /* token spelled with # only */ - WHITE_SHARP_TOKEN, /* token spelled with # and white space */ - - PERCENT_COLON_TOKEN = '%', /* token spelled with %: only */ - WHITE_PERCENT_COLON_TOKEN /* token spelled with %: and white space */ -}; - -/* 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 */ - U_CHAR *expansion; - int line; /* Line number of definition */ - char *file; /* File of definition */ - size_t file_len; /* Length of file (which can contain NULs) */ - char rest_args; /* Nonzero if last arg. absorbs the rest */ - struct reflist { - struct reflist *next; - - enum sharp_token_type stringify; /* set if a # operator before arg */ - enum sharp_token_type raw_before; /* set if a ## operator before arg */ - enum sharp_token_type raw_after; /* set 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. */ - U_CHAR *argnames; - } args; -}; - -/* different kinds of things that can appear in the value field - of a hash node. Actually, this may be useless now. */ -union hashval { - char *cpval; - DEFINITION *defn; - KEYDEF *keydef; -}; - -/* - * 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) - -/* This is the implicit parameter name when using variable number of - parameters for macros using the ISO C 9x extension. */ -static char va_args_name[] = "__VA_ARGS__"; -#define VA_ARGS_NAME_LENGTH (sizeof (va_args_name) - 1) - -/* The structure of a node in the hash table. The hash table - has entries for all tokens defined by #define directives (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_USER_LABEL_PREFIX_TYPE, /* `__USER_LABEL_PREFIX__' */ - T_REGISTER_PREFIX_TYPE, /* `__REGISTER_PREFIX__' */ - T_IMMEDIATE_PREFIX_TYPE, /* `__IMMEDIATE_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. */ - }; - -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 -static HASHNODE *hashtab[HASHSIZE]; -#define HASHSTEP(old, c) ((old << 2) + c) -#define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */ - - -/* 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__. */ - -#ifndef WCHAR_TYPE -#define WCHAR_TYPE "int" -#endif -char * wchar_type = WCHAR_TYPE; -#undef WCHAR_TYPE - -/* The string value for __USER_LABEL_PREFIX__ */ - -#ifndef USER_LABEL_PREFIX -#define USER_LABEL_PREFIX "" -#endif -char * user_label_prefix = USER_LABEL_PREFIX; -#undef USER_LABEL_PREFIX - -/* The string value for __REGISTER_PREFIX__ */ - -#ifndef REGISTER_PREFIX -#define REGISTER_PREFIX "" -#endif - -/* The string value for __IMMEDIATE_PREFIX__ */ - -#ifndef IMMEDIATE_PREFIX -#define IMMEDIATE_PREFIX "" -#endif - -/* In the definition of a #assert name, this structure forms - a list of the individual values asserted. - Each value is itself a list of "tokens". - These are strings that are compared by name. */ - -struct tokenlist_list { - struct tokenlist_list *next; - struct arglist *tokens; -}; - -struct assertion_hashnode { - struct assertion_hashnode *next; /* double links for easy deletion */ - struct assertion_hashnode *prev; - /* 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. */ - struct assertion_hashnode **bucket_hdr; - int length; /* length of token, for quick comparison */ - U_CHAR *name; /* the actual name */ - /* List of token-sequences. */ - struct tokenlist_list *value; -}; - -typedef struct assertion_hashnode ASSERTION_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 ASSERTION_HASHSIZE 37 -static ASSERTION_HASHNODE *assertion_hashtab[ASSERTION_HASHSIZE]; - -/* Nonzero means inhibit macroexpansion of what seem to be - assertion tests, in rescan. For #if. */ -static int assertions_flag; - -/* `struct directive' defines one #-directive, including how to handle it. */ - -#define DO_PROTO PROTO((U_CHAR *, U_CHAR *, FILE_BUF *, struct directive *)) - -struct directive { - int length; /* Length of name */ - int (*func) DO_PROTO; /* Function to handle directive */ - char *name; /* Name of directive */ - enum node_type type; /* Code which describes which directive. */ -}; - -#define IS_INCLUDE_DIRECTIVE_TYPE(t) \ -((int) T_INCLUDE <= (int) (t) && (int) (t) <= (int) T_IMPORT) - -/* These functions are declared to return int instead of void since they - are going to be placed in the table and some old compilers have trouble with - pointers to functions returning void. */ - -static int do_assert DO_PROTO; -static int do_define DO_PROTO; -static int do_elif DO_PROTO; -static int do_else DO_PROTO; -static int do_endif DO_PROTO; -static int do_error DO_PROTO; -static int do_ident DO_PROTO; -static int do_if DO_PROTO; -static int do_include DO_PROTO; -static int do_line DO_PROTO; -static int do_pragma DO_PROTO; -#ifdef SCCS_DIRECTIVE -static int do_sccs DO_PROTO; -#endif -static int do_unassert DO_PROTO; -static int do_undef DO_PROTO; -static int do_warning DO_PROTO; -static int do_xifdef DO_PROTO; - -/* Here is the actual list of #-directives, most-often-used first. */ - -static struct directive directive_table[] = { - { 6, do_define, "define", T_DEFINE}, - { 2, do_if, "if", T_IF}, - { 5, do_xifdef, "ifdef", T_IFDEF}, - { 6, do_xifdef, "ifndef", T_IFNDEF}, - { 5, do_endif, "endif", T_ENDIF}, - { 4, do_else, "else", T_ELSE}, - { 4, do_elif, "elif", T_ELIF}, - { 4, do_line, "line", T_LINE}, - { 7, do_include, "include", T_INCLUDE}, - { 12, do_include, "include_next", T_INCLUDE_NEXT}, - { 6, do_include, "import", T_IMPORT}, - { 5, do_undef, "undef", T_UNDEF}, - { 5, do_error, "error", T_ERROR}, - { 7, do_warning, "warning", T_WARNING}, -#ifdef SCCS_DIRECTIVE - { 4, do_sccs, "sccs", T_SCCS}, -#endif - { 6, do_pragma, "pragma", T_PRAGMA}, - { 5, do_ident, "ident", T_IDENT}, - { 6, do_assert, "assert", T_ASSERT}, - { 8, do_unassert, "unassert", T_UNASSERT}, - { -1, 0, "", T_UNUSED}, -}; - -/* When a directive handler is called, - this points to the # (or the : of the %:) that started the directive. */ -U_CHAR *directive_start; - -/* table to tell if char can be part of a C identifier. */ -U_CHAR is_idchar[256]; -/* table to tell if char can be first char of a c identifier. */ -U_CHAR is_idstart[256]; -/* table to tell if c is horizontal space. */ -static U_CHAR is_hor_space[256]; -/* table to tell if c is horizontal or vertical space. */ -U_CHAR is_space[256]; - -#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) - -static int errors = 0; /* Error counter for exit code */ - -/* Name of output file, for error messages. */ -static char *out_fname; - -/* Nonzero to ignore \ in string constants. Use to treat #line 1 "A:\file.h - as a non-form feed. If you want it to be a form feed, you must use - # 1 "\f". */ -static int ignore_escape_flag = 1; - -/* 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 */ - size_t fname_len; /* similarly */ - int lineno; /* similarly */ - int if_succeeded; /* true if a leg of this if-group - has been passed through rescan */ - U_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; -static IF_STACK_FRAME *if_stack = NULL; - -/* Buffer of -M output. */ -static char *deps_buffer; - -/* Number of bytes allocated in above. */ -static int deps_allocated_size; - -/* Number of bytes used. */ -static int deps_size; - -/* Number of bytes since the last newline. */ -static int deps_column; - -/* Nonzero means -I- has been seen, - so don't look for #include "foo" the source-file directory. */ -static int ignore_srcdir; - -static int safe_read PROTO((int, char *, int)); -static void safe_write PROTO((int, char *, int)); -static void eprint_string PROTO((const char *, size_t)); - -int main PROTO((int, char **)); - -static void path_include PROTO((char *)); - -static U_CHAR *index0 PROTO((U_CHAR *, int, size_t)); - -static void trigraph_pcp PROTO((FILE_BUF *)); - -static void newline_fix PROTO((U_CHAR *)); -static void name_newline_fix PROTO((U_CHAR *)); - -static char *get_lintcmd PROTO((U_CHAR *, U_CHAR *, U_CHAR **, int *, int *)); - -static void rescan PROTO((FILE_BUF *, int)); - -static FILE_BUF expand_to_temp_buffer PROTO((U_CHAR *, U_CHAR *, int, int)); - -static int handle_directive PROTO((FILE_BUF *, FILE_BUF *)); - -static struct tm *timestamp PROTO((void)); -static void special_symbol PROTO((HASHNODE *, FILE_BUF *)); - -static int is_system_include PROTO((char *)); -static char *base_name PROTO((char *)); -static int absolute_filename PROTO((char *)); -static size_t simplify_filename PROTO((char *)); - -static char *read_filename_string PROTO((int, FILE *)); -static struct file_name_map *read_name_map PROTO((char *)); -static int open_include_file PROTO((char *, struct file_name_list *, U_CHAR *, struct include_file **)); -static char *remap_include_file PROTO((char *, struct file_name_list *)); -static int lookup_ino_include PROTO((struct include_file *)); - -static void finclude PROTO((int, struct include_file *, FILE_BUF *, int, struct file_name_list *)); -static void record_control_macro PROTO((struct include_file *, U_CHAR *)); - -static char *check_precompiled PROTO((int, struct stat *, char *, char **)); -static int check_preconditions PROTO((char *)); -static void pcfinclude PROTO((U_CHAR *, U_CHAR *, FILE_BUF *)); -static void pcstring_used PROTO((HASHNODE *)); -static void write_output PROTO((void)); -static void pass_thru_directive PROTO((U_CHAR *, U_CHAR *, FILE_BUF *, struct directive *)); - -static MACRODEF create_definition PROTO((U_CHAR *, U_CHAR *, FILE_BUF *)); - -static int check_macro_name PROTO((U_CHAR *, int)); -static int compare_defs PROTO((DEFINITION *, DEFINITION *)); -static int comp_def_part PROTO((int, U_CHAR *, int, U_CHAR *, int, int)); - -static DEFINITION *collect_expansion PROTO((U_CHAR *, U_CHAR *, int, struct arglist *)); - -int check_assertion PROTO((U_CHAR *, int, int, struct arglist *)); -static int compare_token_lists PROTO((struct arglist *, struct arglist *)); - -static struct arglist *read_token_list PROTO((U_CHAR **, U_CHAR *, int *)); -static void free_token_list PROTO((struct arglist *)); - -static ASSERTION_HASHNODE *assertion_install PROTO((U_CHAR *, int, int)); -static ASSERTION_HASHNODE *assertion_lookup PROTO((U_CHAR *, int, int)); -static void delete_assertion PROTO((ASSERTION_HASHNODE *)); - -static void do_once PROTO((void)); - -static HOST_WIDEST_INT eval_if_expression PROTO((U_CHAR *, int)); -static void conditional_skip PROTO((FILE_BUF *, int, enum node_type, U_CHAR *, FILE_BUF *)); -static void skip_if_group PROTO((FILE_BUF *, int, FILE_BUF *)); -static void validate_else PROTO((U_CHAR *, U_CHAR *)); - -static U_CHAR *skip_to_end_of_comment PROTO((FILE_BUF *, int *, int)); -static U_CHAR *skip_quoted_string PROTO((U_CHAR *, U_CHAR *, int, int *, int *, int *)); -static char *quote_string PROTO((char *, char *, size_t)); -static U_CHAR *skip_paren_group PROTO((FILE_BUF *)); - -/* Last arg to output_line_directive. */ -enum file_change_code {same_file, enter_file, leave_file}; -static void output_line_directive PROTO((FILE_BUF *, FILE_BUF *, int, enum file_change_code)); - -static void macroexpand PROTO((HASHNODE *, FILE_BUF *)); - -struct argdata; -static int macarg PROTO((struct argdata *, int)); - -static U_CHAR *macarg1 PROTO((U_CHAR *, U_CHAR *, struct hashnode *, int *, int *, int *, int)); - -static int discard_comments PROTO((U_CHAR *, int, int)); - -static int change_newlines PROTO((U_CHAR *, int)); - -static char *my_strerror PROTO((int)); -static void notice PVPROTO((const char *, ...)) ATTRIBUTE_PRINTF_1; -static void vnotice PROTO((const char *, va_list)); -void error PVPROTO((const char *, ...)) ATTRIBUTE_PRINTF_1; -void verror PROTO((const char *, va_list)); -static void error_from_errno PROTO((char *)); -void warning PVPROTO((const char *, ...)) ATTRIBUTE_PRINTF_1; -static void vwarning PROTO((const char *, va_list)); -static void error_with_line PVPROTO((int, const char *, ...)) ATTRIBUTE_PRINTF_2; -static void verror_with_line PROTO((int, const char *, va_list)); -static void vwarning_with_line PROTO((int, const char *, va_list)); -static void warning_with_line PVPROTO((int, const char *, ...)) ATTRIBUTE_PRINTF_2; -void pedwarn PVPROTO((const char *, ...)) ATTRIBUTE_PRINTF_1; -void pedwarn_with_line PVPROTO((int, const char *, ...)) ATTRIBUTE_PRINTF_2; -static void pedwarn_with_file_and_line PVPROTO((const char *, size_t, int, const char *, ...)) ATTRIBUTE_PRINTF_4; -static void pedwarn_strange_white_space PROTO((int)); - -static void print_containing_files PROTO((void)); - -static int line_for_error PROTO((int)); -static int grow_outbuf PROTO((FILE_BUF *, int)); - -static HASHNODE *install PROTO((U_CHAR *, int, enum node_type, char *, int)); -HASHNODE *lookup PROTO((U_CHAR *, int, int)); -static void delete_macro PROTO((HASHNODE *)); -static int hashf PROTO((U_CHAR *, int, int)); - -static void dump_single_macro PROTO((HASHNODE *, FILE *)); -static void dump_all_macros PROTO((void)); -static void dump_defn_1 PROTO((U_CHAR *, int, int, FILE *)); -static void dump_arg_n PROTO((DEFINITION *, int, FILE *)); - -static void initialize_char_syntax PROTO((void)); -static void initialize_builtins PROTO((FILE_BUF *, FILE_BUF *)); - -static void make_definition PROTO((char *)); -static void make_undef PROTO((char *, FILE_BUF *)); - -static void make_assertion PROTO((const char *, const char *)); - -static struct file_name_list *new_include_prefix PROTO((struct file_name_list *, const char *, const char *, const char *)); -static void append_include_chain PROTO((struct file_name_list *, struct file_name_list *)); - -static int quote_string_for_make PROTO((char *, const char *)); -static void deps_output PROTO((const char *, int)); - -void fatal PVPROTO((const char *, ...)) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; -void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN; -static void perror_with_name PROTO((char *)); -static void pfatal_with_name PROTO((char *)) ATTRIBUTE_NORETURN; -static void pipe_closed PROTO((int)) ATTRIBUTE_NORETURN; - -static void memory_full PROTO((void)) ATTRIBUTE_NORETURN; -static void print_help PROTO((void)); - -/* 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 int -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; -} - -/* Write LEN bytes at PTR to descriptor DESC, - retrying if necessary, and treating any real error as fatal. - If MAX_WRITE_LEN is defined, write at most that many bytes at a time. */ - -static void -safe_write (desc, ptr, len) - int desc; - char *ptr; - int len; -{ - int wcount, written; - - while (len > 0) { - wcount = len; -#ifdef MAX_WRITE_LEN - if (wcount > MAX_WRITE_LEN) - wcount = MAX_WRITE_LEN; -#endif - written = write (desc, ptr, wcount); - if (written < 0) - { -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - pfatal_with_name (out_fname); - } - ptr += written; - len -= written; - } -} - -/* Print a string to stderr, with extra handling in case it contains - embedded NUL characters. Any present are written as is. - - Using fwrite for this purpose produces undesireable results on VMS - when stderr happens to be a record oriented file, such as a batch log - file, rather than a stream oriented one. */ - -static void -eprint_string (string, length) - const char *string; - size_t length; -{ - size_t segment_length; - - do { - fprintf(stderr, "%s", string); - length -= (segment_length = strlen(string)); - if (length > 0) - { - fputc('\0', stderr); - length -= 1; - /* Advance past the portion which has already been printed. */ - string += segment_length + 1; - } - } while (length > 0); -} - - -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 is C89; depricated\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 (" -std=<std name> Specify the conformance standard; one of:\n"); - printf (" gnu89, gnu9x, c89, c9x, iso9899:1990,\n"); - printf (" iso9899:199409, iso9899:199x\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 -traditional 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 undefined 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 (" -A<question> (<answer>) Assert the <answer> to <question>\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"); -} - -int -main (argc, argv) - int argc; - char **argv; -{ - struct stat st; - char *in_fname; - char *cp; - int f, i; - FILE_BUF *fp; - - char **pend_files; - char **pend_defs; - char **pend_undefs; - char **pend_assertions; - char **pend_includes; - - /* Record the option used with each element of pend_assertions. - This is preparation for supporting more than one option for making - an assertion. */ - char **pend_assertion_options; - int no_standard_includes = 0; - int no_standard_cplusplus_includes = 0; - int missing_newline = 0; - - /* Non-0 means don't output the preprocessed program. */ - int inhibit_output = 0; - /* Non-0 means -v, so print the full set of include dirs. */ - int verbose = 0; - - /* File name which deps are being written to. - This is 0 if deps are being written to stdout. */ - char *deps_file = 0; - /* Fopen file mode to open deps_file with. */ - char *deps_mode = "a"; - /* Stream on which to print the dependency information. */ - FILE *deps_stream = 0; - /* Target-name to write with the dependency information. */ - char *deps_target = 0; - -#if defined (RLIMIT_STACK) && defined (HAVE_GETRLIMIT) && defined (HAVE_SETRLIMIT) - /* Get rid of any avoidable limit on stack size. */ - { - struct rlimit rlim; - - /* Set the stack limit huge so that alloca (particularly stringtab - in dbxread.c) does not fail. */ - getrlimit (RLIMIT_STACK, &rlim); - rlim.rlim_cur = rlim.rlim_max; - setrlimit (RLIMIT_STACK, &rlim); - } -#endif - -#ifdef SIGPIPE - signal (SIGPIPE, pipe_closed); -#endif - -#ifdef HAVE_LC_MESSAGES - setlocale (LC_MESSAGES, ""); -#endif - (void) bindtextdomain (PACKAGE, localedir); - (void) textdomain (PACKAGE); - - progname = base_name (argv[0]); - -#ifdef VMS - { - /* Remove extension from PROGNAME. */ - char *p; - char *s = progname = xstrdup (progname); - - if ((p = rindex (s, ';')) != 0) *p = '\0'; /* strip version number */ - if ((p = rindex (s, '.')) != 0 /* strip type iff ".exe" */ - && (p[1] == 'e' || p[1] == 'E') - && (p[2] == 'x' || p[2] == 'X') - && (p[3] == 'e' || p[3] == 'E') - && !p[4]) - *p = '\0'; - } -#endif - - /* Do not invoke xmalloc before this point, since locale and - progname need to be set first, in case a diagnostic is issued. */ - - pend_files = (char **) xmalloc (argc * sizeof (char *)); - pend_defs = (char **) xmalloc (argc * sizeof (char *)); - pend_undefs = (char **) xmalloc (argc * sizeof (char *)); - pend_assertions = (char **) xmalloc (argc * sizeof (char *)); - pend_includes = (char **) xmalloc (argc * sizeof (char *)); - pend_assertion_options = (char **) xmalloc (argc * sizeof (char *)); - - in_fname = NULL; - out_fname = NULL; - - /* Initialize is_idchar. */ - initialize_char_syntax (); - - no_line_directives = 0; - no_trigraphs = 1; - dump_macros = dump_none; - no_output = 0; - cplusplus = 0; - cplusplus_comments = 1; - - bzero ((char *) pend_files, argc * sizeof (char *)); - bzero ((char *) pend_defs, argc * sizeof (char *)); - bzero ((char *) pend_undefs, argc * sizeof (char *)); - bzero ((char *) pend_assertions, argc * sizeof (char *)); - bzero ((char *) pend_includes, argc * sizeof (char *)); - -#ifdef MULTIBYTE_CHARS - /* Change to the native locale for multibyte conversions. */ - setlocale (LC_CTYPE, ""); - literal_codeset = getenv ("LANG"); -#endif - - /* Process switches and find input file name. */ - - for (i = 1; i < argc; i++) { - if (argv[i][0] != '-') { - if (out_fname != NULL) - { - print_help (); - fatal ("Too many arguments"); - } - else if (in_fname != NULL) - out_fname = argv[i]; - else - in_fname = argv[i]; - } else { - switch (argv[i][1]) { - - case 'i': - if (!strcmp (argv[i], "-include")) { - int temp = i; - - if (i + 1 == argc) - fatal ("Filename missing after `-include' option"); - else - simplify_filename (pend_includes[temp] = argv[++i]); - } - if (!strcmp (argv[i], "-imacros")) { - int temp = i; - - if (i + 1 == argc) - fatal ("Filename missing after `-imacros' option"); - else - simplify_filename (pend_files[temp] = argv[++i]); - } - if (!strcmp (argv[i], "-iprefix")) { - if (i + 1 == argc) - fatal ("Filename missing after `-iprefix' option"); - else - include_prefix = argv[++i]; - } - if (!strcmp (argv[i], "-ifoutput")) { - output_conditionals = 1; - } - if (!strcmp (argv[i], "-isystem")) { - struct file_name_list *dirtmp; - - if (! (dirtmp = new_include_prefix (NULL_PTR, NULL_PTR, - "", argv[++i]))) - break; - dirtmp->c_system_include_path = 1; - - if (before_system == 0) - before_system = dirtmp; - else - last_before_system->next = dirtmp; - last_before_system = dirtmp; /* Tail follows the last one */ - } - /* Add directory to end of path for includes, - with the default prefix at the front of its name. */ - if (!strcmp (argv[i], "-iwithprefix")) { - struct file_name_list *dirtmp; - char *prefix; - - if (include_prefix != 0) - prefix = include_prefix; - else { - prefix = xstrdup (GCC_INCLUDE_DIR); - /* Remove the `include' from /usr/local/lib/gcc.../include. */ - if (!strcmp (prefix + strlen (prefix) - 8, "/include")) - prefix[strlen (prefix) - 7] = 0; - } - - if (! (dirtmp = new_include_prefix (NULL_PTR, NULL_PTR, - prefix, argv[++i]))) - break; - - if (after_include == 0) - after_include = dirtmp; - else - last_after_include->next = dirtmp; - last_after_include = dirtmp; /* Tail follows the last one */ - } - /* Add directory to main path for includes, - with the default prefix at the front of its name. */ - if (!strcmp (argv[i], "-iwithprefixbefore")) { - struct file_name_list *dirtmp; - char *prefix; - - if (include_prefix != 0) - prefix = include_prefix; - else { - prefix = xstrdup (GCC_INCLUDE_DIR); - /* Remove the `include' from /usr/local/lib/gcc.../include. */ - if (!strcmp (prefix + strlen (prefix) - 8, "/include")) - prefix[strlen (prefix) - 7] = 0; - } - - dirtmp = new_include_prefix (NULL_PTR, NULL_PTR, prefix, argv[++i]); - append_include_chain (dirtmp, dirtmp); - } - /* Add directory to end of path for includes. */ - if (!strcmp (argv[i], "-idirafter")) { - struct file_name_list *dirtmp; - - if (! (dirtmp = new_include_prefix (NULL_PTR, NULL_PTR, - "", argv[++i]))) - break; - - if (after_include == 0) - after_include = dirtmp; - else - last_after_include->next = dirtmp; - last_after_include = dirtmp; /* Tail follows the last one */ - } - break; - - case 'o': - if (out_fname != NULL) - fatal ("Output filename specified twice"); - if (i + 1 == argc) - fatal ("Filename missing after -o option"); - out_fname = argv[++i]; - if (!strcmp (out_fname, "-")) - out_fname = ""; - break; - - case 'p': - if (!strcmp (argv[i], "-pedantic")) - pedantic = 1; - else if (!strcmp (argv[i], "-pedantic-errors")) { - pedantic = 1; - pedantic_errors = 1; - } else if (!strcmp (argv[i], "-pcp")) { - char *pcp_fname; - if (i + 1 == argc) - fatal ("Filename missing after -pcp option"); - pcp_fname = argv[++i]; - pcp_outfile - = ((pcp_fname[0] != '-' || pcp_fname[1] != '\0') - ? fopen (pcp_fname, "w") - : stdout); - if (pcp_outfile == 0) - pfatal_with_name (pcp_fname); - no_precomp = 1; - } - break; - - case 't': - if (!strcmp (argv[i], "-traditional")) { - traditional = 1; - cplusplus_comments = 0; - } else if (!strcmp (argv[i], "-trigraphs")) { - no_trigraphs = 0; - } - break; - - case 'l': - if (! strcmp (argv[i], "-lang-c")) - cplusplus = 0, cplusplus_comments = 1, c89 = 0, c9x = 1, objc = 0; - else if (! strcmp (argv[i], "-lang-c89")) - cplusplus = 0, cplusplus_comments = 0, c89 = 1, c9x = 0, objc = 0; - else if (! strcmp (argv[i], "-lang-c++")) - cplusplus = 1, cplusplus_comments = 1, c89 = 0, c9x = 0, objc = 0; - else if (! strcmp (argv[i], "-lang-objc")) - cplusplus = 0, cplusplus_comments = 1, c89 = 0, c9x = 0, objc = 1; - else if (! strcmp (argv[i], "-lang-objc++")) - cplusplus = 1, cplusplus_comments = 1, c89 = 0, c9x = 0, objc = 1; - else if (! strcmp (argv[i], "-lang-asm")) - lang_asm = 1; - else if (! strcmp (argv[i], "-lint")) - for_lint = 1; - break; - - case '+': - cplusplus = 1, cplusplus_comments = 1; - break; - - case 's': - if (!strcmp (argv[i], "-std=iso9899:1990") - || !strcmp (argv[i], "-std=iso9899:199409") - || !strcmp (argv[i], "-std=c89") - || !strcmp (argv[i], "-std=gnu89")) - cplusplus = 0, cplusplus_comments = 0, c89 = 1, c9x = 0, objc = 0; - else if (!strcmp (argv[i], "-std=iso9899:199x") - || !strcmp (argv[i], "-std=c9x") - || !strcmp (argv[i], "-std=gnu9x")) - cplusplus = 0, cplusplus_comments = 1, c89 = 0, c9x = 1, objc = 0; - break; - - case 'w': - inhibit_warnings = 1; - break; - - case 'W': - if (!strcmp (argv[i], "-Wtrigraphs")) - warn_trigraphs = 1; - else if (!strcmp (argv[i], "-Wno-trigraphs")) - warn_trigraphs = 0; - else if (!strcmp (argv[i], "-Wcomment")) - warn_comments = 1; - else if (!strcmp (argv[i], "-Wno-comment")) - warn_comments = 0; - else if (!strcmp (argv[i], "-Wcomments")) - warn_comments = 1; - else if (!strcmp (argv[i], "-Wno-comments")) - warn_comments = 0; - else if (!strcmp (argv[i], "-Wtraditional")) - warn_stringify = 1; - else if (!strcmp (argv[i], "-Wno-traditional")) - warn_stringify = 0; - else if (!strcmp (argv[i], "-Wundef")) - warn_undef = 1; - else if (!strcmp (argv[i], "-Wno-undef")) - warn_undef = 0; - else if (!strcmp (argv[i], "-Wimport")) - warn_import = 1; - else if (!strcmp (argv[i], "-Wno-import")) - warn_import = 0; - else if (!strcmp (argv[i], "-Werror")) - warnings_are_errors = 1; - else if (!strcmp (argv[i], "-Wno-error")) - warnings_are_errors = 0; - else if (!strcmp (argv[i], "-Wall")) - { - warn_trigraphs = 1; - warn_comments = 1; - } - break; - - case 'f': - if (!strcmp (argv[i], "-fleading-underscore")) - user_label_prefix = "_"; - else if (!strcmp (argv[i], "-fno-leading-underscore")) - user_label_prefix = ""; - 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")) - { - print_deps_missing_files = 1; - break; - } - if (!strcmp (argv[i], "-M")) - print_deps = 2; - else if (!strcmp (argv[i], "-MM")) - print_deps = 1; - else if (!strcmp (argv[i], "-MD")) - print_deps = 2; - else if (!strcmp (argv[i], "-MMD")) - 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) - fatal ("Filename missing after %s option", argv[i]); - i++; - deps_file = argv[i]; - deps_mode = "w"; - } else { - /* For -M and -MM, write deps on standard output - and suppress the usual output. */ - deps_stream = stdout; - inhibit_output = 1; - } - break; - - case 'd': - { - char *p = argv[i] + 2; - char c; - while ((c = *p++)) { - /* Arg to -d specifies what parts of macros to dump */ - switch (c) { - case 'M': - dump_macros = dump_only; - no_output = 1; - break; - case 'N': - dump_macros = dump_names; - break; - case 'D': - dump_macros = dump_definitions; - break; - case 'I': - dump_includes = 1; - break; - } - } - } - break; - - case 'g': - if (argv[i][2] == '3') - debug_output = 1; - break; - - case '-': - if (strcmp (argv[i], "--help") != 0) - return i; - print_help (); - exit (0); - break; - - case 'v': - notice ("GNU CPP version %s", version_string); -#ifdef TARGET_VERSION - TARGET_VERSION; -#endif - fprintf (stderr, "\n"); - verbose = 1; - break; - - case 'H': - print_include_names = 1; - break; - - case 'D': - if (argv[i][2] != 0) - pend_defs[i] = argv[i] + 2; - else if (i + 1 == argc) - fatal ("Macro name missing after -D option"); - else - i++, pend_defs[i] = argv[i]; - break; - - case 'A': - { - char *p; - - if (argv[i][2] != 0) - p = argv[i] + 2; - else if (i + 1 == argc) - fatal ("Assertion missing after -A option"); - else - p = argv[++i]; - - if (!strcmp (p, "-")) { - /* -A- eliminates all predefined macros and assertions. - Let's include also any that were specified earlier - on the command line. That way we can get rid of any - that were passed automatically in from GCC. */ - int j; - for (j = 0; j < i; j++) - pend_defs[j] = pend_assertions[j] = 0; - } else { - pend_assertions[i] = p; - pend_assertion_options[i] = "-A"; - } - } - break; - - case 'U': /* JF #undef something */ - if (argv[i][2] != 0) - pend_undefs[i] = argv[i] + 2; - else if (i + 1 == argc) - fatal ("Macro name missing after -U option"); - else - pend_undefs[i] = argv[i+1], i++; - break; - - case 'C': - put_out_comments = 1; - break; - - case 'E': /* -E comes from cc -E; ignore it. */ - break; - - case 'P': - no_line_directives = 1; - break; - - case '$': /* Don't include $ in identifiers. */ - is_idchar['$'] = is_idstart['$'] = 0; - break; - - case 'I': /* Add directory to path for includes. */ - { - struct file_name_list *dirtmp; - - if (! ignore_srcdir && !strcmp (argv[i] + 2, "-")) { - ignore_srcdir = 1; - /* Don't use any preceding -I directories for #include <...>. */ - first_bracket_include = 0; - } - else { - dirtmp = new_include_prefix (last_include, NULL_PTR, "", - argv[i][2] ? argv[i] + 2 : argv[++i]); - append_include_chain (dirtmp, dirtmp); - } - } - break; - - case 'n': - if (!strcmp (argv[i], "-nostdinc")) - /* -nostdinc causes no default include directories. - You must specify all include-file directories with -I. */ - no_standard_includes = 1; - else if (!strcmp (argv[i], "-nostdinc++")) - /* -nostdinc++ causes no default C++-specific include directories. */ - no_standard_cplusplus_includes = 1; - else if (!strcmp (argv[i], "-noprecomp")) - no_precomp = 1; - break; - - case 'r': - if (!strcmp (argv[i], "-remap")) - remap = 1; - break; - - case '\0': /* JF handle '-' as file name meaning stdin or stdout */ - if (in_fname == NULL) { - in_fname = ""; - break; - } else if (out_fname == NULL) { - out_fname = ""; - break; - } /* else fall through into error */ - - default: - fatal ("Invalid option `%s'", argv[i]); - } - } - } - - /* 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 (cp, "CPATH"); - if (cp && ! no_standard_includes) - path_include (cp); - - /* Initialize output buffer */ - - outbuf.buf = (U_CHAR *) xmalloc (OUTBUF_SIZE); - outbuf.bufp = outbuf.buf; - outbuf.length = OUTBUF_SIZE; - - /* Do partial setup of input buffer for the sake of generating - early #line directives (when -g is in effect). */ - - fp = &instack[++indepth]; - if (in_fname == NULL) - in_fname = ""; - fp->nominal_fname = fp->fname = in_fname; - fp->nominal_fname_len = strlen (in_fname); - fp->lineno = 0; - - /* In C++, wchar_t is a distinct basic type, and we can expect - __wchar_t to be defined by cc1plus. */ - if (cplusplus) - wchar_type = "__wchar_t"; - - /* Install __LINE__, etc. Must follow initialize_char_syntax - and option processing. */ - initialize_builtins (fp, &outbuf); - - /* Now handle the command line options. */ - - /* Do -U's, -D's and -A's in the order they were seen. */ - for (i = 1; i < argc; i++) { - if (pend_undefs[i]) { - if (debug_output) - output_line_directive (fp, &outbuf, 0, same_file); - make_undef (pend_undefs[i], &outbuf); - } - if (pend_defs[i]) { - if (debug_output) - output_line_directive (fp, &outbuf, 0, same_file); - make_definition (pend_defs[i]); - } - if (pend_assertions[i]) - make_assertion (pend_assertion_options[i], pend_assertions[i]); - } - - done_initializing = 1; - - { /* Read the appropriate environment variable and if it exists - replace include_defaults with the listed path. */ - char *epath = 0; - switch ((objc << 1) + 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) { - 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) { - char c = *endp++; - if (c == PATH_SEPARATOR || !c) { - endp[-1] = 0; - include_defaults[num_dirs].fname - = startp == endp ? "." : xstrdup (startp); - endp[-1] = c; - include_defaults[num_dirs].component = 0; - include_defaults[num_dirs].cplusplus = cplusplus; - include_defaults[num_dirs].cxx_aware = 1; - num_dirs++; - if (!c) - break; - startp = endp; - } - } - /* Put the usual defaults back in at the end. */ - bcopy ((char *) include_defaults_array, - (char *) &include_defaults[num_dirs], - sizeof (include_defaults_array)); - } - } - - append_include_chain (before_system, last_before_system); - first_system_include = before_system; - - /* Unless -fnostdinc, - tack on the standard include file dirs to the specified list */ - if (!no_standard_includes) { - struct default_include *p = include_defaults; - char *specd_prefix = 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 || (cplusplus && !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. */ - struct file_name_list *new - = new_include_prefix (NULL_PTR, NULL_PTR, specd_prefix, - p->fname + default_len); - if (new) { - new->c_system_include_path = !p->cxx_aware; - append_include_chain (new, new); - if (first_system_include == 0) - first_system_include = new; - p->included = 1; - } - } - } - } - /* Search ordinary names for GNU include directories. */ - for (p = include_defaults; p->fname; p++) { - /* Some standard dirs are only for C++. */ - if (!p->cplusplus || (cplusplus && !no_standard_cplusplus_includes)) { - struct file_name_list *new - = new_include_prefix (NULL_PTR, p->component, "", p->fname); - if (new) { - new->c_system_include_path = !p->cxx_aware; - append_include_chain (new, new); - if (first_system_include == 0) - first_system_include = new; - p->included = 1; - } - } - } - } - - /* Tack the after_include chain at the end of the include chain. */ - append_include_chain (after_include, last_after_include); - if (first_system_include == 0) - first_system_include = after_include; - - /* With -v, print the list of dirs to search. */ - if (verbose) { - struct file_name_list *p; - notice ("#include \"...\" search starts here:\n"); - for (p = include; p; p = p->next) { - if (p == first_bracket_include) - notice ("#include <...> search starts here:\n"); - if (!p->fname[0]) - fprintf (stderr, " .\n"); - else if (!strcmp (p->fname, "/") || !strcmp (p->fname, "//")) - fprintf (stderr, " %s\n", p->fname); - else - /* Omit trailing '/'. */ - fprintf (stderr, " %.*s\n", (int) strlen (p->fname) - 1, p->fname); - } - notice ("End of search list.\n"); - { - struct default_include * d; - notice ("The following default directories have been omitted from the search path:\n"); - for (d = include_defaults; d->fname; d++) - if (! d->included) - fprintf (stderr, " %s\n", d->fname); - notice ("End of omitted list.\n"); - } - } - - /* -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 (print_deps_missing_files && (print_deps == 0 || !inhibit_output)) - fatal ("-MG must be specified with one of -M or -MM"); - - /* 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 (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"); - print_deps = 2; - } - else - 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) { - deps_target = s + 1; - output_file = xmalloc (s - spec + 1); - bcopy (spec, output_file, s - spec); - output_file[s - spec] = 0; - } - else { - deps_target = 0; - output_file = spec; - } - - deps_file = output_file; - deps_mode = "a"; - } - - /* For -M, print the expected object file name - as the target of this Make-rule. */ - if (print_deps) { - deps_allocated_size = 200; - deps_buffer = xmalloc (deps_allocated_size); - deps_buffer[0] = 0; - deps_size = 0; - deps_column = 0; - - if (deps_target) { - deps_output (deps_target, ':'); - } else if (*in_fname == 0) { - deps_output ("-", ':'); - } else { - char *p, *q; - int len; - - q = base_name (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; - if (len >= 2 - && p[len - 2] == '.' - && index("cCsSm", p[len - 1])) - q = p + (len - 2); - else if (len >= 3 - && p[len - 3] == '.' - && p[len - 2] == 'c' - && p[len - 1] == 'c') - q = p + (len - 3); - else if (len >= 4 - && p[len - 4] == '.' - && p[len - 3] == 'c' - && p[len - 2] == 'x' - && p[len - 1] == 'x') - q = p + (len - 4); - else if (len >= 4 - && p[len - 4] == '.' - && p[len - 3] == 'c' - && p[len - 2] == 'p' - && p[len - 1] == 'p') - q = p + (len - 4); - - /* Supply our own suffix. */ - strcpy (q, OBJECT_SUFFIX); - - deps_output (p, ':'); - deps_output (in_fname, ' '); - } - } - - /* Scan the -imacros files before the main input. - Much like #including them, but with no_output set - so that only their macro definitions matter. */ - - no_output++; no_record_file++; - for (i = 1; i < argc; i++) - if (pend_files[i]) { - struct include_file *inc; - int fd = open_include_file (pend_files[i], NULL_PTR, NULL_PTR, &inc); - if (fd < 0) { - perror_with_name (pend_files[i]); - return FATAL_EXIT_CODE; - } - finclude (fd, inc, &outbuf, 0, NULL_PTR); - } - no_output--; no_record_file--; - - /* Copy the entire contents of the main input file into - the stacked input buffer previously allocated for it. */ - - /* JF check for stdin */ - if (in_fname == NULL || *in_fname == 0) { - in_fname = ""; - f = 0; - } else if ((f = open (in_fname, O_RDONLY, 0666)) < 0) - goto perror; - - if (fstat (f, &st) != 0) - pfatal_with_name (in_fname); - fp->nominal_fname = fp->fname = in_fname; - fp->nominal_fname_len = strlen (in_fname); - fp->lineno = 1; - fp->system_header_p = 0; - /* JF all this is mine about reading pipes and ttys */ - if (! S_ISREG (st.st_mode)) { - /* Read input from a file that is not a normal disk file. - We cannot preallocate a buffer with the correct size, - so we must read in the file a piece at the time and make it bigger. */ - int size; - int bsize; - int cnt; - - if (S_ISDIR (st.st_mode)) - fatal ("Input file `%s' is a directory", in_fname); - - bsize = 2000; - size = 0; - fp->buf = (U_CHAR *) xmalloc (bsize + 2); - for (;;) { - cnt = safe_read (f, (char *) fp->buf + size, bsize - size); - if (cnt < 0) goto perror; /* error! */ - size += cnt; - if (size != bsize) break; /* End of file */ - bsize *= 2; - fp->buf = (U_CHAR *) xrealloc (fp->buf, bsize + 2); - } - fp->length = size; - } else { - /* Read a file whose size we can determine in advance. - For the sake of VMS, st.st_size is just an upper bound. */ - size_t s = (size_t) st.st_size; - if (s != st.st_size || s + 2 < s) - memory_full (); - fp->buf = (U_CHAR *) xmalloc (s + 2); - fp->length = safe_read (f, (char *) fp->buf, s); - if (fp->length < 0) goto perror; - } - fp->bufp = fp->buf; - fp->if_stack = if_stack; - - /* 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); - - /* Now that we know the input file is valid, open the output. */ - - if (!out_fname || !strcmp (out_fname, "")) - out_fname = "stdout"; - else if (! freopen (out_fname, "w", stdout)) - pfatal_with_name (out_fname); - - output_line_directive (fp, &outbuf, 0, same_file); - - /* Scan the -include files before the main input. */ - - no_record_file++; - for (i = 1; i < argc; i++) - if (pend_includes[i]) { - struct include_file *inc; - int fd = open_include_file (pend_includes[i], NULL_PTR, NULL_PTR, &inc); - if (fd < 0) { - perror_with_name (pend_includes[i]); - return FATAL_EXIT_CODE; - } - finclude (fd, inc, &outbuf, 0, NULL_PTR); - } - no_record_file--; - - /* Scan the input, processing macros and directives. */ - - rescan (&outbuf, 0); - - if (missing_newline) - fp->lineno--; - - if (pedantic && missing_newline) - pedwarn ("file does not end in newline"); - - /* Now we have processed the entire input - Write whichever kind of output has been requested. */ - - if (dump_macros == dump_only) - dump_all_macros (); - else if (! inhibit_output) { - write_output (); - } - - if (print_deps) { - /* Don't actually write the deps file if compilation has failed. */ - if (errors == 0) { - if (deps_file && ! (deps_stream = fopen (deps_file, deps_mode))) - pfatal_with_name (deps_file); - fputs (deps_buffer, deps_stream); - putc ('\n', deps_stream); - if (deps_file) { - if (ferror (deps_stream) || fclose (deps_stream) != 0) - fatal ("I/O error on output"); - } - } - } - - if (pcp_outfile && pcp_outfile != stdout - && (ferror (pcp_outfile) || fclose (pcp_outfile) != 0)) - fatal ("I/O error on `-pcp' output"); - - if (ferror (stdout) || fclose (stdout) != 0) - fatal ("I/O error on output"); - - if (errors) - exit (FATAL_EXIT_CODE); - exit (SUCCESS_EXIT_CODE); - - perror: - pfatal_with_name (in_fname); - return 0; -} - -/* Given a colon-separated list of file names PATH, - add all the names to the search path for include files. */ - -static void -path_include (path) - char *path; -{ - char *p; - - p = path; - - if (*p) - while (1) { - char *q = p; - char c; - struct file_name_list *dirtmp; - - /* Find the end of this name. */ - while ((c = *q++) != PATH_SEPARATOR && c) - continue; - - q[-1] = 0; - dirtmp = new_include_prefix (last_include, NULL_PTR, - "", p == q ? "." : p); - q[-1] = c; - append_include_chain (dirtmp, dirtmp); - - /* Advance past this name. */ - p = q; - if (! c) - break; - } -} - -/* Return the address of the first character in S that equals C. - S is an array of length N, possibly containing '\0's, and followed by '\0'. - Return 0 if there is no such character. Assume that C itself is not '\0'. - If we knew we could use memchr, we could just invoke memchr (S, C, N), - but unfortunately memchr isn't autoconfigured yet. */ - -static U_CHAR * -index0 (s, c, n) - U_CHAR *s; - int c; - size_t n; -{ - char *p = (char *) s; - for (;;) { - char *q = index (p, c); - if (q) - return (U_CHAR *) q; - else { - size_t l = strlen (p); - if (l == n) - return 0; - l++; - p += l; - n -= l; - } - } -} - -/* Pre-C-Preprocessor to translate ANSI trigraph idiocy in BUF - before main CCCP processing. Name `pcp' is also in honor of the - drugs the trigraph designers must have been on. - - Using an extra pass through the buffer takes a little extra time, - but is infinitely less hairy than trying to handle trigraphs inside - strings, etc. everywhere, and also makes sure that trigraphs are - only translated in the top level of processing. */ - -static void -trigraph_pcp (buf) - FILE_BUF *buf; -{ - register U_CHAR c, *fptr, *bptr, *sptr, *lptr; - int len; - - fptr = bptr = sptr = buf->buf; - lptr = fptr + buf->length; - while ((sptr = index0 (sptr, '?', (size_t) (lptr - sptr))) != NULL) { - if (*++sptr != '?') - continue; - switch (*++sptr) { - case '=': - c = '#'; - break; - case '(': - c = '['; - break; - case '/': - c = '\\'; - break; - case ')': - c = ']'; - break; - case '\'': - c = '^'; - break; - case '<': - c = '{'; - break; - case '!': - c = '|'; - break; - case '>': - c = '}'; - break; - case '-': - c = '~'; - break; - case '?': - sptr--; - continue; - default: - continue; - } - len = sptr - fptr - 2; - - /* BSD doc says bcopy () works right for overlapping strings. In ANSI - C, this will be memmove (). */ - if (bptr != fptr && len > 0) - bcopy ((char *) fptr, (char *) bptr, len); - - bptr += len; - *bptr++ = c; - fptr = ++sptr; - } - len = buf->length - (fptr - buf->buf); - if (bptr != fptr && len > 0) - bcopy ((char *) fptr, (char *) bptr, len); - buf->length -= fptr - bptr; - buf->buf[buf->length] = '\0'; - if (warn_trigraphs && fptr != bptr) - warning_with_line (0, "%lu trigraph(s) encountered", - (unsigned long) (fptr - bptr) / 2); -} - -/* 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). */ - -static void -newline_fix (bp) - U_CHAR *bp; -{ - register U_CHAR *p = bp; - - /* First count the backslash-newline pairs here. */ - - while (p[0] == '\\' && p[1] == '\n') - p += 2; - - /* What follows the backslash-newlines is not embarrassing. */ - - if (*p != '/' && *p != '*') - return; - - /* Copy all potentially embarrassing characters - that follow the backslash-newline pairs - down to where the pairs originally started. */ - - while (*p == '*' || *p == '/') - *bp++ = *p++; - - /* Now write the same number of pairs after the embarrassing chars. */ - while (bp < p) { - *bp++ = '\\'; - *bp++ = '\n'; - } -} - -/* Like newline_fix but for use within a directive-name. - Move any backslash-newlines up past any following symbol constituents. */ - -static void -name_newline_fix (bp) - U_CHAR *bp; -{ - register U_CHAR *p = bp; - - /* First count the backslash-newline pairs here. */ - while (p[0] == '\\' && p[1] == '\n') - p += 2; - - /* What follows the backslash-newlines is not embarrassing. */ - - if (!is_idchar[*p]) - return; - - /* Copy all potentially embarrassing characters - that follow the backslash-newline pairs - down to where the pairs originally started. */ - - while (is_idchar[*p]) - *bp++ = *p++; - - /* Now write the same number of pairs after the embarrassing chars. */ - while (bp < p) { - *bp++ = '\\'; - *bp++ = '\n'; - } -} - -/* Look for lint commands in comments. - - When we come in here, ibp points into a comment. Limit is as one expects. - scan within the comment -- it should start, after lwsp, with a lint command. - If so that command is returned as a (constant) string. - - Upon return, any arg will be pointed to with argstart and will be - arglen long. Note that we don't parse that arg since it will just - be printed out again. */ - -static char * -get_lintcmd (ibp, limit, argstart, arglen, cmdlen) - register U_CHAR *ibp; - register U_CHAR *limit; - U_CHAR **argstart; /* point to command arg */ - int *arglen, *cmdlen; /* how long they are */ -{ - HOST_WIDEST_INT linsize; - register U_CHAR *numptr; /* temp for arg parsing */ - - *arglen = 0; - - SKIP_WHITE_SPACE (ibp); - - if (ibp >= limit) return NULL; - - linsize = limit - ibp; - - /* Oh, I wish C had lexical functions... hell, I'll just open-code the set */ - if ((linsize >= 10) && !bcmp (ibp, "NOTREACHED", 10)) { - *cmdlen = 10; - return "NOTREACHED"; - } - if ((linsize >= 8) && !bcmp (ibp, "ARGSUSED", 8)) { - *cmdlen = 8; - return "ARGSUSED"; - } - if ((linsize >= 11) && !bcmp (ibp, "LINTLIBRARY", 11)) { - *cmdlen = 11; - return "LINTLIBRARY"; - } - if ((linsize >= 7) && !bcmp (ibp, "VARARGS", 7)) { - *cmdlen = 7; - ibp += 7; linsize -= 7; - if ((linsize == 0) || ! ISDIGIT (*ibp)) return "VARARGS"; - - /* OK, read a number */ - for (numptr = *argstart = ibp; (numptr < limit) && ISDIGIT (*numptr); - numptr++); - *arglen = numptr - *argstart; - return "VARARGS"; - } - return NULL; -} - -/* - * The main loop of the program. - * - * Read characters from the input stack, transferring them to the - * output buffer OP. - * - * Macros are expanded and push levels on the input stack. - * At the end of such a level it is popped off and we keep reading. - * At the end of any other kind of level, we return. - * #-directives are handled, except within macros. - * - * If OUTPUT_MARKS is nonzero, keep Newline markers found in the input - * and insert them when appropriate. This is set while scanning macro - * arguments before substitution. It is zero when scanning for final output. - * There are three types of Newline markers: - * * Newline - follows a macro name that was not expanded - * because it appeared inside an expansion of the same macro. - * This marker prevents future expansion of that identifier. - * When the input is rescanned into the final output, these are deleted. - * These are also deleted by ## concatenation. - * * Newline Space (or Newline and any other whitespace character) - * stands for a place that tokens must be separated or whitespace - * is otherwise desirable, but where the ANSI standard specifies there - * is no whitespace. This marker turns into a Space (or whichever other - * whitespace char appears in the marker) in the final output, - * but it turns into nothing in an argument that is stringified with #. - * Such stringified arguments are the only place where the ANSI standard - * specifies with precision that whitespace may not appear. - * - * During this function, IP->bufp is kept cached in IBP for speed of access. - * Likewise, OP->bufp is kept in OBP. Before calling a subroutine - * IBP, IP and OBP must be copied back to memory. IP and IBP are - * copied back with the RECACHE macro. OBP must be copied back from OP->bufp - * explicitly, and before RECACHE, since RECACHE uses OBP. - */ - -static void -rescan (op, output_marks) - FILE_BUF *op; - int output_marks; -{ - /* Character being scanned in main loop. */ - register U_CHAR c; - - /* Length of pending accumulated identifier. */ - register int ident_length = 0; - - /* Hash code of pending accumulated identifier. */ - register int hash = 0; - - /* Current input level (&instack[indepth]). */ - FILE_BUF *ip; - - /* Pointer for scanning input. */ - register U_CHAR *ibp; - - /* Pointer to end of input. End of scan is controlled by LIMIT. */ - register U_CHAR *limit; - - /* Pointer for storing output. */ - register U_CHAR *obp; - - /* REDO_CHAR is nonzero if we are processing an identifier - after backing up over the terminating character. - Sometimes we process an identifier without backing up over - the terminating character, if the terminating character - is not special. Backing up is done so that the terminating character - will be dispatched on again once the identifier is dealt with. */ - int redo_char = 0; - - /* 1 if within an identifier inside of which a concatenation - marker (Newline -) has been seen. */ - int concatenated = 0; - - /* While scanning a comment or a string constant, - this records the line it started on, for error messages. */ - int start_line; - - /* Record position of last `real' newline. */ - U_CHAR *beg_of_line; - -/* Pop the innermost input stack level, assuming it is a macro expansion. */ - -#define POPMACRO \ -do { ip->macro->type = T_MACRO; \ - if (ip->free_ptr) free (ip->free_ptr); \ - --indepth; } while (0) - -/* Reload `rescan's local variables that describe the current - level of the input stack. */ - -#define RECACHE \ -do { ip = &instack[indepth]; \ - ibp = ip->bufp; \ - limit = ip->buf + ip->length; \ - op->bufp = obp; \ - check_expand (op, limit - ibp); \ - beg_of_line = 0; \ - obp = op->bufp; } while (0) - - if (no_output && instack[indepth].fname != 0) - skip_if_group (&instack[indepth], 1, NULL); - - obp = op->bufp; - RECACHE; - - beg_of_line = ibp; - - /* Our caller must always put a null after the end of - the input at each input stack level. */ - if (*limit != 0) - abort (); - - while (1) { - c = *ibp++; - *obp++ = c; - - switch (c) { - case '\\': - if (*ibp == '\n' && !ip->macro) { - /* At the top level, always merge lines ending with backslash-newline, - even in middle of identifier. But do not merge lines in a macro, - since backslash might be followed by a newline-space marker. */ - ++ibp; - ++ip->lineno; - --obp; /* remove backslash from obuf */ - break; - } - /* If ANSI, backslash is just another character outside a string. */ - if (!traditional) - goto randomchar; - /* Otherwise, backslash suppresses specialness of following char, - so copy it here to prevent the switch from seeing it. - But first get any pending identifier processed. */ - if (ident_length > 0) - goto specialchar; - if (ibp < limit) - *obp++ = *ibp++; - break; - - case '%': - if (ident_length || ip->macro || traditional) - goto randomchar; - while (*ibp == '\\' && ibp[1] == '\n') { - ibp += 2; - ++ip->lineno; - } - if (*ibp != ':') - break; - /* Treat this %: digraph as if it were #. */ - /* Fall through. */ - - case '#': - if (assertions_flag) { - if (ident_length) - goto specialchar; - /* Copy #foo (bar lose) without macro expansion. */ - obp[-1] = '#'; /* In case it was '%'. */ - SKIP_WHITE_SPACE (ibp); - while (is_idchar[*ibp]) - *obp++ = *ibp++; - SKIP_WHITE_SPACE (ibp); - if (*ibp == '(') { - ip->bufp = ibp; - skip_paren_group (ip); - bcopy ((char *) ibp, (char *) obp, ip->bufp - ibp); - obp += ip->bufp - ibp; - ibp = ip->bufp; - } - break; - } - - /* If this is expanding a macro definition, don't recognize - preprocessing directives. */ - if (ip->macro != 0) - goto randomchar; - /* If this is expand_into_temp_buffer, - don't recognize them either. Warn about them - only after an actual newline at this level, - not at the beginning of the input level. */ - if (! ip->fname) { - if (ip->buf != beg_of_line) - warning ("preprocessing directive not recognized within macro arg"); - goto randomchar; - } - if (ident_length) - goto specialchar; - - - /* # keyword: a # must be first nonblank char on the line */ - if (beg_of_line == 0) - goto randomchar; - { - U_CHAR *bp; - - /* Scan from start of line, skipping whitespace, comments - and backslash-newlines, and see if we reach this #. - If not, this # is not special. */ - bp = beg_of_line; - /* If -traditional, require # to be at beginning of line. */ - if (!traditional) { - while (1) { - if (is_hor_space[*bp]) - bp++; - else if (*bp == '\\' && bp[1] == '\n') - bp += 2; - else if (*bp == '/' && bp[1] == '*') { - bp += 2; - while (1) - { - if (*bp == '*') - { - if (bp[1] == '/') - { - bp += 2; - break; - } - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (bp, limit - bp); - if (length > 1) - bp += (length - 1); -#endif - } - bp++; - } - } - /* There is no point in trying to deal with C++ // comments here, - because if there is one, then this # must be part of the - comment and we would never reach here. */ - else break; - } - if (c == '%') { - if (bp[0] != '%') - break; - while (bp[1] == '\\' && bp[2] == '\n') - bp += 2; - if (bp + 1 != ibp) - break; - /* %: appears at start of line; skip past the ':' too. */ - bp++; - ibp++; - } - } - if (bp + 1 != ibp) - goto randomchar; - } - - /* This # can start a directive. */ - - --obp; /* Don't copy the '#' */ - - ip->bufp = ibp; - op->bufp = obp; - if (! handle_directive (ip, op)) { -#ifdef USE_C_ALLOCA - alloca (0); -#endif - /* Not a known directive: treat it as ordinary text. - IP, OP, IBP, etc. have not been changed. */ - if (no_output && instack[indepth].fname) { - /* If not generating expanded output, - what we do with ordinary text is skip it. - Discard everything until next # directive. */ - skip_if_group (&instack[indepth], 1, 0); - RECACHE; - beg_of_line = ibp; - break; - } - *obp++ = '#'; /* Copy # (even if it was originally %:). */ - /* Don't expand an identifier that could be a macro directive. - (Section 3.8.3 of the ANSI C standard) */ - SKIP_WHITE_SPACE (ibp); - if (is_idstart[*ibp]) - { - *obp++ = *ibp++; - while (is_idchar[*ibp]) - *obp++ = *ibp++; - } - goto randomchar; - } -#ifdef USE_C_ALLOCA - alloca (0); -#endif - /* A # directive has been successfully processed. */ - /* If not generating expanded output, ignore everything until - next # directive. */ - if (no_output && instack[indepth].fname) - skip_if_group (&instack[indepth], 1, 0); - obp = op->bufp; - RECACHE; - beg_of_line = ibp; - break; - - case '\"': /* skip quoted string */ - case '\'': - /* A single quoted string is treated like a double -- some - programs (e.g., troff) are perverse this way */ - - /* Handle any pending identifier; - but the L in L'...' or L"..." is not an identifier. */ - if (ident_length) { - if (! (ident_length == 1 && hash == HASHSTEP (0, 'L'))) - goto specialchar; - ident_length = hash = 0; - } - - start_line = ip->lineno; - - /* Skip ahead to a matching quote. */ - - while (1) { - if (ibp >= limit) { - if (ip->macro != 0) { - /* 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. */ - POPMACRO; - RECACHE; - continue; - } - if (!traditional) { - error_with_line (line_for_error (start_line), - "unterminated string or character constant"); - if (multiline_string_line) { - error_with_line (multiline_string_line, - "possible real start of unterminated constant"); - multiline_string_line = 0; - } - } - break; - } - *obp++ = *ibp; - switch (*ibp++) { - case '\n': - ++ip->lineno; - ++op->lineno; - /* Traditionally, end of line ends a string constant with no error. - So exit the loop and record the new line. */ - if (traditional) { - beg_of_line = ibp; - goto while2end; - } - if (c == '\'') { - error_with_line (line_for_error (start_line), - "unterminated character constant"); - goto while2end; - } - if (multiline_string_line == 0) { - if (pedantic) - pedwarn_with_line (line_for_error (start_line), - "string constant runs past end of line"); - multiline_string_line = ip->lineno - 1; - } - break; - - case '\\': - if (*ibp == '\n') { - /* Backslash newline is replaced by nothing at all, but - keep the line counts correct. But if we are reading - from a macro, keep the backslash newline, since backslash - newlines have already been processed. */ - if (ip->macro) - *obp++ = '\n'; - else - --obp; - ++ibp; - ++ip->lineno; - } else { - /* ANSI stupidly requires that in \\ the second \ - is *not* prevented from combining with a newline. */ - if (!ip->macro) { - while (*ibp == '\\' && ibp[1] == '\n') { - ibp += 2; - ++ip->lineno; - } - } - *obp++ = *ibp++; - } - break; - - case '\"': - case '\'': - if (ibp[-1] == c) - goto while2end; - break; -#ifdef MULTIBYTE_CHARS - default: - { - int length; - --ibp; - length = local_mblen (ibp, limit - ibp); - if (length > 0) - { - --obp; - bcopy (ibp, obp, length); - obp += length; - ibp += length; - } - else - ++ibp; - } - break; -#endif - } - } - while2end: - break; - - case '/': - if (ip->macro != 0) - goto randomchar; - if (*ibp == '\\' && ibp[1] == '\n') - newline_fix (ibp); - if (*ibp != '*' - && !(cplusplus_comments && *ibp == '/')) - goto randomchar; - if (ident_length) - goto specialchar; - - if (*ibp == '/') { - /* C++ style comment... */ - start_line = ip->lineno; - - /* Comments are equivalent to spaces. */ - if (! put_out_comments) - obp[-1] = ' '; - - { - U_CHAR *before_bp = ibp; - - while (++ibp < limit) { - if (*ibp == '\n') - { - if (put_out_comments) { - bcopy ((char *) before_bp, (char *) obp, ibp - before_bp); - obp += ibp - before_bp; - } - break; - } - if (*ibp == '\\') - { - if (ibp + 1 < limit && ibp[1] == '\n') - { - if (warn_comments) - warning ("multiline `//' comment"); - ++ip->lineno; - /* Copy the newline into the output buffer, in order to - avoid the pain of a #line every time a multiline comment - is seen. */ - if (!put_out_comments) - *obp++ = '\n'; - ++op->lineno; - ++ibp; - } - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (ibp, limit - ibp); - if (length > 1) - ibp += (length - 1); -#endif - } - } - break; - } - } - - /* Ordinary C comment. Skip it, optionally copying it to output. */ - - start_line = ip->lineno; - - ++ibp; /* Skip the star. */ - - /* If this cpp is for lint, we peek inside the comments: */ - if (for_lint) { - U_CHAR *argbp; - int cmdlen, arglen; - char *lintcmd = get_lintcmd (ibp, limit, &argbp, &arglen, &cmdlen); - - if (lintcmd != NULL) { - op->bufp = obp; - check_expand (op, cmdlen + arglen + 14); - obp = op->bufp; - /* I believe it is always safe to emit this newline: */ - obp[-1] = '\n'; - bcopy ("#pragma lint ", (char *) obp, 13); - obp += 13; - bcopy (lintcmd, (char *) obp, cmdlen); - obp += cmdlen; - - if (arglen != 0) { - *(obp++) = ' '; - bcopy (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 #pragma's newline always - messes up the line count. */ - op->bufp = obp; - output_line_directive (ip, op, 0, same_file); - check_expand (op, limit - ibp + 2); - obp = op->bufp; - *(obp++) = '/'; - } - } - - /* Comments are equivalent to spaces. - Note that we already output the slash; we might not want it. - For -traditional, a comment is equivalent to nothing. */ - if (! put_out_comments) { - if (traditional) - obp--; - else - obp[-1] = ' '; - } - else - *obp++ = '*'; - - { - U_CHAR *before_bp = ibp; - - for (;;) { - switch (*ibp++) { - case '*': - if (ibp[-2] == '/' && warn_comments) - warning ("`/*' within comment"); - if (*ibp == '\\' && ibp[1] == '\n') - newline_fix (ibp); - if (*ibp == '/') - goto comment_end; - break; - - case '\n': - ++ip->lineno; - /* Copy the newline into the output buffer, in order to - avoid the pain of a #line every time a multiline comment - is seen. */ - if (!put_out_comments) - *obp++ = '\n'; - ++op->lineno; - break; - - case 0: - if (limit < ibp) { - error_with_line (line_for_error (start_line), - "unterminated comment"); - goto limit_reached; - } - break; -#ifdef MULTIBYTE_CHARS - default: - { - int length; - length = local_mblen (ibp, limit - ibp); - if (length > 1) - ibp += (length - 1); - } - break; -#endif - } - } - comment_end: - - ibp++; - if (put_out_comments) { - bcopy ((char *) before_bp, (char *) obp, ibp - before_bp); - obp += ibp - before_bp; - } - } - break; - - case '$': - if (! is_idchar['$']) - goto randomchar; - if (pedantic) - pedwarn ("`$' in identifier"); - goto letter; - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - /* If digit is not part of identifier, it starts a number, - which means that following letters are not an identifier. - "0x5" does not refer to an identifier "x5". - So copy all alphanumerics that follow without accumulating - as an identifier. Periods also, for sake of "3.e7". */ - - if (ident_length == 0) { - for (;;) { - if (!ip->macro) { - while (ibp[0] == '\\' && ibp[1] == '\n') { - ++ip->lineno; - ibp += 2; - } - } - c = *ibp++; - if (!is_idchar[c] && c != '.') { - --ibp; - break; - } - *obp++ = c; - /* A sign can be part of a preprocessing number - if it follows an `e' or `p'. */ - if (c == 'e' || c == 'E' || c == 'p' || c == 'P') { - if (!ip->macro) { - while (ibp[0] == '\\' && ibp[1] == '\n') { - ++ip->lineno; - ibp += 2; - } - } - if (*ibp == '+' || *ibp == '-') { - *obp++ = *ibp++; - /* But traditional C does not let the token go past the sign, - and C89 does not allow `p'. */ - if (traditional || (c89 && (c == 'p' || c == 'P'))) - break; - } - } - } - break; - } - /* fall through */ - - case '_': - case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': - case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': - case 'm': case 'n': case 'o': 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 'B': case 'C': case 'D': case 'E': case 'F': - case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': - case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': - case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': - case 'Y': case 'Z': - letter: - ident_length++; - /* Compute step of hash function, to avoid a proc call on every token */ - hash = HASHSTEP (hash, c); - break; - - case '\n': - if (ip->fname == 0 && *ibp == '-') { - /* Newline - inhibits expansion of preceding token. - If expanding a macro arg, we keep the newline -. - In final output, it is deleted. - We recognize Newline - in macro bodies and macro args. */ - if (! concatenated) { - ident_length = 0; - hash = 0; - } - ibp++; - if (!output_marks) { - obp--; - } else { - /* If expanding a macro arg, keep the newline -. */ - *obp++ = '-'; - } - break; - } - - /* If reprocessing a macro expansion, newline is a special marker. */ - else if (ip->macro != 0) { - /* Newline White is a "funny space" to separate tokens that are - supposed to be separate but without space between. - Here White means any whitespace character. - Newline - marks a recursive macro use that is not - supposed to be expandable. */ - - if (is_space[*ibp]) { - /* Newline Space does not prevent expansion of preceding token - so expand the preceding token and then come back. */ - if (ident_length > 0) - goto specialchar; - - /* If generating final output, newline space makes a space. */ - if (!output_marks) { - obp[-1] = *ibp++; - /* And Newline Newline makes a newline, so count it. */ - if (obp[-1] == '\n') - op->lineno++; - } else { - /* If expanding a macro arg, keep the newline space. - If the arg gets stringified, newline space makes nothing. */ - *obp++ = *ibp++; - } - } else abort (); /* Newline followed by something random? */ - break; - } - - /* If there is a pending identifier, handle it and come back here. */ - if (ident_length > 0) - goto specialchar; - - beg_of_line = ibp; - - /* Update the line counts and output a #line if necessary. */ - ++ip->lineno; - ++op->lineno; - if (ip->lineno != op->lineno) { - op->bufp = obp; - output_line_directive (ip, op, 1, same_file); - check_expand (op, limit - ibp); - obp = op->bufp; - } - break; - - /* Come here either after (1) a null character that is part of the input - or (2) at the end of the input, because there is a null there. */ - case 0: - if (ibp <= limit) - /* Our input really contains a null character. */ - goto randomchar; - - limit_reached: - /* At end of a macro-expansion level, pop it and read next level. */ - if (ip->macro != 0) { - obp--; - ibp--; - /* If traditional, and we have an identifier that ends here, - process it now, so we get the right error for recursion. */ - if (traditional && ident_length - && ! is_idchar[*instack[indepth - 1].bufp]) { - redo_char = 1; - goto randomchar; - } - POPMACRO; - RECACHE; - break; - } - - /* If we don't have a pending identifier, - return at end of input. */ - if (ident_length == 0) { - obp--; - ibp--; - op->bufp = obp; - ip->bufp = ibp; - goto ending; - } - - /* If we do have a pending identifier, just consider this null - a special character and arrange to dispatch on it again. - The second time, IDENT_LENGTH will be zero so we will return. */ - - /* Fall through */ - -specialchar: - - /* Handle the case of a character such as /, ', " or null - seen following an identifier. Back over it so that - after the identifier is processed the special char - will be dispatched on again. */ - - ibp--; - obp--; - redo_char = 1; - - default: - -randomchar: - - if (ident_length > 0) { - register HASHNODE *hp; - - /* We have just seen an identifier end. If it's a macro, expand it. - - IDENT_LENGTH is the length of the identifier - and HASH is its hash code. - - The identifier has already been copied to the output, - so if it is a macro we must remove it. - - If REDO_CHAR is 0, the char that terminated the identifier - has been skipped in the output and the input. - OBP-IDENT_LENGTH-1 points to the identifier. - If the identifier is a macro, we must back over the terminator. - - If REDO_CHAR is 1, the terminating char has already been - backed over. OBP-IDENT_LENGTH points to the identifier. */ - - if (!pcp_outfile || pcp_inside_if) { - for (hp = hashtab[MAKE_POS (hash) % HASHSIZE]; hp != NULL; - hp = hp->next) { - - if (hp->length == ident_length) { - int obufp_before_macroname; - int op_lineno_before_macroname; - register int i = ident_length; - register U_CHAR *p = hp->name; - register U_CHAR *q = obp - i; - int disabled; - - if (! redo_char) - q--; - - do { /* All this to avoid a strncmp () */ - if (*p++ != *q++) - goto hashcollision; - } while (--i); - - /* We found a use of a macro name. - see if the context shows it is a macro call. */ - - /* Back up over terminating character if not already done. */ - if (! redo_char) { - ibp--; - obp--; - } - - /* Save this as a displacement from the beginning of the output - buffer. We can not save this as a position in the output - buffer, because it may get realloc'ed by RECACHE. */ - obufp_before_macroname = (obp - op->buf) - ident_length; - op_lineno_before_macroname = op->lineno; - - if (hp->type == T_PCSTRING) { - pcstring_used (hp); /* Mark the definition of this key - as needed, ensuring that it - will be output. */ - break; /* Exit loop, since the key cannot have a - definition any longer. */ - } - - /* Record whether the macro is disabled. */ - disabled = hp->type == T_DISABLED; - - /* This looks like a macro ref, but if the macro was disabled, - just copy its name and put in a marker if requested. */ - - if (disabled) { -#if 0 - /* This error check caught useful cases such as - #define foo(x,y) bar (x (y,0), y) - foo (foo, baz) */ - if (traditional) - error ("recursive use of macro `%s'", hp->name); -#endif - - if (output_marks) { - op->bufp = obp; - check_expand (op, limit - ibp + 2); - obp = op->bufp; - *obp++ = '\n'; - *obp++ = '-'; - } - break; - } - - /* 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->type == T_DISABLED) - && hp->value.defn->nargs >= 0) - { - U_CHAR *old_ibp = ibp; - U_CHAR *old_obp = obp; - int old_iln = ip->lineno; - int old_oln = op->lineno; - - while (1) { - /* Scan forward over whitespace, copying it to the output. */ - if (ibp == limit && ip->macro != 0) { - POPMACRO; - RECACHE; - old_ibp = ibp; - old_obp = obp; - old_iln = ip->lineno; - old_oln = op->lineno; - } - else if (is_space[*ibp]) { - *obp++ = *ibp++; - if (ibp[-1] == '\n') { - if (ip->macro == 0) { - /* Newline in a file. Count it. */ - ++ip->lineno; - ++op->lineno; - } else if (!output_marks) { - /* A newline mark, and we don't want marks - in the output. If it is newline-hyphen, - discard it entirely. Otherwise, it is - newline-whitechar, so keep the whitechar. */ - obp--; - if (*ibp == '-') - ibp++; - else { - if (*ibp == '\n') - ++op->lineno; - *obp++ = *ibp++; - } - } else { - /* A newline mark; copy both chars to the output. */ - *obp++ = *ibp++; - } - } - } - else if (ip->macro) - break; - else if (*ibp == '/') { - /* If a comment, copy it unchanged or discard it. */ - if (ibp[1] == '\\' && ibp[2] == '\n') - newline_fix (ibp + 1); - if (ibp[1] == '*') { - if (put_out_comments) { - *obp++ = '/'; - *obp++ = '*'; - } else if (! traditional) { - *obp++ = ' '; - } - for (ibp += 2; ibp < limit; ibp++) { - /* We need not worry about newline-marks, - since they are never found in comments. */ - if (ibp[0] == '*') { - if (ibp[1] == '\\' && ibp[2] == '\n') - newline_fix (ibp + 1); - if (ibp[1] == '/') { - ibp += 2; - if (put_out_comments) { - *obp++ = '*'; - *obp++ = '/'; - } - break; - } - } - else if (*ibp == '\n') { - /* Newline in a file. Count it. */ - ++ip->lineno; - ++op->lineno; - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (ibp, limit - ibp); - if (length > 1) - { - if (put_out_comments) - { - bcopy (ibp, obp, length - 1); - obp += length - 1; - } - ibp += (length - 1); - } -#endif - } - if (put_out_comments) - *obp++ = *ibp; - } - } else if (ibp[1] == '/' && cplusplus_comments) { - if (put_out_comments) { - *obp++ = '/'; - *obp++ = '/'; - } else if (! traditional) { - *obp++ = ' '; - } - for (ibp += 2; ; ibp++) - { - if (*ibp == '\n') - break; - if (*ibp == '\\' && ibp[1] == '\n') - { - if (put_out_comments) - *obp++ = *ibp++; - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (ibp, limit - ibp); - if (length > 1) - { - if (put_out_comments) - { - bcopy (ibp, obp, length - 1); - obp += length - 1; - } - ibp += (length - 1); - } -#endif - } - if (put_out_comments) - *obp++ = *ibp; - } - } else - break; - } - else if (ibp[0] == '\\' && ibp[1] == '\n') { - ibp += 2; - ++ip->lineno; - } - else break; - } - if (*ibp != '(') { - /* It isn't a macro call. - Put back the space that we just skipped. */ - ibp = old_ibp; - obp = old_obp; - ip->lineno = old_iln; - op->lineno = old_oln; - /* Exit the for loop. */ - break; - } - } - - /* This is now known to be a macro call. - Discard the macro name from the output, - along with any following whitespace just copied, - but preserve newlines if not outputting marks since this - is more likely to do the right thing with line numbers. */ - obp = op->buf + obufp_before_macroname; - if (output_marks) - op->lineno = op_lineno_before_macroname; - else { - int newlines = op->lineno - op_lineno_before_macroname; - while (0 < newlines--) - *obp++ = '\n'; - } - - /* Prevent accidental token-pasting with a character - before the macro call. */ - if (!traditional && obp != op->buf) { - switch (obp[-1]) { - case '!': case '%': case '&': case '*': - case '+': case '-': case '.': case '/': - case ':': case '<': case '=': case '>': - case '^': case '|': - /* If we are expanding a macro arg, make a newline marker - to separate the tokens. If we are making real output, - a plain space will do. */ - if (output_marks) - *obp++ = '\n'; - *obp++ = ' '; - } - } - - /* Expand the macro, reading arguments as needed, - and push the expansion on the input stack. */ - ip->bufp = ibp; - op->bufp = obp; - macroexpand (hp, op); - - /* Reexamine input stack, since macroexpand has pushed - a new level on it. */ - obp = op->bufp; - RECACHE; - break; - } -hashcollision: - ; - } /* End hash-table-search loop */ - } - ident_length = hash = 0; /* Stop collecting identifier */ - redo_char = 0; - concatenated = 0; - } /* End if (ident_length > 0) */ - } /* End switch */ - } /* End per-char loop */ - - /* Come here to return -- but first give an error message - if there was an unterminated successful conditional. */ - ending: - if (if_stack != ip->if_stack) - { - char *str; - - switch (if_stack->type) - { - case T_IF: - str = "if"; - break; - case T_IFDEF: - str = "ifdef"; - break; - case T_IFNDEF: - str = "ifndef"; - break; - case T_ELSE: - str = "else"; - break; - case T_ELIF: - str = "elif"; - break; - default: - abort (); - } - - error_with_line (line_for_error (if_stack->lineno), - "unterminated `#%s' conditional", str); - } - if_stack = ip->if_stack; -} - -/* - * Rescan a string into a temporary buffer and return the result - * as a FILE_BUF. Note this function returns a struct, not a pointer. - * - * OUTPUT_MARKS nonzero means keep Newline markers found in the input - * and insert such markers when appropriate. See `rescan' for details. - * OUTPUT_MARKS is 1 for macroexpanding a macro argument separately - * before substitution; it is 0 for other uses. - */ -static FILE_BUF -expand_to_temp_buffer (buf, limit, output_marks, assertions) - U_CHAR *buf, *limit; - int output_marks, assertions; -{ - register FILE_BUF *ip; - FILE_BUF obuf; - int length = limit - buf; - U_CHAR *buf1; - int odepth = indepth; - int save_assertions_flag = assertions_flag; - - assertions_flag = assertions; - - 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; - - /* Set up to receive the output. */ - - obuf.length = length * 2 + 100; /* Usually enough. Why be stingy? */ - obuf.bufp = obuf.buf = (U_CHAR *) xmalloc (obuf.length); - obuf.nominal_fname = 0; - obuf.inc = 0; - obuf.dir = 0; - obuf.fname = 0; - obuf.macro = 0; - obuf.if_stack = 0; - obuf.free_ptr = 0; - obuf.system_header_p = 0; - - CHECK_DEPTH ({return obuf;}); - - ++indepth; - - ip = &instack[indepth]; - ip->fname = 0; - ip->nominal_fname = 0; - ip->nominal_fname_len = 0; - ip->inc = 0; - ip->system_header_p = 0; - ip->macro = 0; - ip->free_ptr = 0; - ip->length = length; - ip->buf = ip->bufp = buf1; - ip->if_stack = if_stack; - - ip->lineno = obuf.lineno = 1; - - /* Scan the input, create the output. */ - rescan (&obuf, output_marks); - - /* Pop input stack to original state. */ - --indepth; - - if (indepth != odepth) - abort (); - - /* Record the output. */ - obuf.length = obuf.bufp - obuf.buf; - - assertions_flag = save_assertions_flag; - return obuf; -} - -/* - * Process a # directive. Expects IP->bufp to point after the '#', as in - * `#define foo bar'. Passes to the directive handler - * (do_define, do_include, etc.): the addresses of the 1st and - * last chars of the directive (starting immediately after the # - * keyword), plus op and the keyword table pointer. If the directive - * contains comments it is copied into a temporary buffer sans comments - * and the temporary buffer is passed to the directive handler instead. - * Likewise for backslash-newlines. - * - * Returns nonzero if this was a known # directive. - * Otherwise, returns zero, without advancing the input pointer. - */ - -static int -handle_directive (ip, op) - FILE_BUF *ip, *op; -{ - register U_CHAR *bp, *cp; - register struct directive *kt; - register int ident_length; - U_CHAR *resume_p; - - /* Nonzero means we must copy the entire directive - to get rid of comments or backslash-newlines. */ - int copy_directive = 0; - - U_CHAR *ident, *after_ident; - - bp = ip->bufp; - - /* Record where the directive started. do_xifdef needs this. */ - directive_start = bp - 1; - - ignore_escape_flag = 1; - - /* Skip whitespace and \-newline. */ - while (1) { - if (is_hor_space[*bp]) { - if (*bp != ' ' && *bp != '\t' && pedantic) - pedwarn_strange_white_space (*bp); - bp++; - } else if (*bp == '/') { - if (bp[1] == '\\' && bp[2] == '\n') - newline_fix (bp + 1); - if (! (bp[1] == '*' || (cplusplus_comments && bp[1] == '/'))) - break; - ip->bufp = bp + 2; - skip_to_end_of_comment (ip, &ip->lineno, 0); - bp = ip->bufp; - } else if (*bp == '\\' && bp[1] == '\n') { - bp += 2; ip->lineno++; - } else break; - } - - /* Now find end of directive name. - If we encounter a backslash-newline, exchange it with any following - symbol-constituents so that we end up with a contiguous name. */ - - cp = bp; - while (1) { - if (is_idchar[*cp]) - cp++; - else { - if (*cp == '\\' && cp[1] == '\n') - name_newline_fix (cp); - if (is_idchar[*cp]) - cp++; - else break; - } - } - ident_length = cp - bp; - ident = bp; - after_ident = cp; - - /* A line of just `#' becomes blank. */ - - if (ident_length == 0 && *after_ident == '\n') { - ip->bufp = after_ident; - return 1; - } - - if (ident_length == 0 || !is_idstart[*ident]) { - U_CHAR *p = ident; - while (is_idchar[*p]) { - if (*p < '0' || *p > '9') - break; - p++; - } - /* Handle # followed by a line number. */ - if (p != ident && !is_idchar[*p]) { - static struct directive line_directive_table[] = { - { 4, do_line, "line", T_LINE}, - }; - if (pedantic) - pedwarn ("`#' followed by integer"); - after_ident = ident; - kt = line_directive_table; - ignore_escape_flag = 0; - goto old_linenum; - } - - /* 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) - warning ("invalid preprocessing directive"); - return 0; - } - } - - if (!lang_asm) - error ("invalid preprocessing directive name"); - - return 0; - } - - /* - * Decode the keyword and call the appropriate expansion - * routine, after moving the input pointer up to the next line. - */ - for (kt = directive_table; kt->length > 0; kt++) { - if (kt->length == ident_length && !bcmp (kt->name, ident, ident_length)) { - register U_CHAR *buf; - register U_CHAR *limit; - int unterminated; - int junk; - int *already_output; - - /* Nonzero means do not delete comments within the directive. - #define needs this when -traditional. */ - int keep_comments; - - old_linenum: - - limit = ip->buf + ip->length; - unterminated = 0; - already_output = 0; - keep_comments = traditional && kt->type == T_DEFINE; - /* #import is defined only in Objective C, or when on the NeXT. */ - if (kt->type == T_IMPORT - && !(objc || lookup ((U_CHAR *) "__NeXT__", -1, -1))) - break; - - /* Find the end of this directive (first newline not backslashed - and not in a string or comment). - Set COPY_DIRECTIVE if the directive must be copied - (it contains a backslash-newline or a comment). */ - - buf = bp = after_ident; - while (bp < limit) { - register U_CHAR c = *bp++; - switch (c) { - case '\\': - if (bp < limit) { - if (*bp == '\n') { - ip->lineno++; - copy_directive = 1; - bp++; - } else if (traditional) - bp++; - } - break; - - case '"': - /* "..." is special for #include. */ - if (IS_INCLUDE_DIRECTIVE_TYPE (kt->type)) { - while (bp < limit && *bp != '\n') { - if (*bp == '"') { - bp++; - break; - } - if (*bp == '\\' && bp[1] == '\n') { - ip->lineno++; - copy_directive = 1; - bp++; - } - bp++; - } - break; - } - /* Fall through. */ - case '\'': - bp = skip_quoted_string (bp - 1, limit, ip->lineno, &ip->lineno, ©_directive, &unterminated); - /* Don't bother calling the directive if we already got an error - message due to unterminated string. Skip everything and pretend - we called the directive. */ - if (unterminated) { - if (traditional) { - /* Traditional preprocessing permits unterminated strings. */ - ip->bufp = bp; - goto endloop1; - } - ip->bufp = bp; - return 1; - } - break; - - /* <...> is special for #include. */ - case '<': - if (! IS_INCLUDE_DIRECTIVE_TYPE (kt->type)) - break; - while (bp < limit && *bp != '>' && *bp != '\n') { - if (*bp == '\\' && bp[1] == '\n') { - ip->lineno++; - copy_directive = 1; - bp++; - } - bp++; - } - break; - - case '/': - if (*bp == '\\' && bp[1] == '\n') - newline_fix (bp); - if (*bp == '*' - || (cplusplus_comments && *bp == '/')) { - U_CHAR *obp = bp - 1; - ip->bufp = bp + 1; - skip_to_end_of_comment (ip, &ip->lineno, 0); - bp = ip->bufp; - /* No need to copy the directive because of a comment at the end; - just don't include the comment in the directive. */ - if (!put_out_comments) { - U_CHAR *p; - for (p = bp; *p == ' ' || *p == '\t'; p++) - continue; - if (*p == '\n') { - bp = obp; - goto endloop1; - } - } - /* Don't remove the comments if -traditional. */ - if (! keep_comments) - copy_directive++; - } - break; - - case '\f': - case '\r': - case '\v': - if (pedantic) - pedwarn_strange_white_space (c); - break; - - case '\n': - --bp; /* Point to the newline */ - ip->bufp = bp; - goto endloop1; - } - } - ip->bufp = bp; - - endloop1: - resume_p = ip->bufp; - /* BP is the end of the directive. - RESUME_P is the next interesting data after the directive. - A comment may come between. */ - - /* If a directive should be copied through, and -C was given, - pass it through before removing comments. */ - if (!no_output && put_out_comments - && ((kt->type == T_DEFINE || kt->type == T_UNDEF) - ? dump_macros == dump_definitions - : IS_INCLUDE_DIRECTIVE_TYPE (kt->type) ? dump_includes - : kt->type == T_PRAGMA)) { - int len; - - /* Output directive name. */ - check_expand (op, kt->length + 2); - /* Make sure # is at the start of a line */ - if (op->bufp > op->buf && op->bufp[-1] != '\n') { - op->lineno++; - *op->bufp++ = '\n'; - } - *op->bufp++ = '#'; - bcopy (kt->name, op->bufp, kt->length); - op->bufp += kt->length; - - /* Output arguments. */ - len = (bp - buf); - check_expand (op, len); - bcopy (buf, (char *) op->bufp, len); - op->bufp += len; - /* Take account of any (escaped) newlines just output. */ - while (--len >= 0) - if (buf[len] == '\n') - op->lineno++; - - already_output = &junk; - } /* Don't we need a newline or #line? */ - - if (copy_directive) { - register U_CHAR *xp = buf; - /* Need to copy entire directive into temp buffer before dispatching */ - - cp = (U_CHAR *) alloca (bp - buf + 5); /* room for directive plus - some slop */ - buf = cp; - - /* Copy to the new buffer, deleting comments - and backslash-newlines (and whitespace surrounding the latter). */ - - while (xp < bp) { - register U_CHAR c = *xp++; - *cp++ = c; - - switch (c) { - case '\n': - abort (); /* A bare newline should never part of the line. */ - break; - - /* <...> is special for #include. */ - case '<': - if (! IS_INCLUDE_DIRECTIVE_TYPE (kt->type)) - break; - while (xp < bp && c != '>') { - c = *xp++; - if (c == '\\' && xp < bp && *xp == '\n') - xp++; - else - *cp++ = c; - } - break; - - case '\\': - if (*xp == '\n') { - xp++; - cp--; - if (cp != buf && is_hor_space[cp[-1]]) { - while (cp - 1 != buf && is_hor_space[cp[-2]]) - cp--; - SKIP_WHITE_SPACE (xp); - } else if (is_hor_space[*xp]) { - *cp++ = *xp++; - SKIP_WHITE_SPACE (xp); - } - } else if (traditional && xp < bp) { - *cp++ = *xp++; - } - break; - - case '\'': - case '\"': - { - int backslash_newlines_p = 0; - - register U_CHAR *bp1 - = skip_quoted_string (xp - 1, bp, ip->lineno, - NULL_PTR, &backslash_newlines_p, - NULL_PTR); - if (backslash_newlines_p) - while (xp != bp1) - { - /* With something like: - - #define X "a\ - b" - - we should still remove the backslash-newline - pair as part of phase two. */ - if (xp[0] == '\\' && xp[1] == '\n') - xp += 2; - else - *cp++ = *xp++; - } - else - /* This is the same as the loop above, but taking - advantage of the fact that we know there are no - backslash-newline pairs. */ - while (xp != bp1) - *cp++ = *xp++; - } - break; - - case '/': - if (*xp == '*' - || (cplusplus_comments && *xp == '/')) { - ip->bufp = xp + 1; - /* If we already copied the directive through, - already_output != 0 prevents outputting comment now. */ - skip_to_end_of_comment (ip, already_output, 0); - if (keep_comments) - while (xp != ip->bufp) - *cp++ = *xp++; - /* Delete or replace the slash. */ - else if (traditional) - cp--; - else - cp[-1] = ' '; - xp = ip->bufp; - } - } - } - - /* Null-terminate the copy. */ - - *cp = 0; - } else - cp = bp; - - ip->bufp = resume_p; - - /* Some directives should be written out for cc1 to process, - just as if they were not defined. And sometimes we're copying - directives through. */ - - if (!no_output && already_output == 0 - && (kt->type == T_DEFINE ? (int) dump_names <= (int) dump_macros - : IS_INCLUDE_DIRECTIVE_TYPE (kt->type) ? dump_includes - : kt->type == T_PRAGMA)) { - int len; - - /* Output directive name. */ - check_expand (op, kt->length + 1); - *op->bufp++ = '#'; - bcopy (kt->name, (char *) op->bufp, kt->length); - op->bufp += kt->length; - - if (kt->type == T_DEFINE && dump_macros == dump_names) { - /* Output `#define name' only. */ - U_CHAR *xp = buf; - U_CHAR *yp; - SKIP_WHITE_SPACE (xp); - yp = xp; - while (is_idchar[*xp]) xp++; - len = (xp - yp); - check_expand (op, len + 1); - *op->bufp++ = ' '; - bcopy (yp, (char *) op->bufp, len); - } else { - /* Output entire directive. */ - len = (cp - buf); - check_expand (op, len); - bcopy (buf, (char *) op->bufp, len); - } - op->bufp += len; - } /* Don't we need a newline or #line? */ - - /* Call the appropriate directive handler. buf now points to - either the appropriate place in the input buffer, or to - the temp buffer if it was necessary to make one. cp - points to the first char after the contents of the (possibly - copied) directive, in either case. */ - (*kt->func) (buf, cp, op, kt); - check_expand (op, ip->length - (ip->bufp - ip->buf)); - - return 1; - } - } - - /* It is deliberate that we don't warn about undefined directives. - That is the responsibility of cc1. */ - return 0; -} - -static struct tm * -timestamp () -{ - static struct tm *timebuf; - if (!timebuf) { - time_t t = time ((time_t *) 0); - timebuf = localtime (&t); - } - return 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 (hp, op) - HASHNODE *hp; - FILE_BUF *op; -{ - char *buf; - int i, len; - int true_indepth; - FILE_BUF *ip = NULL; - struct tm *timebuf; - - int paren = 0; /* For special `defined' keyword */ - - if (pcp_outfile && pcp_inside_if - && hp->type != T_SPEC_DEFINED && hp->type != T_CONST) - error ("Predefined macro `%s' used inside `#if' during precompilation", - hp->name); - - for (i = indepth; i >= 0; i--) - if (instack[i].fname != NULL) { - ip = &instack[i]; - break; - } - if (ip == NULL) { - error ("cccp error: not in any file?!"); - return; /* the show must go on */ - } - - switch (hp->type) { - case T_FILE: - case T_BASE_FILE: - { - FILE_BUF *p = hp->type == T_FILE ? ip : &instack[0]; - char *string = p->nominal_fname; - - if (string) - { - size_t string_len = p->nominal_fname_len; - buf = (char *) alloca (3 + 4 * string_len); - quote_string (buf, string, string_len); - } - else - buf = "\"\""; - - break; - } - - case T_INCLUDE_LEVEL: - true_indepth = 0; - for (i = indepth; i >= 0; i--) - if (instack[i].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 - - case T_WCHAR_TYPE: - buf = wchar_type; - break; - - case T_USER_LABEL_PREFIX_TYPE: - buf = user_label_prefix; - break; - - case T_REGISTER_PREFIX_TYPE: - buf = REGISTER_PREFIX; - break; - - case T_IMMEDIATE_PREFIX_TYPE: - buf = IMMEDIATE_PREFIX; - break; - - case T_CONST: - buf = hp->value.cpval; -#ifdef STDC_0_IN_SYSTEM_HEADERS - if (ip->system_header_p - && hp->length == 8 && bcmp (hp->name, "__STDC__", 8) == 0 - && !lookup ((U_CHAR *) "__STRICT_ANSI__", -1, -1)) - buf = "0"; -#endif - if (pcp_inside_if && pcp_outfile) - /* Output a precondition for this macro use */ - fprintf (pcp_outfile, "#define %s %s\n", hp->name, buf); - break; - - case T_SPECLINE: - buf = (char *) alloca (10); - sprintf (buf, "%d", ip->lineno); - break; - - case T_DATE: - case T_TIME: - buf = (char *) alloca (20); - timebuf = timestamp (); - 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 = &instack[indepth]; - SKIP_WHITE_SPACE (ip->bufp); - if (*ip->bufp == '(') { - paren++; - ip->bufp++; /* Skip over the paren */ - SKIP_WHITE_SPACE (ip->bufp); - } - - if (!is_idstart[*ip->bufp]) - goto oops; - if (ip->bufp[0] == 'L' && (ip->bufp[1] == '\'' || ip->bufp[1] == '"')) - goto oops; - if ((hp = lookup (ip->bufp, -1, -1))) { - 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); - buf = " 1 "; - } - 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); - } - while (is_idchar[*ip->bufp]) - ++ip->bufp; - SKIP_WHITE_SPACE (ip->bufp); - if (paren) { - if (*ip->bufp != ')') - goto oops; - ++ip->bufp; - } - break; - -oops: - - error ("`defined' without an identifier"); - break; - - default: - error ("cccp error: invalid special hash type"); /* time for gdb */ - abort (); - } - len = strlen (buf); - check_expand (op, len); - bcopy (buf, (char *) op->bufp, len); - op->bufp += len; - - return; -} - - -/* Routines to handle #directives */ - -/* Handle #include and #import. - This function expects to see "fname" or <fname> on the input. */ - -static int -do_include (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword; -{ - U_CHAR *importing = keyword->type == T_IMPORT ? (U_CHAR *) "" : (U_CHAR *) 0; - int skip_dirs = (keyword->type == T_INCLUDE_NEXT); - static int import_warning = 0; - char *fname; /* Dynamically allocated fname buffer */ - char *pcftry; - char *pcfname; - char *fbeg, *fend; /* Beginning and end of fname */ - U_CHAR *fin; - - struct file_name_list *search_start = include; /* Chain of dirs to search */ - struct file_name_list *dsp; /* First in chain, if #include "..." */ - struct file_name_list *searchptr = 0; - size_t flen; - - int f = -3; /* file number */ - struct include_file *inc = 0; - - int retried = 0; /* Have already tried macro - expanding the include line*/ - int angle_brackets = 0; /* 0 for "...", 1 for <...> */ -#ifdef VMS - int vaxc_include = 0; /* 1 for token without punctuation */ -#endif - int pcf = -1; - char *pcfbuf; - char *pcfbuflimit; - int pcfnum; - - if (pedantic && !instack[indepth].system_header_p) - { - if (importing) - pedwarn ("ANSI C does not allow `#import'"); - if (skip_dirs) - pedwarn ("ANSI C does not allow `#include_next'"); - } - - if (importing && warn_import && !inhibit_warnings - && !instack[indepth].system_header_p && !import_warning) { - import_warning = 1; - warning ("using `#import' is not recommended"); - notice ("The fact that a certain header file need not be processed more than once\n\ -should be indicated in the header file, not where it is used.\n\ -The best way to do this is with a conditional of this form:\n\ -\n\ - #ifndef _FOO_H_INCLUDED\n\ - #define _FOO_H_INCLUDED\n\ - ... <real contents of file> ...\n\ - #endif /* Not _FOO_H_INCLUDED */\n\ -\n\ -Then users can use `#include' any number of times.\n\ -GNU C automatically avoids processing the file more than once\n\ -when it is equipped with such a conditional.\n"); - } - -get_filename: - - fin = buf; - SKIP_WHITE_SPACE (fin); - /* Discard trailing whitespace so we can easily see - if we have parsed all the significant chars we were given. */ - while (limit != fin && is_hor_space[limit[-1]]) limit--; - fbeg = fend = (char *) alloca (limit - fin); - - switch (*fin++) { - case '\"': - { - FILE_BUF *fp; - /* Copy the operand text, concatenating the strings. */ - { - for (;;) { - for (;;) { - if (fin == limit) - goto invalid_include_file_name; - *fend = *fin++; - if (*fend == '"') - break; - fend++; - } - if (fin == limit) - break; - /* If not at the end, there had better be another string. */ - /* Skip just horiz space, and don't go past limit. */ - while (fin != limit && is_hor_space[*fin]) fin++; - if (fin != limit && *fin == '\"') - fin++; - else - goto fail; - } - } - - /* We have "filename". Figure out directory this source - file is coming from and put it on the front of the list. */ - - /* If -I- was specified, don't search current dir, only spec'd ones. */ - if (ignore_srcdir) break; - - for (fp = &instack[indepth]; fp >= instack; fp--) - { - int n; - char *nam; - - if ((nam = fp->nominal_fname) != NULL) { - /* Found a named file. Figure out dir of the file, - and put it in front of the search list. */ - dsp = ((struct file_name_list *) - alloca (sizeof (struct file_name_list) - + fp->nominal_fname_len)); - strcpy (dsp->fname, nam); - simplify_filename (dsp->fname); - nam = base_name (dsp->fname); - *nam = 0; -#ifdef VMS - /* for hack_vms_include_specification(), a local - dir specification must start with "./" on VMS. */ - if (nam == dsp->fname) - { - *nam++ = '.'; - *nam++ = '/'; - *nam = 0; - } -#endif - /* But for efficiency's sake, do not insert the dir - if it matches the search list's first dir. */ - dsp->next = search_start; - if (!search_start || strcmp (dsp->fname, search_start->fname)) { - search_start = dsp; - n = nam - dsp->fname; - if (n + INCLUDE_LEN_FUDGE > max_include_len) - max_include_len = n + INCLUDE_LEN_FUDGE; - } - dsp[0].got_name_map = 0; - break; - } - } - break; - } - - case '<': - while (fin != limit && *fin != '>') - *fend++ = *fin++; - if (*fin == '>' && fin + 1 == limit) { - angle_brackets = 1; - /* If -I-, start with the first -I dir after the -I-. */ - search_start = first_bracket_include; - break; - } - goto fail; - - default: -#ifdef VMS - /* - * Support '#include xyz' like VAX-C to allow for easy use of all the - * decwindow include files. It defaults to '#include <xyz.h>' (so the - * code from case '<' is repeated here) and generates a warning. - * (Note: macro expansion of `xyz' takes precedence.) - */ - /* Note: The argument of ISALPHA() can be evaluated twice, so do - the pre-decrement outside of the macro. */ - if (retried && (--fin, ISALPHA(*(U_CHAR *) (fin)))) { - while (fin != limit && (!ISSPACE(*fin))) - *fend++ = *fin++; - warning ("VAX-C-style include specification found, use '#include <filename.h>' !"); - vaxc_include = 1; - if (fin == limit) { - angle_brackets = 1; - /* If -I-, start with the first -I dir after the -I-. */ - search_start = first_bracket_include; - break; - } - } -#endif - - fail: - if (! retried) { - /* Expand buffer and then remove any newline markers. - We can't just tell expand_to_temp_buffer to omit the markers, - since it would put extra spaces in include file names. */ - FILE_BUF trybuf; - U_CHAR *src; - int errors_before_expansion = errors; - trybuf = expand_to_temp_buffer (buf, limit, 1, 0); - if (errors != errors_before_expansion) { - free (trybuf.buf); - goto invalid_include_file_name; - } - src = trybuf.buf; - buf = (U_CHAR *) alloca (trybuf.bufp - trybuf.buf + 1); - limit = buf; - while (src != trybuf.bufp) { - switch ((*limit++ = *src++)) { - case '\n': - limit--; - src++; - break; - - case '\'': - case '\"': - { - U_CHAR *src1 = skip_quoted_string (src - 1, trybuf.bufp, 0, - NULL_PTR, NULL_PTR, NULL_PTR); - while (src != src1) - *limit++ = *src++; - } - break; - } - } - *limit = 0; - free (trybuf.buf); - retried = 1; - goto get_filename; - } - - invalid_include_file_name: - error ("`#%s' expects \"FILENAME\" or <FILENAME>", keyword->name); - return 0; - } - - /* For #include_next, skip in the search path - past the dir in which the containing file was found. */ - if (skip_dirs) { - FILE_BUF *fp; - for (fp = &instack[indepth]; fp >= instack; fp--) - if (fp->fname != NULL) { - /* fp->dir is null if the containing file was specified - with an absolute file name. In that case, don't skip anything. */ - if (fp->dir) - search_start = fp->dir->next; - break; - } - } - - *fend = 0; - flen = simplify_filename (fbeg); - - if (flen == 0) - { - error ("empty file name in `#%s'", keyword->name); - return 0; - } - - /* Allocate this permanently, because it gets stored in the definitions - of macros. */ - fname = xmalloc (max_include_len + flen + 1); - /* + 1 above for terminating null. */ - - system_include_depth += angle_brackets; - - /* If specified file name is absolute, just open it. */ - - if (absolute_filename (fbeg)) { - strcpy (fname, fbeg); - f = open_include_file (fname, NULL_PTR, importing, &inc); - } else { - - struct bypass_dir { - struct bypass_dir *next; - char *fname; - struct file_name_list *searchptr; - } **bypass_slot = 0; - - /* Search directory path, trying to open the file. - Copy each filename tried into FNAME. */ - - for (searchptr = search_start; searchptr; searchptr = searchptr->next) { - - if (searchptr == first_bracket_include) { - /* Go to bypass directory if we know we've seen this file before. */ - static struct bypass_dir *bypass_hashtab[INCLUDE_HASHSIZE]; - struct bypass_dir *p; - bypass_slot = &bypass_hashtab[hashf ((U_CHAR *) fbeg, flen, - INCLUDE_HASHSIZE)]; - for (p = *bypass_slot; p; p = p->next) - if (!strcmp (fbeg, p->fname)) { - searchptr = p->searchptr; - bypass_slot = 0; - break; - } - } - -#ifdef VMS - /* Change this 1/2 Unix 1/2 VMS file specification into a - full VMS file specification */ - if (searchptr->fname[0]) - { - strcpy (fname, searchptr->fname); - if (fname[strlen (fname) - 1] == ':') - { - char *slashp; - slashp = strchr (fbeg, '/'); - - /* start at root-dir of logical device if no path given. */ - if (slashp == 0) - strcat (fname, "[000000]"); - } - strcat (fname, fbeg); - - /* Fix up the filename */ - hack_vms_include_specification (fname, vaxc_include); - } - else - { - /* This is a normal VMS filespec, so use it unchanged. */ - strcpy (fname, fbeg); - /* if it's '#include filename', add the missing .h */ - if (vaxc_include && index(fname,'.')==NULL) - strcat (fname, ".h"); - } -#else - strcpy (fname, searchptr->fname); - strcat (fname, fbeg); -#endif /* VMS */ - f = open_include_file (fname, searchptr, importing, &inc); - if (f != -1) { - if (bypass_slot && searchptr != first_bracket_include) { - /* This is the first time we found this include file, - and we found it after first_bracket_include. - Record its location so that we can bypass to here next time. */ - struct bypass_dir *p - = (struct bypass_dir *) xmalloc (sizeof (struct bypass_dir)); - p->next = *bypass_slot; - p->fname = fname + strlen (searchptr->fname); - p->searchptr = searchptr; - *bypass_slot = p; - } - break; - } -#ifdef VMS - /* Our VMS hacks can produce invalid filespecs, so don't worry - about errors other than EACCES. */ - if (errno == EACCES) - break; -#else - if (errno != ENOENT && errno != ENOTDIR) - break; -#endif - } - } - - - if (f < 0) { - - if (f == -2) { - /* The file was already included. */ - - /* If generating dependencies and -MG was specified, we assume missing - files are leaf files, living in the same directory as the source file - or other similar place; these missing files may be generated from - other files and may not exist yet (eg: y.tab.h). */ - } else if (print_deps_missing_files - && (system_include_depth != 0) < print_deps) - { - /* If it was requested as a system header file, - then assume it belongs in the first place to look for such. */ - if (angle_brackets) - { - if (search_start) { - char *p = (char *) alloca (strlen (search_start->fname) - + strlen (fbeg) + 1); - strcpy (p, search_start->fname); - strcat (p, fbeg); - deps_output (p, ' '); - } - } - else - { - /* Otherwise, omit the directory, as if the file existed - in the directory with the source. */ - deps_output (fbeg, ' '); - } - } - /* 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 (0 < print_deps && print_deps <= (system_include_depth != 0)) - warning ("No include path in which to find %s", fbeg); - else if (f != -3) - error_from_errno (fbeg); - else - error ("No include path in which to find %s", fbeg); - - } else { - - /* Actually process the file. */ - - pcftry = (char *) alloca (strlen (fname) + 30); - pcfbuf = 0; - pcfnum = 0; - - if (!no_precomp) - { - do { - sprintf (pcftry, "%s%d", fname, pcfnum++); - - pcf = open (pcftry, O_RDONLY, 0666); - if (pcf != -1) - { - struct stat s; - - if (fstat (pcf, &s) != 0) - pfatal_with_name (pcftry); - if (! INO_T_EQ (inc->st.st_ino, s.st_ino) - || inc->st.st_dev != s.st_dev) - { - pcfbuf = check_precompiled (pcf, &s, fname, &pcfbuflimit); - /* Don't need it any more. */ - close (pcf); - } - else - { - /* Don't need it at all. */ - close (pcf); - break; - } - } - } while (pcf != -1 && !pcfbuf); - } - - /* Actually process the file */ - if (pcfbuf) { - pcfname = xmalloc (strlen (pcftry) + 1); - strcpy (pcfname, pcftry); - pcfinclude ((U_CHAR *) pcfbuf, (U_CHAR *) fname, op); - } - else - finclude (f, inc, op, is_system_include (fname), searchptr); - } - - system_include_depth -= angle_brackets; - - return 0; -} - -/* Return nonzero if the given FILENAME is an absolute pathname which - designates a file within one of the known "system" include file - directories. We assume here that if the given FILENAME looks like - it is the name of a file which resides either directly in a "system" - include file directory, or within any subdirectory thereof, then the - given file must be a "system" include file. This function tells us - if we should suppress pedantic errors/warnings for the given FILENAME. - - The value is 2 if the file is a C-language system header file - for which C++ should (on most systems) assume `extern "C"'. */ - -static int -is_system_include (filename) - register char *filename; -{ - struct file_name_list *searchptr; - - for (searchptr = first_system_include; searchptr; - searchptr = searchptr->next) - if (! strncmp (searchptr->fname, filename, strlen (searchptr->fname))) - return searchptr->c_system_include_path + 1; - return 0; -} - -/* Yield the non-directory suffix of a file name. */ - -static char * -base_name (fname) - char *fname; -{ - char *s = fname; - char *p; -#if defined (__MSDOS__) || defined (_WIN32) - if (ISALPHA (s[0]) && s[1] == ':') s += 2; -#endif -#ifdef VMS - if ((p = rindex (s, ':'))) s = p + 1; /* Skip device. */ - if ((p = rindex (s, ']'))) s = p + 1; /* Skip directory. */ - if ((p = rindex (s, '>'))) s = p + 1; /* Skip alternate (int'n'l) dir. */ - if (s != fname) - return s; -#endif - if ((p = rindex (s, '/'))) s = p + 1; -#ifdef DIR_SEPARATOR - if ((p = rindex (s, DIR_SEPARATOR))) s = p + 1; -#endif - return s; -} - -/* Yield nonzero if FILENAME is absolute (i.e. not relative). */ - -static int -absolute_filename (filename) - char *filename; -{ -#if defined (__MSDOS__) \ - || (defined (_WIN32) && !defined (__CYGWIN__) && !defined (_UWIN)) - if (ISALPHA (filename[0]) && filename[1] == ':') filename += 2; -#endif -#if defined (__CYGWIN__) - /* At present, any path that begins with a drive spec is absolute. */ - if (ISALPHA (filename[0]) && filename[1] == ':') return 1; -#endif -#ifdef VMS - if (index (filename, ':') != 0) return 1; -#endif - if (filename[0] == '/') return 1; -#ifdef DIR_SEPARATOR - if (filename[0] == DIR_SEPARATOR) return 1; -#endif - return 0; -} - -/* Returns whether or not a given character is a directory separator. - Used by simplify_filename. */ -static inline -int -is_dir_separator(ch) - char ch; -{ - return (ch == DIR_SEPARATOR) -#if defined (DIR_SEPARATOR_2) - || (ch == DIR_SEPARATOR_2) -#endif - ; -} - -/* Remove unnecessary characters from FILENAME in place, - to avoid unnecessary filename aliasing. - Return the length of the resulting string. - - Do only the simplifications allowed by Posix. - It is OK to miss simplifications on non-Posix hosts, - since this merely leads to suboptimal results. */ - -static size_t -simplify_filename (filename) - char *filename; -{ - register char *from = filename; - register char *to = filename; - char *to0; - - /* Remove redundant initial /s. */ - if (is_dir_separator (*from)) - { - *to++ = DIR_SEPARATOR; - if (is_dir_separator (*++from)) - { - if (is_dir_separator (*++from)) - { - /* 3 or more initial /s are equivalent to 1 /. */ - while (is_dir_separator (*++from)) - continue; - } - else - { - /* On some hosts // differs from /; Posix allows this. */ - *to++ = DIR_SEPARATOR; - } - } - } - - to0 = to; - - for (;;) - { -#ifndef VMS - if (from[0] == '.' && from[1] == '/') - from += 2; - else -#endif - { - /* Copy this component and trailing DIR_SEPARATOR, if any. */ - while (!is_dir_separator (*to++ = *from++)) - { - if (!to[-1]) - { - /* Trim . component at end of nonempty name. */ - to -= filename <= to - 3 && to[-3] == DIR_SEPARATOR && to[-2] == '.'; - - /* Trim unnecessary trailing /s. */ - while (to0 < --to && to[-1] == DIR_SEPARATOR) - continue; - - *to = 0; - return to - filename; - } - } -#if defined(DIR_SEPARATOR_2) - /* Simplify to one directory separator. */ - to[-1] = DIR_SEPARATOR; -#endif - } - - /* Skip /s after a /. */ - while (is_dir_separator (*from)) - from++; - } -} - -/* 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; -} - -/* Read the file name map file for DIRNAME. - If DIRNAME is empty, read the map file for the working directory; - otherwise DIRNAME must end in '/'. */ - -static struct file_name_map * -read_name_map (dirname) - char *dirname; -{ - /* 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; - }; - static struct file_name_map_list *map_list; - register struct file_name_map_list *map_list_ptr; - char *name; - FILE *f; - size_t dirlen; - - for (map_list_ptr = 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); - map_list_ptr->map_list_map = NULL; - - dirlen = strlen (dirname); - name = (char *) alloca (dirlen + strlen (FILE_NAME_MAP_FILE) + 1); - strcpy (name, dirname); - strcat (name, FILE_NAME_MAP_FILE); - f = fopen (name, "r"); - if (!f) - map_list_ptr->map_list_map = NULL; - else - { - int ch; - - while ((ch = getc (f)) != EOF) - { - char *from, *to; - struct file_name_map *ptr; - size_t tolen; - - 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); - - simplify_filename (from); - tolen = simplify_filename (to); - - ptr = ((struct file_name_map *) - xmalloc (sizeof (struct file_name_map))); - ptr->map_from = from; - - /* Make the real filename absolute. */ - if (absolute_filename (to)) - ptr->map_to = to; - else - { - ptr->map_to = xmalloc (dirlen + tolen + 1); - strcpy (ptr->map_to, dirname); - strcat (ptr->map_to, 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 = map_list; - map_list = map_list_ptr; - - return map_list_ptr->map_list_map; -} - -/* Try to open include file FILENAME. SEARCHPTR is the directory - being tried from the include file search path. - IMPORTING is "" if we are importing, null otherwise. - Return -2 if found, either a matching name or a matching inode. - Otherwise, open the file and return a file descriptor if successful - or -1 if unsuccessful. - Unless unsuccessful, put a descriptor of the included file into *PINC. - This function maps filenames on file systems based on information read by - read_name_map. */ - -static int -open_include_file (filename, searchptr, importing, pinc) - char *filename; - struct file_name_list *searchptr; - U_CHAR *importing; - struct include_file **pinc; -{ - char *fname = remap ? remap_include_file (filename, searchptr) : filename; - int fd = -2; - - /* Look up FNAME in include_hashtab. */ - struct include_file **phead = &include_hashtab[hashf ((U_CHAR *) fname, - strlen (fname), - INCLUDE_HASHSIZE)]; - struct include_file *inc, *head = *phead; - for (inc = head; inc; inc = inc->next) - if (!strcmp (fname, inc->fname)) - break; - - if (!inc - || ! inc->control_macro - || (inc->control_macro[0] && ! lookup (inc->control_macro, -1, -1))) { - - fd = open (fname, O_RDONLY, 0); - - if (fd < 0) - { -#ifdef VMS - /* if #include <dir/file> fails, try again with hacked spec. */ - if (!hack_vms_include_specification (fname, 0)) - return fd; - fd = open (fname, O_RDONLY, 0); - if (fd < 0) -#endif - return fd; - } - - if (!inc) { - /* FNAME was not in include_hashtab; insert a new entry. */ - inc = (struct include_file *) xmalloc (sizeof (struct include_file)); - inc->next = head; - inc->fname = fname; - inc->control_macro = 0; - inc->deps_output = 0; - if (fstat (fd, &inc->st) != 0) - pfatal_with_name (fname); - *phead = inc; - - /* Look for another file with the same inode and device. */ - if (lookup_ino_include (inc) - && inc->control_macro - && (!inc->control_macro[0] || lookup (inc->control_macro, -1, -1))) { - close (fd); - fd = -2; - } - } - - /* For -M, add this file to the dependencies. */ - if (! inc->deps_output && (system_include_depth != 0) < print_deps) { - inc->deps_output = 1; - deps_output (fname, ' '); - } - - /* Handle -H option. */ - if (print_include_names) - fprintf (stderr, "%*s%s\n", indepth, "", fname); - } - - if (importing) - inc->control_macro = importing; - - *pinc = inc; - return fd; -} - -/* Return the remapped name of the include file FILENAME. - SEARCHPTR is the directory being tried from the include file path. */ - -static char * -remap_include_file (filename, searchptr) - char *filename; - struct file_name_list *searchptr; -{ - register struct file_name_map *map; - register char *from; - - if (searchptr) - { - if (! searchptr->got_name_map) - { - searchptr->name_map = read_name_map (searchptr->fname); - searchptr->got_name_map = 1; - } - - /* Check the mapping for the directory we are using. */ - from = filename + strlen (searchptr->fname); - for (map = searchptr->name_map; map; map = map->map_next) - if (! strcmp (map->map_from, from)) - return map->map_to; - } - - from = base_name (filename); - - if (from != filename || !searchptr) - { - /* 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. */ - - char *dir = (char *) alloca (from - filename + 1); - bcopy (filename, dir, from - filename); - dir[from - filename] = '\0'; - - for (map = read_name_map (dir); map; map = map->map_next) - if (! strcmp (map->map_from, from)) - return map->map_to; - } - - return filename; -} - -/* Insert INC into the include file table, hashed by device and inode number. - If a file with different name but same dev+ino was already in the table, - return 1 and set INC's control macro to the already-known macro. */ - -static int -lookup_ino_include (inc) - struct include_file *inc; -{ - int hash = ((unsigned) (inc->st.st_dev + INO_T_HASH (inc->st.st_ino)) - % INCLUDE_HASHSIZE); - struct include_file *i = include_ino_hashtab[hash]; - inc->next_ino = i; - include_ino_hashtab[hash] = inc; - - for (; i; i = i->next_ino) - if (INO_T_EQ (inc->st.st_ino, i->st.st_ino) - && inc->st.st_dev == i->st.st_dev) { - inc->control_macro = i->control_macro; - return 1; - } - - return 0; -} - -/* Process file descriptor F, which corresponds to include file INC, - with output to OP. - SYSTEM_HEADER_P is 1 if this file resides in any one of the known - "system" include directories (as decided by the `is_system_include' - function above). - DIRPTR is the link in the dir path through which this file was found, - or 0 if the file name was absolute. */ - -static void -finclude (f, inc, op, system_header_p, dirptr) - int f; - struct include_file *inc; - FILE_BUF *op; - int system_header_p; - struct file_name_list *dirptr; -{ - char *fname = inc->fname; - int i; - FILE_BUF *fp; /* For input stack frame */ - int missing_newline = 0; - - CHECK_DEPTH (return;); - - fp = &instack[indepth + 1]; - bzero ((char *) fp, sizeof (FILE_BUF)); - fp->nominal_fname = fp->fname = fname; - fp->nominal_fname_len = strlen (fname); - fp->inc = inc; - fp->length = 0; - fp->lineno = 1; - fp->if_stack = if_stack; - fp->system_header_p = system_header_p; - fp->dir = dirptr; - - if (S_ISREG (inc->st.st_mode)) { - size_t s = (size_t) inc->st.st_size; - if (s != inc->st.st_size || s + 2 < s) - memory_full (); - fp->buf = (U_CHAR *) xmalloc (s + 2); - fp->bufp = fp->buf; - - /* Read the file contents, knowing that s is an upper bound - on the number of bytes we can read. */ - fp->length = safe_read (f, (char *) fp->buf, s); - if (fp->length < 0) goto nope; - } - else if (S_ISDIR (inc->st.st_mode)) { - error ("directory `%s' specified in #include", fname); - close (f); - return; - } else { - /* Cannot count its file size before reading. - First read the entire file into heap and - copy them into buffer on stack. */ - - int bsize = 2000; - int st_size = 0; - - fp->buf = (U_CHAR *) xmalloc (bsize + 2); - - for (;;) { - i = safe_read (f, (char *) fp->buf + st_size, bsize - st_size); - if (i < 0) - goto nope; /* error! */ - st_size += i; - if (st_size != bsize) - break; /* End of file */ - bsize *= 2; - fp->buf = (U_CHAR *) xrealloc (fp->buf, bsize + 2); - } - fp->bufp = fp->buf; - fp->length = st_size; - } - - 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'; - - /* Close descriptor now, so nesting does not use lots of descriptors. */ - close (f); - - /* Must do this before calling trigraph_pcp, so that the correct file name - will be printed in warning messages. */ - - indepth++; - input_file_stack_tick++; - - if (!no_trigraphs) - trigraph_pcp (fp); - - output_line_directive (fp, op, 0, enter_file); - rescan (op, 0); - - if (missing_newline) - fp->lineno--; - - if (pedantic && missing_newline) - pedwarn ("file does not end in newline"); - - indepth--; - input_file_stack_tick++; - output_line_directive (&instack[indepth], op, 0, leave_file); - free (fp->buf); - return; - - nope: - - perror_with_name (fname); - close (f); - free (fp->buf); -} - -/* Record that inclusion of the include file INC - should be controlled by the macro named MACRO_NAME. - This means that trying to include the file again - will do something if that macro is defined. */ - -static void -record_control_macro (inc, macro_name) - struct include_file *inc; - U_CHAR *macro_name; -{ - if (!inc->control_macro || inc->control_macro[0]) - inc->control_macro = macro_name; -} - -/* Load the specified precompiled header into core, and verify its - preconditions. PCF indicates the file descriptor to read, which must - be a regular file. *ST is its file status. - FNAME indicates the file name of the original header. - *LIMIT will be set to an address one past the end of the file. - If the preconditions of the file are not satisfied, the buffer is - freed and we return 0. If the preconditions are satisfied, return - the address of the buffer following the preconditions. The buffer, in - this case, should never be freed because various pieces of it will - be referred to until all precompiled strings are output at the end of - the run. */ - -static char * -check_precompiled (pcf, st, fname, limit) - int pcf; - struct stat *st; - char *fname ATTRIBUTE_UNUSED; - char **limit; -{ - int length = 0; - char *buf; - char *cp; - - if (pcp_outfile) - return 0; - - if (S_ISREG (st->st_mode)) - { - size_t s = (size_t) st->st_size; - if (s != st->st_size || s + 2 < s) - memory_full (); - buf = xmalloc (s + 2); - length = safe_read (pcf, buf, s); - if (length < 0) - goto nope; - } - else - abort (); - - if (length > 0 && buf[length-1] != '\n') - buf[length++] = '\n'; - buf[length] = '\0'; - - *limit = buf + length; - - /* File is in core. Check the preconditions. */ - if (!check_preconditions (buf)) - goto nope; - for (cp = buf; *cp; cp++) - ; -#ifdef DEBUG_PCP - fprintf (stderr, "Using preinclude %s\n", fname); -#endif - return cp + 1; - - nope: -#ifdef DEBUG_PCP - fprintf (stderr, "Cannot use preinclude %s\n", fname); -#endif - free (buf); - return 0; -} - -/* PREC (null terminated) points to the preconditions of a - precompiled header. These are a series of #define and #undef - lines which must match the current contents of the hash - table. */ - -static int -check_preconditions (prec) - char *prec; -{ - MACRODEF mdef; - char *lineend; - - while (*prec) { - lineend = index (prec, '\n'); - - if (*prec++ != '#') { - error ("Bad format encountered while reading precompiled file"); - return 0; - } - if (!strncmp (prec, "define", 6)) { - HASHNODE *hp; - - prec += 6; - mdef = create_definition ((U_CHAR *) prec, (U_CHAR *) lineend, NULL_PTR); - - if (mdef.defn == 0) - abort (); - - if ((hp = lookup (mdef.symnam, mdef.symlen, -1)) == NULL - || (hp->type != T_MACRO && hp->type != T_CONST) - || (hp->type == T_MACRO - && !compare_defs (mdef.defn, hp->value.defn) - && (mdef.defn->length != 2 - || mdef.defn->expansion[0] != '\n' - || mdef.defn->expansion[1] != ' '))) - return 0; - } else if (!strncmp (prec, "undef", 5)) { - char *name; - int len; - - prec += 5; - while (is_hor_space[(U_CHAR) *prec]) - prec++; - name = prec; - while (is_idchar[(U_CHAR) *prec]) - prec++; - len = prec - name; - - if (lookup ((U_CHAR *) name, len, -1)) - return 0; - } else { - error ("Bad format encountered while reading precompiled file"); - return 0; - } - prec = lineend + 1; - } - /* They all passed successfully */ - return 1; -} - -/* Process the main body of a precompiled file. BUF points to the - string section of the file, following the preconditions. LIMIT is one - character past the end. NAME is the name of the file being read - in. OP is the main output buffer. */ - -static void -pcfinclude (buf, name, op) - U_CHAR *buf, *name; - FILE_BUF *op; -{ - FILE_BUF tmpbuf; - int nstrings; - U_CHAR *cp = buf; - - /* First in the file comes 4 bytes indicating the number of strings, */ - /* in network byte order. (MSB first). */ - nstrings = *cp++; - nstrings = (nstrings << 8) | *cp++; - nstrings = (nstrings << 8) | *cp++; - nstrings = (nstrings << 8) | *cp++; - - /* Looping over each string... */ - while (nstrings--) { - U_CHAR *string_start; - U_CHAR *endofthiskey; - STRINGDEF *str; - int nkeys; - - /* Each string starts with a STRINGDEF structure (str), followed */ - /* by the text of the string (string_start) */ - - /* First skip to a longword boundary */ - /* ??? Why a 4-byte boundary? On all machines? */ - /* NOTE: This works correctly even if size_t - is narrower than a pointer. - Do not try risky measures here to get another type to use! - Do not include stddef.h--it will fail! */ - if ((size_t) cp & 3) - cp += 4 - ((size_t) cp & 3); - - /* Now get the string. */ - str = (STRINGDEF *) (GENERIC_PTR) cp; - string_start = cp += sizeof (STRINGDEF); - - for (; *cp; cp++) /* skip the string */ - ; - - /* We need to macro expand the string here to ensure that the - proper definition environment is in place. If it were only - expanded when we find out it is needed, macros necessary for - its proper expansion might have had their definitions changed. */ - tmpbuf = expand_to_temp_buffer (string_start, cp++, 0, 0); - /* Lineno is already set in the precompiled file */ - str->contents = tmpbuf.buf; - str->len = tmpbuf.length; - str->writeflag = 0; - str->filename = name; - str->output_mark = outbuf.bufp - outbuf.buf; - - str->chain = 0; - *stringlist_tailp = str; - stringlist_tailp = &str->chain; - - /* Next comes a fourbyte number indicating the number of keys - for this string. */ - nkeys = *cp++; - nkeys = (nkeys << 8) | *cp++; - nkeys = (nkeys << 8) | *cp++; - nkeys = (nkeys << 8) | *cp++; - - /* If this number is -1, then the string is mandatory. */ - if (nkeys == -1) - str->writeflag = 1; - else - /* Otherwise, for each key, */ - for (; nkeys--; free (tmpbuf.buf), cp = endofthiskey + 1) { - KEYDEF *kp = (KEYDEF *) (GENERIC_PTR) cp; - HASHNODE *hp; - - /* It starts with a KEYDEF structure */ - cp += sizeof (KEYDEF); - - /* Find the end of the key. At the end of this for loop we - advance CP to the start of the next key using this variable. */ - endofthiskey = cp + strlen ((char *) cp); - kp->str = str; - - /* Expand the key, and enter it into the hash table. */ - tmpbuf = expand_to_temp_buffer (cp, endofthiskey, 0, 0); - tmpbuf.bufp = tmpbuf.buf; - - while (is_hor_space[*tmpbuf.bufp]) - tmpbuf.bufp++; - if (!is_idstart[*tmpbuf.bufp] - || tmpbuf.bufp == tmpbuf.buf + tmpbuf.length) { - str->writeflag = 1; - continue; - } - - hp = lookup (tmpbuf.bufp, -1, -1); - if (hp == NULL) { - kp->chain = 0; - install (tmpbuf.bufp, -1, T_PCSTRING, (char *) kp, -1); - } - else if (hp->type == T_PCSTRING) { - kp->chain = hp->value.keydef; - hp->value.keydef = kp; - } - else - str->writeflag = 1; - } - } - /* This output_line_directive serves to switch us back to the current - input file in case some of these strings get output (which will - result in line directives for the header file being output). */ - output_line_directive (&instack[indepth], op, 0, enter_file); -} - -/* Called from rescan when it hits a key for strings. Mark them all - used and clean up. */ - -static void -pcstring_used (hp) - HASHNODE *hp; -{ - KEYDEF *kp; - - for (kp = hp->value.keydef; kp; kp = kp->chain) - kp->str->writeflag = 1; - delete_macro (hp); -} - -/* Write the output, interspersing precompiled strings in their - appropriate places. */ - -static void -write_output () -{ - STRINGDEF *next_string; - U_CHAR *cur_buf_loc; - int line_directive_len = 80; - char *line_directive = xmalloc (line_directive_len); - int len; - - /* In each run through the loop, either cur_buf_loc == - next_string_loc, in which case we print a series of strings, or - it is less than next_string_loc, in which case we write some of - the buffer. */ - cur_buf_loc = outbuf.buf; - next_string = stringlist; - - while (cur_buf_loc < outbuf.bufp || next_string) { - if (next_string - && cur_buf_loc - outbuf.buf == next_string->output_mark) { - if (next_string->writeflag) { - len = 4 * strlen ((char *) next_string->filename) + 32; - while (len > line_directive_len) - line_directive = xrealloc (line_directive, - line_directive_len *= 2); - sprintf (line_directive, "\n# %d ", next_string->lineno); - strcpy (quote_string (line_directive + strlen (line_directive), - (char *) next_string->filename, - strlen ((char *) next_string->filename)), - "\n"); - safe_write (fileno (stdout), line_directive, strlen (line_directive)); - safe_write (fileno (stdout), - (char *) next_string->contents, next_string->len); - } - next_string = next_string->chain; - } - else { - len = (next_string - ? (next_string->output_mark - - (cur_buf_loc - outbuf.buf)) - : outbuf.bufp - cur_buf_loc); - - safe_write (fileno (stdout), (char *) cur_buf_loc, len); - cur_buf_loc += len; - } - } - free (line_directive); -} - -/* Pass a directive through to the output file. - BUF points to the contents of the directive, as a contiguous string. - 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 (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword; -{ - register int keyword_length = keyword->length; - - check_expand (op, 1 + keyword_length + (limit - buf)); - *op->bufp++ = '#'; - bcopy (keyword->name, (char *) op->bufp, keyword_length); - op->bufp += keyword_length; - if (limit != buf && buf[0] != ' ') - *op->bufp++ = ' '; - bcopy ((char *) buf, (char *) op->bufp, limit - buf); - op->bufp += (limit - buf); -#if 0 - *op->bufp++ = '\n'; - /* Count the line we have just made in the output, - to get in sync properly. */ - op->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; -}; - -/* Create a DEFINITION node from a #define directive. Arguments are - as for do_define. */ - -static MACRODEF -create_definition (buf, limit, op) - U_CHAR *buf, *limit; - FILE_BUF *op; -{ - 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 line = instack[indepth].lineno; - char *file = instack[indepth].nominal_fname; - size_t file_len = instack[indepth].nominal_fname_len; - int rest_args = 0; - - DEFINITION *defn; - int arglengths = 0; /* Accumulate lengths of arg names - plus number of args. */ - MACRODEF mdef; - - bp = buf; - - while (is_hor_space[*bp]) - bp++; - - symname = bp; /* remember where it starts */ - sym_length = check_macro_name (bp, 0); - 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) - pedwarn ("another parameter follows `%s'", - rest_extension); - - if (!is_idstart[*bp]) - { - if (c9x && limit - bp > (long) REST_EXTENSION_LENGTH - && bcmp (rest_extension, bp, REST_EXTENSION_LENGTH) == 0) - { - /* This is the ISO C 9x way to write macros with variable - number of arguments. */ - rest_args = 1; - temp->rest_args = 1; - } - else - pedwarn ("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 (limit - bp > (long) REST_EXTENSION_LENGTH - && bcmp (rest_extension, bp, REST_EXTENSION_LENGTH) == 0) { - if (pedantic && !instack[indepth].system_header_p) - pedwarn ("ANSI C does not allow macro with variable arguments"); - rest_args = 1; - temp->rest_args = 1; - break; - } - } - if (bp == temp->name && rest_args == 1) - { - /* This is the ISO C 9x style. */ - temp->name = (U_CHAR *) va_args_name; - temp->length = VA_ARGS_NAME_LENGTH; - } - else - 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 != ')')) { - error ("badly punctuated parameter list in `#define'"); - goto nope; - } - if (*bp == ',') { - bp++; - SKIP_WHITE_SPACE (bp); - /* A comma at this point can only be followed by an identifier. */ - if (!is_idstart[*bp] - && !(c9x && limit - bp > (long) REST_EXTENSION_LENGTH - && bcmp (rest_extension, bp, REST_EXTENSION_LENGTH) == 0)) { - error ("badly punctuated parameter list in `#define'"); - goto nope; - } - } - if (bp >= limit) { - error ("unterminated parameter list in `#define'"); - goto nope; - } - { - struct arglist *otemp; - - for (otemp = temp->next; otemp != NULL; otemp = otemp->next) - if (temp->length == otemp->length - && bcmp (temp->name, otemp->name, temp->length) == 0) - { - error ("duplicate argument name `%.*s' in `#define'", - temp->length, temp->name); - goto nope; - } - if (rest_args == 0 && temp->length == VA_ARGS_NAME_LENGTH - && bcmp (temp->name, va_args_name, VA_ARGS_NAME_LENGTH) == 0) - { - error ("\ -reserved name `%s' used as argument name in `#define'", va_args_name); - goto nope; - } - } - } - - ++bp; /* skip paren */ - SKIP_WHITE_SPACE (bp); - /* now everything from bp before limit is the definition. */ - defn = collect_expansion (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) { - bcopy (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 if (sym_length) { - 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 '~': - warning ("missing white space after `#define %.*s'", - sym_length, symname); - break; - - default: - pedwarn ("missing white space after `#define %.*s'", - sym_length, symname); - break; - } - } - } - /* Now everything from bp before limit is the definition. */ - defn = collect_expansion (bp, limit, -1, NULL_PTR); - defn->args.argnames = (U_CHAR *) ""; - } - - defn->line = line; - defn->file = file; - defn->file_len = file_len; - - /* OP is null if this is a predefinition */ - defn->predefined = !op; - mdef.defn = defn; - mdef.symnam = symname; - mdef.symlen = sym_length; - - return mdef; - - nope: - mdef.defn = 0; - return mdef; -} - -/* Process a #define directive. -BUF points to the contents of the #define directive, as a contiguous string. -LIMIT points to the first character past the end of the definition. -KEYWORD is the keyword-table entry for #define. */ - -static int -do_define (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword; -{ - int hashcode; - MACRODEF mdef; - - /* If this is a precompiler run (with -pcp) pass thru #define directives. */ - if (pcp_outfile && op) - pass_thru_directive (buf, limit, op, keyword); - - mdef = create_definition (buf, limit, op); - if (mdef.defn == 0) - goto nope; - - hashcode = hashf (mdef.symnam, mdef.symlen, HASHSIZE); - - { - HASHNODE *hp; - if ((hp = lookup (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 (mdef.defn, hp->value.defn); - /* Redefining a constant is ok with -D. */ - else if (hp->type == T_CONST) - ok = ! done_initializing; - /* Print the warning if it's not ok. */ - if (!ok) { - /* If we are passing through #define and #undef directives, do - that for this re-definition now. */ - if (debug_output && op) - pass_thru_directive (buf, limit, op, keyword); - - pedwarn ("`%.*s' redefined", mdef.symlen, mdef.symnam); - if (hp->type == T_MACRO) - pedwarn_with_file_and_line (hp->value.defn->file, - hp->value.defn->file_len, - 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 (debug_output && op) - pass_thru_directive (buf, limit, op, keyword); - install (mdef.symnam, mdef.symlen, T_MACRO, - (char *) mdef.defn, hashcode); - } - } - - return 0; - -nope: - - return 1; -} - -/* Check a purported macro name SYMNAME, and yield its length. - ASSERTION is nonzero if this is really for an assertion name. */ - -static int -check_macro_name (symname, assertion) - U_CHAR *symname; - int assertion; -{ - 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 == '"'))) - error (assertion ? "invalid assertion name" : "invalid macro name"); - else if (!is_idstart[*symname] - || (sym_length == 7 && ! bcmp (symname, "defined", 7))) - error ((assertion - ? "invalid assertion name `%.*s'" - : "invalid macro name `%.*s'"), - sym_length, symname); - return sym_length; -} - -/* Return zero if two DEFINITIONs are isomorphic. */ - -static int -compare_defs (d1, d2) - DEFINITION *d1, *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 (pedantic - && 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 && ! bcmp (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 (first, beg1, len1, beg2, len2, last) - int first; - U_CHAR *beg1, *beg2; - int len1, 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); -} - -/* 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. */ - -/* If there is no trailing whitespace, a Newline Space is added at the end - to prevent concatenation that would be contrary to the standard. */ - -static DEFINITION * -collect_expansion (buf, end, nargs, arglist) - U_CHAR *buf, *end; - int nargs; - struct arglist *arglist; -{ - DEFINITION *defn; - register U_CHAR *p, *limit, *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; - /* How those tokens were spelled. */ - enum sharp_token_type concat_sharp_token_type = NO_SHARP_TOKEN; - enum sharp_token_type stringify_sharp_token_type = NO_SHARP_TOKEN; - 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 (end < buf) - abort (); - - /* Find the beginning of the trailing whitespace. */ - limit = end; - p = buf; - while (p < limit && is_space[limit[-1]]) limit--; - - /* Allocate space for the text in the macro definition. - Each input char may or may not need 1 byte, - so this is an upper bound. - The extra 3 are for invented trailing newline-marker and final null. */ - maxsize = (sizeof (DEFINITION) - + (limit - p) + 3); - defn = (DEFINITION *) xcalloc (1, maxsize); - - defn->nargs = nargs; - exp_p = defn->expansion = (U_CHAR *) defn + sizeof (DEFINITION); - lastp = exp_p; - - if (p[0] == '#' - ? p[1] == '#' - : p[0] == '%' && p[1] == ':' && p[2] == '%' && p[3] == ':') { - error ("`##' at start of macro definition"); - p += p[0] == '#' ? 2 : 4; - } - - /* Process the main body of the definition. */ - while (p < limit) { - int skipped_arg = 0; - register U_CHAR c = *p++; - - *exp_p++ = c; - - if (!traditional) { - 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 '%': - if (!expected_delimiter && *p == ':') { - /* %: is not a digraph if preceded by an odd number of '<'s. */ - U_CHAR *p0 = p - 1; - while (buf < p0 && p0[-1] == '<') - p0--; - if ((p - p0) & 1) { - /* Treat %:%: as ## and %: as #. */ - if (p[1] == '%' && p[2] == ':') { - p += 2; - goto sharp_sharp_token; - } - if (nargs >= 0) { - p++; - goto sharp_token; - } - } - } - break; - - case '#': - /* # is ordinary inside a string. */ - if (expected_delimiter) - break; - if (*p == '#') { - sharp_sharp_token: - /* ##: 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++; - concat_sharp_token_type = c; - if (is_hor_space[*p]) { - concat_sharp_token_type = c + 1; - p++; - SKIP_WHITE_SPACE (p); - } - concat = p; - if (p == limit) - error ("`##' at end of macro definition"); - } else if (nargs >= 0) { - /* Single #: stringify following argument ref. - Don't leave the # in the expansion. */ - sharp_token: - exp_p--; - stringify_sharp_token_type = c; - if (is_hor_space[*p]) { - stringify_sharp_token_type = c + 1; - p++; - SKIP_WHITE_SPACE (p); - } - if (! is_idstart[*p] || nargs == 0 - || (*p == 'L' && (p[1] == '\'' || p[1] == '"'))) - error ("`#' 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--; - while (++p < limit) { - if (p[0] == '*' && p[1] == '/') { - p += 2; - break; - } - } -#if 0 - /* Mark this as a concatenation-point, as if it had been ##. */ - concat = p; -#endif - } - break; - } - } - -#ifdef MULTIBYTE_CHARS - /* Handle multibyte characters inside string and character literals. */ - if (expected_delimiter != '\0') - { - int length; - --p; - length = local_mblen (p, limit - p); - if (length > 1) - { - --exp_p; - bcopy (p, exp_p, length); - p += length; - exp_p += length; - continue; - } - ++p; - } -#endif - - /* 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 - && bcmp (arg->name, id_beg, id_len) == 0) { - enum sharp_token_type tpat_stringify; - if (expected_delimiter) { - if (warn_stringify) { - if (traditional) { - warning ("macro argument `%.*s' is stringified.", - id_len, arg->name); - } else { - warning ("macro arg `%.*s' would be stringified with -traditional.", - id_len, arg->name); - } - } - /* If ANSI, don't actually substitute inside a string. */ - if (!traditional) - break; - tpat_stringify = SHARP_TOKEN; - } else { - tpat_stringify - = (stringify == id_beg - ? stringify_sharp_token_type : NO_SHARP_TOKEN); - } - /* 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 ? concat_sharp_token_type : NO_SHARP_TOKEN; - tpat->raw_after = NO_SHARP_TOKEN; - tpat->rest_args = arg->rest_args; - tpat->stringify = tpat_stringify; - - 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[0]=='#' - ? p1[1]=='#' - : p1[0]=='%' && p1[1]==':' && p1[2]=='%' && p1[3]==':') - tpat->raw_after = p1[0] + (p != p1); - } - 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) - error ("`#' operator should be followed by a macro argument name"); - } - } - } - - if (!traditional && expected_delimiter == 0) { - /* If ANSI, put in a newline-space marker to prevent token pasting. - But not if "inside a string" (which in ANSI mode happens only for - -D option). */ - *exp_p++ = '\n'; - *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; -} - -static int -do_assert (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op ATTRIBUTE_UNUSED; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - U_CHAR *bp; /* temp ptr into input buffer */ - U_CHAR *symname; /* remember where symbol name starts */ - int sym_length; /* and how long it is */ - struct arglist *tokens = NULL; - - if (pedantic && done_initializing && !instack[indepth].system_header_p) - pedwarn ("ANSI C does not allow `#assert'"); - - bp = buf; - - while (is_hor_space[*bp]) - bp++; - - symname = bp; /* remember where it starts */ - sym_length = check_macro_name (bp, 1); - bp += sym_length; - /* #define doesn't do this, but we should. */ - SKIP_WHITE_SPACE (bp); - - /* Lossage will occur if identifiers or control tokens are broken - across lines using backslash. This is not the right place to take - care of that. */ - - if (*bp != '(') { - error ("missing token-sequence in `#assert'"); - return 1; - } - - { - int error_flag = 0; - - bp++; /* skip '(' */ - SKIP_WHITE_SPACE (bp); - - tokens = read_token_list (&bp, limit, &error_flag); - if (error_flag) - return 1; - if (tokens == 0) { - error ("empty token-sequence in `#assert'"); - return 1; - } - - ++bp; /* skip paren */ - SKIP_WHITE_SPACE (bp); - } - - /* If this name isn't already an assertion name, make it one. - Error if it was already in use in some other way. */ - - { - ASSERTION_HASHNODE *hp; - int hashcode = hashf (symname, sym_length, ASSERTION_HASHSIZE); - struct tokenlist_list *value - = (struct tokenlist_list *) xmalloc (sizeof (struct tokenlist_list)); - - hp = assertion_lookup (symname, sym_length, hashcode); - if (hp == NULL) { - if (sym_length == 7 && ! bcmp (symname, "defined", 7)) - error ("`defined' redefined as assertion"); - hp = assertion_install (symname, sym_length, hashcode); - } - - /* Add the spec'd token-sequence to the list of such. */ - value->tokens = tokens; - value->next = hp->value; - hp->value = value; - } - - return 0; -} - -static int -do_unassert (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op ATTRIBUTE_UNUSED; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - U_CHAR *bp; /* temp ptr into input buffer */ - U_CHAR *symname; /* remember where symbol name starts */ - int sym_length; /* and how long it is */ - - struct arglist *tokens = NULL; - int tokens_specified = 0; - - if (pedantic && done_initializing && !instack[indepth].system_header_p) - pedwarn ("ANSI C does not allow `#unassert'"); - - bp = buf; - - while (is_hor_space[*bp]) - bp++; - - symname = bp; /* remember where it starts */ - sym_length = check_macro_name (bp, 1); - bp += sym_length; - /* #define doesn't do this, but we should. */ - SKIP_WHITE_SPACE (bp); - - /* Lossage will occur if identifiers or control tokens are broken - across lines using backslash. This is not the right place to take - care of that. */ - - if (*bp == '(') { - int error_flag = 0; - - bp++; /* skip '(' */ - SKIP_WHITE_SPACE (bp); - - tokens = read_token_list (&bp, limit, &error_flag); - if (error_flag) - return 1; - if (tokens == 0) { - error ("empty token list in `#unassert'"); - return 1; - } - - tokens_specified = 1; - - ++bp; /* skip paren */ - SKIP_WHITE_SPACE (bp); - } - - { - ASSERTION_HASHNODE *hp; - int hashcode = hashf (symname, sym_length, ASSERTION_HASHSIZE); - struct tokenlist_list *tail, *prev; - - hp = assertion_lookup (symname, sym_length, hashcode); - if (hp == NULL) - return 1; - - /* If no token list was specified, then eliminate this assertion - entirely. */ - if (! tokens_specified) { - struct tokenlist_list *next; - for (tail = hp->value; tail; tail = next) { - next = tail->next; - free_token_list (tail->tokens); - free (tail); - } - delete_assertion (hp); - } else { - /* If a list of tokens was given, then delete any matching list. */ - - tail = hp->value; - prev = 0; - while (tail) { - struct tokenlist_list *next = tail->next; - if (compare_token_lists (tail->tokens, tokens)) { - if (prev) - prev->next = next; - else - hp->value = tail->next; - free_token_list (tail->tokens); - free (tail); - } else { - prev = tail; - } - tail = next; - } - } - } - - return 0; -} - -/* Test whether there is an assertion named NAME - and optionally whether it has an asserted token list TOKENS. - NAME is not null terminated; its length is SYM_LENGTH. - If TOKENS_SPECIFIED is 0, then don't check for any token list. */ - -int -check_assertion (name, sym_length, tokens_specified, tokens) - U_CHAR *name; - int sym_length; - int tokens_specified; - struct arglist *tokens; -{ - ASSERTION_HASHNODE *hp; - int hashcode = hashf (name, sym_length, ASSERTION_HASHSIZE); - - if (pedantic && !instack[indepth].system_header_p) - pedwarn ("ANSI C does not allow testing assertions"); - - hp = assertion_lookup (name, sym_length, hashcode); - if (hp == NULL) - /* It is not an assertion; just return false. */ - return 0; - - /* If no token list was specified, then value is 1. */ - if (! tokens_specified) - return 1; - - { - struct tokenlist_list *tail; - - tail = hp->value; - - /* If a list of tokens was given, - then succeed if the assertion records a matching list. */ - - while (tail) { - if (compare_token_lists (tail->tokens, tokens)) - return 1; - tail = tail->next; - } - - /* Fail if the assertion has no matching list. */ - return 0; - } -} - -/* Compare two lists of tokens for equality including order of tokens. */ - -static int -compare_token_lists (l1, l2) - struct arglist *l1, *l2; -{ - while (l1 && l2) { - if (l1->length != l2->length) - return 0; - if (bcmp (l1->name, l2->name, l1->length)) - return 0; - l1 = l1->next; - l2 = l2->next; - } - - /* Succeed if both lists end at the same time. */ - return l1 == l2; -} - -/* Read a space-separated list of tokens ending in a close parenthesis. - Return a list of strings, in the order they were written. - (In case of error, return 0 and store -1 in *ERROR_FLAG.) - Parse the text starting at *BPP, and update *BPP. - Don't parse beyond LIMIT. */ - -static struct arglist * -read_token_list (bpp, limit, error_flag) - U_CHAR **bpp; - U_CHAR *limit; - int *error_flag; -{ - struct arglist *token_ptrs = 0; - U_CHAR *bp = *bpp; - int depth = 1; - - *error_flag = 0; - - /* Loop over the assertion value tokens. */ - while (depth > 0) { - struct arglist *temp; - int eofp = 0; - U_CHAR *beg = bp; - - /* Find the end of the token. */ - if (*bp == '(') { - bp++; - depth++; - } else if (*bp == ')') { - depth--; - if (depth == 0) - break; - bp++; - } else if (*bp == '"' || *bp == '\'') - bp = skip_quoted_string (bp, limit, 0, NULL_PTR, NULL_PTR, &eofp); - else - while (! is_hor_space[*bp] && *bp != '(' && *bp != ')' - && *bp != '"' && *bp != '\'' && bp != limit) - bp++; - - temp = (struct arglist *) xmalloc (sizeof (struct arglist)); - temp->name = (U_CHAR *) xmalloc (bp - beg + 1); - bcopy ((char *) beg, (char *) temp->name, bp - beg); - temp->name[bp - beg] = 0; - temp->next = token_ptrs; - token_ptrs = temp; - temp->length = bp - beg; - - SKIP_WHITE_SPACE (bp); - - if (bp >= limit) { - error ("unterminated token sequence in `#assert' or `#unassert'"); - *error_flag = -1; - return 0; - } - } - *bpp = bp; - - /* We accumulated the names in reverse order. - Now reverse them to get the proper order. */ - { - register struct arglist *prev = 0, *this, *next; - for (this = token_ptrs; this; this = next) { - next = this->next; - this->next = prev; - prev = this; - } - return prev; - } -} - -static void -free_token_list (tokens) - struct arglist *tokens; -{ - while (tokens) { - struct arglist *next = tokens->next; - free (tokens->name); - free (tokens); - tokens = next; - } -} - -/* Install a name in the assertion hash table. - - 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. */ - -static ASSERTION_HASHNODE * -assertion_install (name, len, hash) - U_CHAR *name; - int len; - int hash; -{ - register ASSERTION_HASHNODE *hp; - register int i, bucket; - register U_CHAR *p, *q; - - i = sizeof (ASSERTION_HASHNODE) + len + 1; - hp = (ASSERTION_HASHNODE *) xmalloc (i); - bucket = hash; - hp->bucket_hdr = &assertion_hashtab[bucket]; - hp->next = assertion_hashtab[bucket]; - assertion_hashtab[bucket] = hp; - hp->prev = NULL; - if (hp->next != NULL) - hp->next->prev = hp; - hp->length = len; - hp->value = 0; - hp->name = ((U_CHAR *) hp) + sizeof (ASSERTION_HASHNODE); - p = hp->name; - q = name; - for (i = 0; i < len; i++) - *p++ = *q++; - hp->name[len] = 0; - return hp; -} - -/* 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. */ - -static ASSERTION_HASHNODE * -assertion_lookup (name, len, hash) - U_CHAR *name; - int len; - int hash; -{ - register ASSERTION_HASHNODE *bucket; - - bucket = assertion_hashtab[hash]; - while (bucket) { - if (bucket->length == len && bcmp (bucket->name, name, len) == 0) - return bucket; - bucket = bucket->next; - } - return NULL; -} - -static void -delete_assertion (hp) - ASSERTION_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; - - free (hp); -} - -/* - * interpret #line directive. Remembers previously seen fnames - * in its very own hash table. - */ -#define FNAME_HASHSIZE 37 - -static int -do_line (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - register U_CHAR *bp; - FILE_BUF *ip = &instack[indepth]; - FILE_BUF tem; - int new_lineno; - enum file_change_code file_change = same_file; - - /* Expand any macros. */ - tem = expand_to_temp_buffer (buf, limit, 0, 0); - - /* Point to macroexpanded line, which is null-terminated now. */ - bp = tem.buf; - SKIP_WHITE_SPACE (bp); - - if (!ISDIGIT (*bp)) { - error ("invalid format `#line' directive"); - return 0; - } - - /* 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 *) bp) - 1; - - /* NEW_LINENO is one less than the actual line number here. */ - if (pedantic && new_lineno < 0) - pedwarn ("line number out of range in `#line' directive"); - - /* skip over the line number. */ - while (ISDIGIT (*bp)) - bp++; - -#if 0 /* #line 10"foo.c" is supposed to be allowed. */ - if (*bp && !is_space[*bp]) { - error ("invalid format `#line' directive"); - return; - } -#endif - - SKIP_WHITE_SPACE (bp); - - if (*bp == '\"') { - static HASHNODE *fname_table[FNAME_HASHSIZE]; - HASHNODE *hp, **hash_bucket; - U_CHAR *fname, *p; - int fname_length; - - fname = ++bp; - - /* Turn the file name, which is a character string literal, - into a null-terminated string. Do this in place. */ - p = bp; - for (;;) - switch ((*p++ = *bp++)) { - case '\0': - error ("invalid format `#line' directive"); - return 0; - - case '\\': - if (! ignore_escape_flag) - { - char *bpc = (char *) bp; - HOST_WIDEST_INT c = parse_escape (&bpc, (HOST_WIDEST_INT) (U_CHAR) (-1)); - bp = (U_CHAR *) bpc; - if (c < 0) - p--; - else - p[-1] = c; - } - break; - - case '\"': - *--p = 0; - goto fname_done; - } - fname_done: - fname_length = p - fname; - - SKIP_WHITE_SPACE (bp); - if (*bp) { - if (pedantic) - pedwarn ("garbage at end of `#line' directive"); - if (*bp == '1') - file_change = enter_file; - else if (*bp == '2') - file_change = leave_file; - else if (*bp == '3') - ip->system_header_p = 1; - else if (*bp == '4') - ip->system_header_p = 2; - else { - error ("invalid format `#line' directive"); - return 0; - } - - bp++; - SKIP_WHITE_SPACE (bp); - if (*bp == '3') { - ip->system_header_p = 1; - bp++; - SKIP_WHITE_SPACE (bp); - } - if (*bp == '4') { - ip->system_header_p = 2; - bp++; - SKIP_WHITE_SPACE (bp); - } - if (*bp) { - error ("invalid format `#line' directive"); - return 0; - } - } - - hash_bucket = &fname_table[hashf (fname, fname_length, FNAME_HASHSIZE)]; - for (hp = *hash_bucket; hp != NULL; hp = hp->next) - if (hp->length == fname_length && - bcmp (hp->value.cpval, fname, fname_length) == 0) { - ip->nominal_fname = hp->value.cpval; - ip->nominal_fname_len = fname_length; - 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; - - ip->nominal_fname = hp->value.cpval = ((char *) hp) + sizeof (HASHNODE); - ip->nominal_fname_len = hp->length = fname_length; - bcopy (fname, hp->value.cpval, fname_length + 1); - } - } else if (*bp) { - error ("invalid format `#line' directive"); - return 0; - } - - ip->lineno = new_lineno; - output_line_directive (ip, op, 0, file_change); - check_expand (op, ip->length - (ip->bufp - ip->buf)); - 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 (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword; -{ - int sym_length; - HASHNODE *hp; - U_CHAR *orig_buf = buf; - - /* If this is a precompiler run (with -pcp) pass thru #undef directives. */ - if (pcp_outfile && op) - pass_thru_directive (buf, limit, op, keyword); - - SKIP_WHITE_SPACE (buf); - sym_length = check_macro_name (buf, 0); - - while ((hp = lookup (buf, sym_length, -1)) != NULL) { - /* If we are generating additional info for debugging (with -g) we - need to pass through all effective #undef directives. */ - if (debug_output && op) - pass_thru_directive (orig_buf, limit, op, keyword); - if (hp->type != T_MACRO) - warning ("undefining `%s'", hp->name); - delete_macro (hp); - } - - if (pedantic) { - buf += sym_length; - SKIP_WHITE_SPACE (buf); - if (buf != limit) - pedwarn ("garbage after `#undef' directive"); - } - return 0; -} - -/* 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 (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op ATTRIBUTE_UNUSED; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - int length = limit - buf; - U_CHAR *copy = (U_CHAR *) alloca (length + 1); - bcopy ((char *) buf, (char *) copy, length); - copy[length] = 0; - SKIP_WHITE_SPACE (copy); - error ("#error %s", copy); - return 0; -} - -/* Report a warning detected by the program we are processing. - Use the text of the line in the warning message, then continue. - (We use error because it prints the filename & line#.) */ - -static int -do_warning (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op ATTRIBUTE_UNUSED; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - int length = limit - buf; - U_CHAR *copy = (U_CHAR *) alloca (length + 1); - bcopy ((char *) buf, (char *) copy, length); - copy[length] = 0; - SKIP_WHITE_SPACE (copy); - - if (pedantic && !instack[indepth].system_header_p) - pedwarn ("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. */ - pedwarn ("#warning %s", copy); - return 0; -} - -/* Remember the name of the current file being read from so that we can - avoid ever including it again. */ - -static void -do_once () -{ - int i; - - for (i = indepth; i >= 0; i--) - if (instack[i].inc) { - record_control_macro (instack[i].inc, (U_CHAR *) ""); - break; - } -} - -/* Report program identification. */ - -static int -do_ident (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - FILE_BUF trybuf; - int len; - - /* Allow #ident in system headers, since that's not user's fault. */ - if (pedantic && !instack[indepth].system_header_p) - pedwarn ("ANSI C does not allow `#ident'"); - - trybuf = expand_to_temp_buffer (buf, limit, 0, 0); - buf = trybuf.buf; - len = trybuf.bufp - buf; - - /* Output expanded directive. */ - check_expand (op, 7 + len); - bcopy ("#ident ", (char *) op->bufp, 7); - op->bufp += 7; - bcopy ((char *) buf, (char *) op->bufp, len); - op->bufp += len; - - free (buf); - return 0; -} - -/* #pragma and its argument line have already been copied to the output file. - Just check for some recognized pragmas that need validation here. */ - -static int -do_pragma (buf, limit, op, keyword) - U_CHAR *buf, *limit ATTRIBUTE_UNUSED; - FILE_BUF *op ATTRIBUTE_UNUSED; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - SKIP_WHITE_SPACE (buf); - if (!strncmp ((char *) buf, "once", 4)) { - /* Allow #pragma once in system headers, since that's not the user's - fault. */ - if (!instack[indepth].system_header_p) - warning ("`#pragma once' is obsolete"); - do_once (); - } - - if (!strncmp ((char *) buf, "implementation", 14)) { - /* Be quiet about `#pragma implementation' for a file only if it hasn't - been included yet. */ - - int h; - U_CHAR *p = buf + 14, *fname; - SKIP_WHITE_SPACE (p); - if (*p != '\"') - return 0; - - fname = p + 1; - if ((p = (U_CHAR *) index ((char *) fname, '\"'))) - *p = '\0'; - - for (h = 0; h < INCLUDE_HASHSIZE; h++) { - struct include_file *inc; - for (inc = include_hashtab[h]; inc; inc = inc->next) { - if (!strcmp (base_name (inc->fname), (char *) fname)) { - warning ("`#pragma implementation' for \"%s\" appears after its #include",fname); - return 0; - } - } - } - } - return 0; -} - -#if 0 -/* This was a fun hack, but #pragma seems to start to be useful. - By failing to recognize it, we pass it through unchanged to cc1. */ - -/* The behavior of the #pragma directive is implementation defined. - this implementation defines it as follows. */ - -static int -do_pragma () -{ - close (0); - if (open ("/dev/tty", O_RDONLY, 0666) != 0) - goto nope; - close (1); - if (open ("/dev/tty", O_WRONLY, 0666) != 1) - goto nope; - execl ("/usr/games/hack", "#pragma", 0); - execl ("/usr/games/rogue", "#pragma", 0); - execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0); - execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0); -nope: - fatal ("You are in a maze of twisty compiler features, all different"); -} -#endif - -#ifdef SCCS_DIRECTIVE - -/* Just ignore #sccs, on systems where we define it at all. */ - -static int -do_sccs (buf, limit, op, keyword) - U_CHAR *buf ATTRIBUTE_UNUSED, *limit ATTRIBUTE_UNUSED; - FILE_BUF *op ATTRIBUTE_UNUSED; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - if (pedantic) - pedwarn ("ANSI C does not allow `#sccs'"); - return 0; -} - -#endif /* defined (SCCS_DIRECTIVE) */ - -/* Handle #if directive 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 directive) - 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 (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - HOST_WIDEST_INT value; - FILE_BUF *ip = &instack[indepth]; - - value = eval_if_expression (buf, limit - buf); - conditional_skip (ip, value == 0, T_IF, NULL_PTR, op); - return 0; -} - -/* Handle a #elif directive by not changing if_stack either. - see the comment above do_else. */ - -static int -do_elif (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - HOST_WIDEST_INT value; - FILE_BUF *ip = &instack[indepth]; - - if (if_stack == instack[indepth].if_stack) { - error ("`#elif' not within a conditional"); - return 0; - } else { - if (if_stack->type != T_IF && if_stack->type != T_ELIF) { - error ("`#elif' after `#else'"); - fprintf (stderr, " (matches line %d", if_stack->lineno); - if (! (if_stack->fname_len == ip->nominal_fname_len - && !bcmp (if_stack->fname, ip->nominal_fname, - if_stack->fname_len))) { - fprintf (stderr, ", file "); - eprint_string (if_stack->fname, if_stack->fname_len); - } - fprintf (stderr, ")\n"); - } - if_stack->type = T_ELIF; - } - - if (if_stack->if_succeeded) - skip_if_group (ip, 0, op); - else { - value = eval_if_expression (buf, limit - buf); - if (value == 0) - skip_if_group (ip, 0, op); - else { - ++if_stack->if_succeeded; /* continue processing input */ - output_line_directive (ip, op, 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_WIDEST_INT -eval_if_expression (buf, length) - U_CHAR *buf; - int length; -{ - FILE_BUF temp_obuf; - HASHNODE *save_defined; - HOST_WIDEST_INT value; - - save_defined = install ((U_CHAR *) "defined", -1, T_SPEC_DEFINED, - NULL_PTR, -1); - pcp_inside_if = 1; - temp_obuf = expand_to_temp_buffer (buf, buf + length, 0, 1); - pcp_inside_if = 0; - delete_macro (save_defined); /* clean up special symbol */ - - temp_obuf.buf[temp_obuf.length] = '\n'; - value = parse_c_expression ((char *) temp_obuf.buf, - warn_undef && !instack[indepth].system_header_p); - - free (temp_obuf.buf); - - 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 (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword; -{ - int skip; - FILE_BUF *ip = &instack[indepth]; - U_CHAR *end; - int start_of_file = 0; - U_CHAR *control_macro = 0; - - /* Detect a #ifndef at start of file (not counting comments). */ - if (ip->fname != 0 && keyword->type == T_IFNDEF) { - U_CHAR *p = ip->buf; - while (p != directive_start) { - U_CHAR c = *p++; - if (is_space[c]) - ; - /* Make no special provision for backslash-newline here; this is - slower if backslash-newlines are present, but it's correct, - and it's not worth it to tune for the rare backslash-newline. */ - else if (c == '/' - && (*p == '*' || (cplusplus_comments && *p == '/'))) { - /* Skip this comment. */ - int junk = 0; - U_CHAR *save_bufp = ip->bufp; - ip->bufp = p + 1; - p = skip_to_end_of_comment (ip, &junk, 1); - ip->bufp = save_bufp; - } else { - goto fail; - } - } - /* If we get here, this conditional is the beginning of the file. */ - start_of_file = 1; - fail: ; - } - - /* Discard leading and trailing whitespace. */ - SKIP_WHITE_SPACE (buf); - while (limit != buf && is_hor_space[limit[-1]]) limit--; - - /* Find the end of the identifier at the beginning. */ - for (end = buf; is_idchar[*end]; end++); - - if (end == buf) { - skip = (keyword->type == T_IFDEF); - if (! traditional) - pedwarn (end == limit ? "`#%s' with no argument" - : "`#%s' argument starts with punctuation", - keyword->name); - } else { - HASHNODE *hp; - - if (! traditional) { - if (ISDIGIT (buf[0])) - pedwarn ("`#%s' argument starts with a digit", keyword->name); - else if (end != limit) - pedwarn ("garbage at end of `#%s' argument", keyword->name); - } - - hp = lookup (buf, end-buf, -1); - - if (pcp_outfile) { - /* Output a precondition for this macro. */ - if (hp - && (hp->type == T_CONST - || (hp->type == T_MACRO && 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); - } - } - - skip = (hp == NULL) ^ (keyword->type == T_IFNDEF); - if (start_of_file && !skip) { - control_macro = (U_CHAR *) xmalloc (end - buf + 1); - bcopy ((char *) buf, (char *) control_macro, end - buf); - control_macro[end - buf] = 0; - } - } - - conditional_skip (ip, skip, T_IF, control_macro, op); - 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 (ip, skip, type, control_macro, op) - FILE_BUF *ip; - int skip; - enum node_type type; - U_CHAR *control_macro; - FILE_BUF *op; -{ - IF_STACK_FRAME *temp; - - temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME)); - temp->fname = ip->nominal_fname; - temp->fname_len = ip->nominal_fname_len; - temp->lineno = ip->lineno; - temp->next = if_stack; - temp->control_macro = control_macro; - if_stack = temp; - - if_stack->type = type; - - if (skip != 0) { - skip_if_group (ip, 0, op); - return; - } else { - ++if_stack->if_succeeded; - output_line_directive (ip, &outbuf, 1, same_file); - } -} - -/* Skip to #endif, #else, or #elif. adjust line numbers, etc. - Leaves input ptr at the sharp sign found. - If ANY is nonzero, return at next directive of any sort. */ - -static void -skip_if_group (ip, any, op) - FILE_BUF *ip; - int any; - FILE_BUF *op; -{ - register U_CHAR *bp = ip->bufp, *cp; - register U_CHAR *endb = ip->buf + ip->length; - struct directive *kt; - IF_STACK_FRAME *save_if_stack = if_stack; /* don't pop past here */ - U_CHAR *beg_of_line = bp; - register int ident_length; - U_CHAR *ident, *after_ident; - /* Save info about where the group starts. */ - U_CHAR *beg_of_group = bp; - int beg_lineno = ip->lineno; - int skipping_include_directive = 0; - - if (output_conditionals && op != 0) { - char *ptr = "#failed\n"; - int len = strlen (ptr); - - if (op->bufp > op->buf && op->bufp[-1] != '\n') - { - *op->bufp++ = '\n'; - op->lineno++; - } - check_expand (op, len); - bcopy (ptr, (char *) op->bufp, len); - op->bufp += len; - op->lineno++; - output_line_directive (ip, op, 1, 0); - } - - while (bp < endb) { - switch (*bp++) { - case '/': /* possible comment */ - if (*bp == '\\' && bp[1] == '\n') - newline_fix (bp); - if (*bp == '*' - || (cplusplus_comments && *bp == '/')) { - ip->bufp = ++bp; - bp = skip_to_end_of_comment (ip, &ip->lineno, 0); - } - break; - case '<': - if (skipping_include_directive) { - while (bp < endb && *bp != '>' && *bp != '\n') { - if (*bp == '\\' && bp[1] == '\n') { - ip->lineno++; - bp++; - } - bp++; - } - } - break; - case '\"': - if (skipping_include_directive) { - while (bp < endb && *bp != '\n') { - if (*bp == '"') { - bp++; - break; - } - if (*bp == '\\' && bp[1] == '\n') { - ip->lineno++; - bp++; - } - bp++; - } - break; - } - /* Fall through. */ - case '\'': - bp = skip_quoted_string (bp - 1, endb, ip->lineno, &ip->lineno, - NULL_PTR, NULL_PTR); - break; - case '\\': - /* Char after backslash loses its special meaning in some cases. */ - if (*bp == '\n') { - ++ip->lineno; - bp++; - } else if (traditional && bp < endb) - bp++; - break; - case '\n': - ++ip->lineno; - beg_of_line = bp; - skipping_include_directive = 0; - break; - case '%': - if (beg_of_line == 0 || traditional) - break; - ip->bufp = bp - 1; - while (bp[0] == '\\' && bp[1] == '\n') - bp += 2; - if (*bp == ':') - goto sharp_token; - break; - case '#': - /* # keyword: a # must be first nonblank char on the line */ - if (beg_of_line == 0) - break; - ip->bufp = bp - 1; - sharp_token: - /* Scan from start of line, skipping whitespace, comments - and backslash-newlines, and see if we reach this #. - If not, this # is not special. */ - bp = beg_of_line; - /* If -traditional, require # to be at beginning of line. */ - if (!traditional) { - while (1) { - if (is_hor_space[*bp]) - bp++; - else if (*bp == '\\' && bp[1] == '\n') - bp += 2; - else if (*bp == '/' && bp[1] == '*') { - bp += 2; - while (1) - { - if (*bp == '*') - { - if (bp[1] == '/') - { - bp += 2; - break; - } - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (bp, endb - bp); - if (length > 1) - bp += (length - 1); -#endif - } - bp++; - } - } - /* There is no point in trying to deal with C++ // comments here, - because if there is one, then this # must be part of the - comment and we would never reach here. */ - else break; - } - } - if (bp != ip->bufp) { - bp = ip->bufp + 1; /* Reset bp to after the #. */ - break; - } - - bp = ip->bufp + 1; /* Point after the '#' */ - if (ip->bufp[0] == '%') { - /* Skip past the ':' again. */ - while (*bp == '\\') { - ip->lineno++; - bp += 2; - } - bp++; - } - - /* Skip whitespace and \-newline. */ - while (1) { - if (is_hor_space[*bp]) - bp++; - else if (*bp == '\\' && bp[1] == '\n') - bp += 2; - else if (*bp == '/') { - if (bp[1] == '\\' && bp[2] == '\n') - newline_fix (bp + 1); - if (bp[1] == '*') { - for (bp += 2; ; bp++) { - if (*bp == '\n') - ip->lineno++; - else if (*bp == '*') { - if (bp[-1] == '/' && warn_comments) - warning ("`/*' within comment"); - if (bp[1] == '\\' && bp[2] == '\n') - newline_fix (bp + 1); - if (bp[1] == '/') - break; - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (bp, endb - bp); - if (length > 1) - bp += (length - 1); -#endif - } - } - bp += 2; - } else if (bp[1] == '/' && cplusplus_comments) { - for (bp += 2; ; bp++) { - if (*bp == '\n') - break; - if (*bp == '\\' && bp[1] == '\n') - { - if (warn_comments) - warning ("multiline `//' comment"); - ip->lineno++; - bp++; - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (bp, endb - bp); - if (length > 1) - bp += (length - 1); -#endif - } - } - } else - break; - } else - break; - } - - cp = bp; - - /* Now find end of directive name. - If we encounter a backslash-newline, exchange it with any following - symbol-constituents so that we end up with a contiguous name. */ - - while (1) { - if (is_idchar[*bp]) - bp++; - else { - if (*bp == '\\' && bp[1] == '\n') - name_newline_fix (bp); - if (is_idchar[*bp]) - bp++; - else break; - } - } - ident_length = bp - cp; - ident = cp; - after_ident = bp; - - /* A line of just `#' becomes blank. */ - - if (ident_length == 0 && *after_ident == '\n') { - continue; - } - - if (ident_length == 0 || !is_idstart[*ident]) { - U_CHAR *p = ident; - while (is_idchar[*p]) { - if (*p < '0' || *p > '9') - break; - p++; - } - /* Handle # followed by a line number. */ - if (p != ident && !is_idchar[*p]) { - if (pedantic) - pedwarn ("`#' followed by integer"); - continue; - } - - /* 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) - pedwarn ("invalid preprocessing directive"); - continue; - } - } - - if (!lang_asm && pedantic) - pedwarn ("invalid preprocessing directive name"); - continue; - } - - for (kt = directive_table; kt->length >= 0; kt++) { - IF_STACK_FRAME *temp; - if (ident_length == kt->length - && bcmp (cp, kt->name, kt->length) == 0) { - /* If we are asked to return on next directive, do so now. */ - if (any) - goto done; - - switch (kt->type) { - case T_IF: - case T_IFDEF: - case T_IFNDEF: - temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME)); - temp->next = if_stack; - if_stack = temp; - temp->lineno = ip->lineno; - temp->fname = ip->nominal_fname; - temp->fname_len = ip->nominal_fname_len; - temp->type = kt->type; - break; - case T_ELSE: - case T_ENDIF: - if (pedantic && if_stack != save_if_stack) - validate_else (bp, endb); - case T_ELIF: - if (if_stack == instack[indepth].if_stack) { - error ("`#%s' not within a conditional", kt->name); - break; - } - else if (if_stack == save_if_stack) - goto done; /* found what we came for */ - - if (kt->type != T_ENDIF) { - if (if_stack->type == T_ELSE) - error ("`#else' or `#elif' after `#else'"); - if_stack->type = kt->type; - break; - } - - temp = if_stack; - if_stack = if_stack->next; - free (temp); - break; - - case T_INCLUDE: - case T_INCLUDE_NEXT: - case T_IMPORT: - skipping_include_directive = 1; - break; - - default: - break; - } - break; - } - } - /* Don't let erroneous code go by. */ - if (kt->length < 0 && !lang_asm && pedantic) - pedwarn ("invalid preprocessing directive name"); - } - } - - ip->bufp = bp; - /* after this returns, rescan will exit because ip->bufp - now points to the end of the buffer. - rescan is responsible for the error message also. */ - - done: - if (output_conditionals && op != 0) { - char *ptr = "#endfailed\n"; - int len = strlen (ptr); - - if (op->bufp > op->buf && op->bufp[-1] != '\n') - { - *op->bufp++ = '\n'; - op->lineno++; - } - check_expand (op, beg_of_line - beg_of_group); - bcopy ((char *) beg_of_group, (char *) op->bufp, - beg_of_line - beg_of_group); - op->bufp += beg_of_line - beg_of_group; - op->lineno += ip->lineno - beg_lineno; - check_expand (op, len); - bcopy (ptr, (char *) op->bufp, len); - op->bufp += len; - op->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 (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - FILE_BUF *ip = &instack[indepth]; - - if (pedantic) { - SKIP_WHITE_SPACE (buf); - if (buf != limit) - pedwarn ("text following `#else' violates ANSI standard"); - } - - if (if_stack == instack[indepth].if_stack) { - error ("`#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. */ - if_stack->control_macro = 0; - - if (if_stack->type != T_IF && if_stack->type != T_ELIF) { - error ("`#else' after `#else'"); - fprintf (stderr, " (matches line %d", if_stack->lineno); - if (! (if_stack->fname_len == ip->nominal_fname_len - && !bcmp (if_stack->fname, ip->nominal_fname, - if_stack->fname_len))) { - fprintf (stderr, ", file "); - eprint_string (if_stack->fname, if_stack->fname_len); - } - fprintf (stderr, ")\n"); - } - if_stack->type = T_ELSE; - } - - if (if_stack->if_succeeded) - skip_if_group (ip, 0, op); - else { - ++if_stack->if_succeeded; /* continue processing input */ - output_line_directive (ip, op, 1, same_file); - } - return 0; -} - -/* Unstack after #endif directive. */ - -static int -do_endif (buf, limit, op, keyword) - U_CHAR *buf, *limit; - FILE_BUF *op; - struct directive *keyword ATTRIBUTE_UNUSED; -{ - if (pedantic) { - SKIP_WHITE_SPACE (buf); - if (buf != limit) - pedwarn ("text following `#endif' violates ANSI standard"); - } - - if (if_stack == instack[indepth].if_stack) - error ("unbalanced `#endif'"); - else { - IF_STACK_FRAME *temp = if_stack; - if_stack = if_stack->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. */ - FILE_BUF *ip = &instack[indepth]; - U_CHAR *p = ip->bufp; - U_CHAR *ep = ip->buf + ip->length; - - while (p != ep) { - U_CHAR c = *p++; - if (!is_space[c]) { - if (c == '/' - && (*p == '*' || (cplusplus_comments && *p == '/'))) { - /* Skip this comment. */ - int junk = 0; - U_CHAR *save_bufp = ip->bufp; - ip->bufp = p + 1; - p = skip_to_end_of_comment (ip, &junk, 1); - ip->bufp = save_bufp; - } else - goto fail; - } - } - /* If we get here, 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. - - Do not do this for the top-level file in a -include or any - file in a -imacros. */ - if (indepth != 0 - && ! (indepth == 1 && no_record_file) - && ! (no_record_file && no_output)) - record_control_macro (ip->inc, temp->control_macro); - fail: ; - } - free (temp); - output_line_directive (&instack[indepth], op, 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 directive name. P points to the first char after the directive - name. */ - -static void -validate_else (p, limit) - register U_CHAR *p; - register U_CHAR *limit; -{ - /* Advance P over whitespace and comments. */ - while (1) { - while (*p == '\\' && p[1] == '\n') - p += 2; - if (is_hor_space[*p]) - p++; - else if (*p == '/') { - while (p[1] == '\\' && p[2] == '\n') - p += 2; - if (p[1] == '*') { - /* Don't bother warning about unterminated comments - since that will happen later. Just be sure to exit. */ - for (p += 2; ; p++) { - if (p == limit) - return; - if (*p == '*') { - while (p[1] == '\\' && p[2] == '\n') - p += 2; - if (p[1] == '/') { - p += 2; - break; - } - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (p, limit - p); - if (length > 1) - p += (length - 1); -#endif - } - } - } - else if (cplusplus_comments && p[1] == '/') - return; - else break; - } else break; - } - if (*p != '\n') - pedwarn ("text following `#else' or `#endif' violates ANSI standard"); -} - -/* Skip a comment, assuming the input ptr immediately follows the - initial slash-star. Bump *LINE_COUNTER for each newline. - (The canonical line counter is &ip->lineno.) - Don't use this routine (or the next one) if bumping the line - counter is not sufficient to deal with newlines in the string. - - If NOWARN is nonzero, don't warn about slash-star inside a comment. - This feature is useful when processing a comment that is going to - be processed or was processed at another point in the preprocessor, - to avoid a duplicate warning. Likewise for unterminated comment - errors. */ - -static U_CHAR * -skip_to_end_of_comment (ip, line_counter, nowarn) - register FILE_BUF *ip; - int *line_counter; /* place to remember newlines, or NULL */ - int nowarn; -{ - register U_CHAR *limit = ip->buf + ip->length; - register U_CHAR *bp = ip->bufp; - FILE_BUF *op = put_out_comments && !line_counter ? &outbuf : (FILE_BUF *) 0; - int start_line = line_counter ? *line_counter : 0; - - /* JF this line_counter stuff is a crock to make sure the - comment is only put out once, no matter how many times - the comment is skipped. It almost works */ - if (op) { - *op->bufp++ = '/'; - *op->bufp++ = bp[-1]; - } - if (cplusplus_comments && bp[-1] == '/') { - for (; bp < limit; bp++) { - if (*bp == '\n') - break; - if (*bp == '\\' && bp + 1 < limit && bp[1] == '\n') - { - if (!nowarn && warn_comments) - warning ("multiline `//' comment"); - if (line_counter) - ++*line_counter; - if (op) - { - ++op->lineno; - *op->bufp++ = *bp; - } - ++bp; - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (bp, limit - bp); - if (length > 1) - { - if (op) - { - bcopy (bp, op->bufp, length - 1); - op->bufp += (length - 1); - } - bp += (length - 1); - } -#endif - } - if (op) - *op->bufp++ = *bp; - } - ip->bufp = bp; - return bp; - } - while (bp < limit) { - if (op) - *op->bufp++ = *bp; - switch (*bp++) { - case '\n': - /* If this is the end of the file, we have an unterminated comment. - Don't swallow the newline. We are guaranteed that there will be a - trailing newline and various pieces assume it's there. */ - if (bp == limit) - { - --bp; - --limit; - break; - } - if (line_counter != NULL) - ++*line_counter; - if (op) - ++op->lineno; - break; - case '*': - if (bp[-2] == '/' && !nowarn && warn_comments) - warning ("`/*' within comment"); - if (*bp == '\\' && bp[1] == '\n') - newline_fix (bp); - if (*bp == '/') { - if (op) - *op->bufp++ = '/'; - ip->bufp = ++bp; - return bp; - } - break; -#ifdef MULTIBYTE_CHARS - default: - { - int length; - bp--; - length = local_mblen (bp, limit - bp); - if (length <= 0) - length = 1; - if (op) - { - op->bufp--; - bcopy (bp, op->bufp, length); - op->bufp += length; - } - bp += length; - } -#endif - } - } - - if (!nowarn) - error_with_line (line_for_error (start_line), "unterminated comment"); - ip->bufp = bp; - return bp; -} - -/* Skip over a quoted string. BP points to the opening quote. - Returns a pointer after the closing quote. Don't go past LIMIT. - START_LINE is the line number of the starting point (but it need - not be valid if the starting point is inside a macro expansion). - - The input stack state is not changed. - - If COUNT_NEWLINES is nonzero, it points to an int to increment - for each newline passed. - - If BACKSLASH_NEWLINES_P is nonzero, store 1 thru it - if we pass a backslash-newline. - - If EOFP is nonzero, set *EOFP to 1 if the string is unterminated. */ - -static U_CHAR * -skip_quoted_string (bp, limit, start_line, count_newlines, backslash_newlines_p, eofp) - register U_CHAR *bp; - register U_CHAR *limit; - int start_line; - int *count_newlines; - int *backslash_newlines_p; - int *eofp; -{ - register U_CHAR c, match; - - match = *bp++; - while (1) { - if (bp >= limit) { - error_with_line (line_for_error (start_line), - "unterminated string or character constant"); - error_with_line (multiline_string_line, - "possible real start of unterminated constant"); - multiline_string_line = 0; - if (eofp) - *eofp = 1; - break; - } - c = *bp++; - if (c == '\\') { - while (*bp == '\\' && bp[1] == '\n') { - if (backslash_newlines_p) - *backslash_newlines_p = 1; - if (count_newlines) - ++*count_newlines; - bp += 2; - } - if (*bp == '\n') { - if (backslash_newlines_p) - *backslash_newlines_p = 1; - if (count_newlines) - ++*count_newlines; - } - bp++; - } else if (c == '\n') { - if (traditional) { - /* Unterminated strings and character constants are 'valid'. */ - bp--; /* Don't consume the newline. */ - if (eofp) - *eofp = 1; - break; - } - if (match == '\'') { - error_with_line (line_for_error (start_line), - "unterminated string or character constant"); - bp--; - if (eofp) - *eofp = 1; - break; - } - /* If not traditional, then allow newlines inside strings. */ - if (count_newlines) - ++*count_newlines; - if (multiline_string_line == 0) { - if (pedantic) - pedwarn_with_line (line_for_error (start_line), - "string constant runs past end of line"); - multiline_string_line = start_line; - } - } else if (c == match) - break; -#ifdef MULTIBYTE_CHARS - { - int length; - --bp; - length = local_mblen (bp, limit - bp); - if (length <= 0) - length = 1; - bp += length; - } -#endif - } - return bp; -} - -/* Place into DST a quoted string representing the string SRC. - SRCLEN is the length of SRC; SRC may contain null bytes. - Return the address of DST's terminating null. */ - -static char * -quote_string (dst, src, srclen) - char *dst, *src; - size_t srclen; -{ - U_CHAR c; - char *srclim = src + srclen; - - *dst++ = '\"'; - while (src != srclim) - switch ((c = *src++)) - { - default: - if (ISPRINT (c)) - *dst++ = c; - else - { - sprintf (dst, "\\%03o", c); - dst += 4; - } - break; - - case '\"': - case '\\': - *dst++ = '\\'; - *dst++ = c; - break; - } - - *dst++ = '\"'; - *dst = '\0'; - return dst; -} - -/* Skip across a group of balanced parens, starting from IP->bufp. - IP->bufp is updated. Use this with IP->bufp pointing at an open-paren. - - This does not handle newlines, because it's used for the arg of #if, - where there aren't any newlines. Also, backslash-newline can't appear. */ - -static U_CHAR * -skip_paren_group (ip) - register FILE_BUF *ip; -{ - U_CHAR *limit = ip->buf + ip->length; - U_CHAR *p = ip->bufp; - int depth = 0; - int lines_dummy = 0; - - while (p != limit) { - int c = *p++; - switch (c) { - case '(': - depth++; - break; - - case ')': - depth--; - if (depth == 0) - return ip->bufp = p; - break; - - case '/': - if (*p == '*') { - ip->bufp = p; - p = skip_to_end_of_comment (ip, &lines_dummy, 0); - p = ip->bufp; - } - - case '"': - case '\'': - { - int eofp = 0; - p = skip_quoted_string (p - 1, limit, 0, NULL_PTR, NULL_PTR, &eofp); - if (eofp) - return ip->bufp = p; - } - break; - } - } - - ip->bufp = p; - return p; -} - -/* Write out a #line directive, 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_directive (ip, op, conditional, file_change) - FILE_BUF *ip, *op; - int conditional; - enum file_change_code file_change; -{ - int len; - char *line_directive_buf, *line_end; - - if (no_line_directives - || ip->fname == NULL - || no_output) { - op->lineno = ip->lineno; - return; - } - - if (conditional) { - if (ip->lineno == op->lineno) - return; - - /* If the inherited line number is a little too small, - output some newlines instead of a #line directive. */ - if (ip->lineno > op->lineno && ip->lineno < op->lineno + 8) { - check_expand (op, 10); - while (ip->lineno > op->lineno) { - *op->bufp++ = '\n'; - op->lineno++; - } - return; - } - } - - /* Output a positive line number if possible. */ - while (ip->lineno <= 0 && ip->bufp - ip->buf < ip->length - && *ip->bufp == '\n') { - ip->lineno++; - ip->bufp++; - } - - line_directive_buf = (char *) alloca (4 * ip->nominal_fname_len + 100); - sprintf (line_directive_buf, "# %d ", ip->lineno); - line_end = quote_string (line_directive_buf + strlen (line_directive_buf), - ip->nominal_fname, ip->nominal_fname_len); - if (file_change != same_file) { - *line_end++ = ' '; - *line_end++ = file_change == enter_file ? '1' : '2'; - } - /* Tell cc1 if following text comes from a system header file. */ - if (ip->system_header_p) { - *line_end++ = ' '; - *line_end++ = '3'; - } -#ifndef NO_IMPLICIT_EXTERN_C - /* Tell cc1plus if following text should be treated as C. */ - if (ip->system_header_p == 2 && cplusplus) { - *line_end++ = ' '; - *line_end++ = '4'; - } -#endif - *line_end++ = '\n'; - len = line_end - line_directive_buf; - check_expand (op, len + 1); - if (op->bufp > op->buf && op->bufp[-1] != '\n') - *op->bufp++ = '\n'; - bcopy ((char *) line_directive_buf, (char *) op->bufp, len); - op->bufp += len; - op->lineno = ip->lineno; -} - -/* 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. - `free1' and `free2', if nonzero, point to blocks to be freed - when the macro argument data is no longer needed. */ - -struct argdata { - U_CHAR *raw, *expanded; - int raw_length, expand_length; - int stringified_length; - U_CHAR *free1, *free2; - char newlines; - char use_count; -}; - -/* 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 (hp, op) - HASHNODE *hp; - FILE_BUF *op; -{ - int nargs; - DEFINITION *defn = hp->value.defn; - register U_CHAR *xbuf; - int xbuf_len; - int start_line = instack[indepth].lineno; - int rest_args, rest_zero; - - CHECK_DEPTH (return;); - - /* it might not actually be a macro. */ - if (hp->type != T_MACRO) { - special_symbol (hp, op); - return; - } - - /* 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); - - nargs = defn->nargs; - - if (nargs >= 0) { - register int i; - struct argdata *args; - int parse_error = 0; - - args = (struct argdata *) alloca ((nargs + 1) * sizeof (struct argdata)); - - for (i = 0; i < nargs; i++) { - args[i].raw = (U_CHAR *) ""; - args[i].expanded = 0; - args[i].raw_length = args[i].expand_length - = args[i].stringified_length = 0; - args[i].free1 = args[i].free2 = 0; - 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; - do { - /* Discard the open-parenthesis or comma before the next arg. */ - ++instack[indepth].bufp; - 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; - parse_error = macarg (&args[i], rest_args); - } - else - parse_error = macarg (NULL_PTR, 0); - if (parse_error) { - error_with_line (line_for_error (start_line), - "unterminated macro call"); - break; - } - i++; - } while (*instack[indepth].bufp != ')'); - - /* If we got one arg but it was just whitespace, call that 0 args. */ - if (i == 1) { - register U_CHAR *bp = 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) { - if (! parse_error) - error ("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 && traditional) - ; - /* the rest args token is allowed to absorb 0 tokens */ - else if (i == nargs - 1 && defn->rest_args) - rest_zero = 1; - else if (parse_error) - ; - else if (i == 0) - error ("macro `%s' used without args", hp->name); - else if (i == 1) - error ("macro `%s' used with just one arg", hp->name); - else - error ("macro `%s' used with only %d args", hp->name, i); - } else if (i > nargs) { - if (! parse_error) - error ("macro `%s' used with too many (%d) args", hp->name, i); - } - - /* Swallow the closeparen. */ - ++instack[indepth].bufp; - - /* 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) - xbuf_len += args[ap->argno].stringified_length; - else if (ap->raw_before != 0 || ap->raw_after != 0 || traditional) - /* 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].expanded == 0) { - FILE_BUF obuf; - obuf = expand_to_temp_buffer (args[ap->argno].raw, - args[ap->argno].raw + args[ap->argno].raw_length, - 1, 0); - - args[ap->argno].expanded = obuf.buf; - args[ap->argno].expand_length = obuf.length; - args[ap->argno].free2 = obuf.buf; - } - - /* 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 != 0) - || (last_ap != NULL && last_ap->rest_args - && last_ap->raw_after != 0))) { - /* 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) { - int arglen = arg->raw_length; - int escaped = 0; - int in_string = 0; - int c; - i = 0; - while (i < arglen - && (c = arg->raw[i], is_space[c])) - i++; - while (i < arglen - && (c = arg->raw[arglen - 1], is_space[c])) - arglen--; - if (!traditional) - xbuf[totlen++] = '\"'; /* insert beginning quote */ - for (; i < arglen; i++) { - c = arg->raw[i]; - - if (! in_string) { - /* Special markers Newline Space - generate nothing for a stringified argument. */ - if (c == '\n' && arg->raw[i+1] != '\n') { - i++; - continue; - } - - /* Internal sequences of whitespace are replaced by one space - except within an string or char token. */ - if (c == '\n' ? arg->raw[i+1] == '\n' : is_space[c]) { - while (1) { - /* Note that Newline Space does occur within whitespace - sequences; consider it part of the sequence. */ - if (c == '\n' && is_space[arg->raw[i+1]]) - i += 2; - else if (c != '\n' && is_space[c]) - i++; - else break; - c = arg->raw[i]; - } - i--; - c = ' '; - } - } - - if (escaped) - escaped = 0; - else { - if (c == '\\') - escaped = 1; - else if (in_string) { - if (c == in_string) - in_string = 0; - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (arg->raw + i, arglen - i); - if (length > 1) - { - bcopy (arg->raw + i, xbuf + totlen, length); - i += length - 1; - totlen += length; - continue; - } -#endif - } - } else if (c == '\"' || c == '\'') - in_string = c; - } - - /* Escape these chars */ - if (c == '\"' || (in_string && c == '\\')) - xbuf[totlen++] = '\\'; - /* We used to output e.g. \008 for control characters here, - but this doesn't conform to the C Standard. - Just output the characters as-is. */ - xbuf[totlen++] = c; - } - if (!traditional) - xbuf[totlen++] = '\"'; /* insert ending quote */ - } else if (ap->raw_before != 0 || ap->raw_after != 0 || traditional) { - U_CHAR *p1 = arg->raw; - U_CHAR *l1 = p1 + arg->raw_length; - if (ap->raw_before != 0) { - while (p1 != l1 && is_space[*p1]) p1++; - while (p1 != l1 && is_idchar[*p1]) - xbuf[totlen++] = *p1++; - /* Delete any no-reexpansion marker that follows - an identifier at the beginning of the argument - if the argument is concatenated with what precedes it. */ - if (p1[0] == '\n' && p1[1] == '-') - p1 += 2; - } else if (!traditional) { - /* Ordinary expanded use of the argument. - Put in newline-space markers to prevent token pasting. */ - xbuf[totlen++] = '\n'; - xbuf[totlen++] = ' '; - } - if (ap->raw_after != 0) { - /* 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 a `-' is preceded by an odd number of newlines then it - and the last newline are a no-reexpansion marker. */ - while (p2 != p1 && p2[-1] == '\n') p2--; - if ((l1 - 1 - p2) & 1) { - l1 -= 2; - } - else break; - } - else break; - } - } - - bcopy ((char *) p1, (char *) (xbuf + totlen), l1 - p1); - totlen += l1 - p1; - if (!traditional && ap->raw_after == 0) { - /* Ordinary expanded use of the argument. - Put in newline-space markers to prevent token pasting. */ - xbuf[totlen++] = '\n'; - xbuf[totlen++] = ' '; - } - } else { - /* Ordinary expanded use of the argument. - Put in newline-space markers to prevent token pasting. */ - if (!traditional) { - xbuf[totlen++] = '\n'; - xbuf[totlen++] = ' '; - } - bcopy ((char *) arg->expanded, (char *) (xbuf + totlen), - arg->expand_length); - totlen += arg->expand_length; - if (!traditional) { - xbuf[totlen++] = '\n'; - 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 (arg->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 != 0)) - xbuf[totlen++] = exp[i]; - } - - xbuf[totlen] = 0; - xbuf_len = totlen; - - for (i = 0; i < nargs; i++) { - if (args[i].free1 != 0) - free (args[i].free1); - if (args[i].free2 != 0) - free (args[i].free2); - } - } - } else { - xbuf = defn->expansion; - xbuf_len = defn->length; - } - - /* Now put the expansion on the input stack - so our caller will commence reading from it. */ - { - register FILE_BUF *ip2; - - ip2 = &instack[++indepth]; - - ip2->fname = 0; - ip2->nominal_fname = 0; - ip2->nominal_fname_len = 0; - ip2->inc = 0; - /* This may not be exactly correct, but will give much better error - messages for nested macro calls than using a line number of zero. */ - ip2->lineno = start_line; - ip2->buf = xbuf; - ip2->length = xbuf_len; - ip2->bufp = xbuf; - ip2->free_ptr = (nargs > 0) ? xbuf : 0; - ip2->macro = hp; - ip2->if_stack = if_stack; - ip2->system_header_p = 0; - - /* Recursive macro use sometimes works traditionally. - #define foo(x,y) bar (x (y,0), y) - foo (foo, baz) */ - - if (!traditional) - hp->type = T_DISABLED; - } -} - -/* Parse a macro argument and store the info on it into *ARGPTR. - REST_ARGS is passed to macarg1 to make it absorb the rest of the args. - Return nonzero to indicate a syntax error. */ - -static int -macarg (argptr, rest_args) - register struct argdata *argptr; - int rest_args; -{ - FILE_BUF *ip = &instack[indepth]; - int paren = 0; - int newlines = 0; - int comments = 0; - int result = 0; - - /* Try to parse as much of the argument as exists at this - input stack level. */ - U_CHAR *bp = macarg1 (ip->bufp, ip->buf + ip->length, ip->macro, - &paren, &newlines, &comments, rest_args); - - /* If we find the end of the argument at this level, - set up *ARGPTR to point at it in the input stack. */ - if (!(ip->fname != 0 && (newlines != 0 || comments != 0)) - && bp != ip->buf + ip->length) { - if (argptr != 0) { - argptr->raw = ip->bufp; - argptr->raw_length = bp - ip->bufp; - argptr->newlines = newlines; - } - ip->bufp = bp; - } else { - /* This input stack level ends before the macro argument does. - We must pop levels and keep parsing. - Therefore, we must allocate a temporary buffer and copy - the macro argument into it. */ - int bufsize = bp - ip->bufp; - int extra = newlines; - U_CHAR *buffer = (U_CHAR *) xmalloc (bufsize + extra + 1); - int final_start = 0; - - bcopy ((char *) ip->bufp, (char *) buffer, bufsize); - ip->bufp = bp; - ip->lineno += newlines; - - while (bp == ip->buf + ip->length) { - if (instack[indepth].macro == 0) { - result = 1; - break; - } - ip->macro->type = T_MACRO; - if (ip->free_ptr) - free (ip->free_ptr); - ip = &instack[--indepth]; - newlines = 0; - comments = 0; - bp = macarg1 (ip->bufp, ip->buf + ip->length, ip->macro, &paren, - &newlines, &comments, rest_args); - final_start = bufsize; - bufsize += bp - ip->bufp; - extra += newlines; - buffer = (U_CHAR *) xrealloc (buffer, bufsize + extra + 1); - bcopy ((char *) ip->bufp, (char *) (buffer + bufsize - (bp - ip->bufp)), - bp - ip->bufp); - ip->bufp = bp; - ip->lineno += newlines; - } - - /* Now, if arg is actually wanted, record its raw form, - discarding comments and duplicating newlines in whatever - part of it did not come from a macro expansion. - EXTRA space has been preallocated for duplicating the newlines. - FINAL_START is the index of the start of that part. */ - if (argptr != 0) { - argptr->raw = buffer; - argptr->raw_length = bufsize; - argptr->free1 = buffer; - argptr->newlines = newlines; - if ((newlines || comments) && ip->fname != 0) - argptr->raw_length - = final_start + - discard_comments (argptr->raw + final_start, - argptr->raw_length - final_start, - newlines); - argptr->raw[argptr->raw_length] = 0; - if (argptr->raw_length > bufsize + extra) - abort (); - } - } - - /* If we are not discarding this argument, - macroexpand it and compute its length as stringified. - All this info goes into *ARGPTR. */ - - if (argptr != 0) { - register U_CHAR *buf, *lim; - register int totlen; - - buf = argptr->raw; - lim = buf + argptr->raw_length; - - while (buf != lim && is_space[*buf]) - buf++; - while (buf != lim && is_space[lim[-1]]) - lim--; - totlen = traditional ? 0 : 2; /* Count opening and closing quote. */ - while (buf != lim) { - register U_CHAR c = *buf++; - totlen++; - /* Internal sequences of whitespace are replaced by one space - in most cases, but not always. So count all the whitespace - in case we need to keep it all. */ -#if 0 - if (is_space[c]) - SKIP_ALL_WHITE_SPACE (buf); - else -#endif - if (c == '\"' || c == '\\') /* escape these chars */ - totlen++; - } - argptr->stringified_length = totlen; - } - return result; -} - -/* Scan text from START (inclusive) up to LIMIT (exclusive), - taken from the expansion of MACRO, - counting parens in *DEPTHPTR, - and return if reach LIMIT - or before a `)' that would make *DEPTHPTR negative - or before a comma when *DEPTHPTR is zero. - Single and double quotes are matched and termination - is inhibited within them. Comments also inhibit it. - Value returned is pointer to stopping place. - - Increment *NEWLINES each time a newline is passed. - REST_ARGS notifies macarg1 that it should absorb the rest of the args. - Set *COMMENTS to 1 if a comment is seen. */ - -static U_CHAR * -macarg1 (start, limit, macro, depthptr, newlines, comments, rest_args) - U_CHAR *start; - register U_CHAR *limit; - struct hashnode *macro; - int *depthptr, *newlines, *comments; - int rest_args; -{ - register U_CHAR *bp = start; - - while (bp < limit) { - switch (*bp) { - case '(': - (*depthptr)++; - break; - case ')': - if (--(*depthptr) < 0) - return bp; - break; - case '\\': - /* Traditionally, backslash makes following char not special. */ - if (traditional && bp + 1 < limit && bp[1] != '\n') - bp++; - break; - case '\n': - ++*newlines; - break; - case '/': - if (macro) - break; - if (bp[1] == '\\' && bp[2] == '\n') - newline_fix (bp + 1); - if (bp[1] == '*') { - *comments = 1; - for (bp += 2; bp < limit; bp++) { - if (*bp == '\n') - ++*newlines; - else if (*bp == '*') { - if (bp[-1] == '/' && warn_comments) - warning ("`/*' within comment"); - if (bp[1] == '\\' && bp[2] == '\n') - newline_fix (bp + 1); - if (bp[1] == '/') { - bp++; - break; - } - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (bp, limit - bp); - if (length > 1) - bp += (length - 1); -#endif - } - } - } else if (bp[1] == '/' && cplusplus_comments) { - *comments = 1; - for (bp += 2; bp < limit; bp++) { - if (*bp == '\n') { - ++*newlines; - break; - } - if (*bp == '\\' && bp + 1 < limit && bp[1] == '\n') - { - ++*newlines; - if (warn_comments) - warning ("multiline `//' comment"); - ++bp; - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (bp, limit - bp); - if (length > 1) - bp += (length - 1); -#endif - } - } - } - break; - case '\'': - case '\"': - { - int quotec; - for (quotec = *bp++; bp + 1 < limit && *bp != quotec; bp++) { - if (*bp == '\\') { - bp++; - if (*bp == '\n') - ++*newlines; - if (!macro) { - while (*bp == '\\' && bp[1] == '\n') { - bp += 2; - ++*newlines; - } - } - } else if (*bp == '\n') { - ++*newlines; - if (quotec == '\'') - break; - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - length = local_mblen (bp, limit - bp); - if (length > 1) - bp += (length - 1); -#endif - } - } - } - break; - case ',': - /* if we've returned to lowest level and we aren't absorbing all args */ - if ((*depthptr) == 0 && rest_args == 0) - return bp; - break; - } - bp++; - } - - return bp; -} - -/* Discard comments and duplicate newlines - in the string of length LENGTH at START, - except inside of string constants. - The string is copied into itself with its beginning staying fixed. - - NEWLINES is the number of newlines that must be duplicated. - We assume that that much extra space is available past the end - of the string. */ - -static int -discard_comments (start, length, newlines) - U_CHAR *start; - int length; - int newlines; -{ - register U_CHAR *ibp; - register U_CHAR *obp; - register U_CHAR *limit; - register int c; - - /* If we have newlines to duplicate, copy everything - that many characters up. Then, in the second part, - we will have room to insert the newlines - while copying down. - NEWLINES may actually be too large, because it counts - newlines in string constants, and we don't duplicate those. - But that does no harm. */ - if (newlines > 0) { - ibp = start + length; - obp = ibp + newlines; - limit = start; - while (limit != ibp) - *--obp = *--ibp; - } - - ibp = start + newlines; - limit = start + length + newlines; - obp = start; - - while (ibp < limit) { - *obp++ = c = *ibp++; - switch (c) { - case '\n': - /* Duplicate the newline. */ - *obp++ = '\n'; - break; - - case '\\': - if (*ibp == '\n') { - obp--; - ibp++; - } - break; - - case '/': - if (*ibp == '\\' && ibp[1] == '\n') - newline_fix (ibp); - /* Delete any comment. */ - if (cplusplus_comments && ibp[0] == '/') { - /* Comments are equivalent to spaces. */ - obp[-1] = ' '; - ibp++; - while (ibp < limit) - { - if (*ibp == '\n') - break; - if (*ibp == '\\' && ibp + 1 < limit && ibp[1] == '\n') - ibp++; - else - { -#ifdef MULTIBYTE_CHARS - int length = local_mblen (ibp, limit - ibp); - if (length > 1) - ibp += (length - 1); -#endif - } - ibp++; - } - break; - } - if (ibp[0] != '*' || ibp + 1 >= limit) - break; - /* Comments are equivalent to spaces. - For -traditional, a comment is equivalent to nothing. */ - if (traditional) - obp--; - else - obp[-1] = ' '; - while (++ibp < limit) { - if (ibp[0] == '*') { - if (ibp[1] == '\\' && ibp[2] == '\n') - newline_fix (ibp + 1); - if (ibp[1] == '/') { - ibp += 2; - break; - } - } - else - { -#ifdef MULTIBYTE_CHARS - int length = local_mblen (ibp, limit - ibp); - if (length > 1) - ibp += (length - 1); -#endif - } - } - break; - - case '\'': - case '\"': - /* Notice and skip strings, so that we don't - think that comments start inside them, - and so we don't duplicate newlines in them. */ - { - int quotec = c; - while (ibp < limit) { - *obp++ = c = *ibp++; - if (c == quotec) - break; - if (c == '\n') - { - if (quotec == '\'') - break; - } - else if (c == '\\') { - if (ibp < limit && *ibp == '\n') { - ibp++; - obp--; - } else { - while (*ibp == '\\' && ibp[1] == '\n') - ibp += 2; - if (ibp < limit) - *obp++ = *ibp++; - } - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - ibp--; - length = local_mblen (ibp, limit - ibp); - if (length > 1) - { - obp--; - bcopy (ibp, obp, length); - ibp += length; - obp += length; - } - else - ibp++; -#endif - } - } - } - break; - } - } - - return obp - start; -} - -/* 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 (start, length) - 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 '\n': - /* If this is a NEWLINE NEWLINE, then this is a real newline in the - string. Skip past the newline and its duplicate. - Put a space in the output. */ - if (*ibp == '\n') - { - ibp++; - obp--; - *obp++ = ' '; - } - break; - - 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; - else if (c == '\\' && ibp < limit && *ibp == '\n') - *obp++ = *ibp++; - else if (c == '\n') - { - if (quotec == '\'') - break; - } - else - { -#ifdef MULTIBYTE_CHARS - int length; - ibp--; - length = local_mblen (ibp, limit - ibp); - if (length > 1) - { - obp--; - bcopy (ibp, obp, length); - ibp += length; - obp += length; - } - else - ibp++; -#endif - } - } - } - break; - } - } - - return obp - start; -} - -/* my_strerror - return the descriptive text associated with an - `errno' code. */ - -static char * -my_strerror (errnum) - int errnum; -{ - char *result; - -#ifndef VMS -#ifndef HAVE_STRERROR - result = (char *) ((errnum < sys_nerr) ? sys_errlist[errnum] : 0); -#else - result = strerror (errnum); -#endif -#else /* VMS */ - /* VAXCRTL's strerror() takes an optional second argument, which only - matters when the first argument is EVMSERR. However, it's simplest - just to pass it unconditionally. `vaxc$errno' is declared in - <errno.h>, and maintained by the library in parallel with `errno'. - We assume that caller's `errnum' either matches the last setting of - `errno' by the library or else does not have the value `EVMSERR'. */ - - result = strerror (errnum, vaxc$errno); -#endif - - if (!result) - result = "errno = ?"; - - return result; -} - -/* notice - output message to stderr */ - -static void -notice VPROTO ((const char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - msgid = va_arg (args, const char *); -#endif - - vnotice (msgid, args); - va_end (args); -} - -static void -vnotice (msgid, args) - const char *msgid; - va_list args; -{ - vfprintf (stderr, _(msgid), args); -} - -/* error - print error message and increment count of errors. */ - -void -error VPROTO ((const char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - msgid = va_arg (args, const char *); -#endif - - verror (msgid, args); - va_end (args); -} - -void -verror (msgid, args) - const char *msgid; - va_list args; -{ - int i; - FILE_BUF *ip = NULL; - - print_containing_files (); - - for (i = indepth; i >= 0; i--) - if (instack[i].fname != NULL) { - ip = &instack[i]; - break; - } - - if (ip != NULL) { - eprint_string (ip->nominal_fname, ip->nominal_fname_len); - fprintf (stderr, ":%d: ", ip->lineno); - } - vnotice (msgid, args); - fprintf (stderr, "\n"); - errors++; -} - -/* Error including a message from `errno'. */ - -static void -error_from_errno (name) - char *name; -{ - int e = errno; - int i; - FILE_BUF *ip = NULL; - - print_containing_files (); - - for (i = indepth; i >= 0; i--) - if (instack[i].fname != NULL) { - ip = &instack[i]; - break; - } - - if (ip != NULL) { - eprint_string (ip->nominal_fname, ip->nominal_fname_len); - fprintf (stderr, ":%d: ", ip->lineno); - } - - fprintf (stderr, "%s: %s\n", name, my_strerror (e)); - - errors++; -} - -/* Print error message but don't count it. */ - -void -warning VPROTO ((const char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - msgid = va_arg (args, const char *); -#endif - - vwarning (msgid, args); - va_end (args); -} - -static void -vwarning (msgid, args) - const char *msgid; - va_list args; -{ - int i; - FILE_BUF *ip = NULL; - - if (inhibit_warnings) - return; - - if (warnings_are_errors) - errors++; - - print_containing_files (); - - for (i = indepth; i >= 0; i--) - if (instack[i].fname != NULL) { - ip = &instack[i]; - break; - } - - if (ip != NULL) { - eprint_string (ip->nominal_fname, ip->nominal_fname_len); - fprintf (stderr, ":%d: ", ip->lineno); - } - notice ("warning: "); - vnotice (msgid, args); - fprintf (stderr, "\n"); -} - -static void -error_with_line VPROTO ((int line, const char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - int line; - const char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - line = va_arg (args, int); - msgid = va_arg (args, const char *); -#endif - - verror_with_line (line, msgid, args); - va_end (args); -} - - -static void -verror_with_line (line, msgid, args) - int line; - const char *msgid; - va_list args; -{ - int i; - FILE_BUF *ip = NULL; - - print_containing_files (); - - for (i = indepth; i >= 0; i--) - if (instack[i].fname != NULL) { - ip = &instack[i]; - break; - } - - if (ip != NULL) { - eprint_string (ip->nominal_fname, ip->nominal_fname_len); - fprintf (stderr, ":%d: ", line); - } - vnotice (msgid, args); - fprintf (stderr, "\n"); - errors++; -} - -static void -warning_with_line VPROTO ((int line, const char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - int line; - const char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - line = va_arg (args, int); - msgid = va_arg (args, const char *); -#endif - - vwarning_with_line (line, msgid, args); - va_end (args); -} - -static void -vwarning_with_line (line, msgid, args) - int line; - const char *msgid; - va_list args; -{ - int i; - FILE_BUF *ip = NULL; - - if (inhibit_warnings) - return; - - if (warnings_are_errors) - errors++; - - print_containing_files (); - - for (i = indepth; i >= 0; i--) - if (instack[i].fname != NULL) { - ip = &instack[i]; - break; - } - - if (ip != NULL) { - eprint_string (ip->nominal_fname, ip->nominal_fname_len); - fprintf (stderr, line ? ":%d: " : ": ", line); - } - notice ("warning: "); - vnotice (msgid, args); - fprintf (stderr, "\n"); -} - -/* Print an error message and maybe count it. */ - -void -pedwarn VPROTO ((const char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - msgid = va_arg (args, const char *); -#endif - - if (pedantic_errors) - verror (msgid, args); - else - vwarning (msgid, args); - va_end (args); -} - -void -pedwarn_with_line VPROTO ((int line, const char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - int line; - const char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - line = va_arg (args, int); - msgid = va_arg (args, const char *); -#endif - - if (pedantic_errors) - verror_with_line (line, msgid, args); - else - vwarning_with_line (line, msgid, args); - va_end (args); -} - -/* Report a warning (or an error if pedantic_errors) - giving specified file name and line number, not current. */ - -static void -pedwarn_with_file_and_line VPROTO ((const char *file, size_t file_len, int line, - const char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char *file; - size_t file_len; - int line; - const char * msgid; -#endif - va_list args; - - if (!pedantic_errors && inhibit_warnings) - return; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - file = va_arg (args, const char *); - file_len = va_arg (args, size_t); - line = va_arg (args, int); - msgid = va_arg (args, const char *); -#endif - - if (file) { - eprint_string (file, file_len); - fprintf (stderr, ":%d: ", line); - } - if (pedantic_errors) - errors++; - if (!pedantic_errors) - notice ("warning: "); - vnotice (msgid, args); - va_end (args); - fprintf (stderr, "\n"); -} - -static void -pedwarn_strange_white_space (ch) - int ch; -{ - switch (ch) - { - case '\f': pedwarn ("formfeed in preprocessing directive"); break; - case '\r': pedwarn ("carriage return in preprocessing directive"); break; - case '\v': pedwarn ("vertical tab in preprocessing directive"); break; - default: abort (); - } -} - -/* Print the file names and line numbers of the #include - directives which led to the current file. */ - -static void -print_containing_files () -{ - FILE_BUF *ip = NULL; - int i; - int first = 1; - - /* If stack of files hasn't changed since we last printed - this info, don't repeat it. */ - if (last_error_tick == input_file_stack_tick) - return; - - for (i = indepth; i >= 0; i--) - if (instack[i].fname != NULL) { - ip = &instack[i]; - break; - } - - /* Give up if we don't find a source file. */ - if (ip == NULL) - return; - - /* Find the other, outer source files. */ - for (i--; i >= 0; i--) - if (instack[i].fname != NULL) { - ip = &instack[i]; - if (first) { - first = 0; - notice ( "In file included from "); - } else { - notice (",\n from "); - } - - eprint_string (ip->nominal_fname, ip->nominal_fname_len); - fprintf (stderr, ":%d", ip->lineno); - } - if (! first) - fprintf (stderr, ":\n"); - - /* Record we have printed the status as of this time. */ - last_error_tick = input_file_stack_tick; -} - -/* Return the line at which an error occurred. - The error is not necessarily associated with the current spot - in the input stack, so LINE says where. LINE will have been - copied from ip->lineno for the current input level. - If the current level is for a file, we return LINE. - But if the current level is not for a file, LINE is meaningless. - In that case, we return the lineno of the innermost file. */ - -static int -line_for_error (line) - int line; -{ - int i; - int line1 = line; - - for (i = indepth; i >= 0; ) { - if (instack[i].fname != 0) - return line1; - i--; - if (i < 0) - return 0; - line1 = instack[i].lineno; - } - abort (); - /*NOTREACHED*/ - return 0; -} - -/* - * If OBUF doesn't have NEEDED bytes after OPTR, make it bigger. - * - * As things stand, nothing is ever placed in the output buffer to be - * removed again except when it's KNOWN to be part of an identifier, - * so flushing and moving down everything left, instead of expanding, - * should work ok. - */ - -/* You might think void was cleaner for the return type, - but that would get type mismatch in check_expand in strict ANSI. */ - -static int -grow_outbuf (obuf, needed) - register FILE_BUF *obuf; - register int needed; -{ - register U_CHAR *p; - int minsize; - - if (obuf->length - (obuf->bufp - obuf->buf) > needed) - return 0; - - /* Make it at least twice as big as it is now. */ - obuf->length *= 2; - /* Make it have at least 150% of the free space we will need. */ - minsize = (3 * needed) / 2 + (obuf->bufp - obuf->buf); - if (minsize > obuf->length) - obuf->length = minsize; - - if ((p = (U_CHAR *) xrealloc (obuf->buf, obuf->length)) == NULL) - memory_full (); - - obuf->bufp = p + (obuf->bufp - obuf->buf); - obuf->buf = p; - - return 0; -} - -/* Symbol table for macro names and special symbols */ - -/* - * 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. - */ - -static HASHNODE * -install (name, len, type, value, hash) - U_CHAR *name; - int len; - enum node_type type; - char *value; - int hash; -{ - register HASHNODE *hp; - register int i, bucket; - register U_CHAR *p, *q; - - 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; - hp->value.cpval = value; - hp->name = ((U_CHAR *) hp) + sizeof (HASHNODE); - p = hp->name; - q = name; - for (i = 0; i < len; i++) - *p++ = *q++; - hp->name[len] = 0; - return hp; -} - -/* - * 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 * -lookup (name, len, hash) - U_CHAR *name; - int len; - int hash; -{ - register 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 && bcmp (bucket->name, name, len) == 0) - return bucket; - bucket = bucket->next; - } - return NULL; -} - -/* - * 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. */ - -static 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 0 - 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); - } - free (d); - } -#endif - free (hp); -} - -/* - * return hash function on name. must be compatible with the one - * computed a step at a time, elsewhere - */ - -static int -hashf (name, len, hashsize) - register U_CHAR *name; - register int len; - int hashsize; -{ - register int r = 0; - - while (len--) - r = HASHSTEP (r, *name++); - - return MAKE_POS (r) % hashsize; -} - - -/* Dump the definition of a single macro HP to OF. */ - -static void -dump_single_macro (hp, of) - register HASHNODE *hp; - FILE *of; -{ - register DEFINITION *defn = hp->value.defn; - struct reflist *ap; - int offset; - int concat; - - - /* Print the definition of the macro HP. */ - - fprintf (of, "#define %s", hp->name); - - if (defn->nargs >= 0) { - int i; - - fprintf (of, "("); - for (i = 0; i < defn->nargs; i++) { - dump_arg_n (defn, i, of); - if (i + 1 < defn->nargs) - fprintf (of, ", "); - } - fprintf (of, ")"); - } - - fprintf (of, " "); - - offset = 0; - concat = 0; - for (ap = defn->pattern; ap != NULL; ap = ap->next) { - dump_defn_1 (defn->expansion, offset, ap->nchars, of); - offset += ap->nchars; - if (!traditional) { - if (ap->nchars != 0) - concat = 0; - if (ap->stringify) { - switch (ap->stringify) { - case SHARP_TOKEN: fprintf (of, "#"); break; - case WHITE_SHARP_TOKEN: fprintf (of, "# "); break; - case PERCENT_COLON_TOKEN: fprintf (of, "%%:"); break; - case WHITE_PERCENT_COLON_TOKEN: fprintf (of, "%%: "); break; - default: abort (); - } - } - if (ap->raw_before != 0) { - if (concat) { - switch (ap->raw_before) { - case WHITE_SHARP_TOKEN: - case WHITE_PERCENT_COLON_TOKEN: - fprintf (of, " "); - break; - default: - break; - } - } else { - switch (ap->raw_before) { - case SHARP_TOKEN: fprintf (of, "##"); break; - case WHITE_SHARP_TOKEN: fprintf (of, "## "); break; - case PERCENT_COLON_TOKEN: fprintf (of, "%%:%%:"); break; - case WHITE_PERCENT_COLON_TOKEN: fprintf (of, "%%:%%: "); break; - default: abort (); - } - } - } - concat = 0; - } - dump_arg_n (defn, ap->argno, of); - if (!traditional && ap->raw_after != 0) { - switch (ap->raw_after) { - case SHARP_TOKEN: fprintf (of, "##"); break; - case WHITE_SHARP_TOKEN: fprintf (of, " ##"); break; - case PERCENT_COLON_TOKEN: fprintf (of, "%%:%%:"); break; - case WHITE_PERCENT_COLON_TOKEN: fprintf (of, " %%:%%:"); break; - default: abort (); - } - concat = 1; - } - } - dump_defn_1 (defn->expansion, offset, defn->length - offset, of); - fprintf (of, "\n"); -} - -/* Dump all macro definitions as #defines to stdout. */ - -static void -dump_all_macros () -{ - int bucket; - - for (bucket = 0; bucket < HASHSIZE; bucket++) { - register HASHNODE *hp; - - for (hp = hashtab[bucket]; hp; hp= hp->next) { - if (hp->type == T_MACRO) - dump_single_macro (hp, stdout); - } - } -} - -/* Output to OF a substring of a macro definition. - BASE is the beginning of the definition. - Output characters START thru LENGTH. - Unless traditional, discard newlines outside of strings, thus - converting funny-space markers to ordinary spaces. */ - -static void -dump_defn_1 (base, start, length, of) - U_CHAR *base; - int start; - int length; - FILE *of; -{ - U_CHAR *p = base + start; - U_CHAR *limit = base + start + length; - - if (traditional) - fwrite (p, sizeof (*p), length, of); - else { - while (p < limit) { - if (*p == '\"' || *p =='\'') { - U_CHAR *p1 = skip_quoted_string (p, limit, 0, NULL_PTR, - NULL_PTR, NULL_PTR); - fwrite (p, sizeof (*p), p1 - p, of); - p = p1; - } else { - if (*p != '\n') - putc (*p, of); - p++; - } - } - } -} - -/* Print the name of argument number ARGNUM of macro definition DEFN - to OF. - Recall that DEFN->args.argnames contains all the arg names - concatenated in reverse order with comma-space in between. */ - -static void -dump_arg_n (defn, argnum, of) - DEFINITION *defn; - int argnum; - FILE *of; -{ - register U_CHAR *p = defn->args.argnames; - while (argnum + 1 < defn->nargs) { - p = (U_CHAR *) index ((char *) p, ' ') + 1; - argnum++; - } - - while (*p && *p != ',') { - putc (*p, of); - p++; - } -} - -/* 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. - */ - for (i = 'a'; i <= 'z'; i++) { - is_idchar[i - 'a' + 'A'] = 1; - is_idchar[i] = 1; - is_idstart[i - 'a' + 'A'] = 1; - is_idstart[i] = 1; - } - for (i = '0'; i <= '9'; i++) - is_idchar[i] = 1; - is_idchar['_'] = 1; - is_idstart['_'] = 1; - 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; -} - -/* Initialize the built-in macros. */ - -static void -initialize_builtins (inp, outp) - FILE_BUF *inp; - FILE_BUF *outp; -{ - install ((U_CHAR *) "__LINE__", -1, T_SPECLINE, NULL_PTR, -1); - install ((U_CHAR *) "__DATE__", -1, T_DATE, NULL_PTR, -1); - install ((U_CHAR *) "__FILE__", -1, T_FILE, NULL_PTR, -1); - install ((U_CHAR *) "__BASE_FILE__", -1, T_BASE_FILE, NULL_PTR, -1); - install ((U_CHAR *) "__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL, NULL_PTR, -1); - install ((U_CHAR *) "__VERSION__", -1, T_VERSION, NULL_PTR, -1); -#ifndef NO_BUILTIN_SIZE_TYPE - install ((U_CHAR *) "__SIZE_TYPE__", -1, T_SIZE_TYPE, NULL_PTR, -1); -#endif -#ifndef NO_BUILTIN_PTRDIFF_TYPE - install ((U_CHAR *) "__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE, NULL_PTR, -1); -#endif - install ((U_CHAR *) "__WCHAR_TYPE__", -1, T_WCHAR_TYPE, NULL_PTR, -1); - install ((U_CHAR *) "__USER_LABEL_PREFIX__", -1, T_USER_LABEL_PREFIX_TYPE, - NULL_PTR, -1); - install ((U_CHAR *) "__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE, - NULL_PTR, -1); - install ((U_CHAR *) "__IMMEDIATE_PREFIX__", -1, T_IMMEDIATE_PREFIX_TYPE, - NULL_PTR, -1); - install ((U_CHAR *) "__TIME__", -1, T_TIME, NULL_PTR, -1); - if (!traditional) { - install ((U_CHAR *) "__STDC__", -1, T_CONST, "1", -1); - install ((U_CHAR *) "__STDC_VERSION__", -1, T_CONST, "199409L", -1); - } -/* This is supplied using a -D by the compiler driver - so that it is present only when truly compiling with GNU C. */ -/* install ((U_CHAR *) "__GNUC__", -1, T_CONST, "2", -1); */ - install ((U_CHAR *) "__HAVE_BUILTIN_SETJMP__", -1, T_CONST, "1", -1); - - if (debug_output) - { - char directive[2048]; - U_CHAR *udirective = (U_CHAR *) directive; - register struct directive *dp = &directive_table[0]; - struct tm *timebuf = timestamp (); - - sprintf (directive, " __BASE_FILE__ \"%s\"\n", - instack[0].nominal_fname); - output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (udirective, &udirective[strlen (directive)], - outp, dp); - - sprintf (directive, " __VERSION__ \"%s\"\n", version_string); - output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (udirective, &udirective[strlen (directive)], - outp, dp); - -#ifndef NO_BUILTIN_SIZE_TYPE - sprintf (directive, " __SIZE_TYPE__ %s\n", SIZE_TYPE); - output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (udirective, &udirective[strlen (directive)], - outp, dp); -#endif - -#ifndef NO_BUILTIN_PTRDIFF_TYPE - sprintf (directive, " __PTRDIFF_TYPE__ %s\n", PTRDIFF_TYPE); - output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (udirective, &udirective[strlen (directive)], - outp, dp); -#endif - - sprintf (directive, " __WCHAR_TYPE__ %s\n", wchar_type); - output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (udirective, &udirective[strlen (directive)], - outp, dp); - - sprintf (directive, " __DATE__ \"%s %2d %4d\"\n", - monthnames[timebuf->tm_mon], - timebuf->tm_mday, timebuf->tm_year + 1900); - output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (udirective, &udirective[strlen (directive)], - outp, dp); - - sprintf (directive, " __TIME__ \"%02d:%02d:%02d\"\n", - timebuf->tm_hour, timebuf->tm_min, timebuf->tm_sec); - output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (udirective, &udirective[strlen (directive)], - outp, dp); - - if (!traditional) - { - sprintf (directive, " __STDC__ 1"); - output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (udirective, &udirective[strlen (directive)], - outp, dp); - } - if (objc) - { - sprintf (directive, " __OBJC__ 1"); - output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (udirective, &udirective[strlen (directive)], - outp, dp); - } - } -} - -/* - * 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. - */ - -static void -make_definition (str) - char *str; -{ - FILE_BUF *ip; - struct directive *kt; - U_CHAR *buf, *p; - - p = buf = (U_CHAR *) str; - if (!is_idstart[*p]) { - error ("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 != '=') { - error ("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 ((char *) buf, str, p - (U_CHAR *) str); - /* Change the = to a space. */ - buf[p - (U_CHAR *) str] = ' '; - /* Scan for any backslash-newline and remove it. */ - p++; - q = &buf[p - (U_CHAR *) str]; - while (*p) { - if (*p == '\"' || *p == '\'') { - int unterminated = 0; - U_CHAR *p1 = skip_quoted_string (p, p + strlen ((char *) p), 0, - NULL_PTR, NULL_PTR, &unterminated); - if (unterminated) - return; - while (p != p1) - *q++ = *p++; - } else if (*p == '\\' && p[1] == '\n') - p += 2; - /* Change newline chars into newline-markers. */ - else if (*p == '\n') - { - *q++ = '\n'; - *q++ = '\n'; - p++; - } - else - *q++ = *p++; - } - *q = 0; - } - - ip = &instack[++indepth]; - ip->nominal_fname = ip->fname = "*Initialization*"; - ip->nominal_fname_len = strlen (ip->nominal_fname); - - ip->buf = ip->bufp = buf; - ip->length = strlen ((char *) buf); - ip->lineno = 1; - ip->macro = 0; - ip->free_ptr = 0; - ip->if_stack = if_stack; - ip->system_header_p = 0; - - for (kt = directive_table; kt->type != T_DEFINE; kt++) - ; - - /* Pass NULL instead of OP, since this is a "predefined" macro. */ - do_define (buf, buf + strlen ((char *) buf), NULL_PTR, kt); - --indepth; -} - -/* JF, this does the work for the -U option */ - -static void -make_undef (str, op) - char *str; - FILE_BUF *op; -{ - FILE_BUF *ip; - struct directive *kt; - - ip = &instack[++indepth]; - ip->nominal_fname = ip->fname = "*undef*"; - ip->nominal_fname_len = strlen (ip->nominal_fname); - - ip->buf = ip->bufp = (U_CHAR *) str; - ip->length = strlen (str); - ip->lineno = 1; - ip->macro = 0; - ip->free_ptr = 0; - ip->if_stack = if_stack; - ip->system_header_p = 0; - - for (kt = directive_table; kt->type != T_UNDEF; kt++) - ; - - do_undef ((U_CHAR *) str, (U_CHAR *) str + strlen (str), op, kt); - --indepth; -} - -/* Process the string STR as if it appeared as the body of a #assert. - OPTION is the option name for which STR was the argument. */ - -static void -make_assertion (option, str) - const char *option; - const char *str; -{ - FILE_BUF *ip; - struct directive *kt; - U_CHAR *buf, *p, *q; - - /* Copy the entire option so we can modify it. */ - buf = (U_CHAR *) alloca (strlen (str) + 1); - strcpy ((char *) buf, str); - /* Scan for any backslash-newline and remove it. */ - p = q = buf; - while (*p) { - if (*p == '\\' && p[1] == '\n') - p += 2; - else - *q++ = *p++; - } - *q = 0; - - p = buf; - if (!is_idstart[*p]) { - error ("malformed option `%s %s'", option, str); - return; - } - while (is_idchar[*++p]) - ; - SKIP_WHITE_SPACE (p); - if (! (*p == 0 || *p == '(')) { - error ("malformed option `%s %s'", option, str); - return; - } - - ip = &instack[++indepth]; - ip->nominal_fname = ip->fname = "*Initialization*"; - ip->nominal_fname_len = strlen (ip->nominal_fname); - - ip->buf = ip->bufp = buf; - ip->length = strlen ((char *) buf); - ip->lineno = 1; - ip->macro = 0; - ip->free_ptr = 0; - ip->if_stack = if_stack; - ip->system_header_p = 0; - - for (kt = directive_table; kt->type != T_ASSERT; kt++) - ; - - /* Pass NULL as output ptr to do_define since we KNOW it never does - any output.... */ - do_assert (buf, buf + strlen ((char *) buf) , NULL_PTR, kt); - --indepth; -} - -/* The previous include prefix, if any, is PREV_FILE_NAME. - Translate any pathnames with COMPONENT. - Allocate a new include prefix whose name is the - simplified concatenation of PREFIX and NAME, - with a trailing / added if needed. - But return 0 if the include prefix should be ignored, - e.g. because it is a duplicate of PREV_FILE_NAME. */ - -static struct file_name_list * -new_include_prefix (prev_file_name, component, prefix, name) - struct file_name_list *prev_file_name; - const char *component; - const char *prefix; - const char *name; -{ - if (name == 0) - fatal ("Directory name missing after command line option"); - - if (*name == 0) - /* Ignore the empty string. */ - return 0; - - prefix = update_path (prefix, component); - name = update_path (name, component); - - { - struct file_name_list *dir - = ((struct file_name_list *) - xmalloc (sizeof (struct file_name_list) - + strlen (prefix) + strlen (name) + 2)); - size_t len; - strcpy (dir->fname, prefix); - strcat (dir->fname, name); - len = simplify_filename (dir->fname); - - /* Convert directory name to a prefix. */ - if (len && dir->fname[len - 1] != DIR_SEPARATOR) { - if (len == 1 && dir->fname[len - 1] == '.') - len = 0; - else -#ifdef VMS - /* must be '/', hack_vms_include_specification triggers on it. */ - dir->fname[len++] = '/'; -#else - dir->fname[len++] = DIR_SEPARATOR; -#endif - dir->fname[len] = 0; - } - - /* Ignore a directory whose name matches the previous one. */ - if (prev_file_name && !strcmp (prev_file_name->fname, dir->fname)) { - /* But treat `-Idir -I- -Idir' as `-I- -Idir'. */ - if (!first_bracket_include) - first_bracket_include = prev_file_name; - free (dir); - return 0; - } - -#ifndef VMS - /* VMS can't stat dir prefixes, so skip these optimizations in VMS. */ - - /* Add a trailing "." if there is a filename. This increases the number - of systems that can stat directories. We remove it below. */ - if (len != 0) - { - dir->fname[len] = '.'; - dir->fname[len + 1] = 0; - } - - /* Ignore a nonexistent directory. */ - if (stat (len ? dir->fname : ".", &dir->st) != 0) { - if (errno != ENOENT && errno != ENOTDIR) - error_from_errno (dir->fname); - free (dir); - return 0; - } - - if (len != 0) - dir->fname[len] = 0; - - /* Ignore a directory whose identity matches the previous one. */ - if (prev_file_name - && INO_T_EQ (prev_file_name->st.st_ino, dir->st.st_ino) - && prev_file_name->st.st_dev == dir->st.st_dev) { - /* But treat `-Idir -I- -Idir' as `-I- -Idir'. */ - if (!first_bracket_include) - first_bracket_include = prev_file_name; - free (dir); - return 0; - } -#endif /* ! VMS */ - - dir->next = 0; - dir->c_system_include_path = 0; - dir->got_name_map = 0; - - return dir; - } -} - -/* Append a chain of `struct file_name_list's - to the end of the main include chain. - FIRST is the beginning of the chain to append, and LAST is the end. */ - -static void -append_include_chain (first, last) - struct file_name_list *first, *last; -{ - struct file_name_list *dir; - - if (!first || !last) - return; - - if (include == 0) - include = first; - else - last_include->next = first; - - if (first_bracket_include == 0) - first_bracket_include = first; - - for (dir = first; ; dir = dir->next) { - int len = strlen (dir->fname) + INCLUDE_LEN_FUDGE; - if (len > max_include_len) - max_include_len = len; - if (dir == last) - break; - } - - last->next = NULL; - last_include = last; -} - -/* Place into DST a representation of the file named SRC that is suitable - for `make'. Do not null-terminate DST. Return its length. */ -static int -quote_string_for_make (dst, src) - char *dst; - const char *src; -{ - const char *p = src; - int i = 0; - for (;;) - { - char c = *p++; - switch (c) - { - case '\0': - case ' ': - case '\t': - { - /* GNU make uses a weird quoting scheme for white space. - A space or tab preceded by 2N+1 backslashes represents - N backslashes followed by space; a space or tab - preceded by 2N backslashes represents N backslashes at - the end of a file name; and backslashes in other - contexts should not be doubled. */ - const char *q; - for (q = p - 1; src < q && q[-1] == '\\'; q--) - { - if (dst) - dst[i] = '\\'; - i++; - } - } - if (!c) - return i; - if (dst) - dst[i] = '\\'; - i++; - goto ordinary_char; - - case '$': - if (dst) - dst[i] = c; - i++; - /* Fall through. This can mishandle things like "$(" but - there's no easy fix. */ - default: - ordinary_char: - /* This can mishandle characters in the string "\0\n%*?[\\~"; - exactly which chars are mishandled depends on the `make' version. - We know of no portable solution for this; - even GNU make 3.76.1 doesn't solve the problem entirely. - (Also, '\0' is mishandled due to our calling conventions.) */ - if (dst) - dst[i] = c; - i++; - break; - } - } -} - - -/* Add output to `deps_buffer' for the -M switch. - STRING points to the text to be output. - SPACER is ':' for targets, ' ' for dependencies. */ - -static void -deps_output (string, spacer) - const char *string; - int spacer; -{ - int size = quote_string_for_make ((char *) 0, string); - - if (size == 0) - return; - -#ifndef MAX_OUTPUT_COLUMNS -#define MAX_OUTPUT_COLUMNS 72 -#endif - if (MAX_OUTPUT_COLUMNS - 1 /*spacer*/ - 2 /*` \'*/ < deps_column + size - && 1 < deps_column) { - bcopy (" \\\n ", &deps_buffer[deps_size], 4); - deps_size += 4; - deps_column = 1; - if (spacer == ' ') - spacer = 0; - } - - if (deps_size + 2 * size + 8 > deps_allocated_size) { - deps_allocated_size = (deps_size + 2 * size + 50) * 2; - deps_buffer = xrealloc (deps_buffer, deps_allocated_size); - } - if (spacer == ' ') { - deps_buffer[deps_size++] = ' '; - deps_column++; - } - quote_string_for_make (&deps_buffer[deps_size], string); - deps_size += size; - deps_column += size; - if (spacer == ':') { - deps_buffer[deps_size++] = ':'; - deps_column++; - } - deps_buffer[deps_size] = 0; -} - -void -fatal VPROTO ((const char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char * msgid; -#endif - va_list args; - - fprintf (stderr, "%s: ", progname); - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - msgid = va_arg (args, const char *); -#endif - vnotice (msgid, args); - va_end (args); - fprintf (stderr, "\n"); - exit (FATAL_EXIT_CODE); -} - -/* 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."); -} - -static void -perror_with_name (name) - char *name; -{ - fprintf (stderr, "%s: %s: %s\n", progname, name, my_strerror (errno)); - errors++; -} - -static void -pfatal_with_name (name) - char *name; -{ - perror_with_name (name); -#ifdef VMS - exit (vaxc$errno); -#else - exit (FATAL_EXIT_CODE); -#endif -} - -/* Handler for SIGPIPE. */ - -static void -pipe_closed (signo) - /* If this is missing, some compilers complain. */ - int signo ATTRIBUTE_UNUSED; -{ - fatal ("output pipe has been closed"); -} - -static void -memory_full () -{ - fatal ("Memory exhausted."); -} - -PTR -xmalloc (size) - size_t size; -{ - register PTR ptr = (PTR) malloc (size); - if (!ptr) - memory_full (); - return ptr; -} - -PTR -xrealloc (old, size) - PTR old; - size_t size; -{ - register PTR ptr; - if (old) - ptr = (PTR) realloc (old, size); - else - ptr = (PTR) malloc (size); - if (!ptr) - memory_full (); - return ptr; -} - -PTR -xcalloc (number, size) - size_t number, size; -{ - register size_t total = number * size; - register PTR ptr = (PTR) malloc (total); - if (!ptr) - memory_full (); - bzero (ptr, total); - return ptr; -} - -char * -xstrdup (input) - const char *input; -{ - register size_t len = strlen (input) + 1; - register char *output = xmalloc (len); - memcpy (output, input, len); - return output; -} - -#ifdef VMS - -/* Under VMS we need to fix up the "include" specification filename. - - Rules for possible conversions - - fullname tried paths - - name name - ./dir/name [.dir]name - /dir/name dir:name - /name [000000]name, name - dir/name dir:[000000]name, dir:name, dir/name - dir1/dir2/name dir1:[dir2]name, dir1:[000000.dir2]name - path:/name path:[000000]name, path:name - path:/dir/name path:[000000.dir]name, path:[dir]name - path:dir/name path:[dir]name - [path]:[dir]name [path.dir]name - path/[dir]name [path.dir]name - - The path:/name input is constructed when expanding <> includes. - - return 1 if name was changed, 0 else. */ - -static int -hack_vms_include_specification (fullname, vaxc_include) - char *fullname; - int vaxc_include; -{ - register char *basename, *unixname, *local_ptr, *first_slash; - int f, check_filename_before_returning, must_revert; - char Local[512]; - - check_filename_before_returning = 0; - must_revert = 0; - /* See if we can find a 1st slash. If not, there's no path information. */ - first_slash = index (fullname, '/'); - if (first_slash == 0) - return 0; /* Nothing to do!!! */ - - /* construct device spec if none given. */ - - if (index (fullname, ':') == 0) - { - - /* If fullname has a slash, take it as device spec. */ - - if (first_slash == fullname) - { - first_slash = index (fullname+1, '/'); /* 2nd slash ? */ - if (first_slash) - *first_slash = ':'; /* make device spec */ - for (basename = fullname; *basename != 0; basename++) - *basename = *(basename+1); /* remove leading slash */ - } - else if ((first_slash[-1] != '.') /* keep ':/', './' */ - && (first_slash[-1] != ':') - && (first_slash[-1] != ']')) /* or a vms path */ - { - *first_slash = ':'; - } - else if ((first_slash[1] == '[') /* skip './' in './[dir' */ - && (first_slash[-1] == '.')) - fullname += 2; - } - - /* Get part after first ':' (basename[-1] == ':') - or last '/' (basename[-1] == '/'). */ - - basename = base_name (fullname); - - /* - * Check if we have a vax-c style '#include filename' - * and add the missing .h - */ - - if (vaxc_include && !index (basename,'.')) - strcat (basename, ".h"); - - local_ptr = Local; /* initialize */ - - /* We are trying to do a number of things here. First of all, we are - trying to hammer the filenames into a standard format, such that later - processing can handle them. - - If the file name contains something like [dir.], then it recognizes this - as a root, and strips the ".]". Later processing will add whatever is - needed to get things working properly. - - If no device is specified, then the first directory name is taken to be - a device name (or a rooted logical). */ - - /* Point to the UNIX filename part (which needs to be fixed!) - but skip vms path information. - [basename != fullname since first_slash != 0]. */ - - if ((basename[-1] == ':') /* vms path spec. */ - || (basename[-1] == ']') - || (basename[-1] == '>')) - unixname = basename; - else - unixname = fullname; - - if (*unixname == '/') - unixname++; - - /* If the directory spec is not rooted, we can just copy - the UNIX filename part and we are done. */ - - if (((basename - fullname) > 1) - && ( (basename[-1] == ']') - || (basename[-1] == '>'))) - { - if (basename[-2] != '.') - { - - /* The VMS part ends in a `]', and the preceding character is not a `.'. - -> PATH]:/name (basename = '/name', unixname = 'name') - We strip the `]', and then splice the two parts of the name in the - usual way. Given the default locations for include files in cccp.c, - we will only use this code if the user specifies alternate locations - with the /include (-I) switch on the command line. */ - - basename -= 1; /* Strip "]" */ - unixname--; /* backspace */ - } - else - { - - /* The VMS part has a ".]" at the end, and this will not do. Later - processing will add a second directory spec, and this would be a syntax - error. Thus we strip the ".]", and thus merge the directory specs. - We also backspace unixname, so that it points to a '/'. This inhibits the - generation of the 000000 root directory spec (which does not belong here - in this case). */ - - basename -= 2; /* Strip ".]" */ - unixname--; /* backspace */ - } - } - - else - - { - - /* We drop in here if there is no VMS style directory specification yet. - If there is no device specification either, we make the first dir a - device and try that. If we do not do this, then we will be essentially - searching the users default directory (as if they did a #include "asdf.h"). - - Then all we need to do is to push a '[' into the output string. Later - processing will fill this in, and close the bracket. */ - - if ((unixname != fullname) /* vms path spec found. */ - && (basename[-1] != ':')) - *local_ptr++ = ':'; /* dev not in spec. take first dir */ - - *local_ptr++ = '['; /* Open the directory specification */ - } - - if (unixname == fullname) /* no vms dir spec. */ - { - must_revert = 1; - if ((first_slash != 0) /* unix dir spec. */ - && (*unixname != '/') /* not beginning with '/' */ - && (*unixname != '.')) /* or './' or '../' */ - *local_ptr++ = '.'; /* dir is local ! */ - } - - /* at this point we assume that we have the device spec, and (at least - the opening "[" for a directory specification. We may have directories - specified already. - - If there are no other slashes then the filename will be - in the "root" directory. Otherwise, we need to add - directory specifications. */ - - if (index (unixname, '/') == 0) - { - /* if no directories specified yet and none are following. */ - if (local_ptr[-1] == '[') - { - /* Just add "000000]" as the directory string */ - strcpy (local_ptr, "000000]"); - local_ptr += strlen (local_ptr); - check_filename_before_returning = 1; /* we might need to fool with this later */ - } - } - else - { - - /* As long as there are still subdirectories to add, do them. */ - while (index (unixname, '/') != 0) - { - /* If this token is "." we can ignore it - if it's not at the beginning of a path. */ - if ((unixname[0] == '.') && (unixname[1] == '/')) - { - /* remove it at beginning of path. */ - if ( ((unixname == fullname) /* no device spec */ - && (fullname+2 != basename)) /* starts with ./ */ - /* or */ - || ((basename[-1] == ':') /* device spec */ - && (unixname-1 == basename))) /* and ./ afterwards */ - *local_ptr++ = '.'; /* make '[.' start of path. */ - unixname += 2; - continue; - } - - /* Add a subdirectory spec. Do not duplicate "." */ - if ( local_ptr[-1] != '.' - && local_ptr[-1] != '[' - && local_ptr[-1] != '<') - *local_ptr++ = '.'; - - /* If this is ".." then the spec becomes "-" */ - if ( (unixname[0] == '.') - && (unixname[1] == '.') - && (unixname[2] == '/')) - { - /* Add "-" and skip the ".." */ - if ((local_ptr[-1] == '.') - && (local_ptr[-2] == '[')) - local_ptr--; /* prevent [.- */ - *local_ptr++ = '-'; - unixname += 3; - continue; - } - - /* Copy the subdirectory */ - while (*unixname != '/') - *local_ptr++= *unixname++; - - unixname++; /* Skip the "/" */ - } - - /* Close the directory specification */ - if (local_ptr[-1] == '.') /* no trailing periods */ - local_ptr--; - - if (local_ptr[-1] == '[') /* no dir needed */ - local_ptr--; - else - *local_ptr++ = ']'; - } - - /* Now add the filename. */ - - while (*unixname) - *local_ptr++ = *unixname++; - *local_ptr = 0; - - /* Now append it to the original VMS spec. */ - - strcpy ((must_revert==1)?fullname:basename, Local); - - /* If we put a [000000] in the filename, try to open it first. If this fails, - remove the [000000], and return that name. This provides flexibility - to the user in that they can use both rooted and non-rooted logical names - to point to the location of the file. */ - - if (check_filename_before_returning) - { - f = open (fullname, O_RDONLY, 0666); - if (f >= 0) - { - /* The file name is OK as it is, so return it as is. */ - close (f); - return 1; - } - - /* The filename did not work. Try to remove the [000000] from the name, - and return it. */ - - basename = index (fullname, '['); - local_ptr = index (fullname, ']') + 1; - strcpy (basename, local_ptr); /* this gets rid of it */ - - } - - return 1; -} -#endif /* VMS */ - -#ifdef VMS - -/* The following wrapper functions supply additional arguments to the VMS - I/O routines to optimize performance with file handling. The arguments - are: - "mbc=16" - Set multi-block count to 16 (use a 8192 byte buffer). - "deq=64" - When extending the file, extend it in chunks of 32Kbytes. - "fop=tef"- Truncate unused portions of file when closing file. - "shr=nil"- Disallow file sharing while file is open. */ - -static FILE * -VMS_freopen (fname, type, oldfile) - char *fname; - char *type; - FILE *oldfile; -{ -#undef freopen /* Get back the real freopen routine. */ - if (strcmp (type, "w") == 0) - return freopen (fname, type, oldfile, - "mbc=16", "deq=64", "fop=tef", "shr=nil"); - return freopen (fname, type, oldfile, "mbc=16"); -} - -static FILE * -VMS_fopen (fname, type) - char *fname; - char *type; -{ -#undef fopen /* Get back the real fopen routine. */ - /* The gcc-vms-1.42 distribution's header files prototype fopen with two - fixed arguments, which matches ANSI's specification but not VAXCRTL's - pre-ANSI implementation. This hack circumvents the mismatch problem. */ - FILE *(*vmslib_fopen)() = (FILE *(*)()) fopen; - - if (*type == 'w') - return (*vmslib_fopen) (fname, type, "mbc=32", - "deq=64", "fop=tef", "shr=nil"); - else - return (*vmslib_fopen) (fname, type, "mbc=32"); -} - -static int -VMS_open (fname, flags, prot) - char *fname; - int flags; - int prot; -{ -#undef open /* Get back the real open routine. */ - return open (fname, flags, prot, "mbc=16", "deq=64", "fop=tef"); -} - -/* more VMS hackery */ -#include <fab.h> -#include <nam.h> - -extern unsigned long SYS$PARSE(), SYS$SEARCH(); - -/* Work around another library bug. If a file is located via a searchlist, - and if the device it's on is not the same device as the one specified - in the first element of that searchlist, then both stat() and fstat() - will fail to return info about it. `errno' will be set to EVMSERR, and - `vaxc$errno' will be set to SS$_NORMAL due yet another bug in stat()! - We can get around this by fully parsing the filename and then passing - that absolute name to stat(). - - Without this fix, we can end up failing to find header files, which is - bad enough, but then compounding the problem by reporting the reason for - failure as "normal successful completion." */ - -#undef fstat /* Get back to the library version. */ - -static int -VMS_fstat (fd, statbuf) - int fd; - struct stat *statbuf; -{ - int result = fstat (fd, statbuf); - - if (result < 0) - { - FILE *fp; - char nambuf[NAM$C_MAXRSS+1]; - - if ((fp = fdopen (fd, "r")) != 0 && fgetname (fp, nambuf) != 0) - result = VMS_stat (nambuf, statbuf); - /* No fclose(fp) here; that would close(fd) as well. */ - } - - return result; -} - -static int -VMS_stat (name, statbuf) - const char *name; - struct stat *statbuf; -{ - int result = stat (name, statbuf); - - if (result < 0) - { - struct FAB fab; - struct NAM nam; - char exp_nam[NAM$C_MAXRSS+1], /* expanded name buffer for SYS$PARSE */ - res_nam[NAM$C_MAXRSS+1]; /* resultant name buffer for SYS$SEARCH */ - - fab = cc$rms_fab; - fab.fab$l_fna = (char *) name; - fab.fab$b_fns = (unsigned char) strlen (name); - fab.fab$l_nam = (void *) &nam; - nam = cc$rms_nam; - nam.nam$l_esa = exp_nam, nam.nam$b_ess = sizeof exp_nam - 1; - nam.nam$l_rsa = res_nam, nam.nam$b_rss = sizeof res_nam - 1; - nam.nam$b_nop = NAM$M_PWD | NAM$M_NOCONCEAL; - if (SYS$PARSE (&fab) & 1) - { - if (SYS$SEARCH (&fab) & 1) - { - res_nam[nam.nam$b_rsl] = '\0'; - result = stat (res_nam, statbuf); - } - /* Clean up searchlist context cached by the system. */ - nam.nam$b_nop = NAM$M_SYNCHK; - fab.fab$l_fna = 0, fab.fab$b_fns = 0; - (void) SYS$PARSE (&fab); - } - } - - return result; -} -#endif /* VMS */ diff --git a/contrib/gcc/cexp.y b/contrib/gcc/cexp.y deleted file mode 100644 index 9364ac3a8a03..000000000000 --- a/contrib/gcc/cexp.y +++ /dev/null @@ -1,1222 +0,0 @@ -/* Parse C expressions for CCCP. - Copyright (C) 1987, 92, 94-98, 1999 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! - - Adapted from expread.y of GDB by Paul Rubin, July 1986. */ - -/* Parse a C expression from text in a string */ - -%{ -#include "config.h" - -#include "system.h" -#include "intl.h" -#include <setjmp.h> -/* #define YYDEBUG 1 */ - -#ifdef MULTIBYTE_CHARS -#include "mbchar.h" -#include <locale.h> -#endif /* MULTIBYTE_CHARS */ - -typedef unsigned char U_CHAR; - -/* This is used for communicating lists of keywords with cccp.c. */ -struct arglist { - struct arglist *next; - U_CHAR *name; - int length; - int argno; -}; - -HOST_WIDEST_INT parse_c_expression PROTO((char *, int)); - -static int yylex PROTO((void)); -static void yyerror PVPROTO((const char *, ...)) - ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; -static HOST_WIDEST_INT expression_value; -#ifdef TEST_EXP_READER -static int expression_signedp; -#endif - -static jmp_buf parse_return_error; - -/* Nonzero means count most punctuation as part of a name. */ -static int keyword_parsing = 0; - -/* Nonzero means do not evaluate this expression. - This is a count, since unevaluated expressions can nest. */ -static int skip_evaluation; - -/* Nonzero means warn if undefined identifiers are evaluated. */ -static int warn_undef; - -/* some external tables of character types */ -extern unsigned char is_idstart[], is_idchar[], is_space[]; - -/* Flag for -pedantic. */ -extern int pedantic; - -/* Flag for -traditional. */ -extern int traditional; - -/* Flag for -lang-c89. */ -extern int c89; - -#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 - -#ifndef MAX_CHAR_TYPE_SIZE -#define MAX_CHAR_TYPE_SIZE CHAR_TYPE_SIZE -#endif - -#ifndef MAX_INT_TYPE_SIZE -#define MAX_INT_TYPE_SIZE INT_TYPE_SIZE -#endif - -#ifndef MAX_LONG_TYPE_SIZE -#define MAX_LONG_TYPE_SIZE LONG_TYPE_SIZE -#endif - -#ifndef MAX_WCHAR_TYPE_SIZE -#define MAX_WCHAR_TYPE_SIZE WCHAR_TYPE_SIZE -#endif - -#define MAX_CHAR_TYPE_MASK (MAX_CHAR_TYPE_SIZE < HOST_BITS_PER_WIDEST_INT \ - ? (~ (~ (HOST_WIDEST_INT) 0 << MAX_CHAR_TYPE_SIZE)) \ - : ~ (HOST_WIDEST_INT) 0) - -#define MAX_WCHAR_TYPE_MASK (MAX_WCHAR_TYPE_SIZE < HOST_BITS_PER_WIDEST_INT \ - ? ~ (~ (HOST_WIDEST_INT) 0 << MAX_WCHAR_TYPE_SIZE) \ - : ~ (HOST_WIDEST_INT) 0) - -/* Suppose A1 + B1 = SUM1, using 2's complement arithmetic ignoring overflow. - Suppose A, B and SUM have the same respective signs as A1, B1, and SUM1. - Suppose SIGNEDP is negative if the result is signed, zero if unsigned. - Then this yields nonzero if overflow occurred during the addition. - Overflow occurs if A and B have the same sign, but A and SUM differ in sign, - and SIGNEDP is negative. - Use `^' to test whether signs differ, and `< 0' to isolate the sign. */ -#define overflow_sum_sign(a, b, sum, signedp) \ - ((~((a) ^ (b)) & ((a) ^ (sum)) & (signedp)) < 0) - -struct constant; - -HOST_WIDEST_INT parse_escape PROTO((char **, HOST_WIDEST_INT)); -int check_assertion PROTO((U_CHAR *, int, int, struct arglist *)); -struct hashnode *lookup PROTO((U_CHAR *, int, int)); -void error PVPROTO((const char *, ...)) ATTRIBUTE_PRINTF_1; -void verror PROTO((const char *, va_list)); -void pedwarn PVPROTO((const char *, ...)) ATTRIBUTE_PRINTF_1; -void warning PVPROTO((const char *, ...)) ATTRIBUTE_PRINTF_1; - -static int parse_number PROTO((int)); -static HOST_WIDEST_INT left_shift PROTO((struct constant *, unsigned HOST_WIDEST_INT)); -static HOST_WIDEST_INT right_shift PROTO((struct constant *, unsigned HOST_WIDEST_INT)); -static void integer_overflow PROTO((void)); - -/* `signedp' values */ -#define SIGNED (~0) -#define UNSIGNED 0 -%} - -%union { - struct constant {HOST_WIDEST_INT value; int signedp;} integer; - struct name {U_CHAR *address; int length;} name; - struct arglist *keywords; -} - -%type <integer> exp exp1 start -%type <keywords> keywords -%token <integer> INT CHAR -%token <name> NAME -%token <integer> ERROR - -%right '?' ':' -%left ',' -%left OR -%left AND -%left '|' -%left '^' -%left '&' -%left EQUAL NOTEQUAL -%left '<' '>' LEQ GEQ -%left LSH RSH -%left '+' '-' -%left '*' '/' '%' -%right UNARY - -/* %expect 40 */ - -%% - -start : exp1 - { - expression_value = $1.value; -#ifdef TEST_EXP_READER - expression_signedp = $1.signedp; -#endif - } - ; - -/* Expressions, including the comma operator. */ -exp1 : exp - | exp1 ',' exp - { if (pedantic) - pedwarn ("comma operator in operand of `#if'"); - $$ = $3; } - ; - -/* Expressions, not including the comma operator. */ -exp : '-' exp %prec UNARY - { $$.value = - $2.value; - $$.signedp = $2.signedp; - if (($$.value & $2.value & $$.signedp) < 0) - integer_overflow (); } - | '!' exp %prec UNARY - { $$.value = ! $2.value; - $$.signedp = SIGNED; } - | '+' exp %prec UNARY - { $$ = $2; } - | '~' exp %prec UNARY - { $$.value = ~ $2.value; - $$.signedp = $2.signedp; } - | '#' NAME - { $$.value = check_assertion ($2.address, $2.length, - 0, NULL_PTR); - $$.signedp = SIGNED; } - | '#' NAME - { keyword_parsing = 1; } - '(' keywords ')' - { $$.value = check_assertion ($2.address, $2.length, - 1, $5); - keyword_parsing = 0; - $$.signedp = SIGNED; } - | '(' exp1 ')' - { $$ = $2; } - ; - -/* Binary operators in order of decreasing precedence. */ -exp : exp '*' exp - { $$.signedp = $1.signedp & $3.signedp; - if ($$.signedp) - { - $$.value = $1.value * $3.value; - if ($1.value - && ($$.value / $1.value != $3.value - || ($$.value & $1.value & $3.value) < 0)) - integer_overflow (); - } - else - $$.value = ((unsigned HOST_WIDEST_INT) $1.value - * $3.value); } - | exp '/' exp - { if ($3.value == 0) - { - if (!skip_evaluation) - error ("division by zero in #if"); - $3.value = 1; - } - $$.signedp = $1.signedp & $3.signedp; - if ($$.signedp) - { - $$.value = $1.value / $3.value; - if (($$.value & $1.value & $3.value) < 0) - integer_overflow (); - } - else - $$.value = ((unsigned HOST_WIDEST_INT) $1.value - / $3.value); } - | exp '%' exp - { if ($3.value == 0) - { - if (!skip_evaluation) - error ("division by zero in #if"); - $3.value = 1; - } - $$.signedp = $1.signedp & $3.signedp; - if ($$.signedp) - $$.value = $1.value % $3.value; - else - $$.value = ((unsigned HOST_WIDEST_INT) $1.value - % $3.value); } - | exp '+' exp - { $$.value = $1.value + $3.value; - $$.signedp = $1.signedp & $3.signedp; - if (overflow_sum_sign ($1.value, $3.value, - $$.value, $$.signedp)) - integer_overflow (); } - | exp '-' exp - { $$.value = $1.value - $3.value; - $$.signedp = $1.signedp & $3.signedp; - if (overflow_sum_sign ($$.value, $3.value, - $1.value, $$.signedp)) - integer_overflow (); } - | exp LSH exp - { $$.signedp = $1.signedp; - if (($3.value & $3.signedp) < 0) - $$.value = right_shift (&$1, -$3.value); - else - $$.value = left_shift (&$1, $3.value); } - | exp RSH exp - { $$.signedp = $1.signedp; - if (($3.value & $3.signedp) < 0) - $$.value = left_shift (&$1, -$3.value); - else - $$.value = right_shift (&$1, $3.value); } - | exp EQUAL exp - { $$.value = ($1.value == $3.value); - $$.signedp = SIGNED; } - | exp NOTEQUAL exp - { $$.value = ($1.value != $3.value); - $$.signedp = SIGNED; } - | exp LEQ exp - { $$.signedp = SIGNED; - if ($1.signedp & $3.signedp) - $$.value = $1.value <= $3.value; - else - $$.value = ((unsigned HOST_WIDEST_INT) $1.value - <= $3.value); } - | exp GEQ exp - { $$.signedp = SIGNED; - if ($1.signedp & $3.signedp) - $$.value = $1.value >= $3.value; - else - $$.value = ((unsigned HOST_WIDEST_INT) $1.value - >= $3.value); } - | exp '<' exp - { $$.signedp = SIGNED; - if ($1.signedp & $3.signedp) - $$.value = $1.value < $3.value; - else - $$.value = ((unsigned HOST_WIDEST_INT) $1.value - < $3.value); } - | exp '>' exp - { $$.signedp = SIGNED; - if ($1.signedp & $3.signedp) - $$.value = $1.value > $3.value; - else - $$.value = ((unsigned HOST_WIDEST_INT) $1.value - > $3.value); } - | exp '&' exp - { $$.value = $1.value & $3.value; - $$.signedp = $1.signedp & $3.signedp; } - | exp '^' exp - { $$.value = $1.value ^ $3.value; - $$.signedp = $1.signedp & $3.signedp; } - | exp '|' exp - { $$.value = $1.value | $3.value; - $$.signedp = $1.signedp & $3.signedp; } - | exp AND - { skip_evaluation += !$1.value; } - exp - { skip_evaluation -= !$1.value; - $$.value = ($1.value && $4.value); - $$.signedp = SIGNED; } - | exp OR - { skip_evaluation += !!$1.value; } - exp - { skip_evaluation -= !!$1.value; - $$.value = ($1.value || $4.value); - $$.signedp = SIGNED; } - | exp '?' - { skip_evaluation += !$1.value; } - exp ':' - { skip_evaluation += !!$1.value - !$1.value; } - exp - { skip_evaluation -= !!$1.value; - $$.value = $1.value ? $4.value : $7.value; - $$.signedp = $4.signedp & $7.signedp; } - | INT - { $$ = yylval.integer; } - | CHAR - { $$ = yylval.integer; } - | NAME - { if (warn_undef && !skip_evaluation) - warning ("`%.*s' is not defined", - $1.length, $1.address); - $$.value = 0; - $$.signedp = SIGNED; } - ; - -keywords : - { $$ = 0; } - | '(' keywords ')' keywords - { struct arglist *temp; - $$ = (struct arglist *) xmalloc (sizeof (struct arglist)); - $$->next = $2; - $$->name = (U_CHAR *) "("; - $$->length = 1; - temp = $$; - while (temp != 0 && temp->next != 0) - temp = temp->next; - temp->next = (struct arglist *) xmalloc (sizeof (struct arglist)); - temp->next->next = $4; - temp->next->name = (U_CHAR *) ")"; - temp->next->length = 1; } - | NAME keywords - { $$ = (struct arglist *) xmalloc (sizeof (struct arglist)); - $$->name = $1.address; - $$->length = $1.length; - $$->next = $2; } - ; -%% - -/* During parsing of a C expression, the pointer to the next character - is in this variable. */ - -static char *lexptr; - -/* Take care of parsing a number (anything that starts with a digit). - Set yylval and return the token type; update lexptr. - LEN is the number of characters in it. */ - -/* maybe needs to actually deal with floating point numbers */ - -static int -parse_number (olen) - int olen; -{ - register char *p = lexptr; - register int c; - register unsigned HOST_WIDEST_INT n = 0, nd, max_over_base; - register int base = 10; - register int len = olen; - register int overflow = 0; - register int digit, largest_digit = 0; - int spec_long = 0; - - yylval.integer.signedp = SIGNED; - - if (*p == '0') { - base = 8; - if (len >= 3 && (p[1] == 'x' || p[1] == 'X')) { - p += 2; - base = 16; - len -= 2; - } - } - - max_over_base = (unsigned HOST_WIDEST_INT) -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 (!pedantic < spec_long) - yyerror ("too many `l's in integer constant"); - spec_long++; - } - else if (c == 'u' || c == 'U') - { - if (! yylval.integer.signedp) - yyerror ("two `u's in integer constant"); - yylval.integer.signedp = UNSIGNED; - } - else { - if (c == '.' || c == 'e' || c == 'E' || c == 'p' || c == 'P') - yyerror ("Floating point numbers not allowed in #if expressions"); - else - yyerror ("missing white space after number `%.*s'", - (int) (p - lexptr - 1), lexptr); - } - - if (--len == 0) - break; - c = *p++; - } - /* Don't look for any more digits after the suffixes. */ - break; - } - if (largest_digit < digit) - largest_digit = digit; - nd = n * base + digit; - overflow |= (max_over_base < n) | (nd < n); - n = nd; - } - - if (base <= largest_digit) - pedwarn ("integer constant contains digits beyond the radix"); - - if (overflow) - pedwarn ("integer constant out of range"); - - /* If too big to be signed, consider it unsigned. */ - if (((HOST_WIDEST_INT) n & yylval.integer.signedp) < 0) - { - if (base == 10) - warning ("integer constant is so large that it is unsigned"); - yylval.integer.signedp = UNSIGNED; - } - - lexptr = p; - yylval.integer.value = n; - return INT; -} - -struct token { - const char *operator; - int token; -}; - -static struct token tokentab2[] = { - {"&&", AND}, - {"||", OR}, - {"<<", LSH}, - {">>", RSH}, - {"==", EQUAL}, - {"!=", NOTEQUAL}, - {"<=", LEQ}, - {">=", GEQ}, - {"++", ERROR}, - {"--", ERROR}, - {NULL, ERROR} -}; - -/* Read one token, getting characters through lexptr. */ - -static int -yylex () -{ - register int c; - register int namelen; - register unsigned char *tokstart; - register struct token *toktab; - int wide_flag; - HOST_WIDEST_INT mask; - - retry: - - tokstart = (unsigned char *) lexptr; - c = *tokstart; - /* See if it is a special token of length 2. */ - if (! keyword_parsing) - for (toktab = tokentab2; toktab->operator != NULL; toktab++) - if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) { - lexptr += 2; - if (toktab->token == ERROR) - yyerror ("`%s' not allowed in operand of `#if'", toktab->operator); - return toktab->token; - } - - switch (c) { - case '\n': - return 0; - - case ' ': - case '\t': - case '\r': - lexptr++; - goto retry; - - case 'L': - /* Capital L may start a wide-string or wide-character constant. */ - if (lexptr[1] == '\'') - { - lexptr++; - wide_flag = 1; - mask = MAX_WCHAR_TYPE_MASK; - goto char_constant; - } - if (lexptr[1] == '"') - { - lexptr++; - wide_flag = 1; - mask = MAX_WCHAR_TYPE_MASK; - goto string_constant; - } - break; - - case '\'': - wide_flag = 0; - mask = MAX_CHAR_TYPE_MASK; - char_constant: - lexptr++; - if (keyword_parsing) { - char *start_ptr = lexptr - 1; - while (1) { - c = *lexptr++; - if (c == '\\') - c = parse_escape (&lexptr, mask); - else if (c == '\'') - break; - } - yylval.name.address = tokstart; - yylval.name.length = lexptr - start_ptr; - return NAME; - } - - /* This code for reading a character constant - handles multicharacter constants and wide characters. - It is mostly copied from c-lex.c. */ - { - register HOST_WIDEST_INT result = 0; - register int num_chars = 0; - int chars_seen = 0; - unsigned width = MAX_CHAR_TYPE_SIZE; - int max_chars; -#ifdef MULTIBYTE_CHARS - int longest_char = local_mb_cur_max (); - char *token_buffer = (char *) alloca (longest_char); - (void) local_mbtowc (NULL_PTR, NULL_PTR, 0); -#endif - - max_chars = MAX_LONG_TYPE_SIZE / width; - if (wide_flag) - width = MAX_WCHAR_TYPE_SIZE; - - while (1) - { - c = *lexptr++; - - if (c == '\'' || c == EOF) - break; - - ++chars_seen; - if (c == '\\') - { - c = parse_escape (&lexptr, mask); - } - else - { -#ifdef MULTIBYTE_CHARS - wchar_t wc; - int i; - int char_len = -1; - for (i = 1; i <= longest_char; ++i) - { - token_buffer[i - 1] = c; - char_len = local_mbtowc (& wc, token_buffer, i); - if (char_len != -1) - break; - c = *lexptr++; - } - if (char_len > 1) - { - /* mbtowc sometimes needs an extra char before accepting */ - if (char_len < i) - lexptr--; - 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] - & ((1 << width) - 1)); - else - result = token_buffer[i - 1]; - } - num_chars += char_len; - continue; - } - } - else - { - if (char_len == -1) - warning ("Ignoring invalid multibyte character"); - } - if (wide_flag) - c = wc; -#endif /* ! MULTIBYTE_CHARS */ - } - - if (wide_flag) - { - if (chars_seen == 1) /* only keep the first one */ - result = c; - continue; - } - - /* Merge character into result; ignore excess chars. */ - num_chars++; - if (num_chars <= max_chars) - { - if (width < HOST_BITS_PER_INT) - result = (result << width) | (c & ((1 << width) - 1)); - else - result = c; - } - } - - if (c != '\'') - error ("malformatted character constant"); - else if (chars_seen == 0) - error ("empty character constant"); - else if (num_chars > max_chars) - { - num_chars = max_chars; - error ("character constant too long"); - } - else if (chars_seen != 1 && ! traditional) - warning ("multi-character character constant"); - - /* If char type is signed, sign-extend the constant. */ - if (! wide_flag) - { - int num_bits = num_chars * width; - if (num_bits == 0) - /* We already got an error; avoid invalid shift. */ - yylval.integer.value = 0; - else if (lookup ((U_CHAR *) "__CHAR_UNSIGNED__", - sizeof ("__CHAR_UNSIGNED__") - 1, -1) - || ((result >> (num_bits - 1)) & 1) == 0) - yylval.integer.value - = result & (~ (unsigned HOST_WIDEST_INT) 0 - >> (HOST_BITS_PER_WIDEST_INT - num_bits)); - else - yylval.integer.value - = result | ~(~ (unsigned HOST_WIDEST_INT) 0 - >> (HOST_BITS_PER_WIDEST_INT - num_bits)); - } - else - { - yylval.integer.value = result; - } - } - - /* This is always a signed type. */ - yylval.integer.signedp = SIGNED; - - return CHAR; - - /* some of these chars are invalid in constant expressions; - maybe do something about them later */ - case '/': - case '+': - case '-': - case '*': - case '%': - case '|': - case '&': - case '^': - case '~': - case '!': - case '@': - case '<': - case '>': - case '[': - case ']': - case '.': - case '?': - case ':': - case '=': - case '{': - case '}': - case ',': - case '#': - if (keyword_parsing) - break; - case '(': - case ')': - lexptr++; - return c; - - case '"': - mask = MAX_CHAR_TYPE_MASK; - string_constant: - if (keyword_parsing) { - char *start_ptr = lexptr; - lexptr++; - while (1) { - c = *lexptr++; - if (c == '\\') - c = parse_escape (&lexptr, mask); - else if (c == '"') - break; - } - yylval.name.address = tokstart; - yylval.name.length = lexptr - start_ptr; - return NAME; - } - yyerror ("string constants not allowed in #if expressions"); - return ERROR; - } - - if (c >= '0' && c <= '9' && !keyword_parsing) { - /* It's a number */ - for (namelen = 1; ; namelen++) { - int d = tokstart[namelen]; - if (! ((is_idchar[d] || d == '.') - || ((d == '-' || d == '+') - && (c == 'e' || c == 'E' - || ((c == 'p' || c == 'P') && ! c89)) - && ! traditional))) - break; - c = d; - } - return parse_number (namelen); - } - - /* It is a name. See how long it is. */ - - if (keyword_parsing) { - for (namelen = 0;; namelen++) { - if (is_space[tokstart[namelen]]) - break; - if (tokstart[namelen] == '(' || tokstart[namelen] == ')') - break; - if (tokstart[namelen] == '"' || tokstart[namelen] == '\'') - break; - } - } else { - if (!is_idstart[c]) { - yyerror ("Invalid token in expression"); - return ERROR; - } - - for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++) - ; - } - - lexptr += namelen; - yylval.name.address = tokstart; - yylval.name.length = namelen; - return NAME; -} - - -/* 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. - - RESULT_MASK is used to mask out the result; - an error is reported if bits are lost thereby. - - 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_WIDEST_INT -parse_escape (string_ptr, result_mask) - char **string_ptr; - HOST_WIDEST_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 (pedantic) - pedwarn ("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_WIDEST_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; - pedwarn ("octal escape sequence out of range"); - } - return i; - } - case 'x': - { - register unsigned HOST_WIDEST_INT 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) - yyerror ("\\x used with no following hex digits"); - if (overflow | (i != (i & result_mask))) - { - i &= result_mask; - pedwarn ("hex escape sequence out of range"); - } - return i; - } - default: - return c; - } -} - -static void -integer_overflow () -{ - if (!skip_evaluation && pedantic) - pedwarn ("integer overflow in preprocessor expression"); -} - -static HOST_WIDEST_INT -left_shift (a, b) - struct constant *a; - unsigned HOST_WIDEST_INT b; -{ - /* It's unclear from the C standard whether shifts can overflow. - The following code ignores overflow; perhaps a C standard - interpretation ruling is needed. */ - if (b >= HOST_BITS_PER_WIDEST_INT) - return 0; - else - return (unsigned HOST_WIDEST_INT) a->value << b; -} - -static HOST_WIDEST_INT -right_shift (a, b) - struct constant *a; - unsigned HOST_WIDEST_INT b; -{ - if (b >= HOST_BITS_PER_WIDEST_INT) - return a->signedp ? a->value >> (HOST_BITS_PER_WIDEST_INT - 1) : 0; - else if (a->signedp) - return a->value >> b; - else - return (unsigned HOST_WIDEST_INT) a->value >> b; -} - -/* This page contains the entry point to this file. */ - -/* Parse STRING as an expression, and complain if this fails - to use up all of the contents of STRING. - STRING may contain '\0' bytes; it is terminated by the first '\n' - outside a string constant, so that we can diagnose '\0' properly. - If WARN_UNDEFINED is nonzero, warn if undefined identifiers are evaluated. - We do not support C comments. They should be removed before - this function is called. */ - -HOST_WIDEST_INT -parse_c_expression (string, warn_undefined) - char *string; - int warn_undefined; -{ - lexptr = string; - warn_undef = warn_undefined; - - /* if there is some sort of scanning error, just return 0 and assume - the parsing routine has printed an error message somewhere. - there is surely a better thing to do than this. */ - if (setjmp (parse_return_error)) - return 0; - - if (yyparse () != 0) - abort (); - - if (*lexptr != '\n') - error ("Junk after end of expression."); - - return expression_value; /* set by yyparse () */ -} - -static void -yyerror VPROTO ((const char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - msgid = va_arg (args, const char *); -#endif - - verror (msgid, args); - va_end (args); - skip_evaluation = 0; - longjmp (parse_return_error, 1); -} - - -#ifdef TEST_EXP_READER - -#if YYDEBUG -extern int yydebug; -#endif - -int pedantic; -int traditional; -int c89; - -int main PROTO((int, char **)); -static void initialize_random_junk PROTO((void)); -static void print_unsigned_host_widest_int PROTO((unsigned HOST_WIDEST_INT)); - -/* Main program for testing purposes. */ -int -main (argc, argv) - int argc; - char **argv; -{ - int n, c; - char buf[1024]; - unsigned HOST_WIDEST_INT u; - - pedantic = 1 < argc; - traditional = 2 < argc; - c89 = 3 < argc; -#if YYDEBUG - yydebug = 4 < argc; -#endif - initialize_random_junk (); - - for (;;) { - printf ("enter expression: "); - n = 0; - while ((buf[n] = c = getchar ()) != '\n' && c != EOF) - n++; - if (c == EOF) - break; - parse_c_expression (buf, 1); - printf ("parser returned "); - u = (unsigned HOST_WIDEST_INT) expression_value; - if (expression_value < 0 && expression_signedp) { - u = -u; - printf ("-"); - } - if (u == 0) - printf ("0"); - else - print_unsigned_host_widest_int (u); - if (! expression_signedp) - printf("u"); - printf ("\n"); - } - - return 0; -} - -static void -print_unsigned_host_widest_int (u) - unsigned HOST_WIDEST_INT u; -{ - if (u) { - print_unsigned_host_widest_int (u / 10); - putchar ('0' + (int) (u % 10)); - } -} - -/* table to tell if char can be part of a C identifier. */ -unsigned char is_idchar[256]; -/* table to tell if char can be first char of a c identifier. */ -unsigned char is_idstart[256]; -/* table to tell if c is horizontal or vertical space. */ -unsigned char is_space[256]; - -/* - * initialize random junk in the hash table and maybe other places - */ -static void -initialize_random_junk () -{ - register int i; - - /* - * Set up is_idchar and is_idstart tables. These should be - * faster than saying (is_alpha (c) || c == '_'), etc. - * Must do set up these things before calling any routines tthat - * refer to them. - */ - for (i = 'a'; i <= 'z'; i++) { - ++is_idchar[i - 'a' + 'A']; - ++is_idchar[i]; - ++is_idstart[i - 'a' + 'A']; - ++is_idstart[i]; - } - for (i = '0'; i <= '9'; i++) - ++is_idchar[i]; - ++is_idchar['_']; - ++is_idstart['_']; - ++is_idchar['$']; - ++is_idstart['$']; - - ++is_space[' ']; - ++is_space['\t']; - ++is_space['\v']; - ++is_space['\f']; - ++is_space['\n']; - ++is_space['\r']; -} - -void -error VPROTO ((char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - msgid = va_arg (args, char *); -#endif - - fprintf (stderr, "error: "); - vfprintf (stderr, _(msgid), args); - fprintf (stderr, "\n"); - va_end (args); -} - -void -pedwarn VPROTO ((char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - msgid = va_arg (args, char *); -#endif - - fprintf (stderr, "pedwarn: "); - vfprintf (stderr, _(msgid), args); - fprintf (stderr, "\n"); - va_end (args); -} - -void -warning VPROTO ((char * msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - char * msgid; -#endif - va_list args; - - VA_START (args, msgid); - -#ifndef ANSI_PROTOTYPES - msgid = va_arg (args, char *); -#endif - - fprintf (stderr, "warning: "); - vfprintf (stderr, _(msgid), args); - fprintf (stderr, "\n"); - va_end (args); -} - - -int -check_assertion (name, sym_length, tokens_specified, tokens) - U_CHAR *name; - int sym_length; - int tokens_specified; - struct arglist *tokens; -{ - return 0; -} - -struct hashnode * -lookup (name, len, hash) - U_CHAR *name; - int len; - int hash; -{ - return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1); -} - -PTR -xmalloc (size) - size_t size; -{ - return (PTR) malloc (size); -} -#endif diff --git a/contrib/gcc/config/alpha/netbsd-elf.h b/contrib/gcc/config/alpha/netbsd-elf.h deleted file mode 100644 index 6e4f4daf62b2..000000000000 --- a/contrib/gcc/config/alpha/netbsd-elf.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Definitions of target machine for GNU compiler - for Alpha NetBSD systems using ELF. - 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. */ - -#undef TARGET_VERSION -#define TARGET_VERSION fprintf (stderr, " (Alpha NetBSD/ELF)"); - -#undef SUB_CPP_PREDEFINES -#define SUB_CPP_PREDEFINES "-D__ELF__" - -#undef SUBTARGET_EXTRA_SPECS -#define SUBTARGET_EXTRA_SPECS \ -{ "elf_dynamic_linker", ELF_DYNAMIC_LINKER }, - -#define ELF_DYNAMIC_LINKER "/usr/libexec/ld.elf_so" diff --git a/contrib/gcc/config/alpha/t-crtbe b/contrib/gcc/config/alpha/t-crtbe deleted file mode 100644 index 5e82b923c720..000000000000 --- a/contrib/gcc/config/alpha/t-crtbe +++ /dev/null @@ -1,9 +0,0 @@ -# Effectively disable the crtbegin/end rules using crtstuff.c -T = disable - -# Assemble startup files. -crtbegin.o: $(srcdir)/config/alpha/crtbegin.asm $(GCC_PASSES) - $(GCC_FOR_TARGET) -c -o crtbegin.o -x assembler $(srcdir)/config/alpha/crtbegin.asm - -crtend.o: $(srcdir)/config/alpha/crtend.asm $(GCC_PASSES) - $(GCC_FOR_TARGET) -c -o crtend.o -x assembler $(srcdir)/config/alpha/crtend.asm diff --git a/contrib/gcc/config/alpha/vms-tramp.asm b/contrib/gcc/config/alpha/vms-tramp.asm deleted file mode 100644 index fce9ec539cad..000000000000 --- a/contrib/gcc/config/alpha/vms-tramp.asm +++ /dev/null @@ -1,22 +0,0 @@ -;# New Alpha OpenVMS trampoline -;# - .set noreorder - .set volatile - .set noat - .file 1 "tramp.s" -.text - .align 3 - .globl __tramp - .ent __tramp -__tramp..en: - -.link - .align 3 -__tramp: - .pdesc __tramp..en,null -.text - ldq $1,24($27) - ldq $27,16($27) - ldq $28,8($27) - jmp $31,($28),0 - .end __tramp diff --git a/contrib/gcc/config/alpha/x-alpha b/contrib/gcc/config/alpha/x-alpha deleted file mode 100644 index 9686ab96472a..000000000000 --- a/contrib/gcc/config/alpha/x-alpha +++ /dev/null @@ -1,2 +0,0 @@ -CLIB=-lmld -EXTRA_HEADERS = $(srcdir)/config/alpha/va_list.h diff --git a/contrib/gcc/config/alpha/xm-alpha.h b/contrib/gcc/config/alpha/xm-alpha.h deleted file mode 100644 index c04844fdacde..000000000000 --- a/contrib/gcc/config/alpha/xm-alpha.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Configuration for GNU C-compiler for DEC Alpha. - Copyright (C) 1990, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu). - -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. */ - - -/* #defines that need visibility everywhere. */ -#define FALSE 0 -#define TRUE 1 - -/* This describes the machine the compiler is hosted on. */ -#define HOST_BITS_PER_CHAR 8 -#define HOST_BITS_PER_SHORT 16 -#define HOST_BITS_PER_INT 32 -#define HOST_BITS_PER_LONG 64 -#define HOST_BITS_PER_LONGLONG 64 - -/* #define HOST_WORDS_BIG_ENDIAN */ - -/* target machine dependencies. - tm.h is a symbolic link to the actual target specific file. */ -#include "tm.h" - -/* Arguments to use with `exit'. */ -#define SUCCESS_EXIT_CODE 0 -#define FATAL_EXIT_CODE 33 - -/* If compiled with GNU C, use the builtin alloca. */ -#ifndef alloca -#if defined(__GNUC__) && !defined(USE_C_ALLOCA) -#define alloca __builtin_alloca -#else -#if !defined(_WIN32) && !defined(USE_C_ALLOCA) && !defined(OPEN_VMS) && !defined(__INTERIX) -#include <alloca.h> -#else -extern void *alloca (); -#endif -#endif -#endif - -/* The host compiler has problems with enum bitfields since it makes - them signed so we can't fit all our codes in. */ - -#ifndef __GNUC__ -#define ONLY_INT_FIELDS -#endif - -/* Declare some functions needed for this machine. We don't want to - include these in the sources since other machines might define them - differently. */ - -extern void *malloc (), *realloc (), *calloc (); - -#ifndef inhibit_libc -#include "string.h" -#endif - -/* OSF/1 is POSIX.1 compliant. */ - -#define POSIX diff --git a/contrib/gcc/config/alpha/xm-openbsd.h b/contrib/gcc/config/alpha/xm-openbsd.h deleted file mode 100644 index 50f436695a71..000000000000 --- a/contrib/gcc/config/alpha/xm-openbsd.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Configuration file for an host running alpha OpenBSD. - 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 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 <xm-openbsd.h> -#include <alpha/xm-alpha.h> - diff --git a/contrib/gcc/config/i386/config-nt.sed b/contrib/gcc/config/i386/config-nt.sed deleted file mode 100644 index 6c86b27e99ce..000000000000 --- a/contrib/gcc/config/i386/config-nt.sed +++ /dev/null @@ -1,38 +0,0 @@ -/^Makefile/,/^ rm -f config.run/d -s/rm -f/del/ -s/|| cp/|| copy/ -/^config.status/,/ fi/d -s/config.status//g -s/\/dev\/null/NUL/g -s/$(srcdir)\/c-parse/c-parse/g -s/$(srcdir)\/c-gperf/c-gperf/g -/^multilib.h/ s/multilib/not-multilib/ -/^target=/ c\ -target=winnt3.5 -/^xmake_file=/ d -/^tmake_file=/ d -/^out_file/ c\ -out_file=config/i386/i386.c -/^out_object_file/ c\ -out_object_file=i386.obj -/^md_file/ c\ -md_file=config/i386/i386.md -/^tm_file/ c\ -tm_file=config/i386/win-nt.h -/^build_xm_file/ c\ -build_xm_file=config/i386/xm-winnt.h -/^host_xm_file/ c\ -host_xm_file=config/i386/xm-winnt.h -/^####target/ i\ -CC = cl \ -CLIB = libc.lib kernel32.lib \ -CFLAGS = -Di386 -DWIN32 -D_WIN32 -D_M_IX86=300 -D_X86_=1 \\\ - -DALMOST_STDC -D_MSC_VER=800 \ -LDFLAGS = -align:0x1000 -subsystem:console -entry:mainCRTStartup \\\ - -stack:1000000,1000 \ -\ -EXTRA_OBJS=winnt.obj \ -winnt.obj: $(srcdir)/config/i386/winnt.c \ -\ $(CC) $(CFLAGS) \\\ -\ -I. -I$(srcdir) -I$(srcdir)/config -c $(srcdir)/config/i386/winnt.c \ - diff --git a/contrib/gcc/config/i386/dgux.c b/contrib/gcc/config/i386/dgux.c deleted file mode 100644 index 638d1e0f60e6..000000000000 --- a/contrib/gcc/config/i386/dgux.c +++ /dev/null @@ -1,192 +0,0 @@ -/* Subroutines for GNU compiler for Intel 80x86 running DG/ux - Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc. - Currently maintained by (gcc@dg-rtp.dg.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. */ - -#include <time.h> -#include "i386/i386.c" - - -extern char *version_string; - -struct option -{ - char *string; - int *variable; - int on_value; - char *description; -}; - -static int -output_option (file, sep, type, name, indent, pos, max) - FILE *file; - char *sep; - char *type; - char *name; - char *indent; - int pos; - int max; -{ - if (strlen (sep) + strlen (type) + strlen (name) + pos > max) - { - fprintf (file, indent); - return fprintf (file, "%s%s", type, name); - } - return pos + fprintf (file, "%s%s%s", sep, type, name); -} - -static struct { char *name; int value; } m_options[] = TARGET_SWITCHES; - -static void -output_options (file, f_options, f_len, W_options, W_len, - pos, max, sep, indent, term) - FILE *file; - struct option *f_options; - struct option *W_options; - int f_len, W_len; - int pos; - int max; - char *indent; - char *term; -{ - register int j; - - if (optimize) - pos = output_option (file, sep, "-O", "", indent, pos, max); - if (write_symbols != NO_DEBUG) - pos = output_option (file, sep, "-g", "", indent, pos, max); -/* if (flag_traditional) - pos = output_option (file, sep, "-traditional", "", indent, pos, max);*/ - if (profile_flag) - pos = output_option (file, sep, "-p", "", indent, pos, max); - if (profile_block_flag) - pos = output_option (file, sep, "-a", "", indent, pos, max); - - for (j = 0; j < f_len; j++) - if (*f_options[j].variable == f_options[j].on_value) - pos = output_option (file, sep, "-f", f_options[j].string, - indent, pos, max); - - for (j = 0; j < W_len; j++) - if (*W_options[j].variable == W_options[j].on_value) - pos = output_option (file, sep, "-W", W_options[j].string, - indent, pos, max); - - for (j = 0; j < sizeof m_options / sizeof m_options[0]; j++) - if (m_options[j].name[0] != '\0' - && m_options[j].value > 0 - && ((m_options[j].value & target_flags) - == m_options[j].value)) - pos = output_option (file, sep, "-m", m_options[j].name, - indent, pos, max); - - pos = output_option (file, sep, "-mcpu=", ix86_cpu_string, indent, pos, max); - pos = output_option (file, sep, "-march=", ix86_arch_string, indent, pos, max); - fprintf (file, term); -} - -/* Output to FILE the start of the assembler file. */ - -void -output_file_start (file, f_options, f_len, W_options, W_len) - FILE *file; - struct option *f_options; - struct option *W_options; - int f_len, W_len; -{ - register int pos; - - output_file_directive (file, main_input_filename); - fprintf (file, "\t.version\t\"01.01\"\n"); \ - /* Switch to the data section so that the coffsem symbol and the - gcc2_compiled. symbol aren't in the text section. */ - data_section (); - - pos = fprintf (file, "\n// cc1 (%s) arguments:", VERSION_STRING); - output_options (file, f_options, f_len, W_options, W_len, - pos, 75, " ", "\n// ", "\n\n"); - -#ifdef TARGET_IDENTIFY_REVISION - if (TARGET_IDENTIFY_REVISION) - { - char indent[256]; - - time_t now = time ((time_t *)0); - sprintf (indent, "]\"\n\t%s\t \"@(#)%s [", IDENT_ASM_OP, main_input_filename); - fprintf (file, indent+3); - pos = fprintf (file, "gcc %s, %.24s,", VERSION_STRING, ctime (&now)); - output_options (file, f_options, f_len, W_options, W_len, - pos, 150 - strlen (indent), " ", indent, "]\"\n\n"); - } -#endif /* TARGET_IDENTIFY_REVISION */ -} - -#ifndef CROSS_COMPILE -#if defined (_abort_aux) -/* Debugging aid to be registered via `atexit'. See the definition - of abort in dgux.h. */ -void -abort_aux () -{ - extern int insn_; - extern char * file_; - extern int line_; - static int done; - rtx line_note; - - if (done++) - return; - if (file_ || line_) - { - if (write_symbols != NO_DEBUG) - { - for (line_note = (rtx) insn_ ; line_note != 0 ; line_note = PREV_INSN (line_note)) - if (GET_CODE (line_note) == NOTE && NOTE_LINE_NUMBER (line_note) > 0) - break; - if (line_note != 0) - { - error_with_file_and_line (NOTE_SOURCE_FILE (line_note), - NOTE_LINE_NUMBER (line_note), - "Internal gcc abort from %s:%d", - file_ ? file_ : "<nofile>", line_); - if (insn_ && file_ && strcmp (file_, "toplev.c")) - { - error_with_file_and_line (NOTE_SOURCE_FILE (line_note), - NOTE_LINE_NUMBER (line_note), - "The local variable `insn' has the value:", 0); - debug_rtx ((rtx) insn_); - } - } - } - if (write_symbols == NO_DEBUG || line_note == 0) - { - error ("Internal gcc abort from %s:%d", - file_ ? file_ : "<nofile>", line_); - if (insn_ && file_ && strcmp (file_, "toplev.c")) - { - error ("The local variable `insn' has the value:", 0); - debug_rtx ((rtx) insn_); - } - } - } -} -#endif -#endif - - diff --git a/contrib/gcc/config/i386/os2.h b/contrib/gcc/config/i386/os2.h deleted file mode 100644 index 8bbab361f98f..000000000000 --- a/contrib/gcc/config/i386/os2.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Definitions of target machine for GNU compiler - for an Intel i386 or later processor running OS/2 2.x. - Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. - Contributed by Samuel Figueroa (figueroa@cs.nyu.edu) - -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 DEFAULT_TARGET_MACHINE -#define DEFAULT_TARGET_MACHINE "i386-os2" -#endif -#ifndef LINK_SPEC -#define LINK_SPEC "/st:1048576/pm:vio/noi/a:16/e/bas:65536/nol" -#endif -#ifndef LIB_SPEC -#define LIB_SPEC "libgcc libc" -#endif -#ifndef STARTFILE_SPEC -#define STARTFILE_SPEC "libcrt.lib" -#endif -#ifndef MD_EXEC_PREFIX -#define MD_EXEC_PREFIX "\\gcc\\bin\\" -#endif -#ifndef STANDARD_STARTFILE_PREFIX -#define STANDARD_STARTFILE_PREFIX "\\gcc\\lib\\" -#endif -#ifndef LOCAL_INCLUDE_DIR -#define LOCAL_INCLUDE_DIR "\\gcc\\include" -#endif - -#define YES_UNDERSCORES -#include "i386/gstabs.h" - -#define USE_COLLECT - -#define BIGGEST_FIELD_ALIGNMENT \ - (maximum_field_alignment ? maximum_field_alignment : 32) - -extern int maximum_field_alignment; - -#undef PCC_BITFIELD_TYPE_MATTERS -#define PCC_BITFIELD_TYPE_MATTERS (maximum_field_alignment == 0) - -/* Define this macro if it is advisable to hold scalars in registers - in a wider mode than that declared by the program. In such cases, - the value is constrained to be within the bounds of the declared - type, but kept valid in the wider mode. The signedness of the - extension may differ from that of the type. */ - -#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \ - if (GET_MODE_CLASS (MODE) == MODE_INT \ - && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \ - (MODE) = SImode; - -/* Define this if function arguments should also be promoted using the above - procedure. */ - -#define PROMOTE_FUNCTION_ARGS - -/* Likewise, if the function return value is promoted. */ - -#define PROMOTE_FUNCTION_RETURN diff --git a/contrib/gcc/config/i386/perform.h b/contrib/gcc/config/i386/perform.h deleted file mode 100644 index 8d6d0b71dfeb..000000000000 --- a/contrib/gcc/config/i386/perform.h +++ /dev/null @@ -1,98 +0,0 @@ -/* Definitions for AT&T assembler syntax for the Intel 80386. - Copyright (C) 1993 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. */ - -/* Defines to be able to build libgcc.a with GCC. */ - -/* It might seem that these are not important, since gcc 2 will never - call libgcc for these functions. But programs might be linked with - code compiled by gcc 1, and then these will be used. */ - -/* The arg names used to be a and b, but `a' appears inside strings - and that confuses non-ANSI cpp. */ - -#define perform_udivsi3(arg0,arg1) \ -{ \ - register int dx asm("dx"); \ - register int ax asm("ax"); \ - \ - dx = 0; \ - ax = arg0; \ - asm ("divl %3" : "=a" (ax), "=d" (dx) : "a" (ax), "g" (arg1), "d" (dx)); \ - return ax; \ -} - -#define perform_divsi3(arg0,arg1) \ -{ \ - register int dx asm("dx"); \ - register int ax asm("ax"); \ - register int cx asm("cx"); \ - \ - ax = arg0; \ - cx = arg1; \ - asm ("cltd\n\tidivl %3" : "=a" (ax), "=&d" (dx) : "a" (ax), "c" (cx)); \ - return ax; \ -} - -#define perform_umodsi3(arg0,arg1) \ -{ \ - register int dx asm("dx"); \ - register int ax asm("ax"); \ - \ - dx = 0; \ - ax = arg0; \ - asm ("divl %3" : "=a" (ax), "=d" (dx) : "a" (ax), "g" (arg1), "d" (dx)); \ - return dx; \ -} - -#define perform_modsi3(arg0,arg1) \ -{ \ - register int dx asm("dx"); \ - register int ax asm("ax"); \ - register int cx asm("cx"); \ - \ - ax = arg0; \ - cx = arg1; \ - asm ("cltd\n\tidivl %3" : "=a" (ax), "=&d" (dx) : "a" (ax), "c" (cx)); \ - return dx; \ -} - -#define perform_fixdfsi(arg0) \ -{ \ - auto unsigned short ostatus; \ - auto unsigned short nstatus; \ - auto int ret; \ - auto double tmp; \ - \ - &ostatus; /* guarantee these land in memory */ \ - &nstatus; \ - &ret; \ - &tmp; \ - \ - asm volatile ("fnstcw %0" : "=m" (ostatus)); \ - nstatus = ostatus | 0x0c00; \ - asm volatile ("fldcw %0" : /* no outputs */ : "m" (nstatus)); \ - tmp = arg0; \ - asm volatile ("fldl %0" : /* no outputs */ : "m" (tmp)); \ - asm volatile ("fistpl %0" : "=m" (ret)); \ - asm volatile ("fldcw %0" : /* no outputs */ : "m" (ostatus)); \ - \ - return ret; \ -} - diff --git a/contrib/gcc/config/i386/sco.h b/contrib/gcc/config/i386/sco.h deleted file mode 100644 index 55af64128a10..000000000000 --- a/contrib/gcc/config/i386/sco.h +++ /dev/null @@ -1,117 +0,0 @@ -/* Definitions for Intel 386 running SCO Unix System V. - Copyright (C) 1988, 92, 94, 95, 96, 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. */ - -/* Mostly it's like AT&T Unix System V. */ - -#include "i386/sysv3.h" - -/* By default, target has a 80387, uses IEEE compatible arithmetic, - and returns float values in the 387, ie, - (TARGET_80387 | TARGET_FLOAT_RETURNS_IN_80387) - - SCO's software emulation of a 387 fails to handle the `fucomp' - opcode. fucomp is only used when generating IEEE compliant code. - So don't make TARGET_IEEE_FP default for SCO. */ - -#undef TARGET_DEFAULT -#define TARGET_DEFAULT (MASK_80387 | MASK_FLOAT_RETURNS) - -/* Let's guess that the SCO software FPU emulator can't handle - 80-bit XFmode insns, so don't generate them. */ -#undef LONG_DOUBLE_TYPE_SIZE -#define LONG_DOUBLE_TYPE_SIZE 64 - -/* Use crt1.o as a startup file and crtn.o as a closing file. */ - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC \ - "%{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}} crtbegin.o%s" - -#define ENDFILE_SPEC "crtend.o%s crtn.o%s" - -/* Library spec, including SCO international language support. */ - -#undef LIB_SPEC -#define LIB_SPEC \ - "%{p:-L/usr/lib/libp}%{pg:-L/usr/lib/libp} %{scointl:libintl.a%s} -lc" - -/* Specify predefined symbols in preprocessor. */ - -#undef CPP_PREDEFINES -#define CPP_PREDEFINES "-Dunix -DM_UNIX -DM_I386 -DM_COFF -DM_WORDSWAP -Asystem(svr3)" - -#undef CPP_SPEC -#define CPP_SPEC "%(cpp_cpu) %{scointl:-DM_INTERNAT}" - -/* This spec is used for telling cpp whether char is signed or not. */ - -#undef SIGNED_CHAR_SPEC -#if DEFAULT_SIGNED_CHAR -#define SIGNED_CHAR_SPEC \ - "%{funsigned-char:-D__CHAR_UNSIGNED__ -D_CHAR_UNSIGNED}" -#else -#define SIGNED_CHAR_SPEC \ - "%{!fsigned-char:-D__CHAR_UNSIGNED__ -D_CHAR_UNSIGNED}" -#endif - -/* Use atexit for static destructors, instead of defining - our own exit function. */ -#define HAVE_ATEXIT - -/* Specify the size_t type. */ -#define SIZE_TYPE "unsigned int" - -#if 0 /* Not yet certain whether this is needed. */ -/* If no 387, use the general regs to return floating values, - since this system does not emulate the 80387. */ - -#undef VALUE_REGNO -#define VALUE_REGNO(MODE) \ - ((TARGET_80387 - && ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode) - ? FIRST_FLOAT_REG : 0) - -#undef HARD_REGNO_MODE_OK -#define HARD_REGNO_MODE_OK(REGNO, MODE) \ - ((REGNO) < 2 ? 1 \ - : (REGNO) < 4 ? 1 \ - : FP_REGNO_P (REGNO) ? ((GET_MODE_CLASS (MODE) == MODE_FLOAT \ - || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT) \ - && TARGET_80387 \ - && GET_MODE_UNIT_SIZE (MODE) <= 8) \ - : (MODE) != QImode) -#endif - -/* caller has to pop the extra argument passed to functions that return - structures. */ - -#undef RETURN_POPS_ARGS -#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \ - ((FUNDECL) && TREE_CODE (FUNDECL) == IDENTIFIER_NODE ? 0 \ - : (TARGET_RTD \ - && (TYPE_ARG_TYPES (FUNTYPE) == 0 \ - || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE))) \ - == void_type_node))) ? (SIZE) \ - : 0) -/* On other 386 systems, the last line looks like this: - : (aggregate_value_p (TREE_TYPE (FUNTYPE))) ? GET_MODE_SIZE (Pmode) : 0) */ - -/* Handle #pragma pack. */ -#define HANDLE_SYSV_PRAGMA diff --git a/contrib/gcc/config/i386/sco4.h b/contrib/gcc/config/i386/sco4.h deleted file mode 100644 index 5d1ea471dbf8..000000000000 --- a/contrib/gcc/config/i386/sco4.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Definitions for Intel 386 running SCO Unix System V 3.2 Version 4. - Written by Chip Salzenberg. - Copyright (C) 1992, 1994 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. */ - - -/* Mostly it's like earlier SCO UNIX. */ - -#include "i386/sco.h" - -/* Use crt1.o as a startup file and crtn.o as a closing file. */ - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC \ - "%{scoxpg3:%{p:mcrt1X.o%s}%{!p:crt1X.o%s}} \ - %{!scoxpg3:\ - %{posix:%{p:mcrt1P.o%s}%{!p:crt1P.o%s}} \ - %{!posix:\ - %{ansi:%{p:mcrt1A.o%s}%{!p:crt1A.o%s}} \ - %{!ansi:%{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}}}} \ - crtbegin.o%s" - -#undef ENDFILE_SPEC -#define ENDFILE_SPEC \ - "crtend.o%s \ - %{scoxpg3:crtnX.o%s} \ - %{!scoxpg3:\ - %{posix:crtnP.o%s} \ - %{!posix:\ - %{ansi:crtnA.o%s} \ - %{!ansi:crtn.o%s}}}" - -/* Library spec. */ - -#undef LIB_SPEC -#define LIB_SPEC \ - "%{p:-L/usr/lib/libp}%{pg:-L/usr/lib/libp} \ - %{scoxpg3:-lcX -lcP -lcA} \ - %{!scoxpg3:\ - %{posix:-lcP -lcA} \ - %{!posix:\ - %{ansi:-lcA} \ - %{!ansi:%{scointl:-lintl} -lc}}}" - -/* Macros, macros everywhere: - Specify predefined symbols in preprocessor. */ - -#undef CPP_PREDEFINES -#define CPP_PREDEFINES \ - "-Asystem(svr3)" - -#undef CPP_SPEC -#define CPP_SPEC "%(cpp_cpu) \ - -D_i386 -D_M_I386 -D_M_I86 -D_M_I86SM -D_M_SDATA -D_M_STEXT \ - -D_unix -D_M_UNIX -D_M_XENIX \ - -D_M_SYS5 -D_M_SYSV -D_M_SYS3 -D_M_SYSIII \ - -D_M_COFF -D_M_BITFIELDS -D_M_WORDSWAP \ - %{scoxpg3:-D_XOPEN_SOURCE -D_STRICT_NAMES} \ - %{!scoxpg3:%{posix:-D_POSIX_SOURCE -D_STRICT_NAMES}} \ - %{!scoxpg3:%{!posix:\ - %{ansi:-D_STRICT_NAMES}%{!ansi:\ - -Di386 -DM_I386 -DM_I86 -DM_I86SM -DM_SDATA -DM_STEXT \ - -Dunix -DM_UNIX -DM_XENIX \ - -DM_SYS5 -DM_SYSV -DM_SYS3 -DM_SYSIII \ - -DM_COFF -DM_BITFIELDS -DM_WORDSWAP \ - %{scointl:-D_M_INTERNAT -DM_INTERNAT} \ - %{traditional:-D_KR -D_SVID -D_NO_PROTOTYPE}}}}" - -/* The system headers are C++-aware. */ -#define NO_IMPLICIT_EXTERN_C diff --git a/contrib/gcc/config/i386/sco4dbx.h b/contrib/gcc/config/i386/sco4dbx.h deleted file mode 100644 index 3d075b6a2e26..000000000000 --- a/contrib/gcc/config/i386/sco4dbx.h +++ /dev/null @@ -1,81 +0,0 @@ -/* Definitions for Intel 386 running SCO Unix System V 3.2 Version 4.s, - using dbx-in-coff encapsulation. - Copyright (C) 1992 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. */ - - -/* Mostly it's like earlier SCO UNIX. */ - -#include "i386/scodbx.h" - -/* Use crt1.o as a startup file and crtn.o as a closing file. */ - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC \ - "%{!r:%{!z:gcc.ifile%s}%{z:gccz.ifile%s}}\ - %{scoxpg3:%{p:mcrt1X.o%s}%{!p:crt1X.o%s}} \ - %{!scoxpg3:\ - %{posix:%{p:mcrt1P.o%s}%{!p:crt1P.o%s}} \ - %{!posix:\ - %{ansi:%{p:mcrt1A.o%s}%{!p:crt1A.o%s}} \ - %{!ansi:%{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}}}}" - -#undef ENDFILE_SPEC -#define ENDFILE_SPEC \ - "%{scoxpg3:crtnX.o%s} \ - %{!scoxpg3:\ - %{posix:crtnP.o%s} \ - %{!posix:\ - %{ansi:crtnA.o%s} \ - %{!ansi:crtn.o%s}}}" - -/* Library spec. */ - -#undef LIB_SPEC -#define LIB_SPEC \ - "%{p:-L/usr/lib/libp}%{pg:-L/usr/lib/libp} \ - %{scoxpg3:-lcX -lcP -lcA} \ - %{!scoxpg3:\ - %{posix:-lcP -lcA} \ - %{!posix:\ - %{ansi:-lcA} \ - %{!ansi:%{scointl:-lintl} -lc}}}" - -/* Macros, macros everywhere: - Specify predefined symbols in preprocessor. */ - -#undef CPP_PREDEFINES -#define CPP_PREDEFINES "-Dunix -Asystem(svr3)" - -#undef CPP_SPEC -#define CPP_SPEC "%(cpp_cpu) \ - -D_M_I386 -D_M_I86 -D_M_I86SM -D_M_SDATA -D_M_STEXT \ - -D_M_UNIX -D_M_XENIX \ - -D_M_SYS5 -D_M_SYSV -D_M_SYS3 -D_M_SYSIII \ - -D_M_COFF -D_M_BITFIELDS -D_M_WORDSWAP \ - %{scoxpg3:-D_XOPEN_SOURCE -D_STRICT_NAMES} \ - %{!scoxpg3:%{posix:-D_POSIX_SOURCE -D_STRICT_NAMES}} \ - %{!scoxpg3:%{!posix:\ - %{ansi:-D_STRICT_NAMES}%{!ansi:\ - -DM_I386 -DM_I86 -DM_I86SM -DM_SDATA -DM_STEXT \ - -DM_UNIX -DM_XENIX \ - -DM_SYS5 -DM_SYSV -DM_SYS3 -DM_SYSIII \ - -DM_COFF -DM_BITFIELDS -DM_WORDSWAP \ - %{scointl:-D_M_INTERNAT -DM_INTERNAT} \ - %{traditional:-D_KR -D_SVID -D_NO_PROTOTYPE}}}}" diff --git a/contrib/gcc/config/i386/sco5gas.h b/contrib/gcc/config/i386/sco5gas.h deleted file mode 100644 index de3e5d5570f1..000000000000 --- a/contrib/gcc/config/i386/sco5gas.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Definitions for Intel x86 running SCO OpenServer, running GNU assembler - 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. */ - - -/* Just set a single flag we can test for inside of sco5.h and include it. */ - -#define USE_GAS 1 diff --git a/contrib/gcc/config/i386/scodbx.h b/contrib/gcc/config/i386/scodbx.h deleted file mode 100644 index 7da93053256f..000000000000 --- a/contrib/gcc/config/i386/scodbx.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Definitions for Intel 386 running SCO Unix System V, - using dbx-in-coff encapsulation. - Copyright (C) 1992, 1995, 1996, 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. */ - -#include "i386/svr3dbx.h" - -/* Overridden defines for SCO systems from sco.h. */ - -/* By default, target has a 80387, uses IEEE compatible arithmetic, - and returns float values in the 387, ie, - (TARGET_80387 | TARGET_FLOAT_RETURNS_IN_80387) - - SCO's software emulation of a 387 fails to handle the `fucomp' - opcode. fucomp is only used when generating IEEE compliant code. - So don't make TARGET_IEEE_FP default for SCO. */ - -#undef TARGET_SUBTARGET_DEFAULT -#define TARGET_SUBTARGET_DEFAULT (MASK_80387 | MASK_FLOAT_RETURNS) - -/* Use crt1.o as a startup file and crtn.o as a closing file. */ - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC \ - "%{!r:%{!z:svr3.ifile%s}%{z:svr3z.ifile%s}}\ - %{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}" - -/* Library spec, including SCO international language support. */ - -#undef LIB_SPEC -#define LIB_SPEC \ - "%{p:-L/usr/lib/libp}%{pg:-L/usr/lib/libp} %{scointl:libintl.a%s} -lc" - -/* Specify predefined symbols in preprocessor. */ - -#undef CPP_PREDEFINES -#define CPP_PREDEFINES "-Dunix -DM_UNIX -DM_I386 -DM_COFF -DM_WORDSWAP -Asystem=svr3" - -#undef CPP_SPEC -#define CPP_SPEC "%(cpp_cpu) %{scointl:-DM_INTERNAT}" - -/* This spec is used for telling cpp whether char is signed or not. */ - -#undef SIGNED_CHAR_SPEC -#if DEFAULT_SIGNED_CHAR -#define SIGNED_CHAR_SPEC \ - "%{funsigned-char:-D__CHAR_UNSIGNED__ -D_CHAR_UNSIGNED}" -#else -#define SIGNED_CHAR_SPEC \ - "%{!fsigned-char:-D__CHAR_UNSIGNED__ -D_CHAR_UNSIGNED}" -#endif - -/* caller has to pop the extra argument passed to functions that return - structures. */ - -#undef RETURN_POPS_ARGS -#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \ - ((FUNDECL) && TREE_CODE (FUNDECL) == IDENTIFIER_NODE ? 0 \ - : (TARGET_RTD \ - && (TYPE_ARG_TYPES (FUNTYPE) == 0 \ - || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE))) \ - == void_type_node))) ? (SIZE) \ - : 0) -/* On other 386 systems, the last line looks like this: - : (aggregate_value_p (TREE_TYPE (FUNTYPE))) ? GET_MODE_SIZE (Pmode) : 0) */ - -/* Handle #pragma pack. */ -#define HANDLE_SYSV_PRAGMA diff --git a/contrib/gcc/config/i386/t-i386bare b/contrib/gcc/config/i386/t-i386bare deleted file mode 100644 index 2970fa714155..000000000000 --- a/contrib/gcc/config/i386/t-i386bare +++ /dev/null @@ -1,3 +0,0 @@ -# The i386 md has all of these taken care of, according to sef. -LIBGCC1 = -CROSS_LIBGCC1 = diff --git a/contrib/gcc/config/i386/t-vsta b/contrib/gcc/config/i386/t-vsta deleted file mode 100644 index 6160b7ec945d..000000000000 --- a/contrib/gcc/config/i386/t-vsta +++ /dev/null @@ -1,2 +0,0 @@ -LIBGCC1 = libgcc1.null -CROSS_LIBGCC1 = libgcc1.null diff --git a/contrib/gcc/config/i386/t-winnt b/contrib/gcc/config/i386/t-winnt deleted file mode 100644 index 1e3557c1822a..000000000000 --- a/contrib/gcc/config/i386/t-winnt +++ /dev/null @@ -1,6 +0,0 @@ -winnt.o: $(srcdir)/config/i386/winnt.c - $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/i386/winnt.c -oldnames.o: $(srcdir)/config/winnt/oldnames.c - $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/winnt/oldnames.c -spawnv.o: $(srcdir)/config/winnt/spawnv.c - $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/winnt/spawnv.c diff --git a/contrib/gcc/config/i386/win-nt.h b/contrib/gcc/config/i386/win-nt.h deleted file mode 100644 index 97f10c39d002..000000000000 --- a/contrib/gcc/config/i386/win-nt.h +++ /dev/null @@ -1,150 +0,0 @@ -/* Operating system specific defines to be used when targeting GCC for - Windows NT 3.x on an i386. - Copyright (C) 1994, 1995 Free Software Foundation, Inc. - Contributed by Douglas B. Rupp (drupp@cs.washington.edu). - -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. */ - -#define YES_UNDERSCORES - -#include "i386/gas.h" - -#ifdef CPP_PREDEFINES -#undef CPP_PREDEFINES -#endif -#define CPP_PREDEFINES "-Dunix -Di386 -DWIN32 -D_WIN32 \ - -DWINNT -D_M_IX86=300 -D_X86_=1 -D__STDC__=0 -DALMOST_STDC -D_MSC_VER=800 \ - -D__stdcall=__attribute__((__stdcall__)) \ - -D__cdecl=__attribute__((__cdecl__)) \ - -D_cdecl=__attribute__((__cdecl__)) \ - -Asystem(unix) -Asystem(winnt) -Acpu(i386) -Amachine(i386)" - -#define SIZE_TYPE "unsigned int" -#define PTRDIFF_TYPE "int" -#define WCHAR_UNSIGNED 1 -#define WCHAR_TYPE_SIZE 16 -#define WCHAR_TYPE "short unsigned int" -#undef LONG_DOUBLE_TYPE_SIZE -#define LONG_DOUBLE_TYPE_SIZE 64 -#define HAVE_ATEXIT 1 - -#undef EXTRA_SECTIONS -#define EXTRA_SECTIONS in_ctor, in_dtor - -#undef EXTRA_SECTION_FUNCTIONS -#define EXTRA_SECTION_FUNCTIONS \ - CTOR_SECTION_FUNCTION \ - DTOR_SECTION_FUNCTION - -#define CTOR_SECTION_FUNCTION \ -void \ -ctor_section () \ -{ \ - if (in_section != in_ctor) \ - { \ - fprintf (asm_out_file, "\t.section .ctor\n"); \ - in_section = in_ctor; \ - } \ -} - -#define DTOR_SECTION_FUNCTION \ -void \ -dtor_section () \ -{ \ - if (in_section != in_dtor) \ - { \ - fprintf (asm_out_file, "\t.section .dtor\n"); \ - in_section = in_dtor; \ - } \ -} - -#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \ - do { \ - ctor_section (); \ - fprintf (FILE, "%s\t", ASM_LONG); \ - assemble_name (FILE, NAME); \ - fprintf (FILE, "\n"); \ - } while (0) - -#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \ - do { \ - dtor_section (); \ - fprintf (FILE, "%s\t", ASM_LONG); \ - assemble_name (FILE, NAME); \ - fprintf (FILE, "\n"); \ - } while (0) - -/* 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). - - On i386, if using PIC, mark a SYMBOL_REF for a non-global symbol - so that we may access it directly in the GOT. - - On i386 running Windows NT, modify the assembler name with a suffix - consisting of an atsign (@) followed by string of digits that represents - the number of bytes of arguments passed to the function, if it has the - attribute STDCALL. */ - -#ifdef ENCODE_SECTION_INFO -#undef ENCODE_SECTION_INFO -#define ENCODE_SECTION_INFO(DECL) \ -do \ - { \ - if (flag_pic) \ - { \ - rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ - ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \ - SYMBOL_REF_FLAG (XEXP (rtl, 0)) \ - = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ - || ! TREE_PUBLIC (DECL)); \ - } \ - if (TREE_CODE (DECL) == FUNCTION_DECL) \ - if (lookup_attribute ("stdcall", \ - TYPE_ATTRIBUTES (TREE_TYPE (DECL)))) \ - XEXP (DECL_RTL (DECL), 0) = \ - gen_rtx (SYMBOL_REF, Pmode, gen_stdcall_suffix (DECL)); \ - } \ -while (0) -#endif - -/* The global __fltused is necessary to cause the printf/scanf routines - for outputting/inputting floating point numbers to be loaded. Since this - is kind of hard to detect, we just do it all the time. */ - -#ifdef ASM_FILE_START -#undef ASM_FILE_START -#endif -#define ASM_FILE_START(FILE) \ - do { output_file_directive (FILE, main_input_filename); \ - fprintf (FILE, ".global\t__fltused\n"); \ - } while (0) - -/* if the switch "-mwindows" is passed to ld, then specify to the Microsoft - linker the proper switches and libraries to build a graphical program */ - -#undef LIB_SPEC -#define LIB_SPEC "%{mwindows:-subsystem windows -e _WinMainCRTStartup \ - USER32.LIB%s GDI32.LIB%s COMDLG32.LIB%s WINSPOOL.LIB%s} \ - %{!mwindows:-subsystem console -e _mainCRTStartup} \ - %{mcrtmt:LIBCMT.LIB%s KERNEL32.LIB%s ADVAPI32.LIB%s} \ - %{!mcrtmt:LIBC.LIB%s KERNEL32.LIB%s ADVAPI32.LIB%s} \ - %{v}" - -#include "winnt/win-nt.h" - diff --git a/contrib/gcc/config/i386/x-aix b/contrib/gcc/config/i386/x-aix deleted file mode 100644 index b191e48fd0f0..000000000000 --- a/contrib/gcc/config/i386/x-aix +++ /dev/null @@ -1,12 +0,0 @@ -# There is an alloca in -lbsd, but it is limited to 32K -ALLOCA = alloca.o - -# If you are running out of memory while compiling gcc, with the standard -# /bin/cc uncomment MALLOCLIB line. That version of malloc is slower but -# has less overhead than the one in libc. -#MALLOCLIB = -lmalloc - -# Uncomment out the next line if you want to link with the shareable libc_s. -#CLIB_S = -lc_s - -CLIB = -lld $(MALLOCLIB) $(CLIB_S) diff --git a/contrib/gcc/config/i386/x-cygwin b/contrib/gcc/config/i386/x-cygwin deleted file mode 100644 index f251835bd332..000000000000 --- a/contrib/gcc/config/i386/x-cygwin +++ /dev/null @@ -1,4 +0,0 @@ -# Don't run fixproto -STMP_FIXPROTO = -# prefix.c wants to poke around the Registry -CLIB = -ladvapi32 diff --git a/contrib/gcc/config/i386/x-dgux b/contrib/gcc/config/i386/x-dgux deleted file mode 100644 index 322bfe3ae911..000000000000 --- a/contrib/gcc/config/i386/x-dgux +++ /dev/null @@ -1,11 +0,0 @@ -# -# host is ix86 running dgux -# -CC = /bin/gcc -X_CFLAGS = -O -mstandard -mlegend -BOOT_CFLAGS = -O2 -g -mstandard -mlegend $(CFLAGS) -CLIB = -lw32 -RANLIB = true -USER_H = $(EXTRA_HEADERS) $(LANG_EXTRA_HEADERS) -STMP_FIXPROTO = - diff --git a/contrib/gcc/config/i386/x-djgpp b/contrib/gcc/config/i386/x-djgpp deleted file mode 100644 index 89f31ff50082..000000000000 --- a/contrib/gcc/config/i386/x-djgpp +++ /dev/null @@ -1,24 +0,0 @@ -# translate the version string, so it can be used on DJGPP, where only -# one dot in filename is allowed - -# to avoid recursion when redefining $(version) -_version:=$(version) -__version=$(subst ., ,$(_version)) -version=$(word 1,$(__version))$(word 2,$(__version)).$(word 3,$(__version)) - -SYSTEM_HEADER_DIR=$(DJDIR)/include -X_CPPFLAGS=-DSTANDARD_INCLUDE_DIR=\"\$$DJDIR/include\" \ - -DSTANDARD_INCLUDE_COMPONENT=\"\" - -# when building a native compiler for DJGPP, make the target_alias -# a shorter name, since otherwise it will produce some problems, when -# using the same gcc once with long filenames and once with short (8+3) -# filenames -ifeq ($(findstring -pc-msdosdjgpp,$(target_alias)),-pc-msdosdjgpp) -target_alias=djgpp -endif - -# on DJGPP the 'ln -s' does not work correctly -LN = cp -p -LN_S = cp -p - diff --git a/contrib/gcc/config/i386/x-isc b/contrib/gcc/config/i386/x-isc deleted file mode 100644 index ea65ec888a32..000000000000 --- a/contrib/gcc/config/i386/x-isc +++ /dev/null @@ -1,3 +0,0 @@ -CLIB = -lPW -lcposix -X_CFLAGS = -D_POSIX_SOURCE -ENQUIRE_LDFLAGS = -posix $(LDFLAGS) diff --git a/contrib/gcc/config/i386/x-isc3 b/contrib/gcc/config/i386/x-isc3 deleted file mode 100644 index 527cca8132b6..000000000000 --- a/contrib/gcc/config/i386/x-isc3 +++ /dev/null @@ -1,4 +0,0 @@ -CLIB = -lPW -# One person said it needs -DPOSIX_JC, but daa@CERF.NET says no. -X_CFLAGS = -D_SYSV3 -Xp -ENQUIRE_LDFLAGS = $(LDFLAGS) diff --git a/contrib/gcc/config/i386/x-ncr3000 b/contrib/gcc/config/i386/x-ncr3000 deleted file mode 100644 index 4ae168b1fe51..000000000000 --- a/contrib/gcc/config/i386/x-ncr3000 +++ /dev/null @@ -1,34 +0,0 @@ -# Makefile additions for the NCR3000 as host system. - -# Using -O with the AT&T compiler fails, with a message about a missing -# /usr/ccs/lib/optim pass. So override the default in Makefile.in - -CCLIBFLAGS= - -## Supposedly not needed now that xm-sysv4.h includes alloc.h for Metaware. -### NCR3000 ships with a MetaWare compiler installed as CC, which chokes and -### dies all over the place on GCC source. However, the AT&T compiler, -### crusty as it is, can be used to bootstrap GCC. It can be found in -### /usr/ccs/ATT/cc. It is also used to compile the things that should -### not be compiled with GCC. -## -##CC = /usr/ccs/ATT/cc -##OLDCC = /usr/ccs/ATT/cc - -# The rest is just x-i386v4. - -# Some versions of SVR4 have an alloca in /usr/ucblib/libucb.a, and if we are -# careful to link that in after libc we can use it, but since newer versions of -# SVR4 are dropping libucb, it is better to just use the portable C version for -# bootstrapping. Do this by defining ALLOCA. - -ALLOCA = alloca.o - -# We used to build all stages *without* shared libraries because that may make -# debugging the compiler easier (until there is a GDB which supports -# both Dwarf *and* svr4 shared libraries). - -# But james@bigtex.cactus.org says that redefining GCC_CFLAGS causes trouble, -# and that it is easy enough to debug using shared libraries. -# CCLIBFLAGS=-Bstatic -dn -g -# GCC_CFLAGS=-static -g -O2 -B./ diff --git a/contrib/gcc/config/i386/x-next b/contrib/gcc/config/i386/x-next deleted file mode 100644 index a16b918e2d37..000000000000 --- a/contrib/gcc/config/i386/x-next +++ /dev/null @@ -1,3 +0,0 @@ -# Make assignments for compiling on NeXT with their compiler version. -CC=cc -traditional-cpp -OLDCC=cc -traditional-cpp diff --git a/contrib/gcc/config/i386/x-osf1elf b/contrib/gcc/config/i386/x-osf1elf deleted file mode 100644 index 146738107f6e..000000000000 --- a/contrib/gcc/config/i386/x-osf1elf +++ /dev/null @@ -1,8 +0,0 @@ -# Defaults for OSF/1 1.3+ -CC = $(OLDCC) -CLIB = -lld -INSTALL = installbsd -c -OLDCC = /usr/ccs/gcc/gcc -X_CFLAGS = -static - -# FIXPROTO_DEFINES = -D_XOPEN_SOURCE diff --git a/contrib/gcc/config/i386/x-osfrose b/contrib/gcc/config/i386/x-osfrose deleted file mode 100644 index 2c5e3ba13c76..000000000000 --- a/contrib/gcc/config/i386/x-osfrose +++ /dev/null @@ -1,27 +0,0 @@ -# Define CC and OLDCC as the same, so that the tests: -# if [ x"$(OLDCC)" = x"$(CC)" ] ... -# -# will succeed (if OLDCC != CC, it is assumed that GCC is -# being used in secondary stage builds). - -BUILD = -CC = $(OLDCC) -CLIB = -lld -X_CFLAGS = $(DEB_OPT) $(MSTATS) $(X_DEFINES) -X_CFLAGS_NODEBUG = $(NO_DEBUG) $(MSTATS) $(OPT) $(PROFILE) $(X_DEFINES) $(XCFLAGS) -XCFLAGS = $(SHLIB) -CPP_ABORT = # -Dabort=fancy_abort -CPPFLAGS = $(CPP_ABORT) $(SYSTEM_INCLUDES) -DEB_OPT = $(OPT) $(DEBUG) $(PROFILE) -DEBUG = -DEBUG_COLLECT = # -DDEBUG -CCLIBFLAGS = -O -DNO_HALF_PIC -GCC_CFLAGS = $(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) -B./ -DPOSIX -DNO_HALF_PIC -LDFLAGS = -MSTATS = # -mstats -OLDCC = /usr/ccs/gcc/gcc -OPT = -O -PROFILE = -SHLIB = -pic-none -SYSTEM_INCLUDES = # -I${BUILD}/usr/include -X_DEFINES = -Dvfork=fork diff --git a/contrib/gcc/config/i386/x-sco b/contrib/gcc/config/i386/x-sco deleted file mode 100644 index f7f14e9f7c09..000000000000 --- a/contrib/gcc/config/i386/x-sco +++ /dev/null @@ -1,7 +0,0 @@ -RANLIB = : -RANLIB_TEST = false -CC = rcc $(RCCFLAGS) -OLDCC = rcc $(RCCFLAGS) -RCCFLAGS = -Dunix -Di386 -DM_UNIX -DM_I386 -DNULL=0 -CCLIBFLAGS = -CLIB = -lmalloc -lPW diff --git a/contrib/gcc/config/i386/x-sco4 b/contrib/gcc/config/i386/x-sco4 deleted file mode 100644 index be6080f8893d..000000000000 --- a/contrib/gcc/config/i386/x-sco4 +++ /dev/null @@ -1,10 +0,0 @@ -RANLIB = : -RANLIB_TEST = false -CC = rcc $(RCCFLAGS) -OLDCC = rcc $(RCCFLAGS) -RCCFLAGS = -Dunix -Di386 -DM_UNIX -DM_I386 -DNULL=0 -CCLIBFLAGS = -CLIB = -lmalloc -lPW - -# See all the declarations. -FIXPROTO_DEFINES = -D_XOPEN_SOURCE diff --git a/contrib/gcc/config/i386/x-sco5 b/contrib/gcc/config/i386/x-sco5 deleted file mode 100644 index e13ed7425404..000000000000 --- a/contrib/gcc/config/i386/x-sco5 +++ /dev/null @@ -1,10 +0,0 @@ -RANLIB = : -RANLIB_TEST = false -CC = cc -OLDCC = cc -CCLIBFLAGS = -# We avoid the ALLOCA in -lPW becuase it gives us an evil index() -ALLOCA = alloca.o - -# See all the declarations. -FIXPROTO_DEFINES = -D_XOPEN_SOURCE -D_POSIX_C_SOURCE=2 diff --git a/contrib/gcc/config/i386/x-sysv3 b/contrib/gcc/config/i386/x-sysv3 deleted file mode 100644 index a1391df851c9..000000000000 --- a/contrib/gcc/config/i386/x-sysv3 +++ /dev/null @@ -1 +0,0 @@ -CLIB=-lPW diff --git a/contrib/gcc/config/i386/x-vsta b/contrib/gcc/config/i386/x-vsta deleted file mode 100644 index e2279a4b59a7..000000000000 --- a/contrib/gcc/config/i386/x-vsta +++ /dev/null @@ -1 +0,0 @@ -CLIB=-lm diff --git a/contrib/gcc/config/i386/xm-aix.h b/contrib/gcc/config/i386/xm-aix.h deleted file mode 100644 index 4cbd36ef518f..000000000000 --- a/contrib/gcc/config/i386/xm-aix.h +++ /dev/null @@ -1,2 +0,0 @@ -#undef TRUE -#undef FALSE diff --git a/contrib/gcc/config/i386/xm-bsd386.h b/contrib/gcc/config/i386/xm-bsd386.h deleted file mode 100644 index 6b8eee7db039..000000000000 --- a/contrib/gcc/config/i386/xm-bsd386.h +++ /dev/null @@ -1,3 +0,0 @@ -/* Configuration for GCC for Intel i386 running BSDI's BSD/386 as host. */ - -#include "i386/xm-i386.h" diff --git a/contrib/gcc/config/i386/xm-dgux.h b/contrib/gcc/config/i386/xm-dgux.h deleted file mode 100644 index 881c5c7be9d8..000000000000 --- a/contrib/gcc/config/i386/xm-dgux.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Configuration for GCC for Intel i386 running DG/ux */ - -/* looks just like sysv4 for now */ -#include "xm-svr4.h" diff --git a/contrib/gcc/config/i386/xm-dos.h b/contrib/gcc/config/i386/xm-dos.h deleted file mode 100644 index 4e1cb42c8c11..000000000000 --- a/contrib/gcc/config/i386/xm-dos.h +++ /dev/null @@ -1,38 +0,0 @@ -/* Configuration for GNU C-compiler for Intel 80386 running DOS. - Copyright (C) 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. */ - -#include "i386/xm-i386.h" - -/* Use semicolons to separate elements of a path. */ -#define PATH_SEPARATOR ';' - -/* Use backslashs to separate levels of directory. */ -#define DIR_SEPARATOR '\\' -#define DIR_SEPARATOR_2 '/' - -/* Allow checks for drive names. */ -#define HAVE_DOS_BASED_FILE_SYSTEM - -/* Suffix for executable file names. */ -#define EXECUTABLE_SUFFIX ".exe" - -#define MKTEMP_EACH_FILE 1 - -#define NO_PRECOMPILES 1 diff --git a/contrib/gcc/config/i386/xm-freebsd.h b/contrib/gcc/config/i386/xm-freebsd.h deleted file mode 100644 index 007a609f263f..000000000000 --- a/contrib/gcc/config/i386/xm-freebsd.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Configuration for GCC for Intel i386 running FreeBSD as host. */ - -#include <i386/xm-i386.h> -#include <xm-freebsd.h> diff --git a/contrib/gcc/config/i386/xm-gnu.h b/contrib/gcc/config/i386/xm-gnu.h deleted file mode 100644 index 0b5985f9065c..000000000000 --- a/contrib/gcc/config/i386/xm-gnu.h +++ /dev/null @@ -1,5 +0,0 @@ -/* Configuration for GCC for Intel i386 running GNU as host. */ - -#include <i386/xm-i386.h> -#include <xm-gnu.h> - diff --git a/contrib/gcc/config/i386/xm-i386.h b/contrib/gcc/config/i386/xm-i386.h deleted file mode 100644 index acc165767093..000000000000 --- a/contrib/gcc/config/i386/xm-i386.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Configuration for GNU C-compiler for Intel 80386. - Copyright (C) 1988, 1993 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 i386 -#define i386 -#endif - -/* #defines that need visibility everywhere. */ -#define FALSE 0 -#define TRUE 1 - -/* This describes the machine the compiler is hosted on. */ -#define HOST_BITS_PER_CHAR 8 -#define HOST_BITS_PER_SHORT 16 -#define HOST_BITS_PER_INT 32 -#define HOST_BITS_PER_LONG 32 -#define HOST_BITS_PER_LONGLONG 64 - -/* Arguments to use with `exit'. */ -#define SUCCESS_EXIT_CODE 0 -#define FATAL_EXIT_CODE 33 - -/* target machine dependencies. - tm.h is a symbolic link to the actual target specific file. */ - -#include "tm.h" diff --git a/contrib/gcc/config/i386/xm-isc.h b/contrib/gcc/config/i386/xm-isc.h deleted file mode 100644 index e686c5ec9d4d..000000000000 --- a/contrib/gcc/config/i386/xm-isc.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef REAL_ARITHMETIC -#define REAL_VALUE_ATOF(x, mode) strtod ((x), (char **)0) -extern double strtod (); -#endif diff --git a/contrib/gcc/config/i386/xm-linux.h b/contrib/gcc/config/i386/xm-linux.h deleted file mode 100644 index 713bf3b2817a..000000000000 --- a/contrib/gcc/config/i386/xm-linux.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Configuration for GCC for Intel i386 running Linux-based GNU systems. - Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc. - Contributed by H.J. Lu (hjl@nynexst.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. */ - -#include <i386/xm-i386.h> -#include <xm-linux.h> - diff --git a/contrib/gcc/config/i386/xm-lynx.h b/contrib/gcc/config/i386/xm-lynx.h deleted file mode 100644 index 359e41bbe242..000000000000 --- a/contrib/gcc/config/i386/xm-lynx.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Configuration for GNU C-compiler for i386 platforms running LynxOS. - Copyright (C) 1995 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 <xm-lynx.h> - -/* This describes the machine the compiler is hosted on. */ -#define HOST_BITS_PER_CHAR 8 -#define HOST_BITS_PER_SHORT 16 -#define HOST_BITS_PER_INT 32 -#define HOST_BITS_PER_LONG 32 -#define HOST_BITS_PER_LONGLONG 64 - -/* target machine dependencies. - tm.h is a symbolic link to the actual target specific file. */ - -#include "tm.h" diff --git a/contrib/gcc/config/i386/xm-next.h b/contrib/gcc/config/i386/xm-next.h deleted file mode 100644 index bf903281a0dc..000000000000 --- a/contrib/gcc/config/i386/xm-next.h +++ /dev/null @@ -1,5 +0,0 @@ -#include "i386/xm-i386.h" - -/* malloc does better with chunks the size of a page. */ - -#define OBSTACK_CHUNK_SIZE (getpagesize ()) diff --git a/contrib/gcc/config/i386/xm-openbsd.h b/contrib/gcc/config/i386/xm-openbsd.h deleted file mode 100644 index 1a79e83bc4a4..000000000000 --- a/contrib/gcc/config/i386/xm-openbsd.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Configuration file for i386 hosts running OpenBSD. - 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 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 <xm-openbsd.h> -#include <i386/xm-i386.h> - diff --git a/contrib/gcc/config/i386/xm-os2.h b/contrib/gcc/config/i386/xm-os2.h deleted file mode 100644 index b8a5ad057a3a..000000000000 --- a/contrib/gcc/config/i386/xm-os2.h +++ /dev/null @@ -1,75 +0,0 @@ -/* Configuration for GNU compiler - for an Intel i386 or later processor running OS/2 2.x. - Copyright (C) 1993, 1994, 1995, 1997, 1998, 1999 Free Software Foundation, Inc. - Contributed by Samuel Figueroa (figueroa@apple.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. */ - -#ifndef OS2 -#define OS2 -#endif - -#ifdef __IBMC__ -#include <stdlib.h> /* this defines alloca */ -#define USG -#define ONLY_INT_FIELDS -#define USE_PROTOTYPES 1 -#define strcasecmp stricmp -#define kill(a,b) raise(b) -#define mktemp tmpnam -#else -#ifdef __EMX__ -#define EMX -#define USG -#define BSTRING -#define HAVE_PUTENV -#define HAVE_VPRINTF -#define HAVE_STRERROR -#define strcasecmp stricmp -#else -#define ____386BSD____ -int spawnv (int modeflag, char *path, char *argv[]); -int spawnvp (int modeflag, char *path, char *argv[]); -#endif /* __EMX__ */ -#endif /* __IBMC__ */ - -#ifndef PATH_SEPARATOR -#define PATH_SEPARATOR ';' -#endif -#ifndef DIR_SEPARATOR -#define DIR_SEPARATOR '\\' -#endif -#ifndef DIR_SEPARATOR_2 -#define DIR_SEPARATOR_2 '/' -#endif - -/* Allow handling of drive names. */ -#define HAVE_DOS_BASED_FILE_SYSTEM - -#define EXECUTABLE_SUFFIX ".exe" - -/* The EMX compiler uses regular .o files */ -#ifndef __EMX__ -#define OBJECT_SUFFIX ".obj" -#endif - -/* This is required to make temporary file names unique on file - systems which severely restrict the length of file names. */ -#define MKTEMP_EACH_FILE - -#include "i386/xm-i386.h" diff --git a/contrib/gcc/config/i386/xm-osf.h b/contrib/gcc/config/i386/xm-osf.h deleted file mode 100644 index 4cbd36ef518f..000000000000 --- a/contrib/gcc/config/i386/xm-osf.h +++ /dev/null @@ -1,2 +0,0 @@ -#undef TRUE -#undef FALSE diff --git a/contrib/gcc/config/i386/xm-osf1elf.h b/contrib/gcc/config/i386/xm-osf1elf.h deleted file mode 100644 index 69ca9c14c007..000000000000 --- a/contrib/gcc/config/i386/xm-osf1elf.h +++ /dev/null @@ -1,6 +0,0 @@ -/* Configuration for GCC for Intel i386 running OSF/1 1.3. */ - -#ifndef HZ -#include <machine/machtime.h> -#define HZ DEFAULT_CLK_TCK -#endif diff --git a/contrib/gcc/config/i386/xm-sco.h b/contrib/gcc/config/i386/xm-sco.h deleted file mode 100644 index ad634499d30b..000000000000 --- a/contrib/gcc/config/i386/xm-sco.h +++ /dev/null @@ -1,13 +0,0 @@ -/* Configuration for GCC for Intel i386 running SCO. */ - -/* Big buffers improve performance. */ - -#define IO_BUFFER_SIZE (0x8000 - 1024) - -#ifndef __GNUC__ -/* The SCO compiler gets it wrong, and treats enumerated bitfields - as signed quantities, making it impossible to use an 8-bit enum - for compiling GNU C++. */ -#define ONLY_INT_FIELDS 1 -#define CODE_FIELD_BUG 1 -#endif diff --git a/contrib/gcc/config/i386/xm-sco5.h b/contrib/gcc/config/i386/xm-sco5.h deleted file mode 100644 index 6b22b1d549fd..000000000000 --- a/contrib/gcc/config/i386/xm-sco5.h +++ /dev/null @@ -1,7 +0,0 @@ -/* Configuration for GCC for Intel i386 running SCO. */ - -/* Big buffers improve performance. */ - -#define IO_BUFFER_SIZE (0x8000 - 1024) - - diff --git a/contrib/gcc/config/i386/xm-sun.h b/contrib/gcc/config/i386/xm-sun.h deleted file mode 100644 index 6c0f0a256302..000000000000 --- a/contrib/gcc/config/i386/xm-sun.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Configuration for GNU C-compiler for Intel 80386 running SunOS 4.0. - Copyright (C) 1988, 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. */ - -#define USG diff --git a/contrib/gcc/config/i386/xm-sysv3.h b/contrib/gcc/config/i386/xm-sysv3.h deleted file mode 100644 index 9a655443ff55..000000000000 --- a/contrib/gcc/config/i386/xm-sysv3.h +++ /dev/null @@ -1,3 +0,0 @@ -/* Configuration for GCC for Intel i386 running System V Release 3. */ - -#include "xm-svr3.h" diff --git a/contrib/gcc/config/i386/xm-sysv4.h b/contrib/gcc/config/i386/xm-sysv4.h deleted file mode 100644 index 1365064a5a64..000000000000 --- a/contrib/gcc/config/i386/xm-sysv4.h +++ /dev/null @@ -1,5 +0,0 @@ -/* Configuration for GCC for Intel i386 running System V Release 4. */ - -#ifdef __HIGHC__ -#include <alloca.h> /* for MetaWare High-C on NCR System 3000 */ -#endif diff --git a/contrib/gcc/config/i386/xm-uwin.h b/contrib/gcc/config/i386/xm-uwin.h deleted file mode 100644 index 2e1ecde0fa72..000000000000 --- a/contrib/gcc/config/i386/xm-uwin.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Configuration for GNU C-compiler for hosting on Windows32. - using GNU tools and the Windows32 API Library. - Copyright (C) 1999 Free Software Foundation, Inc. - Contributed by Mumit Khan <khan@xraylith.wisc.edu>. - -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 ONLY_INT_FIELD -#define ONLY_INT_FIELDS 1 -#endif - -#ifndef USE_PROTOTYPES -#define USE_PROTOTYPES 1 -#endif - -/* U/WIN system calls only support '/' */ -#undef DIR_SEPARATOR -#define DIR_SEPARATOR '/' -#undef EXECUTABLE_SUFFIX -#define EXECUTABLE_SUFFIX ".exe" - -#undef PATH_SEPARATOR -#define PATH_SEPARATOR ':' - diff --git a/contrib/gcc/config/i386/xm-winnt.h b/contrib/gcc/config/i386/xm-winnt.h deleted file mode 100644 index d36d2cdb11ed..000000000000 --- a/contrib/gcc/config/i386/xm-winnt.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Configuration for GNU compiler - for an Intel i386 or later processor running Windows NT 3.x. - Copyright (C) 1994 Free Software Foundation, Inc. - Contributed by Douglas B. Rupp (drupp@cs.washington.edu) - -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 "winnt/xm-winnt.h" -#include "i386/xm-i386.h" diff --git a/contrib/gcc/config/sparc/sol2-sld-64.h b/contrib/gcc/config/sparc/sol2-sld-64.h deleted file mode 100644 index 161026b645b4..000000000000 --- a/contrib/gcc/config/sparc/sol2-sld-64.h +++ /dev/null @@ -1,335 +0,0 @@ -/* Definitions of target machine for GNU compiler, for 64-bit SPARC - running Solaris 2 using the system linker. */ - -#ifdef AS_SPARC64_FLAG -#include "sparc/sparc_bi.h" -#endif - -#include "sparc/sparc.h" -#include "dbxelf.h" -#include "elfos.h" -#include "svr4.h" -#include "sparc/sysv4.h" -#include "sparc/sol2.h" - -#ifdef AS_SPARC64_FLAG - -/* At least up through Solaris 2.6, - the system linker does not work with DWARF or DWARF2, - since it does not have working support for relocations - to unaligned data. */ - -#define LINKER_DOES_NOT_WORK_WITH_DWARF2 - -/* A 64 bit v9 compiler with stack-bias */ - -#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc -#undef TARGET_DEFAULT -#define TARGET_DEFAULT \ - (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ + \ - MASK_STACK_BIAS + MASK_EPILOGUE + MASK_FPU + MASK_LONG_DOUBLE_128) -#endif - -/* The default code model. */ -#undef SPARC_DEFAULT_CMODEL -#define SPARC_DEFAULT_CMODEL CM_MEDANY - -#undef LONG_DOUBLE_TYPE_SIZE -#define LONG_DOUBLE_TYPE_SIZE 128 - -#undef ASM_CPU32_DEFAULT_SPEC -#define ASM_CPU32_DEFAULT_SPEC "" -#undef ASM_CPU64_DEFAULT_SPEC -#define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG - -#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 -#undef CPP_CPU64_DEFAULT_SPEC -#define CPP_CPU64_DEFAULT_SPEC "" -#undef ASM_CPU32_DEFAULT_SPEC -#define ASM_CPU32_DEFAULT_SPEC "-xarch=v8plus" -#endif -#if TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc -#undef CPP_CPU64_DEFAULT_SPEC -#define CPP_CPU64_DEFAULT_SPEC "" -#undef ASM_CPU32_DEFAULT_SPEC -#define ASM_CPU32_DEFAULT_SPEC "-xarch=v8plusa" -#undef ASM_CPU64_DEFAULT_SPEC -#define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG "a" -#endif - -/* The sun bundled assembler doesn't accept -Yd, (and neither does gas). - It's safe to pass -s always, even if -g is not used. */ -#undef ASM_SPEC -#define ASM_SPEC "\ -%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Wa,*:%*} -s \ -%{fpic:-K PIC} %{fPIC:-K PIC} \ -%(asm_cpu)\ -" - -#if DEFAULT_ARCH32_P -#define DEF_ARCH32_SPEC(__str) "%{!m64:" __str "}" -#define DEF_ARCH64_SPEC(__str) "%{m64:" __str "}" -#else -#define DEF_ARCH32_SPEC(__str) "%{m32:" __str "}" -#define DEF_ARCH64_SPEC(__str) "%{!m32:" __str "}" -#endif - -#undef CPP_CPU_SPEC -#define CPP_CPU_SPEC "\ -%{mcypress:} \ -%{msparclite:-D__sparclite__} \ -%{mf930:-D__sparclite__} %{mf934:-D__sparclite__} \ -%{mv8:" DEF_ARCH32_SPEC("-D__sparcv8") "} \ -%{msupersparc:-D__supersparc__ " DEF_ARCH32_SPEC("-D__sparcv8") "} \ -%{mcpu=sparclet:-D__sparclet__} %{mcpu=tsc701:-D__sparclet__} \ -%{mcpu=sparclite:-D__sparclite__} \ -%{mcpu=f930:-D__sparclite__} %{mcpu=f934:-D__sparclite__} \ -%{mcpu=v8:" DEF_ARCH32_SPEC("-D__sparcv8") "} \ -%{mcpu=supersparc:-D__supersparc__ " DEF_ARCH32_SPEC("-D__sparcv8") "} \ -%{mcpu=v9:" DEF_ARCH32_SPEC("-D__sparcv8") "} \ -%{mcpu=ultrasparc:" DEF_ARCH32_SPEC("-D__sparcv8") "} \ -%{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:%(cpp_cpu_default)}}}}}}} \ -" - -#undef ASM_CPU_SPEC -#define ASM_CPU_SPEC "\ -%{mcpu=ultrasparc:" DEF_ARCH32_SPEC("-xarch=v8plusa") DEF_ARCH64_SPEC(AS_SPARC64_FLAG "a") "} \ -%{mcpu=v9:" DEF_ARCH32_SPEC("-xarch=v8plus") DEF_ARCH64_SPEC(AS_SPARC64_FLAG) "} \ -%{!mcpu=ultrasparc:%{!mcpu=v9:%{mcpu*:" DEF_ARCH32_SPEC("-xarch=v8") DEF_ARCH64_SPEC(AS_SPARC64_FLAG) "}}} \ -%{!mcpu*:%(asm_cpu_default)} \ -" - -#define STARTFILE_SPEC32 "\ -%{ansi:values-Xc.o%s} \ -%{!ansi: \ - %{traditional:values-Xt.o%s} \ - %{!traditional:values-Xa.o%s}}" - -#define STARTFILE_SPEC64 "\ -%{ansi:/usr/lib/sparcv9/values-Xc.o%s} \ -%{!ansi: \ - %{traditional:/usr/lib/sparcv9/values-Xt.o%s} \ - %{!traditional:/usr/lib/sparcv9/values-Xa.o%s}}" - -#ifdef SPARC_BI_ARCH - -#if DEFAULT_ARCH32_P -#define STARTFILE_ARCH_SPEC "\ -%{m32:" STARTFILE_SPEC32 "} \ -%{m64:" STARTFILE_SPEC64 "} \ -%{!m32:%{!m64:" STARTFILE_SPEC32 "}}" -#else -#define STARTFILE_ARCH_SPEC "\ -%{m32:" STARTFILE_SPEC32 "} \ -%{m64:" STARTFILE_SPEC64 "} \ -%{!m32:%{!m64:" STARTFILE_SPEC64 "}}" -#endif - -#else /* !SPARC_BI_ARCH */ - -/* In this case we define MD_STARTFILE_PREFIX to /usr/lib/sparcv9/ */ -#define STARTFILE_ARCH_SPEC STARTFILE_SPEC32 - -#endif /* !SPARC_BI_ARCH */ - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC "%{!shared: \ - %{!symbolic: \ - %{p:mcrt1.o%s} \ - %{!p: \ - %{pg:gcrt1.o%s gmon.o%s} \ - %{!pg:crt1.o%s}}}} \ - crti.o%s " STARTFILE_ARCH_SPEC " \ - crtbegin.o%s" - -#ifdef SPARC_BI_ARCH - -#undef CPP_CPU_DEFAULT_SPEC -#define CPP_CPU_DEFAULT_SPEC \ -(DEFAULT_ARCH32_P ? "\ -%{m64:" CPP_CPU64_DEFAULT_SPEC "} \ -%{!m64:" CPP_CPU32_DEFAULT_SPEC "} \ -" : "\ -%{m32:" CPP_CPU32_DEFAULT_SPEC "} \ -%{!m32:" CPP_CPU64_DEFAULT_SPEC "} \ -") - -#undef ASM_CPU_DEFAULT_SPEC -#define ASM_CPU_DEFAULT_SPEC \ -(DEFAULT_ARCH32_P ? "\ -%{m64:" ASM_CPU64_DEFAULT_SPEC "} \ -%{!m64:" ASM_CPU32_DEFAULT_SPEC "} \ -" : "\ -%{m32:" ASM_CPU32_DEFAULT_SPEC "} \ -%{!m32:" ASM_CPU64_DEFAULT_SPEC "} \ -") - -/* wchar_t is called differently in <wchar.h> for 32 and 64-bit - compilations. This is called for by SCD 2.4.1, p. 6-83, Figure 6-65 - (32-bit) and p. 6P-10, Figure 6.38 (64-bit). */ -#define NO_BUILTIN_WCHAR_TYPE - -#undef WCHAR_TYPE -#define WCHAR_TYPE (TARGET_ARCH64 ? "int" : "long int") - -#undef WCHAR_TYPE_SIZE -#define WCHAR_TYPE_SIZE 32 - -/* Same for wint_t. See SCD 2.4.1, p. 6-83, Figure 6-66 (32-bit). There's - no corresponding 64-bit definition, but this is what Solaris 8 - <iso/wchar_iso.h> uses. */ -#define NO_BUILTIN_WINT_TYPE - -#undef WINT_TYPE -#define WINT_TYPE (TARGET_ARCH64 ? "int" : "long int") - -#undef WINT_TYPE_SIZE -#define WINT_TYPE_SIZE 32 - -#undef CPP_ARCH32_SPEC -#define CPP_ARCH32_SPEC "-D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int \ --D__WCHAR_TYPE__=long\\ int -D__WINT_TYPE__=long\\ int \ --D__GCC_NEW_VARARGS__ -Acpu=sparc -Amachine=sparc" -#undef CPP_ARCH64_SPEC -#define CPP_ARCH64_SPEC "-D__SIZE_TYPE__=long\\ unsigned\\ int -D__PTRDIFF_TYPE__=long\\ int \ --D__WCHAR_TYPE__=int -D__WINT_TYPE__=int \ --D__arch64__ -Acpu=sparc64 -Amachine=sparcv9 -D__sparcv9" - -#undef CPP_ARCH_SPEC -#define CPP_ARCH_SPEC "\ -%{m32:%(cpp_arch32)} \ -%{m64:%(cpp_arch64)} \ -%{!m32:%{!m64:%(cpp_arch_default)}} \ -" - -#undef ASM_ARCH_SPEC -#define ASM_ARCH_SPEC "" - -#undef ASM_ARCH32_SPEC -#define ASM_ARCH32_SPEC "" - -#undef ASM_ARCH64_SPEC -#define ASM_ARCH64_SPEC "" - -#undef ASM_ARCH_DEFAULT_SPEC -#define ASM_ARCH_DEFAULT_SPEC "" - -#undef SUBTARGET_EXTRA_SPECS -#define SUBTARGET_EXTRA_SPECS \ - { "link_arch32", LINK_ARCH32_SPEC }, \ - { "link_arch64", LINK_ARCH64_SPEC }, \ - { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ - { "link_arch", LINK_ARCH_SPEC }, - -/* This should be the same as in svr4.h, except with -R added. */ -#define LINK_ARCH32_SPEC \ - "%{G:-G} \ - %{YP,*} \ - %{R*} \ - %{compat-bsd: \ - %{!YP,*:%{p:-Y P,/usr/ucblib:/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \ - %{pg:-Y P,/usr/ucblib:/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \ - %{!p:%{!pg:-Y P,/usr/ucblib:/usr/ccs/lib:/usr/lib}}} \ - -R /usr/ucblib} \ - %{!compat-bsd: \ - %{!YP,*:%{p:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \ - %{pg:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \ - %{!p:%{!pg:-Y P,/usr/ccs/lib:/usr/lib}}}}" - -#define LINK_ARCH64_SPEC \ - "%{mcmodel=medlow:-M /usr/lib/ld/sparcv9/map.below4G} \ - %{G:-G} \ - %{YP,*} \ - %{R*} \ - %{compat-bsd: \ - %{!YP,*:%{p:-Y P,/usr/ucblib/sparcv9:/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \ - %{pg:-Y P,/usr/ucblib/sparcv9:/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \ - %{!p:%{!pg:-Y P,/usr/ucblib/sparcv9:/usr/lib/sparcv9}}} \ - -R /usr/ucblib} \ - %{!compat-bsd: \ - %{!YP,*:%{p:-Y P,/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \ - %{pg:-Y P,/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \ - %{!p:%{!pg:-Y P,/usr/lib/sparcv9}}}}" - -#define LINK_ARCH_SPEC "\ -%{m32:%(link_arch32)} \ -%{m64:%(link_arch64)} \ -%{!m32:%{!m64:%(link_arch_default)}} \ -" - -#define LINK_ARCH_DEFAULT_SPEC \ -(DEFAULT_ARCH32_P ? LINK_ARCH32_SPEC : LINK_ARCH64_SPEC) - -#undef LINK_SPEC -#define LINK_SPEC \ - "%{h*} %{v:-V} \ - %{b} %{Wl,*:%*} \ - %{static:-dn -Bstatic} \ - %{shared:-G -dy %{!mimpure-text:-z text}} \ - %{symbolic:-Bsymbolic -G -dy -z text} \ - %(link_arch) \ - %{Qy:} %{!Qn:-Qy}" - -#undef CC1_SPEC -#if DEFAULT_ARCH32_P -#define CC1_SPEC "\ -%{sun4:} %{target:} \ -%{mcypress:-mcpu=cypress} \ -%{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ -%{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ -%{m64:-mptr64 -mstack-bias -mno-v8plus \ - %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8*:%{!msupersparc:-mcpu=v9}}}}}}}} \ -" -#else -#define CC1_SPEC "\ -%{sun4:} %{target:} \ -%{mcypress:-mcpu=cypress} \ -%{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ -%{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ -%{m32:-mptr32 -mno-stack-bias \ - %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8*:%{!msupersparc:-mcpu=cypress}}}}}}}} \ -%{mv8plus:-m32 -mptr32 -mno-stack-bias \ - %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:-mcpu=v9}}}}}}}} \ -" -#endif - -#if DEFAULT_ARCH32_P -#define MULTILIB_DEFAULTS { "m32" } -#else -#define MULTILIB_DEFAULTS { "m64" } -#endif - -#else /* !SPARC_BI_ARCH */ - -/* - * This should be the same as in sol2-sld.h, except with "/sparcv9" - * appended to the paths and /usr/ccs/lib is no longer necessary - */ -#undef LINK_SPEC -#define LINK_SPEC \ - "%{h*} %{v:-V} \ - %{b} %{Wl,*:%*} \ - %{static:-dn -Bstatic} \ - %{shared:-G -dy %{!mimpure-text:-z text}} \ - %{symbolic:-Bsymbolic -G -dy -z text} \ - %{mcmodel=medlow:-M /usr/lib/ld/sparcv9/map.below4G} \ - %{G:-G} \ - %{YP,*} \ - %{R*} \ - %{compat-bsd: \ - %{!YP,*:%{p:-Y P,/usr/ucblib/sparcv9:/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \ - %{pg:-Y P,/usr/ucblib/sparcv9:/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \ - %{!p:%{!pg:-Y P,/usr/ucblib/sparcv9:/usr/lib/sparcv9}}} \ - -R /usr/ucblib} \ - %{!compat-bsd: \ - %{!YP,*:%{p:-Y P,/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \ - %{pg:-Y P,/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \ - %{!p:%{!pg:-Y P,/usr/lib/sparcv9}}}} \ - %{Qy:} %{!Qn:-Qy}" - -#undef MD_STARTFILE_PREFIX -#define MD_STARTFILE_PREFIX "/usr/lib/sparcv9/" - -#endif /* ! SPARC_BI_ARCH */ - -#endif diff --git a/contrib/gcc/config/sparc/sol2-sld.h b/contrib/gcc/config/sparc/sol2-sld.h deleted file mode 100644 index 3847fae15060..000000000000 --- a/contrib/gcc/config/sparc/sol2-sld.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Definitions of target machine for GNU compiler, for SPARC running Solaris 2 - using the system linker. */ - -/* At least up through Solaris 2.6, - the system linker does not work with DWARF or DWARF2, - since it does not have working support for relocations - to unaligned data. */ - -#define LINKER_DOES_NOT_WORK_WITH_DWARF2 diff --git a/contrib/gcc/config/sparc/t-sp64 b/contrib/gcc/config/sparc/t-sp64 deleted file mode 100644 index 99acd5d54235..000000000000 --- a/contrib/gcc/config/sparc/t-sp64 +++ /dev/null @@ -1,2 +0,0 @@ -LIBGCC1 = -CROSS_LIBGCC1 = diff --git a/contrib/gcc/config/sparc/t-sunos40 b/contrib/gcc/config/sparc/t-sunos40 deleted file mode 100644 index 3e10575eaea5..000000000000 --- a/contrib/gcc/config/sparc/t-sunos40 +++ /dev/null @@ -1,7 +0,0 @@ -# SunOS 4.0.* -# /bin/as doesn't recognize the v8 instructions, so we can't do a v8 -# multilib build. - -LIBGCC1 = -CROSS_LIBGCC1 = -LIBGCC1_TEST = diff --git a/contrib/gcc/config/sparc/x-sysv4 b/contrib/gcc/config/sparc/x-sysv4 deleted file mode 100644 index 2a661e359993..000000000000 --- a/contrib/gcc/config/sparc/x-sysv4 +++ /dev/null @@ -1,2 +0,0 @@ -X_CFLAGS=-DSVR4 -ALLOCA=alloca.o diff --git a/contrib/gcc/config/sparc/xm-linux.h b/contrib/gcc/config/sparc/xm-linux.h deleted file mode 100644 index 691c7d167847..000000000000 --- a/contrib/gcc/config/sparc/xm-linux.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Configuration for GCC for SPARC running Linux-based GNU systems. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. - Contributed by Eddie C. Dost (ecd@skynet.be) - -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 inhibit_libc -#include <alloca.h> -#include <stdlib.h> -#include <string.h> -#endif diff --git a/contrib/gcc/config/sparc/xm-lynx.h b/contrib/gcc/config/sparc/xm-lynx.h deleted file mode 100644 index 90fef8543b91..000000000000 --- a/contrib/gcc/config/sparc/xm-lynx.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Configuration for GNU C-compiler for sparc platforms running LynxOS. - Copyright (C) 1995 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 <xm-lynx.h> - -/* This describes the machine the compiler is hosted on. */ -#define HOST_BITS_PER_CHAR 8 -#define HOST_BITS_PER_SHORT 16 -#define HOST_BITS_PER_INT 32 -#define HOST_BITS_PER_LONG 32 -#define HOST_BITS_PER_LONGLONG 64 - -#define HOST_WORDS_BIG_ENDIAN 1 - -/* Include <sys/wait.h> to define the exit status access macros. */ -#include <sys/types.h> -#include <sys/wait.h> - -/* target machine dependencies. - tm.h is a symbolic link to the actual target specific file. */ - -#include "tm.h" diff --git a/contrib/gcc/config/sparc/xm-openbsd.h b/contrib/gcc/config/sparc/xm-openbsd.h deleted file mode 100644 index 2df7fb3e3639..000000000000 --- a/contrib/gcc/config/sparc/xm-openbsd.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Configuration file for an host running sparc OpenBSD. - 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 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 <xm-openbsd.h> -#include <sparc/xm-sparc.h> - diff --git a/contrib/gcc/config/sparc/xm-pbd.h b/contrib/gcc/config/sparc/xm-pbd.h deleted file mode 100644 index 1c3f47590c79..000000000000 --- a/contrib/gcc/config/sparc/xm-pbd.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Host environment for the tti "Unicom" PBB 68020 boards */ - -#include "sparc/xm-sparc.h" - -#define USG - -#ifndef __GNUC__ -#define USE_C_ALLOCA -#endif - diff --git a/contrib/gcc/config/sparc/xm-sol2.h b/contrib/gcc/config/sparc/xm-sol2.h deleted file mode 100644 index 5613b086b572..000000000000 --- a/contrib/gcc/config/sparc/xm-sol2.h +++ /dev/null @@ -1,4 +0,0 @@ -/* If not compiled with GNU C, include the system's <alloca.h> header. */ -#ifndef __GNUC__ -#include <alloca.h> -#endif diff --git a/contrib/gcc/config/sparc/xm-sp64.h b/contrib/gcc/config/sparc/xm-sp64.h deleted file mode 100644 index b673161282f4..000000000000 --- a/contrib/gcc/config/sparc/xm-sp64.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Configuration for GCC for Sparc v9 running 64-bit native. - 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. */ - -#include <sparc/xm-sparc.h> - -/* This describes the machine the compiler is hosted on. */ -#if defined(__arch64__) || defined(__sparc_v9__) || defined(__sparcv9) -#undef HOST_BITS_PER_LONG -#define HOST_BITS_PER_LONG 64 -#endif diff --git a/contrib/gcc/config/sparc/xm-sparc.h b/contrib/gcc/config/sparc/xm-sparc.h deleted file mode 100644 index e553a0df0b25..000000000000 --- a/contrib/gcc/config/sparc/xm-sparc.h +++ /dev/null @@ -1,49 +0,0 @@ -/* Configuration for GNU C-compiler for Sun Sparc. - Copyright (C) 1988, 1993, 1995, 1997 Free Software Foundation, Inc. - Contributed by Michael Tiemann (tiemann@cygnus.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. */ - - -/* #defines that need visibility everywhere. */ -#define FALSE 0 -#define TRUE 1 - -/* This describes the machine the compiler is hosted on. */ -#define HOST_BITS_PER_CHAR 8 -#define HOST_BITS_PER_SHORT 16 -#define HOST_BITS_PER_INT 32 -#define HOST_BITS_PER_LONG 32 -#define HOST_BITS_PER_LONGLONG 64 - -/* Doubles are stored in memory with the high order word first. This - matters when cross-compiling. */ -#define HOST_WORDS_BIG_ENDIAN 1 - -/* target machine dependencies. - tm.h is a symbolic link to the actual target specific file. */ -#include "tm.h" - -/* Arguments to use with `exit'. */ -#define SUCCESS_EXIT_CODE 0 -#define FATAL_EXIT_CODE 33 - -/* If compiled with Sun CC, the use of alloca requires this #include. */ -#ifndef __GNUC__ -#include "alloca.h" -#endif diff --git a/contrib/gcc/config/sparc/xm-sysv4-64.h b/contrib/gcc/config/sparc/xm-sysv4-64.h deleted file mode 100644 index c506d22dd360..000000000000 --- a/contrib/gcc/config/sparc/xm-sysv4-64.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Configuration for GCC for Sparc v9 running 64-bit native. - 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. */ - -#include <sparc/xm-sysv4.h> - -/* This describes the machine the compiler is hosted on. */ -#if defined(__arch64__) || defined(__sparc_v9__) || defined(__sparcv9) -#undef HOST_BITS_PER_LONG -#define HOST_BITS_PER_LONG 64 -#endif diff --git a/contrib/gcc/config/sparc/xm-sysv4.h b/contrib/gcc/config/sparc/xm-sysv4.h deleted file mode 100644 index 6e663d12cfa1..000000000000 --- a/contrib/gcc/config/sparc/xm-sysv4.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Configuration for GNU C-compiler for Sun Sparc running System V.4. - Copyright (C) 1992, 1993, 1998 Free Software Foundation, Inc. - Contributed by Ron Guilmette (rfg@netcom.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. */ - - -/* #defines that need visibility everywhere. */ -#define FALSE 0 -#define TRUE 1 - -/* This describes the machine the compiler is hosted on. */ -#define HOST_BITS_PER_CHAR 8 -#define HOST_BITS_PER_SHORT 16 -#define HOST_BITS_PER_INT 32 -#define HOST_BITS_PER_LONG 32 -#define HOST_BITS_PER_LONGLONG 64 - -/* Doubles are stored in memory with the high order word first. This - matters when cross-compiling. */ -#define HOST_WORDS_BIG_ENDIAN 1 - -/* target machine dependencies. - tm.h is a symbolic link to the actual target specific file. */ -#include "tm.h" - -/* Arguments to use with `exit'. */ -#define SUCCESS_EXIT_CODE 0 -#define FATAL_EXIT_CODE 33 - -#ifndef __GNUC__ -#define ONLY_INT_FIELDS -#endif diff --git a/contrib/gcc/config/x-linux b/contrib/gcc/config/x-linux deleted file mode 100644 index a7c091799e89..000000000000 --- a/contrib/gcc/config/x-linux +++ /dev/null @@ -1,5 +0,0 @@ -# Don't run fixproto -STMP_FIXPROTO = - -# Don't install "assert.h" in gcc. We use the one in glibc. -INSTALL_ASSERT_H = diff --git a/contrib/gcc/config/x-linux-aout b/contrib/gcc/config/x-linux-aout deleted file mode 100644 index 36ae68acec54..000000000000 --- a/contrib/gcc/config/x-linux-aout +++ /dev/null @@ -1,14 +0,0 @@ -# It is defined in config/xm-linux.h. -# X_CFLAGS = -DPOSIX - -# The following is needed when compiling stages 2 and 3 because gcc's -# limits.h must be picked up before /usr/include/limits.h. This is because -# each does an #include_next of the other if the other hasn't been included. -# /usr/include/limits.h loses if it gets found first because /usr/include is -# at the end of the search order. When a new version of gcc is released, -# gcc's limits.h hasn't been installed yet and hence isn't found. - -# BOOT_CFLAGS = -O $(CFLAGS) -Iinclude - -# Don't run fixproto -# STMP_FIXPROTO = diff --git a/contrib/gcc/config/x-lynx b/contrib/gcc/config/x-lynx deleted file mode 100644 index 0be03e453e12..000000000000 --- a/contrib/gcc/config/x-lynx +++ /dev/null @@ -1,6 +0,0 @@ -# /bin/cc is hopelessly broken, so we must use /bin/gcc instead. -CC = $(OLDCC) -OLDCC = /bin/gcc - -# /bin/sh is too buggy, so use /bin/bash instead. -SHELL = /bin/bash diff --git a/contrib/gcc/config/x-svr4 b/contrib/gcc/config/x-svr4 deleted file mode 100644 index 9c705434cc99..000000000000 --- a/contrib/gcc/config/x-svr4 +++ /dev/null @@ -1,9 +0,0 @@ -# Some versions of SVR4 have an alloca in /usr/ucblib/libucb.a, and if we are -# careful to link that in after libc we can use it, but since newer versions of -# SVR4 are dropping libucb, it is better to just use the portable C version for -# bootstrapping. Do this by defining ALLOCA. - -ALLOCA = alloca.o - -# See all the declarations. -FIXPROTO_DEFINES = -D_XOPEN_SOURCE diff --git a/contrib/gcc/config/xm-alloca.h b/contrib/gcc/config/xm-alloca.h deleted file mode 100644 index 3dbdc37a1f0a..000000000000 --- a/contrib/gcc/config/xm-alloca.h +++ /dev/null @@ -1,4 +0,0 @@ -/* If not compiled with GNU C, use the portable alloca. */ -#ifndef __GNUC__ -#define USE_C_ALLOCA -#endif diff --git a/contrib/gcc/config/xm-freebsd.h b/contrib/gcc/config/xm-freebsd.h deleted file mode 100644 index b71ff56ca107..000000000000 --- a/contrib/gcc/config/xm-freebsd.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Configuration for GNU C-compiler for hosts running FreeBSD. - Copyright (C) 1994, 1995 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 file defines machine-independent things specific to a host - running FreeBSD. This file should not be specified as $xm_file itself; - instead $xm_file should be CPU/xm-freebsd.h, which should include both - CPU/xm-CPU.h and this file xm-freebsd.h. */ diff --git a/contrib/gcc/config/xm-gnu.h b/contrib/gcc/config/xm-gnu.h deleted file mode 100644 index 64e8e2fa8171..000000000000 --- a/contrib/gcc/config/xm-gnu.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Configuration for GNU C-compiler for hosts running GNU. - Copyright (C) 1994, 1995, 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 file defines machine-independent things specific to a host - running GNU. This file should not be specified as $xm_file itself; - instead $xm_file should be CPU/xm-gnu.h, which should include both - CPU/xm-CPU.h and this file xm-gnu.h. */ - -#define POSIX /* GNU complies to POSIX.1. */ - -#ifndef inhibit_libc -/* Get a definition of O_RDONLY; some of the GCC files don't include this - properly and will define it themselves to be zero. */ -#include <fcntl.h> -#endif diff --git a/contrib/gcc/config/xm-interix.h b/contrib/gcc/config/xm-interix.h deleted file mode 100644 index 756fb5d465f2..000000000000 --- a/contrib/gcc/config/xm-interix.h +++ /dev/null @@ -1,77 +0,0 @@ -/* Configuration for GNU compiler for processor running Interix - Copyright (C) 1993, 1995, 1999 Free Software Foundation, Inc. - Donn Terry, Softway Systems, Inc, - from code - Contributed by Douglas B. Rupp (drupp@cs.washington.edu) - -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 USG -#define USG 1 -#endif - -#ifndef ONLY_INT_FIELDS -#ifndef __GNUC__ -#define ONLY_INT_FIELDS 1 -#endif -#endif - -#ifndef USE_PROTOTYPES -#define USE_PROTOTYPES 1 -#endif - -/* If not compiled with GNU C, use the portable alloca. */ -#ifndef __GNUC__ -#define USE_C_ALLOCA 1 -#endif - -#define NO_SYS_SIGLIST 1 - -/* Our strategy for finding global constructors is a bit different, although - not a lot. */ -#define DO_GLOBAL_CTORS_BODY \ -do { \ - int i; \ - unsigned long nptrs; \ - func_ptr *p; \ - asm( \ - " .section .ctor_head, \"rw\"\n" \ - "1:\n" \ - " .text \n" \ - ASM_LOAD_ADDR(1b,%0) \ - : "=r" (p) : : "cc"); \ - for (nptrs = 0; p[nptrs] != 0; nptrs++); \ - for (i = nptrs-1; i >= 0; i--) \ - p[i] (); \ -} while (0) - -#define DO_GLOBAL_DTORS_BODY \ -do { \ - func_ptr *p; \ - asm( \ - " .section .dtor_head, \"rw\"\n" \ - "1:\n" \ - " .text \n" \ - ASM_LOAD_ADDR(1b,%0) \ - : "=r" (p) : : "cc"); \ - while (*p) \ - { \ - p++; \ - (*(p-1)) (); \ - } \ -} while (0) diff --git a/contrib/gcc/config/xm-linux.h b/contrib/gcc/config/xm-linux.h deleted file mode 100644 index 2cffdb7fab61..000000000000 --- a/contrib/gcc/config/xm-linux.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Configuration for GCC for Intel i386 running Linux-based GNU systems. - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. - Contributed by H.J. Lu (hjl@nynexst.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. */ - -#undef HAVE_ATEXIT -#define HAVE_ATEXIT - -#undef POSIX -#define POSIX - -/* We do have one, but I'd like to use the one come with gcc since - we have been doing that for a long time with USG defined. H.J. */ -#undef HAVE_STAB_H - -#undef BSTRING -#define BSTRING diff --git a/contrib/gcc/config/xm-lynx.h b/contrib/gcc/config/xm-lynx.h deleted file mode 100644 index 009f8445eab7..000000000000 --- a/contrib/gcc/config/xm-lynx.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Configuration for GNU C-compiler for Lynx. - Copyright (C) 1993, 1995 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 file defines machine-independent things specific to a host - running Lynx. This file should not be specified as $xm_file itself; - instead $xm_file should be CPU/xm-lynx.h, which should include this one. */ - -/* #defines that need visibility everywhere. */ -#define FALSE 0 -#define TRUE 1 - -/* Arguments to use with `exit'. */ -#define SUCCESS_EXIT_CODE 0 -#define FATAL_EXIT_CODE 33 - -/* Lynx has no vfork system call. */ -#define vfork fork - -/* Lynx has a non-standard mktemp function. */ -/* ??? This is simpler than creating YATM: Yet Another Target Macro. */ -#define mktemp lynx_mktemp - -#define lynx_mktemp(template) \ -do { \ - int pid = getpid (); \ - char *t = template; \ - char *p; \ - p = t + strlen (t); \ - while (*--p == 'X') \ - { \ - *p = (pid % 10) + '0'; \ - pid /= 10; \ - } \ -} while (0) diff --git a/contrib/gcc/config/xm-openbsd.h b/contrib/gcc/config/xm-openbsd.h deleted file mode 100644 index 74a842184c37..000000000000 --- a/contrib/gcc/config/xm-openbsd.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Configuration fragment for hosts running a version of OpenBSD. - 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 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 file gets included by all architectures. It holds stuff - that ought to be defined when hosting a compiler on an OpenBSD - machine, independently of the architecture. It's included by - ${cpu_type}/xm-openbsd.h, not included directly. */ - -/* OpenBSD is trying to be POSIX-compliant, to the point of fixing - problems that may occur with gcc's interpretation. */ -#undef POSIX -#define POSIX - -/* Ensure we get gnu C's defaults. */ -#ifdef __GNUC__ -#define alloca __builtin_alloca -#endif - - diff --git a/contrib/gcc/config/xm-siglist.h b/contrib/gcc/config/xm-siglist.h deleted file mode 100644 index d6133d6a194a..000000000000 --- a/contrib/gcc/config/xm-siglist.h +++ /dev/null @@ -1,6 +0,0 @@ -/* Some systems provide no sys_siglist, but do offer the same data under - another name. */ - -#define sys_siglist _sys_siglist -#undef SYS_SIGLIST_DECLARED -#define SYS_SIGLIST_DECLARED diff --git a/contrib/gcc/config/xm-std32.h b/contrib/gcc/config/xm-std32.h deleted file mode 100644 index c52782e9741c..000000000000 --- a/contrib/gcc/config/xm-std32.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Configuration for GNU C-compiler for standard 32-bit host machine. - 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. */ - -/* #defines that need visibility everywhere. */ -#define FALSE 0 -#define TRUE 1 - -/* This describes the machine the compiler is hosted on. */ -#define HOST_BITS_PER_CHAR 8 -#define HOST_BITS_PER_SHORT 16 -#define HOST_BITS_PER_INT 32 -#define HOST_BITS_PER_LONG 32 -#define HOST_BITS_PER_LONGLONG 64 - -/* Arguments to use with `exit'. */ -#define SUCCESS_EXIT_CODE 0 -#define FATAL_EXIT_CODE 33 diff --git a/contrib/gcc/config/xm-svr3.h b/contrib/gcc/config/xm-svr3.h deleted file mode 100644 index 6f252505252d..000000000000 --- a/contrib/gcc/config/xm-svr3.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Configuration for GNU C-compiler for hosts running System V Release 3 - Copyright (C) 1991, 1993, 1996 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. */ - -#define USG - -#ifndef SVR3 -#define SVR3 -#endif diff --git a/contrib/gcc/config/xm-svr4.h b/contrib/gcc/config/xm-svr4.h deleted file mode 100644 index 8534aaa75a12..000000000000 --- a/contrib/gcc/config/xm-svr4.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Configuration for GNU C-compiler for hosts running System V Release 4 - Copyright (C) 1988, 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. */ - -#define USG - -#define POSIX - -/* SVR4 provides no sys_siglist, - but does offer the same data under another name. */ -#define sys_siglist _sys_siglist -#undef SYS_SIGLIST_DECLARED -#define SYS_SIGLIST_DECLARED diff --git a/contrib/gcc/configure.lang b/contrib/gcc/configure.lang deleted file mode 100644 index d96b6d8d5314..000000000000 --- a/contrib/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/contrib/gcc/cp/Makefile.in b/contrib/gcc/cp/Makefile.in deleted file mode 100644 index 1a5b32c40c8c..000000000000 --- a/contrib/gcc/cp/Makefile.in +++ /dev/null @@ -1,324 +0,0 @@ -# Makefile for GNU C++ compiler. -# Copyright (C) 1987, 88, 90-5, 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. - -# The makefile built from this file lives in the language subdirectory. -# Its purpose is to provide support for: -# -# 1) recursion where necessary, and only then (building .o's), and -# 2) building and debugging cc1 from the language subdirectory, and -# 3) nothing else. -# -# The parent makefile handles all other chores, with help from the -# language makefile fragment, of course. -# -# The targets for external use are: -# all, TAGS, ???mostlyclean, ???clean. - -# Suppress smart makes who think they know how to automake Yacc files -.y.c: - -# It defines the c++ interface name. It should be changed when the -# c++ interface is changed. -INTERFACE = 2 - -# Variables that exist for you to override. -# See below for how to change them for certain systems. - -ALLOCA = - -# 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 -# XCFLAGS is used for most compilations but not when using the GCC just built. -XCFLAGS = -CFLAGS = -g -BOOT_CFLAGS = -O $(CFLAGS) -# These exists to be overridden by the x-* and t-* files, respectively. -X_CFLAGS = -T_CFLAGS = - -X_CPPFLAGS = -T_CPPFLAGS = - -CC = @CC@ -BISON = `if [ -f ../../bison/bison ] ; then echo ../../bison/bison -L $(srcdir)/../../bison/ ; else echo bison ; fi` -BISONFLAGS = -LEX = `if [ -f ../../flex/flex ] ; then echo ../../flex/flex ; else echo flex ; fi` -LEXFLAGS = -AR = ar -AR_FLAGS = rc -SHELL = /bin/sh -MAKEINFO = makeinfo -TEXI2DVI = texi2dvi - -# 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 = - -# This is used in the definition of SUBDIR_USE_ALLOCA. -# ??? Perhaps it would be better if it just looked for *gcc*. -OLDCC = cc - -# This is used instead of ALL_CFLAGS when compiling with GCC_FOR_TARGET. -# It omits XCFLAGS, and specifies -B./. -# It also specifies -B$(tooldir)/ to find as and ld for a cross compiler. -GCC_CFLAGS=$(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) - -# Tools to use when building a cross-compiler. -# These are used because `configure' appends `cross-make' -# to the makefile when making a cross-compiler. - -# We don't use cross-make. Instead we use the tools -# from the build tree, if they are available. -# program_transform_name and objdir are set by configure.in. -program_transform_name = -objdir = . - -target=@target@ -xmake_file=@dep_host_xmake_file@ -tmake_file=@dep_tmake_file@ -#version=`sed -e 's/.*\"\([^ \"]*\)[ \"].*/\1/' < $(srcdir)/version.c` -#mainversion=`sed -e 's/.*\"\([0-9]*\.[0-9]*\).*/\1/' < $(srcdir)/version.c` - -# Directory where sources are, from where we are. -srcdir = @srcdir@ -VPATH = @srcdir@ - -# Additional system libraries to link with. -CLIB= - -# Top build directory, relative to here. -top_builddir = .. - -# Internationalization library. -INTLLIBS = @INTLLIBS@ - -# Change this to a null string if obstacks are installed in the -# system library. -OBSTACK=obstack.o - -# Choose the real default target. -ALL=all - -# 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. -all: all.indirect - -# 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@ -# -# Now figure out from those variables how to compile and link. - -all.indirect: Makefile ../cc1plus$(exeext) - -# IN_GCC tells obstack.h that we are using gcc's <stddef.h> file. -INTERNAL_CFLAGS = $(CROSS) -DIN_GCC @extra_c_flags@ - -# This is the variable actually used when we compile. -ALL_CFLAGS = $(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) $(XCFLAGS) - -# Likewise. -ALL_CPPFLAGS = $(CPPFLAGS) $(X_CPPFLAGS) $(T_CPPFLAGS) - -# Even if ALLOCA is set, don't use it if compiling with GCC. - -SUBDIR_OBSTACK = `if [ x$(OBSTACK) != x ]; then echo ../$(OBSTACK); else true; fi` -SUBDIR_USE_ALLOCA = `case "${CC}" in "${OLDCC}") if [ x$(ALLOCA) != x ]; then echo ../$(ALLOCA); else true; fi ;; esac` -SUBDIR_MALLOC = `if [ x$(MALLOC) != x ]; then echo ../$(MALLOC); else true; fi` - -# How to link with both our special library facilities -# and the system's installed libraries. -LIBS = $(SUBDIR_OBSTACK) $(SUBDIR_USE_ALLOCA) $(SUBDIR_MALLOC) \ - $(INTLLIBS) $(CLIB) - -# 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.. -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../config -I$(srcdir)/../../include - -# Always use -I$(srcdir)/config when compiling. -.c.o: - $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< - -# The only suffixes we want for implicit rules are .c and .o. -.SUFFIXES: -.SUFFIXES: .c .o - -# 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. - -# Language-specific object files for g++ - -CXX_OBJS = call.o decl.o errfn.o expr.o pt.o sig.o typeck2.o \ - class.o decl2.o error.o lex.o parse.o ptree.o rtti.o spew.o typeck.o cvt.o \ - except.o friend.o init.o method.o search.o semantics.o tree.o xref.o \ - repo.o @extra_cxx_objs@ - -# Language-independent object files. -OBJS = `cat ../stamp-objlist` ../c-common.o ../c-pragma.o -OBJDEPS = ../stamp-objlist ../c-common.o ../c-pragma.o - -compiler: ../cc1plus$(exeext) -../cc1plus$(exeext): $(P) $(OBJDEPS) $(CXX_OBJS) $(LIBDEPS) - $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(CXX_OBJS) $(LIBS) - -Makefile: $(srcdir)/Makefile.in $(srcdir)/../configure - cd ..; $(SHELL) config.status - -native: config.status ../cc1plus$(exeext) -# -# 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. - -RTL_H = $(srcdir)/../rtl.h $(srcdir)/../rtl.def \ - $(srcdir)/../machmode.h $(srcdir)/../machmode.def -TREE_H = $(srcdir)/../tree.h $(srcdir)/../real.h $(srcdir)/../tree.def \ - $(srcdir)/../machmode.h $(srcdir)/../machmode.def -CXX_TREE_H = $(TREE_H) cp-tree.h cp-tree.def -PARSE_H = $(srcdir)/parse.h -PARSE_C = $(srcdir)/parse.c -EXPR_H = $(srcdir)/../expr.h ../insn-codes.h - -parse.o : $(PARSE_C) $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h lex.h \ - $(srcdir)/../except.h $(srcdir)/../output.h $(srcdir)/../system.h \ - $(srcdir)/../toplev.h - $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(BIG_SWITCHFLAG) \ - `echo $(PARSE_C) | sed 's,^\./,,'` - -CONFLICTS = expect 30 shift/reduce conflicts and 42 reduce/reduce conflicts. -$(PARSE_H) : $(PARSE_C) -$(PARSE_C) : $(srcdir)/parse.y - @echo $(CONFLICTS) - cd $(srcdir); $(BISON) $(BISONFLAGS) -d -o parse.c parse.y - cd $(srcdir); grep '^#define[ ]*YYEMPTY' parse.c >>parse.h -#$(PARSE_C) $(PARSE_H) : stamp-parse ; @true -#stamp-parse: $(srcdir)/parse.y -# @echo $(CONFLICTS) -# $(BISON) $(BISONFLAGS) -d $(srcdir)/parse.y -# grep '^#define[ ]*YYEMPTY' y.tab.c >>y.tab.h -# $(srcdir)/../move-if-change y.tab.c $(PARSE_C) -# $(srcdir)/../move-if-change y.tab.h $(PARSE_H) -# cp $(PARSE_C) y.tab.c -# touch stamp-parse - -# We used to try to protect people from having to rerun gperf. But, -# the C front-end already requires this if c-parse.gperf is changed, -# so we should be consistent. -$(srcdir)/hash.h: $(srcdir)/gxx.gperf - gperf -L C -F ', 0, 0' -p -j1 -g -o -t -N is_reserved_word \ - '-k1,4,7,$$' $(srcdir)/gxx.gperf >$(srcdir)/hash.h - -spew.o : spew.c $(CONFIG_H) $(CXX_TREE_H) $(PARSE_H) $(srcdir)/../flags.h \ - lex.h $(srcdir)/../system.h $(srcdir)/../toplev.h -lex.o : lex.c $(CONFIG_H) $(CXX_TREE_H) \ - $(PARSE_H) input.c $(srcdir)/../flags.h hash.h lex.h \ - $(srcdir)/../c-pragma.h $(srcdir)/../system.h $(srcdir)/../toplev.h \ - $(srcdir)/../output.h $(srcdir)/../mbchar.h -decl.o : decl.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - lex.h decl.h $(srcdir)/../stack.h $(srcdir)/../output.h \ - $(srcdir)/../except.h $(srcdir)/../system.h $(srcdir)/../toplev.h \ - $(srcdir)/../hash.h -decl2.o : decl2.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - lex.h decl.h $(EXPR_H) $(srcdir)/../except.h \ - $(srcdir)/../output.h $(srcdir)/../except.h $(srcdir)/../system.h \ - $(srcdir)/../toplev.h $(srcdir)/../dwarf2out.h $(srcdir)/../dwarfout.h \ - $(srcdir)/../../include/splay-tree.h $(srcdir)/../varray.h -typeck2.o : typeck2.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -typeck.o : typeck.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \ - $(EXPR_H) $(srcdir)/../system.h $(srcdir)/../toplev.h -class.o : class.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h \ - $(srcdir)/../../include/splay-tree.h -call.o : call.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -friend.o : friend.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -init.o : init.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \ - $(EXPR_H) $(srcdir)/../system.h $(srcdir)/../toplev.h -method.o : method.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \ - $(srcdir)/../toplev.h -cvt.o : cvt.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h decl.h \ - $(srcdir)/../flags.h $(srcdir)/../toplev.h $(srcdir)/../convert.h -search.o : search.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../stack.h \ - $(srcdir)/../flags.h $(srcdir)/../system.h $(srcdir)/../toplev.h \ - $(srcdir)/../varray.h -tree.o : tree.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -ptree.o : ptree.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h -rtti.o : rtti.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -except.o : except.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \ - $(srcdir)/../except.h $(srcdir)/../system.h $(srcdir)/../toplev.h -expr.o : expr.c $(CONFIG_H) $(CXX_TREE_H) $(RTL_H) $(srcdir)/../flags.h \ - $(EXPR_H) $(srcdir)/../system.h $(srcdir)/../toplev.h -xref.o : xref.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../input.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -pt.o : pt.c $(CONFIG_H) $(CXX_TREE_H) decl.h $(PARSE_H) lex.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -error.o : error.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \ - $(srcdir)/../toplev.h -errfn.o : errfn.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \ - $(srcdir)/../toplev.h -sig.o : sig.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -repo.o : repo.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \ - $(srcdir)/../toplev.h -semantics.o: semantics.c $(CONFIG_H) $(CXX_TREE_H) lex.h \ - $(srcdir)/../except.h $(srcdir)/../system.h $(srcdir)/../toplev.h - - -# -# These exist for maintenance purposes. - -# Update the tags table. -TAGS: force - cd $(srcdir) ; \ - etags *.c *.h ; \ - echo 'l' | tr 'l' '\f' >> TAGS ; \ - echo 'parse.y,0' >> TAGS ; \ - etags -a ../*.h ../*.c; - -.PHONY: TAGS - -force: diff --git a/contrib/gcc/cp/errfn.c b/contrib/gcc/cp/errfn.c deleted file mode 100644 index b5d3eeccd5a9..000000000000 --- a/contrib/gcc/cp/errfn.c +++ /dev/null @@ -1,352 +0,0 @@ -/* Provide a call-back mechanism for handling error output. - Copyright (C) 1993, 94-98, 1999 Free Software Foundation, Inc. - Contributed by Jason Merrill (jason@cygnus.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. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "cp-tree.h" -#include "toplev.h" - -/* cp_printer is the type of a function which converts an argument into - a string for digestion by printf. The cp_printer function should deal - with all memory management; the functions in this file will not free - the char*s returned. See error.c for an example use of this code. */ - -typedef char* cp_printer PROTO((tree, int)); -extern cp_printer * cp_printers[256]; - -/* Whether or not we should try to be quiet for errors and warnings; this is - used to avoid being too talkative about problems with tentative choices - when we're computing the conversion costs for a method call. */ -int cp_silent = 0; - -typedef void errorfn (); /* deliberately vague */ - -static void cp_thing PROTO ((errorfn *, int, const char *, va_list)); - -#define STRDUP(f) (ap = (char *) alloca (strlen (f) +1), strcpy (ap, (f)), ap) - -/* This function supports only `%s', `%d', `%%', and the C++ print - codes. */ - -static void -cp_thing (errfn, atarg1, format, ap) - errorfn *errfn; - int atarg1; - const char *format; - va_list ap; -{ - static char *buf; - static long buflen; - int nargs = 0; - long len; - long offset; - const char *f; - tree atarg = 0; - - len = strlen (format) + 1; - if (len > buflen) - { - buflen = len; - buf = xrealloc (buf, buflen); - } - offset = 0; - - for (f = format; *f; ++f) - { - cp_printer * function; - int alternate; - int maybe_here; - - /* ignore text */ - if (*f != '%') - { - buf[offset++] = *f; - continue; - } - - ++f; - - alternate = 0; - maybe_here = 0; - - /* Check for '+' and '#' (in that order). */ - if (*f == '+') - { - maybe_here = 1; - ++f; - } - if (*f == '#') - { - alternate = 1; - ++f; - } - - /* no field width or precision */ - - function = cp_printers[(int)*f]; - - if (function || *f == 's') - { - char *p; - int plen; - - if (*f == 's') - { - p = va_arg (ap, char *); - nargs++; - } - else - { - tree t = va_arg (ap, tree); - nargs++; - - /* This indicates that ATARG comes from a different - location than normal. */ - if (maybe_here && atarg1) - atarg = t; - - /* If atarg1 is set and this is the first argument, then - set ATARG appropriately. */ - if (atarg1 && nargs == 1) - atarg = t; - - p = (*function) (t, alternate); - } - - plen = strlen (p); - len += plen; - if (len > buflen) - { - buflen = len; - buf = xrealloc (buf, len); - } - strcpy (buf + offset, p); - offset += plen; - } - else if (*f == '%') - { - /* A `%%' has occurred in the input string. Replace it with - a `%' in the formatted message buf. */ - - if (++len > buflen) - { - buflen = len; - buf = xrealloc (buf, len); - } - buf[offset++] = '%'; - } - else - { - if (*f != 'd') - abort (); - len += HOST_BITS_PER_INT / 2; - if (len > buflen) - { - buflen = len; - buf = xrealloc (buf, len); - } - sprintf (buf + offset, "%d", va_arg (ap, int)); - nargs++; - offset += strlen (buf + offset); - /* With an ANSI C library one could write - out += sprintf (...); */ - } - } - buf[offset] = '\0'; - - /* If ATARG1 is set, but we haven't extracted any arguments, then - extract one tree argument for ATARG. */ - if (nargs == 0 && atarg1) - atarg = va_arg (ap, tree); - - if (atarg) - { - char *file = cp_file_of (atarg); - int line = cp_line_of (atarg); - (*errfn) (file, line, "%s", buf); - } - else - (*errfn) ("%s", buf); - -} - -void -cp_error VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) error, 0, format, ap); - va_end (ap); -} - -void -cp_warning VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) warning, 0, format, ap); - va_end (ap); -} - -void -cp_pedwarn VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) pedwarn, 0, format, ap); - va_end (ap); -} - -void -cp_compiler_error VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) compiler_error, 0, format, ap); - va_end (ap); -} - -void -cp_deprecated (msg) - const char *msg; -{ - extern int warn_deprecated; - if (!warn_deprecated) - return; - cp_warning ("%s is deprecated.", msg); - cp_warning ("Please see the documentation for details."); -} - -void -cp_sprintf VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - cp_thing ((errorfn *) sprintf, 0, format, ap); - va_end (ap); -} - -void -cp_error_at VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) error_with_file_and_line, 1, format, ap); - va_end (ap); -} - -void -cp_warning_at VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) warning_with_file_and_line, 1, format, ap); - va_end (ap); -} - -void -cp_pedwarn_at VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) pedwarn_with_file_and_line, 1, format, ap); - va_end (ap); -} diff --git a/contrib/gcc/cp/exception.cc b/contrib/gcc/cp/exception.cc deleted file mode 100644 index 59342c6423ee..000000000000 --- a/contrib/gcc/cp/exception.cc +++ /dev/null @@ -1,343 +0,0 @@ -// Functions for Exception Support for -*- C++ -*- -// Copyright (C) 1994, 95-97, 1998 Free Software Foundation - -// 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. - -// As a special exception, if you link this library with other files, -// some of which are compiled with GCC, to produce an executable, -// this library does not by itself cause the resulting executable -// to be covered by the GNU General Public License. -// This exception does not however invalidate any other reasons why -// the executable file might be covered by the GNU General Public License. - -#pragma implementation "exception" - -#include "typeinfo" -#include "exception" -#include <stddef.h> -#include "gansidecl.h" /* Needed to support macros used in eh-common.h. */ -#include "eh-common.h" - -/* Define terminate, unexpected, set_terminate, set_unexpected as - well as the default terminate func and default unexpected func. */ - -extern std::terminate_handler __terminate_func __attribute__((__noreturn__)); -using std::terminate; - -void -std::terminate () -{ - __terminate_func (); -} - -void -__default_unexpected () -{ - terminate (); -} - -static std::unexpected_handler __unexpected_func __attribute__((__noreturn__)) - = __default_unexpected; - -std::terminate_handler -std::set_terminate (std::terminate_handler func) -{ - std::terminate_handler old = __terminate_func; - - __terminate_func = func; - return old; -} - -std::unexpected_handler -std::set_unexpected (std::unexpected_handler func) -{ - std::unexpected_handler old = __unexpected_func; - - __unexpected_func = func; - return old; -} - -void -std::unexpected () -{ - __unexpected_func (); -} - -/* C++-specific state about the current exception. - This must match init_exception_processing(). - - Note that handlers and caught are not redundant; when rethrown, an - exception can have multiple active handlers and still be considered - uncaught. */ - -struct cp_eh_info -{ - __eh_info eh_info; - void *value; - void *type; - void (*cleanup)(void *, int); - bool caught; - cp_eh_info *next; - long handlers; - void *original_value; -}; - -/* Language-specific EH info pointer, defined in libgcc2. */ - -extern "C" cp_eh_info **__get_eh_info (); // actually void ** - -/* Is P the type_info node for a pointer of some kind? */ - -extern bool __is_pointer (void *); - - -/* OLD Compiler hook to return a pointer to the info for the current exception. - Used by get_eh_info (). This fudges the actualy returned value to - point to the beginning of what USE to be the cp_eh_info structure. - THis is so that old code that dereferences this pointer will find - things where it expects it to be.*/ -extern "C" void * -__cp_exception_info (void) -{ - return &((*__get_eh_info ())->value); -} - -#define CP_EH_INFO ((cp_eh_info *) *__get_eh_info ()) - -/* Old Compiler hook to return a pointer to the info for the current exception. - Used by get_eh_info (). */ - -extern "C" cp_eh_info * -__cp_eh_info (void) -{ - cp_eh_info *p = CP_EH_INFO; - return p; -} - -/* Compiler hook to return a pointer to the info for the current exception, - Set the caught bit, and increment the number of handlers that are - looking at this exception. This makes handlers smaller. */ - -extern "C" cp_eh_info * -__start_cp_handler (void) -{ - cp_eh_info *p = CP_EH_INFO; - p->caught = 1; - p->handlers++; - return p; -} - -/* Allocate a buffer for a cp_eh_info and an exception object of size SIZE, - and return a pointer to the beginning of the object's space. */ - -extern "C" void * malloc (size_t); -extern "C" void * -__eh_alloc (size_t size) -{ - void *p = malloc (size); - if (p == 0) - terminate (); - return p; -} - -/* Free the memory for an cp_eh_info and associated exception, given - a pointer to the cp_eh_info. */ - -extern "C" void free (void *); -extern "C" void -__eh_free (void *p) -{ - free (p); -} - - -typedef void * (* rtimetype) (void); - -extern "C" void * -__cplus_type_matcher (cp_eh_info *info, rtimetype match_info, - exception_descriptor *exception_table) -{ - void *ret; - - /* No exception table implies the old style mechanism, so don't check. */ - if (exception_table != NULL - && exception_table->lang.language != EH_LANG_C_plus_plus) - return NULL; - - if (match_info == CATCH_ALL_TYPE) - return info->value; - - /* we don't worry about version info yet, there is only one version! */ - - void *match_type = match_info (); - ret = __throw_type_match_rtti (match_type, info->type, info->original_value); - /* change value of exception */ - if (ret) - info->value = ret; - return ret; -} - - -/* Compiler hook to push a new exception onto the stack. - Used by expand_throw(). */ - -extern "C" void -__cp_push_exception (void *value, void *type, void (*cleanup)(void *, int)) -{ - cp_eh_info *p = (cp_eh_info *) __eh_alloc (sizeof (cp_eh_info)); - - p->value = value; - p->type = type; - p->cleanup = cleanup; - p->handlers = 0; - p->caught = false; - p->original_value = value; - - p->eh_info.match_function = __cplus_type_matcher; - p->eh_info.language = EH_LANG_C_plus_plus; - p->eh_info.version = 1; - - cp_eh_info **q = __get_eh_info (); - - p->next = *q; - *q = p; -} - -/* Compiler hook to pop an exception that has been finalized. Used by - push_eh_cleanup(). P is the info for the exception caught by the - current catch block. */ - -extern "C" void -__cp_pop_exception (cp_eh_info *p) -{ - cp_eh_info **q = __get_eh_info (); - - --p->handlers; - - /* Don't really pop if there are still active handlers for our exception, - or if our exception is being rethrown (i.e. if the active exception is - our exception and it is uncaught). */ - if (p->handlers != 0 - || (p == *q && !p->caught)) - return; - - for (; *q; q = &((*q)->next)) - if (*q == p) - break; - - if (! *q) - terminate (); - - *q = p->next; - - if (p->cleanup) - /* 2 is a magic value for destructors; see build_delete(). */ - p->cleanup (p->original_value, 2); // value may have been adjusted. - - if (! __is_pointer (p->type)) - __eh_free (p->original_value); // value may have been adjusted. - - __eh_free (p); -} - -extern "C" void -__uncatch_exception (void) -{ - cp_eh_info *p = CP_EH_INFO; - if (p == 0) - terminate (); - p->caught = false; -} - -/* As per [except.unexpected]: - If an exception is thrown, we check it against the spec. If it doesn't - match, we call unexpected (). If unexpected () throws, we check that - exception against the spec. If it doesn't match, if the spec allows - bad_exception we throw that; otherwise we call terminate (). - - The compiler treats an exception spec as a try block with a generic - handler that just calls this function with a list of the allowed - exception types, so we have an active exception that can be rethrown. - - This function does not return. */ - -extern "C" void -__check_eh_spec (int n, const void **spec) -{ - cp_eh_info *p = CP_EH_INFO; - - for (int i = 0; i < n; ++i) - { - if (__throw_type_match_rtti (spec[i], p->type, p->value)) - throw; - } - - try - { - std::unexpected (); - } - catch (...) - { - // __exception_info is an artificial var pushed into each catch block. - if (p != __exception_info) - { - p = __exception_info; - for (int i = 0; i < n; ++i) - { - if (__throw_type_match_rtti (spec[i], p->type, p->value)) - throw; - } - } - - const std::type_info &bad_exc = typeid (std::bad_exception); - for (int i = 0; i < n; ++i) - { - if (__throw_type_match_rtti (spec[i], &bad_exc, p->value)) - throw std::bad_exception (); - } - - terminate (); - } -} - -extern "C" void -__throw_bad_cast (void) -{ - throw std::bad_cast (); -} - -extern "C" void -__throw_bad_typeid (void) -{ - throw std::bad_typeid (); -} - -/* Has the current exception been caught? */ - -bool -std::uncaught_exception () -{ - cp_eh_info *p = CP_EH_INFO; - return p && ! p->caught; -} - -const char * std::exception:: -what () const -{ - return typeid (*this).name (); -} diff --git a/contrib/gcc/cp/gxx.gperf b/contrib/gcc/cp/gxx.gperf deleted file mode 100644 index 1e621c4a22d6..000000000000 --- a/contrib/gcc/cp/gxx.gperf +++ /dev/null @@ -1,111 +0,0 @@ -%{ -/* Command-line: gperf -L KR-C -F ', 0, 0' -p -j1 -g -o -t -N is_reserved_word -k1,4,$,7 gplus.gperf */ -%} -struct resword { const char *name; short token; enum rid rid;}; -%% -__alignof, ALIGNOF, NORID -__alignof__, ALIGNOF, NORID -__asm, ASM_KEYWORD, NORID -__asm__, ASM_KEYWORD, NORID -__attribute, ATTRIBUTE, NORID -__attribute__, ATTRIBUTE, NORID -__complex, TYPESPEC, RID_COMPLEX -__complex__, TYPESPEC, RID_COMPLEX -__const, CV_QUALIFIER, RID_CONST -__const__, CV_QUALIFIER, RID_CONST -__extension__, EXTENSION, NORID -__imag, IMAGPART, NORID -__imag__, IMAGPART, NORID -__inline, SCSPEC, RID_INLINE -__inline__, SCSPEC, RID_INLINE -__label__, LABEL, NORID -__null, CONSTANT, RID_NULL -__real, REALPART, NORID -__real__, REALPART, NORID -__restrict, CV_QUALIFIER, RID_RESTRICT -__restrict__, CV_QUALIFIER, RID_RESTRICT -__signature__, AGGR, RID_SIGNATURE /* Extension */, -__signed, TYPESPEC, RID_SIGNED -__signed__, TYPESPEC, RID_SIGNED -__sigof__, SIGOF, NORID /* Extension */, -__typeof, TYPEOF, NORID -__typeof__, TYPEOF, NORID -__volatile, CV_QUALIFIER, RID_VOLATILE -__volatile__, CV_QUALIFIER, RID_VOLATILE -__wchar_t, TYPESPEC, RID_WCHAR /* Unique to ANSI C++ */, -asm, ASM_KEYWORD, NORID, -and, ANDAND, NORID, -and_eq, ASSIGN, NORID, -auto, SCSPEC, RID_AUTO, -bitand, '&', NORID, -bitor, '|', NORID, -bool, TYPESPEC, RID_BOOL, -break, BREAK, NORID, -case, CASE, NORID, -catch, CATCH, NORID, -char, TYPESPEC, RID_CHAR, -class, AGGR, RID_CLASS, -compl, '~', NORID, -const, CV_QUALIFIER, RID_CONST, -const_cast, CONST_CAST, NORID, -continue, CONTINUE, NORID, -default, DEFAULT, NORID, -delete, DELETE, NORID, -do, DO, NORID, -double, TYPESPEC, RID_DOUBLE, -dynamic_cast, DYNAMIC_CAST, NORID, -else, ELSE, NORID, -enum, ENUM, NORID, -explicit, SCSPEC, RID_EXPLICIT, -export, SCSPEC, RID_EXPORT, -extern, SCSPEC, RID_EXTERN, -false, CXX_FALSE, NORID, -float, TYPESPEC, RID_FLOAT, -for, FOR, NORID, -friend, SCSPEC, RID_FRIEND, -goto, GOTO, NORID, -if, IF, NORID, -inline, SCSPEC, RID_INLINE, -int, TYPESPEC, RID_INT, -long, TYPESPEC, RID_LONG, -mutable, SCSPEC, RID_MUTABLE, -namespace, NAMESPACE, NORID, -new, NEW, NORID, -not, '!', NORID, -not_eq, EQCOMPARE, NORID, -operator, OPERATOR, NORID, -or, OROR, NORID, -or_eq, ASSIGN, NORID, -private, VISSPEC, RID_PRIVATE, -protected, VISSPEC, RID_PROTECTED, -public, VISSPEC, RID_PUBLIC, -register, SCSPEC, RID_REGISTER, -reinterpret_cast, REINTERPRET_CAST, NORID, -return, RETURN_KEYWORD, NORID, -short, TYPESPEC, RID_SHORT, -signature, AGGR, RID_SIGNATURE /* Extension */, -signed, TYPESPEC, RID_SIGNED, -sigof, SIGOF, NORID /* Extension */, -sizeof, SIZEOF, NORID, -static, SCSPEC, RID_STATIC, -static_cast, STATIC_CAST, NORID, -struct, AGGR, RID_RECORD, -switch, SWITCH, NORID, -template, TEMPLATE, RID_TEMPLATE, -this, THIS, NORID, -throw, THROW, NORID, -true, CXX_TRUE, NORID, -try, TRY, NORID, -typedef, SCSPEC, RID_TYPEDEF, -typename, TYPENAME_KEYWORD, NORID, -typeid, TYPEID, NORID, -typeof, TYPEOF, NORID, -union, AGGR, RID_UNION, -unsigned, TYPESPEC, RID_UNSIGNED, -using, USING, NORID, -virtual, SCSPEC, RID_VIRTUAL, -void, TYPESPEC, RID_VOID, -volatile, CV_QUALIFIER, RID_VOLATILE, -while, WHILE, NORID, -xor, '^', NORID, -xor_eq, ASSIGN, NORID, diff --git a/contrib/gcc/cp/gxxint.texi b/contrib/gcc/cp/gxxint.texi deleted file mode 100644 index 81bcab864250..000000000000 --- a/contrib/gcc/cp/gxxint.texi +++ /dev/null @@ -1,2075 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename g++int.info -@settitle G++ internals -@setchapternewpage odd -@c %**end of header - -@node Top, Limitations of g++, (dir), (dir) -@chapter Internal Architecture of the Compiler - -This is meant to describe the C++ front-end for gcc in detail. -Questions and comments to Benjamin Kosnik @code{<bkoz@@cygnus.com>}. - -@menu -* Limitations of g++:: -* Routines:: -* Implementation Specifics:: -* Glossary:: -* Macros:: -* Typical Behavior:: -* Coding Conventions:: -* Templates:: -* Access Control:: -* Error Reporting:: -* Parser:: -* Exception Handling:: -* Free Store:: -* Mangling:: Function name mangling for C++ and Java -* Vtables:: Two ways to do virtual functions -* Concept Index:: -@end menu - -@node Limitations of g++, Routines, Top, Top -@section Limitations of g++ - -@itemize @bullet -@item -Limitations on input source code: 240 nesting levels with the parser -stacksize (YYSTACKSIZE) set to 500 (the default), and requires around -16.4k swap space per nesting level. The parser needs about 2.09 * -number of nesting levels worth of stackspace. - -@cindex pushdecl_class_level -@item -I suspect there are other uses of pushdecl_class_level that do not call -set_identifier_type_value in tandem with the call to -pushdecl_class_level. It would seem to be an omission. - -@cindex access checking -@item -Access checking is unimplemented for nested types. - -@cindex @code{volatile} -@item -@code{volatile} is not implemented in general. - -@end itemize - -@node Routines, Implementation Specifics, Limitations of g++, Top -@section Routines - -This section describes some of the routines used in the C++ front-end. - -@code{build_vtable} and @code{prepare_fresh_vtable} is used only within -the @file{cp-class.c} file, and only in @code{finish_struct} and -@code{modify_vtable_entries}. - -@code{build_vtable}, @code{prepare_fresh_vtable}, and -@code{finish_struct} are the only routines that set @code{DECL_VPARENT}. - -@code{finish_struct} can steal the virtual function table from parents, -this prohibits related_vslot from working. When finish_struct steals, -we know that - -@example -get_binfo (DECL_FIELD_CONTEXT (CLASSTYPE_VFIELD (t)), t, 0) -@end example - -@noindent -will get the related binfo. - -@code{layout_basetypes} does something with the VIRTUALS. - -Supposedly (according to Tiemann) most of the breadth first searching -done, like in @code{get_base_distance} and in @code{get_binfo} was not -because of any design decision. I have since found out the at least one -part of the compiler needs the notion of depth first binfo searching, I -am going to try and convert the whole thing, it should just work. The -term left-most refers to the depth first left-most node. It uses -@code{MAIN_VARIANT == type} as the condition to get left-most, because -the things that have @code{BINFO_OFFSET}s of zero are shared and will -have themselves as their own @code{MAIN_VARIANT}s. The non-shared right -ones, are copies of the left-most one, hence if it is its own -@code{MAIN_VARIANT}, we know it IS a left-most one, if it is not, it is -a non-left-most one. - -@code{get_base_distance}'s path and distance matters in its use in: - -@itemize @bullet -@item -@code{prepare_fresh_vtable} (the code is probably wrong) -@item -@code{init_vfields} Depends upon distance probably in a safe way, -build_offset_ref might use partial paths to do further lookups, -hack_identifier is probably not properly checking access. - -@item -@code{get_first_matching_virtual} probably should check for -@code{get_base_distance} returning -2. - -@item -@code{resolve_offset_ref} should be called in a more deterministic -manner. Right now, it is called in some random contexts, like for -arguments at @code{build_method_call} time, @code{default_conversion} -time, @code{convert_arguments} time, @code{build_unary_op} time, -@code{build_c_cast} time, @code{build_modify_expr} time, -@code{convert_for_assignment} time, and -@code{convert_for_initialization} time. - -But, there are still more contexts it needs to be called in, one was the -ever simple: - -@example -if (obj.*pmi != 7) - @dots{} -@end example - -Seems that the problems were due to the fact that @code{TREE_TYPE} of -the @code{OFFSET_REF} was not a @code{OFFSET_TYPE}, but rather the type -of the referent (like @code{INTEGER_TYPE}). This problem was fixed by -changing @code{default_conversion} to check @code{TREE_CODE (x)}, -instead of only checking @code{TREE_CODE (TREE_TYPE (x))} to see if it -was @code{OFFSET_TYPE}. - -@end itemize - -@node Implementation Specifics, Glossary, Routines, Top -@section Implementation Specifics - -@itemize @bullet -@item Explicit Initialization - -The global list @code{current_member_init_list} contains the list of -mem-initializers specified in a constructor declaration. For example: - -@example -foo::foo() : a(1), b(2) @{@} -@end example - -@noindent -will initialize @samp{a} with 1 and @samp{b} with 2. -@code{expand_member_init} places each initialization (a with 1) on the -global list. Then, when the fndecl is being processed, -@code{emit_base_init} runs down the list, initializing them. It used to -be the case that g++ first ran down @code{current_member_init_list}, -then ran down the list of members initializing the ones that weren't -explicitly initialized. Things were rewritten to perform the -initializations in order of declaration in the class. So, for the above -example, @samp{a} and @samp{b} will be initialized in the order that -they were declared: - -@example -class foo @{ public: int b; int a; foo (); @}; -@end example - -@noindent -Thus, @samp{b} will be initialized with 2 first, then @samp{a} will be -initialized with 1, regardless of how they're listed in the mem-initializer. - -@item The Explicit Keyword - -The use of @code{explicit} on a constructor is used by @code{grokdeclarator} -to set the field @code{DECL_NONCONVERTING_P}. That value is used by -@code{build_method_call} and @code{build_user_type_conversion_1} to decide -if a particular constructor should be used as a candidate for conversions. - -@end itemize - -@node Glossary, Macros, Implementation Specifics, Top -@section Glossary - -@table @r -@item binfo -The main data structure in the compiler used to represent the -inheritance relationships between classes. The data in the binfo can be -accessed by the BINFO_ accessor macros. - -@item vtable -@itemx virtual function table - -The virtual function table holds information used in virtual function -dispatching. In the compiler, they are usually referred to as vtables, -or vtbls. The first index is not used in the normal way, I believe it -is probably used for the virtual destructor. There are two forms of -virtual tables, one that has offsets in addition to pointers, and one -using thunks. @xref{Vtables}. - -@item vfield - -vfields can be thought of as the base information needed to build -vtables. For every vtable that exists for a class, there is a vfield. -See also vtable and virtual function table pointer. When a type is used -as a base class to another type, the virtual function table for the -derived class can be based upon the vtable for the base class, just -extended to include the additional virtual methods declared in the -derived class. The virtual function table from a virtual base class is -never reused in a derived class. @code{is_normal} depends upon this. - -@item virtual function table pointer - -These are @code{FIELD_DECL}s that are pointer types that point to -vtables. See also vtable and vfield. -@end table - -@node Macros, Typical Behavior, Glossary, Top -@section Macros - -This section describes some of the macros used on trees. The list -should be alphabetical. Eventually all macros should be documented -here. - -@table @code -@item BINFO_BASETYPES -A vector of additional binfos for the types inherited by this basetype. -The binfos are fully unshared (except for virtual bases, in which -case the binfo structure is shared). - - If this basetype describes type D as inherited in C, - and if the basetypes of D are E anf F, - then this vector contains binfos for inheritance of E and F by C. - -Has values of: - - TREE_VECs - - -@item BINFO_INHERITANCE_CHAIN -Temporarily used to represent specific inheritances. It usually points -to the binfo associated with the lesser derived type, but it can be -reversed by reverse_path. For example: - -@example - Z ZbY least derived - | - Y YbX - | - X Xb most derived - -TYPE_BINFO (X) == Xb -BINFO_INHERITANCE_CHAIN (Xb) == YbX -BINFO_INHERITANCE_CHAIN (Yb) == ZbY -BINFO_INHERITANCE_CHAIN (Zb) == 0 -@end example - -Not sure is the above is really true, get_base_distance has is point -towards the most derived type, opposite from above. - -Set by build_vbase_path, recursive_bounded_basetype_p, -get_base_distance, lookup_field, lookup_fnfields, and reverse_path. - -What things can this be used on: - - TREE_VECs that are binfos - - -@item BINFO_OFFSET -The offset where this basetype appears in its containing type. -BINFO_OFFSET slot holds the offset (in bytes) from the base of the -complete object to the base of the part of the object that is allocated -on behalf of this `type'. This is always 0 except when there is -multiple inheritance. - -Used on TREE_VEC_ELTs of the binfos BINFO_BASETYPES (...) for example. - - -@item BINFO_VIRTUALS -A unique list of functions for the virtual function table. See also -TYPE_BINFO_VIRTUALS. - -What things can this be used on: - - TREE_VECs that are binfos - - -@item BINFO_VTABLE -Used to find the VAR_DECL that is the virtual function table associated -with this binfo. See also TYPE_BINFO_VTABLE. To get the virtual -function table pointer, see CLASSTYPE_VFIELD. - -What things can this be used on: - - TREE_VECs that are binfos - -Has values of: - - VAR_DECLs that are virtual function tables - - -@item BLOCK_SUPERCONTEXT -In the outermost scope of each function, it points to the FUNCTION_DECL -node. It aids in better DWARF support of inline functions. - - -@item CLASSTYPE_TAGS -CLASSTYPE_TAGS is a linked (via TREE_CHAIN) list of member classes of a -class. TREE_PURPOSE is the name, TREE_VALUE is the type (pushclass scans -these and calls pushtag on them.) - -finish_struct scans these to produce TYPE_DECLs to add to the -TYPE_FIELDS of the type. - -It is expected that name found in the TREE_PURPOSE slot is unique, -resolve_scope_to_name is one such place that depends upon this -uniqueness. - - -@item CLASSTYPE_METHOD_VEC -The following is true after finish_struct has been called (on the -class?) but not before. Before finish_struct is called, things are -different to some extent. Contains a TREE_VEC of methods of the class. -The TREE_VEC_LENGTH is the number of differently named methods plus one -for the 0th entry. The 0th entry is always allocated, and reserved for -ctors and dtors. If there are none, TREE_VEC_ELT(N,0) == NULL_TREE. -Each entry of the TREE_VEC is a FUNCTION_DECL. For each FUNCTION_DECL, -there is a DECL_CHAIN slot. If the FUNCTION_DECL is the last one with a -given name, the DECL_CHAIN slot is NULL_TREE. Otherwise it is the next -method that has the same name (but a different signature). It would -seem that it is not true that because the DECL_CHAIN slot is used in -this way, we cannot call pushdecl to put the method in the global scope -(cause that would overwrite the TREE_CHAIN slot), because they use -different _CHAINs. finish_struct_methods setups up one version of the -TREE_CHAIN slots on the FUNCTION_DECLs. - -friends are kept in TREE_LISTs, so that there's no need to use their -TREE_CHAIN slot for anything. - -Has values of: - - TREE_VECs - - -@item CLASSTYPE_VFIELD -Seems to be in the process of being renamed TYPE_VFIELD. Use on types -to get the main virtual function table pointer. To get the virtual -function table use BINFO_VTABLE (TYPE_BINFO ()). - -Has values of: - - FIELD_DECLs that are virtual function table pointers - -What things can this be used on: - - RECORD_TYPEs - - -@item DECL_CLASS_CONTEXT -Identifies the context that the _DECL was found in. For virtual function -tables, it points to the type associated with the virtual function -table. See also DECL_CONTEXT, DECL_FIELD_CONTEXT and DECL_FCONTEXT. - -The difference between this and DECL_CONTEXT, is that for virtuals -functions like: - -@example -struct A -@{ - virtual int f (); -@}; - -struct B : A -@{ - int f (); -@}; - -DECL_CONTEXT (A::f) == A -DECL_CLASS_CONTEXT (A::f) == A - -DECL_CONTEXT (B::f) == A -DECL_CLASS_CONTEXT (B::f) == B -@end example - -Has values of: - - RECORD_TYPEs, or UNION_TYPEs - -What things can this be used on: - - TYPE_DECLs, _DECLs - - -@item DECL_CONTEXT -Identifies the context that the _DECL was found in. Can be used on -virtual function tables to find the type associated with the virtual -function table, but since they are FIELD_DECLs, DECL_FIELD_CONTEXT is a -better access method. Internally the same as DECL_FIELD_CONTEXT, so -don't us both. See also DECL_FIELD_CONTEXT, DECL_FCONTEXT and -DECL_CLASS_CONTEXT. - -Has values of: - - RECORD_TYPEs - - -What things can this be used on: - -@display -VAR_DECLs that are virtual function tables -_DECLs -@end display - - -@item DECL_FIELD_CONTEXT -Identifies the context that the FIELD_DECL was found in. Internally the -same as DECL_CONTEXT, so don't us both. See also DECL_CONTEXT, -DECL_FCONTEXT and DECL_CLASS_CONTEXT. - -Has values of: - - RECORD_TYPEs - -What things can this be used on: - -@display -FIELD_DECLs that are virtual function pointers -FIELD_DECLs -@end display - - -@item DECL_NAME - -Has values of: - -@display -0 for things that don't have names -IDENTIFIER_NODEs for TYPE_DECLs -@end display - -@item DECL_IGNORED_P -A bit that can be set to inform the debug information output routines in -the back-end that a certain _DECL node should be totally ignored. - -Used in cases where it is known that the debugging information will be -output in another file, or where a sub-type is known not to be needed -because the enclosing type is not needed. - -A compiler constructed virtual destructor in derived classes that do not -define an explicit destructor that was defined explicit in a base class -has this bit set as well. Also used on __FUNCTION__ and -__PRETTY_FUNCTION__ to mark they are ``compiler generated.'' c-decl and -c-lex.c both want DECL_IGNORED_P set for ``internally generated vars,'' -and ``user-invisible variable.'' - -Functions built by the C++ front-end such as default destructors, -virtual destructors and default constructors want to be marked that -they are compiler generated, but unsure why. - -Currently, it is used in an absolute way in the C++ front-end, as an -optimization, to tell the debug information output routines to not -generate debugging information that will be output by another separately -compiled file. - - -@item DECL_VIRTUAL_P -A flag used on FIELD_DECLs and VAR_DECLs. (Documentation in tree.h is -wrong.) Used in VAR_DECLs to indicate that the variable is a vtable. -It is also used in FIELD_DECLs for vtable pointers. - -What things can this be used on: - - FIELD_DECLs and VAR_DECLs - - -@item DECL_VPARENT -Used to point to the parent type of the vtable if there is one, else it -is just the type associated with the vtable. Because of the sharing of -virtual function tables that goes on, this slot is not very useful, and -is in fact, not used in the compiler at all. It can be removed. - -What things can this be used on: - - VAR_DECLs that are virtual function tables - -Has values of: - - RECORD_TYPEs maybe UNION_TYPEs - - -@item DECL_FCONTEXT -Used to find the first baseclass in which this FIELD_DECL is defined. -See also DECL_CONTEXT, DECL_FIELD_CONTEXT and DECL_CLASS_CONTEXT. - -How it is used: - - Used when writing out debugging information about vfield and - vbase decls. - -What things can this be used on: - - FIELD_DECLs that are virtual function pointers - FIELD_DECLs - - -@item DECL_REFERENCE_SLOT -Used to hold the initialize for the reference. - -What things can this be used on: - - PARM_DECLs and VAR_DECLs that have a reference type - - -@item DECL_VINDEX -Used for FUNCTION_DECLs in two different ways. Before the structure -containing the FUNCTION_DECL is laid out, DECL_VINDEX may point to a -FUNCTION_DECL in a base class which is the FUNCTION_DECL which this -FUNCTION_DECL will replace as a virtual function. When the class is -laid out, this pointer is changed to an INTEGER_CST node which is -suitable to find an index into the virtual function table. See -get_vtable_entry as to how one can find the right index into the virtual -function table. The first index 0, of a virtual function table it not -used in the normal way, so the first real index is 1. - -DECL_VINDEX may be a TREE_LIST, that would seem to be a list of -overridden FUNCTION_DECLs. add_virtual_function has code to deal with -this when it uses the variable base_fndecl_list, but it would seem that -somehow, it is possible for the TREE_LIST to pursist until method_call, -and it should not. - - -What things can this be used on: - - FUNCTION_DECLs - - -@item DECL_SOURCE_FILE -Identifies what source file a particular declaration was found in. - -Has values of: - - "<built-in>" on TYPE_DECLs to mean the typedef is built in - - -@item DECL_SOURCE_LINE -Identifies what source line number in the source file the declaration -was found at. - -Has values of: - -@display -0 for an undefined label - -0 for TYPE_DECLs that are internally generated - -0 for FUNCTION_DECLs for functions generated by the compiler - (not yet, but should be) - -0 for ``magic'' arguments to functions, that the user has no - control over -@end display - - -@item TREE_USED - -Has values of: - - 0 for unused labels - - -@item TREE_ADDRESSABLE -A flag that is set for any type that has a constructor. - - -@item TREE_COMPLEXITY -They seem a kludge way to track recursion, poping, and pushing. They only -appear in cp-decl.c and cp-decl2.c, so the are a good candidate for -proper fixing, and removal. - - -@item TREE_HAS_CONSTRUCTOR -A flag to indicate when a CALL_EXPR represents a call to a constructor. -If set, we know that the type of the object, is the complete type of the -object, and that the value returned is nonnull. When used in this -fashion, it is an optimization. Can also be used on SAVE_EXPRs to -indicate when they are of fixed type and nonnull. Can also be used on -INDIRECT_EXPRs on CALL_EXPRs that represent a call to a constructor. - - -@item TREE_PRIVATE -Set for FIELD_DECLs by finish_struct. But not uniformly set. - -The following routines do something with PRIVATE access: -build_method_call, alter_access, finish_struct_methods, -finish_struct, convert_to_aggr, CWriteLanguageDecl, CWriteLanguageType, -CWriteUseObject, compute_access, lookup_field, dfs_pushdecl, -GNU_xref_member, dbxout_type_fields, dbxout_type_method_1 - - -@item TREE_PROTECTED -The following routines do something with PROTECTED access: -build_method_call, alter_access, finish_struct, convert_to_aggr, -CWriteLanguageDecl, CWriteLanguageType, CWriteUseObject, -compute_access, lookup_field, GNU_xref_member, dbxout_type_fields, -dbxout_type_method_1 - - -@item TYPE_BINFO -Used to get the binfo for the type. - -Has values of: - - TREE_VECs that are binfos - -What things can this be used on: - - RECORD_TYPEs - - -@item TYPE_BINFO_BASETYPES -See also BINFO_BASETYPES. - -@item TYPE_BINFO_VIRTUALS -A unique list of functions for the virtual function table. See also -BINFO_VIRTUALS. - -What things can this be used on: - - RECORD_TYPEs - - -@item TYPE_BINFO_VTABLE -Points to the virtual function table associated with the given type. -See also BINFO_VTABLE. - -What things can this be used on: - - RECORD_TYPEs - -Has values of: - - VAR_DECLs that are virtual function tables - - -@item TYPE_NAME -Names the type. - -Has values of: - -@display -0 for things that don't have names. -should be IDENTIFIER_NODE for RECORD_TYPEs UNION_TYPEs and - ENUM_TYPEs. -TYPE_DECL for RECORD_TYPEs, UNION_TYPEs and ENUM_TYPEs, but - shouldn't be. -TYPE_DECL for typedefs, unsure why. -@end display - -What things can one use this on: - -@display -TYPE_DECLs -RECORD_TYPEs -UNION_TYPEs -ENUM_TYPEs -@end display - -History: - - It currently points to the TYPE_DECL for RECORD_TYPEs, - UNION_TYPEs and ENUM_TYPEs, but it should be history soon. - - -@item TYPE_METHODS -Synonym for @code{CLASSTYPE_METHOD_VEC}. Chained together with -@code{TREE_CHAIN}. @file{dbxout.c} uses this to get at the methods of a -class. - - -@item TYPE_DECL -Used to represent typedefs, and used to represent bindings layers. - -Components: - - DECL_NAME is the name of the typedef. For example, foo would - be found in the DECL_NAME slot when @code{typedef int foo;} is - seen. - - DECL_SOURCE_LINE identifies what source line number in the - source file the declaration was found at. A value of 0 - indicates that this TYPE_DECL is just an internal binding layer - marker, and does not correspond to a user supplied typedef. - - DECL_SOURCE_FILE - -@item TYPE_FIELDS -A linked list (via @code{TREE_CHAIN}) of member types of a class. The -list can contain @code{TYPE_DECL}s, but there can also be other things -in the list apparently. See also @code{CLASSTYPE_TAGS}. - - -@item TYPE_VIRTUAL_P -A flag used on a @code{FIELD_DECL} or a @code{VAR_DECL}, indicates it is -a virtual function table or a pointer to one. When used on a -@code{FUNCTION_DECL}, indicates that it is a virtual function. When -used on an @code{IDENTIFIER_NODE}, indicates that a function with this -same name exists and has been declared virtual. - -When used on types, it indicates that the type has virtual functions, or -is derived from one that does. - -Not sure if the above about virtual function tables is still true. See -also info on @code{DECL_VIRTUAL_P}. - -What things can this be used on: - - FIELD_DECLs, VAR_DECLs, FUNCTION_DECLs, IDENTIFIER_NODEs - - -@item VF_BASETYPE_VALUE -Get the associated type from the binfo that caused the given vfield to -exist. This is the least derived class (the most parent class) that -needed a virtual function table. It is probably the case that all uses -of this field are misguided, but they need to be examined on a -case-by-case basis. See history for more information on why the -previous statement was made. - -Set at @code{finish_base_struct} time. - -What things can this be used on: - - TREE_LISTs that are vfields - -History: - - This field was used to determine if a virtual function table's - slot should be filled in with a certain virtual function, by - checking to see if the type returned by VF_BASETYPE_VALUE was a - parent of the context in which the old virtual function existed. - This incorrectly assumes that a given type _could_ not appear as - a parent twice in a given inheritance lattice. For single - inheritance, this would in fact work, because a type could not - possibly appear more than once in an inheritance lattice, but - with multiple inheritance, a type can appear more than once. - - -@item VF_BINFO_VALUE -Identifies the binfo that caused this vfield to exist. If this vfield -is from the first direct base class that has a virtual function table, -then VF_BINFO_VALUE is NULL_TREE, otherwise it will be the binfo of the -direct base where the vfield came from. Can use @code{TREE_VIA_VIRTUAL} -on result to find out if it is a virtual base class. Related to the -binfo found by - -@example -get_binfo (VF_BASETYPE_VALUE (vfield), t, 0) -@end example - -@noindent -where @samp{t} is the type that has the given vfield. - -@example -get_binfo (VF_BASETYPE_VALUE (vfield), t, 0) -@end example - -@noindent -will return the binfo for the given vfield. - -May or may not be set at @code{modify_vtable_entries} time. Set at -@code{finish_base_struct} time. - -What things can this be used on: - - TREE_LISTs that are vfields - - -@item VF_DERIVED_VALUE -Identifies the type of the most derived class of the vfield, excluding -the class this vfield is for. - -Set at @code{finish_base_struct} time. - -What things can this be used on: - - TREE_LISTs that are vfields - - -@item VF_NORMAL_VALUE -Identifies the type of the most derived class of the vfield, including -the class this vfield is for. - -Set at @code{finish_base_struct} time. - -What things can this be used on: - - TREE_LISTs that are vfields - - -@item WRITABLE_VTABLES -This is a option that can be defined when building the compiler, that -will cause the compiler to output vtables into the data segment so that -the vtables maybe written. This is undefined by default, because -normally the vtables should be unwritable. People that implement object -I/O facilities may, or people that want to change the dynamic type of -objects may want to have the vtables writable. Another way of achieving -this would be to make a copy of the vtable into writable memory, but the -drawback there is that that method only changes the type for one object. - -@end table - -@node Typical Behavior, Coding Conventions, Macros, Top -@section Typical Behavior - -@cindex parse errors - -Whenever seemingly normal code fails with errors like -@code{syntax error at `\@{'}, it's highly likely that grokdeclarator is -returning a NULL_TREE for whatever reason. - -@node Coding Conventions, Templates, Typical Behavior, Top -@section Coding Conventions - -It should never be that case that trees are modified in-place by the -back-end, @emph{unless} it is guaranteed that the semantics are the same -no matter how shared the tree structure is. @file{fold-const.c} still -has some cases where this is not true, but rms hypothesizes that this -will never be a problem. - -@node Templates, Access Control, Coding Conventions, Top -@section Templates - -A template is represented by a @code{TEMPLATE_DECL}. The specific -fields used are: - -@table @code -@item DECL_TEMPLATE_RESULT -The generic decl on which instantiations are based. This looks just -like any other decl. - -@item DECL_TEMPLATE_PARMS -The parameters to this template. -@end table - -The generic decl is parsed as much like any other decl as possible, -given the parameterization. The template decl is not built up until the -generic decl has been completed. For template classes, a template decl -is generated for each member function and static data member, as well. - -Template members of template classes are represented by a TEMPLATE_DECL -for the class' parameters around another TEMPLATE_DECL for the member's -parameters. - -All declarations that are instantiations or specializations of templates -refer to their template and parameters through DECL_TEMPLATE_INFO. - -How should I handle parsing member functions with the proper param -decls? Set them up again or try to use the same ones? Currently we do -the former. We can probably do this without any extra machinery in -store_pending_inline, by deducing the parameters from the decl in -do_pending_inlines. PRE_PARSED_TEMPLATE_DECL? - -If a base is a parm, we can't check anything about it. If a base is not -a parm, we need to check it for name binding. Do finish_base_struct if -no bases are parameterized (only if none, including indirect, are -parms). Nah, don't bother trying to do any of this until instantiation --- we only need to do name binding in advance. - -Always set up method vec and fields, inc. synthesized methods. Really? -We can't know the types of the copy folks, or whether we need a -destructor, or can have a default ctor, until we know our bases and -fields. Otherwise, we can assume and fix ourselves later. Hopefully. - -@node Access Control, Error Reporting, Templates, Top -@section Access Control -The function compute_access returns one of three values: - -@table @code -@item access_public -means that the field can be accessed by the current lexical scope. - -@item access_protected -means that the field cannot be accessed by the current lexical scope -because it is protected. - -@item access_private -means that the field cannot be accessed by the current lexical scope -because it is private. -@end table - -DECL_ACCESS is used for access declarations; alter_access creates a list -of types and accesses for a given decl. - -Formerly, DECL_@{PUBLIC,PROTECTED,PRIVATE@} corresponded to the return -codes of compute_access and were used as a cache for compute_access. -Now they are not used at all. - -TREE_PROTECTED and TREE_PRIVATE are used to record the access levels -granted by the containing class. BEWARE: TREE_PUBLIC means something -completely unrelated to access control! - -@node Error Reporting, Parser, Access Control, Top -@section Error Reporting - -The C++ front-end uses a call-back mechanism to allow functions to print -out reasonable strings for types and functions without putting extra -logic in the functions where errors are found. The interface is through -the @code{cp_error} function (or @code{cp_warning}, etc.). The -syntax is exactly like that of @code{error}, except that a few more -conversions are supported: - -@itemize @bullet -@item -%C indicates a value of `enum tree_code'. -@item -%D indicates a *_DECL node. -@item -%E indicates a *_EXPR node. -@item -%L indicates a value of `enum languages'. -@item -%P indicates the name of a parameter (i.e. "this", "1", "2", ...) -@item -%T indicates a *_TYPE node. -@item -%O indicates the name of an operator (MODIFY_EXPR -> "operator ="). - -@end itemize - -There is some overlap between these; for instance, any of the node -options can be used for printing an identifier (though only @code{%D} -tries to decipher function names). - -For a more verbose message (@code{class foo} as opposed to just @code{foo}, -including the return type for functions), use @code{%#c}. -To have the line number on the error message indicate the line of the -DECL, use @code{cp_error_at} and its ilk; to indicate which argument you want, -use @code{%+D}, or it will default to the first. - -@node Parser, Exception Handling, Error Reporting, Top -@section Parser - -Some comments on the parser: - -The @code{after_type_declarator} / @code{notype_declarator} hack is -necessary in order to allow redeclarations of @code{TYPENAME}s, for -instance - -@example -typedef int foo; -class A @{ - char *foo; -@}; -@end example - -In the above, the first @code{foo} is parsed as a @code{notype_declarator}, -and the second as a @code{after_type_declarator}. - -Ambiguities: - -There are currently four reduce/reduce ambiguities in the parser. They are: - -1) Between @code{template_parm} and -@code{named_class_head_sans_basetype}, for the tokens @code{aggr -identifier}. This situation occurs in code looking like - -@example -template <class T> class A @{ @}; -@end example - -It is ambiguous whether @code{class T} should be parsed as the -declaration of a template type parameter named @code{T} or an unnamed -constant parameter of type @code{class T}. Section 14.6, paragraph 3 of -the January '94 working paper states that the first interpretation is -the correct one. This ambiguity results in two reduce/reduce conflicts. - -2) Between @code{primary} and @code{type_id} for code like @samp{int()} -in places where both can be accepted, such as the argument to -@code{sizeof}. Section 8.1 of the pre-San Diego working paper specifies -that these ambiguous constructs will be interpreted as @code{typename}s. -This ambiguity results in six reduce/reduce conflicts between -@samp{absdcl} and @samp{functional_cast}. - -3) Between @code{functional_cast} and -@code{complex_direct_notype_declarator}, for various token strings. -This situation occurs in code looking like - -@example -int (*a); -@end example - -This code is ambiguous; it could be a declaration of the variable -@samp{a} as a pointer to @samp{int}, or it could be a functional cast of -@samp{*a} to @samp{int}. Section 6.8 specifies that the former -interpretation is correct. This ambiguity results in 7 reduce/reduce -conflicts. Another aspect of this ambiguity is code like 'int (x[2]);', -which is resolved at the '[' and accounts for 6 reduce/reduce conflicts -between @samp{direct_notype_declarator} and -@samp{primary}/@samp{overqualified_id}. Finally, there are 4 r/r -conflicts between @samp{expr_or_declarator} and @samp{primary} over code -like 'int (a);', which could probably be resolved but would also -probably be more trouble than it's worth. In all, this situation -accounts for 17 conflicts. Ack! - -The second case above is responsible for the failure to parse 'LinppFile -ppfile (String (argv[1]), &outs, argc, argv);' (from Rogue Wave -Math.h++) as an object declaration, and must be fixed so that it does -not resolve until later. - -4) Indirectly between @code{after_type_declarator} and @code{parm}, for -type names. This occurs in (as one example) code like - -@example -typedef int foo, bar; -class A @{ - foo (bar); -@}; -@end example - -What is @code{bar} inside the class definition? We currently interpret -it as a @code{parm}, as does Cfront, but IBM xlC interprets it as an -@code{after_type_declarator}. I believe that xlC is correct, in light -of 7.1p2, which says "The longest sequence of @i{decl-specifiers} that -could possibly be a type name is taken as the @i{decl-specifier-seq} of -a @i{declaration}." However, it seems clear that this rule must be -violated in the case of constructors. This ambiguity accounts for 8 -conflicts. - -Unlike the others, this ambiguity is not recognized by the Working Paper. - -@node Exception Handling, Free Store, Parser, Top -@section Exception Handling - -Note, exception handling in g++ is still under development. - -This section describes the mapping of C++ exceptions in the C++ -front-end, into the back-end exception handling framework. - -The basic mechanism of exception handling in the back-end is -unwind-protect a la elisp. This is a general, robust, and language -independent representation for exceptions. - -The C++ front-end exceptions are mapping into the unwind-protect -semantics by the C++ front-end. The mapping is describe below. - -When -frtti is used, rtti is used to do exception object type checking, -when it isn't used, the encoded name for the type of the object being -thrown is used instead. All code that originates exceptions, even code -that throws exceptions as a side effect, like dynamic casting, and all -code that catches exceptions must be compiled with either -frtti, or --fno-rtti. It is not possible to mix rtti base exception handling -objects with code that doesn't use rtti. The exceptions to this, are -code that doesn't catch or throw exceptions, catch (...), and code that -just rethrows an exception. - -Currently we use the normal mangling used in building functions names -(int's are "i", const char * is PCc) to build the non-rtti base type -descriptors for exception handling. These descriptors are just plain -NULL terminated strings, and internally they are passed around as char -*. - -In C++, all cleanups should be protected by exception regions. The -region starts just after the reason why the cleanup is created has -ended. For example, with an automatic variable, that has a constructor, -it would be right after the constructor is run. The region ends just -before the finalization is expanded. Since the backend may expand the -cleanup multiple times along different paths, once for normal end of the -region, once for non-local gotos, once for returns, etc, the backend -must take special care to protect the finalization expansion, if the -expansion is for any other reason than normal region end, and it is -`inline' (it is inside the exception region). The backend can either -choose to move them out of line, or it can created an exception region -over the finalization to protect it, and in the handler associated with -it, it would not run the finalization as it otherwise would have, but -rather just rethrow to the outer handler, careful to skip the normal -handler for the original region. - -In Ada, they will use the more runtime intensive approach of having -fewer regions, but at the cost of additional work at run time, to keep a -list of things that need cleanups. When a variable has finished -construction, they add the cleanup to the list, when the come to the end -of the lifetime of the variable, the run the list down. If the take a -hit before the section finishes normally, they examine the list for -actions to perform. I hope they add this logic into the back-end, as it -would be nice to get that alternative approach in C++. - -On an rs6000, xlC stores exception objects on that stack, under the try -block. When is unwinds down into a handler, the frame pointer is -adjusted back to the normal value for the frame in which the handler -resides, and the stack pointer is left unchanged from the time at which -the object was thrown. This is so that there is always someplace for -the exception object, and nothing can overwrite it, once we start -throwing. The only bad part, is that the stack remains large. - -The below points out some things that work in g++'s exception handling. - -All completely constructed temps and local variables are cleaned up in -all unwinded scopes. Completely constructed parts of partially -constructed objects are cleaned up. This includes partially built -arrays. Exception specifications are now handled. Thrown objects are -now cleaned up all the time. We can now tell if we have an active -exception being thrown or not (__eh_type != 0). We use this to call -terminate if someone does a throw; without there being an active -exception object. uncaught_exception () works. Exception handling -should work right if you optimize. Exception handling should work with --fpic or -fPIC. - -The below points out some flaws in g++'s exception handling, as it now -stands. - -Only exact type matching or reference matching of throw types works when --fno-rtti is used. Only works on a SPARC (like Suns) (both -mflat and --mno-flat models work), SPARClite, Hitachi SH, i386, arm, rs6000, -PowerPC, Alpha, mips, VAX, m68k and z8k machines. SPARC v9 may not -work. HPPA is mostly done, but throwing between a shared library and -user code doesn't yet work. Some targets have support for data-driven -unwinding. Partial support is in for all other machines, but a stack -unwinder called __unwind_function has to be written, and added to -libgcc2 for them. The new EH code doesn't rely upon the -__unwind_function for C++ code, instead it creates per function -unwinders right inside the function, unfortunately, on many platforms -the definition of RETURN_ADDR_RTX in the tm.h file for the machine port -is wrong. See below for details on __unwind_function. RTL_EXPRs for EH -cond variables for && and || exprs should probably be wrapped in -UNSAVE_EXPRs, and RTL_EXPRs tweaked so that they can be unsaved. - -We only do pointer conversions on exception matching a la 15.3 p2 case -3: `A handler with type T, const T, T&, or const T& is a match for a -throw-expression with an object of type E if [3]T is a pointer type and -E is a pointer type that can be converted to T by a standard pointer -conversion (_conv.ptr_) not involving conversions to pointers to private -or protected base classes.' when -frtti is given. - -We don't call delete on new expressions that die because the ctor threw -an exception. See except/18 for a test case. - -15.2 para 13: The exception being handled should be rethrown if control -reaches the end of a handler of the function-try-block of a constructor -or destructor, right now, it is not. - -15.2 para 12: If a return statement appears in a handler of -function-try-block of a constructor, the program is ill-formed, but this -isn't diagnosed. - -15.2 para 11: If the handlers of a function-try-block contain a jump -into the body of a constructor or destructor, the program is ill-formed, -but this isn't diagnosed. - -15.2 para 9: Check that the fully constructed base classes and members -of an object are destroyed before entering the handler of a -function-try-block of a constructor or destructor for that object. - -build_exception_variant should sort the incoming list, so that it -implements set compares, not exact list equality. Type smashing should -smash exception specifications using set union. - -Thrown objects are usually allocated on the heap, in the usual way. If -one runs out of heap space, throwing an object will probably never work. -This could be relaxed some by passing an __in_chrg parameter to track -who has control over the exception object. Thrown objects are not -allocated on the heap when they are pointer to object types. We should -extend it so that all small (<4*sizeof(void*)) objects are stored -directly, instead of allocated on the heap. - -When the backend returns a value, it can create new exception regions -that need protecting. The new region should rethrow the object in -context of the last associated cleanup that ran to completion. - -The structure of the code that is generated for C++ exception handling -code is shown below: - -@example -Ln: throw value; - copy value onto heap - jump throw (Ln, id, address of copy of value on heap) - - try @{ -+Lstart: the start of the main EH region -|... ... -+Lend: the end of the main EH region - @} catch (T o) @{ - ...1 - @} -Lresume: - nop used to make sure there is something before - the next region ends, if there is one -... ... - - jump Ldone -[ -Lmainhandler: handler for the region Lstart-Lend - cleanup -] zero or more, depending upon automatic vars with dtors -+Lpartial: -| jump Lover -+Lhere: - rethrow (Lhere, same id, same obj); -Lterm: handler for the region Lpartial-Lhere - call terminate -Lover: -[ - [ - call throw_type_match - if (eq) @{ - ] these lines disappear when there is no catch condition -+Lsregion2: -| ...1 -| jump Lresume -|Lhandler: handler for the region Lsregion2-Leregion2 -| rethrow (Lresume, same id, same obj); -+Leregion2 - @} -] there are zero or more of these sections, depending upon how many - catch clauses there are ------------------------------ expand_end_all_catch -------------------------- - here we have fallen off the end of all catch - clauses, so we rethrow to outer - rethrow (Lresume, same id, same obj); ------------------------------ expand_end_all_catch -------------------------- -[ -L1: maybe throw routine -] depending upon if we have expanded it or not -Ldone: - ret - -start_all_catch emits labels: Lresume, - -@end example - -The __unwind_function takes a pointer to the throw handler, and is -expected to pop the stack frame that was built to call it, as well as -the frame underneath and then jump to the throw handler. It must -restore all registers to their proper values as well as all other -machine state as determined by the context in which we are unwinding -into. The way I normally start is to compile: - - void *g; - foo(void* a) @{ g = a; @} - -with -S, and change the thing that alters the PC (return, or ret -usually) to not alter the PC, making sure to leave all other semantics -(like adjusting the stack pointer, or frame pointers) in. After that, -replicate the prologue once more at the end, again, changing the PC -altering instructions, and finally, at the very end, jump to `g'. - -It takes about a week to write this routine, if someone wants to -volunteer to write this routine for any architecture, exception support -for that architecture will be added to g++. Please send in those code -donations. One other thing that needs to be done, is to double check -that __builtin_return_address (0) works. - -@subsection Specific Targets - -For the alpha, the __unwind_function will be something resembling: - -@example -void -__unwind_function(void *ptr) -@{ - /* First frame */ - asm ("ldq $15, 8($30)"); /* get the saved frame ptr; 15 is fp, 30 is sp */ - asm ("bis $15, $15, $30"); /* reload sp with the fp we found */ - - /* Second frame */ - asm ("ldq $15, 8($30)"); /* fp */ - asm ("bis $15, $15, $30"); /* reload sp with the fp we found */ - - /* Return */ - asm ("ret $31, ($16), 1"); /* return to PTR, stored in a0 */ -@} -@end example - -@noindent -However, there are a few problems preventing it from working. First of -all, the gcc-internal function @code{__builtin_return_address} needs to -work given an argument of 0 for the alpha. As it stands as of August -30th, 1995, the code for @code{BUILT_IN_RETURN_ADDRESS} in @file{expr.c} -will definitely not work on the alpha. Instead, we need to define -the macros @code{DYNAMIC_CHAIN_ADDRESS} (maybe), -@code{RETURN_ADDR_IN_PREVIOUS_FRAME}, and definitely need a new -definition for @code{RETURN_ADDR_RTX}. - -In addition (and more importantly), we need a way to reliably find the -frame pointer on the alpha. The use of the value 8 above to restore the -frame pointer (register 15) is incorrect. On many systems, the frame -pointer is consistently offset to a specific point on the stack. On the -alpha, however, the frame pointer is pushed last. First the return -address is stored, then any other registers are saved (e.g., @code{s0}), -and finally the frame pointer is put in place. So @code{fp} could have -an offset of 8, but if the calling function saved any registers at all, -they add to the offset. - -The only places the frame size is noted are with the @samp{.frame} -directive, for use by the debugger and the OSF exception handling model -(useless to us), and in the initial computation of the new value for -@code{sp}, the stack pointer. For example, the function may start with: - -@example -lda $30,-32($30) -.frame $15,32,$26,0 -@end example - -@noindent -The 32 above is exactly the value we need. With this, we can be sure -that the frame pointer is stored 8 bytes less---in this case, at 24(sp)). -The drawback is that there is no way that I (Brendan) have found to let -us discover the size of a previous frame @emph{inside} the definition -of @code{__unwind_function}. - -So to accomplish exception handling support on the alpha, we need two -things: first, a way to figure out where the frame pointer was stored, -and second, a functional @code{__builtin_return_address} implementation -for except.c to be able to use it. - -Or just support DWARF 2 unwind info. - -@subsection New Backend Exception Support - -This subsection discusses various aspects of the design of the -data-driven model being implemented for the exception handling backend. - -The goal is to generate enough data during the compilation of user code, -such that we can dynamically unwind through functions at run time with a -single routine (@code{__throw}) that lives in libgcc.a, built by the -compiler, and dispatch into associated exception handlers. - -This information is generated by the DWARF 2 debugging backend, and -includes all of the information __throw needs to unwind an arbitrary -frame. It specifies where all of the saved registers and the return -address can be found at any point in the function. - -Major disadvantages when enabling exceptions are: - -@itemize @bullet -@item -Code that uses caller saved registers, can't, when flow can be -transferred into that code from an exception handler. In high performance -code this should not usually be true, so the effects should be minimal. - -@end itemize - -@subsection Backend Exception Support - -The backend must be extended to fully support exceptions. Right now -there are a few hooks into the alpha exception handling backend that -resides in the C++ frontend from that backend that allows exception -handling to work in g++. An exception region is a segment of generated -code that has a handler associated with it. The exception regions are -denoted in the generated code as address ranges denoted by a starting PC -value and an ending PC value of the region. Some of the limitations -with this scheme are: - -@itemize @bullet -@item -The backend replicates insns for such things as loop unrolling and -function inlining. Right now, there are no hooks into the frontend's -exception handling backend to handle the replication of insns. When -replication happens, a new exception region descriptor needs to be -generated for the new region. - -@item -The backend expects to be able to rearrange code, for things like jump -optimization. Any rearranging of the code needs have exception region -descriptors updated appropriately. - -@item -The backend can eliminate dead code. Any associated exception region -descriptor that refers to fully contained code that has been eliminated -should also be removed, although not doing this is harmless in terms of -semantics. - -@end itemize - -The above is not meant to be exhaustive, but does include all things I -have thought of so far. I am sure other limitations exist. - -Below are some notes on the migration of the exception handling code -backend from the C++ frontend to the backend. - -NOTEs are to be used to denote the start of an exception region, and the -end of the region. I presume that the interface used to generate these -notes in the backend would be two functions, start_exception_region and -end_exception_region (or something like that). The frontends are -required to call them in pairs. When marking the end of a region, an -argument can be passed to indicate the handler for the marked region. -This can be passed in many ways, currently a tree is used. Another -possibility would be insns for the handler, or a label that denotes a -handler. I have a feeling insns might be the best way to pass it. -Semantics are, if an exception is thrown inside the region, control is -transferred unconditionally to the handler. If control passes through -the handler, then the backend is to rethrow the exception, in the -context of the end of the original region. The handler is protected by -the conventional mechanisms; it is the frontend's responsibility to -protect the handler, if special semantics are required. - -This is a very low level view, and it would be nice is the backend -supported a somewhat higher level view in addition to this view. This -higher level could include source line number, name of the source file, -name of the language that threw the exception and possibly the name of -the exception. Kenner may want to rope you into doing more than just -the basics required by C++. You will have to resolve this. He may want -you to do support for non-local gotos, first scan for exception handler, -if none is found, allow the debugger to be entered, without any cleanups -being done. To do this, the backend would have to know the difference -between a cleanup-rethrower, and a real handler, if would also have to -have a way to know if a handler `matches' a thrown exception, and this -is frontend specific. - -The stack unwinder is one of the hardest parts to do. It is highly -machine dependent. The form that kenner seems to like was a couple of -macros, that would do the machine dependent grunt work. One preexisting -function that might be of some use is __builtin_return_address (). One -macro he seemed to want was __builtin_return_address, and the other -would do the hard work of fixing up the registers, adjusting the stack -pointer, frame pointer, arg pointer and so on. - - -@node Free Store, Mangling, Exception Handling, Top -@section Free Store - -@code{operator new []} adds a magic cookie to the beginning of arrays -for which the number of elements will be needed by @code{operator delete -[]}. These are arrays of objects with destructors and arrays of objects -that define @code{operator delete []} with the optional size_t argument. -This cookie can be examined from a program as follows: - -@example -typedef unsigned long size_t; -extern "C" int printf (const char *, ...); - -size_t nelts (void *p) -@{ - struct cookie @{ - size_t nelts __attribute__ ((aligned (sizeof (double)))); - @}; - - cookie *cp = (cookie *)p; - --cp; - - return cp->nelts; -@} - -struct A @{ - ~A() @{ @} -@}; - -main() -@{ - A *ap = new A[3]; - printf ("%ld\n", nelts (ap)); -@} -@end example - -@section Linkage -The linkage code in g++ is horribly twisted in order to meet two design goals: - -1) Avoid unnecessary emission of inlines and vtables. - -2) Support pedantic assemblers like the one in AIX. - -To meet the first goal, we defer emission of inlines and vtables until -the end of the translation unit, where we can decide whether or not they -are needed, and how to emit them if they are. - -@node Mangling, Vtables, Free Store, Top -@section Function name mangling for C++ and Java - -Both C++ and Jave provide overloaded function and methods, -which are methods with the same types but different parameter lists. -Selecting the correct version is done at compile time. -Though the overloaded functions have the same name in the source code, -they need to be translated into different assembler-level names, -since typical assemblers and linkers cannot handle overloading. -This process of encoding the parameter types with the method name -into a unique name is called @dfn{name mangling}. The inverse -process is called @dfn{demangling}. - -It is convenient that C++ and Java use compatible mangling schemes, -since the makes life easier for tools such as gdb, and it eases -integration between C++ and Java. - -Note there is also a standard "Jave Native Interface" (JNI) which -implements a different calling convention, and uses a different -mangling scheme. The JNI is a rather abstract ABI so Java can call methods -written in C or C++; -we are concerned here about a lower-level interface primarily -intended for methods written in Java, but that can also be used for C++ -(and less easily C). - -Note that on systems that follow BSD tradition, a C identifier @code{var} -would get "mangled" into the assembler name @samp{_var}. On such -systems, all other mangled names are also prefixed by a @samp{_} -which is not shown in the following examples. - -@subsection Method name mangling - -C++ mangles a method by emitting the function name, followed by @code{__}, -followed by encodings of any method qualifiers (such as @code{const}), -followed by the mangling of the method's class, -followed by the mangling of the parameters, in order. - -For example @code{Foo::bar(int, long) const} is mangled -as @samp{bar__C3Fooil}. - -For a constructor, the method name is left out. -That is @code{Foo::Foo(int, long) const} is mangled -as @samp{__C3Fooil}. - -GNU Java does the same. - -@subsection Primitive types - -The C++ types @code{int}, @code{long}, @code{short}, @code{char}, -and @code{long long} are mangled as @samp{i}, @samp{l}, -@samp{s}, @samp{c}, and @samp{x}, respectively. -The corresponding unsigned types have @samp{U} prefixed -to the mangling. The type @code{signed char} is mangled @samp{Sc}. - -The C++ and Java floating-point types @code{float} and @code{double} -are mangled as @samp{f} and @samp{d} respectively. - -The C++ @code{bool} type and the Java @code{boolean} type are -mangled as @samp{b}. - -The C++ @code{wchar_t} and the Java @code{char} types are -mangled as @samp{w}. - -The Java integral types @code{byte}, @code{short}, @code{int} -and @code{long} are mangled as @samp{c}, @samp{s}, @samp{i}, -and @samp{x}, respectively. - -C++ code that has included @code{javatypes.h} will mangle -the typedefs @code{jbyte}, @code{jshort}, @code{jint} -and @code{jlong} as respectively @samp{c}, @samp{s}, @samp{i}, -and @samp{x}. (This has not been implemented yet.) - -@subsection Mangling of simple names - -A simple class, package, template, or namespace name is -encoded as the number of characters in the name, followed by -the actual characters. Thus the class @code{Foo} -is encoded as @samp{3Foo}. - -If any of the characters in the name are not alphanumeric -(i.e not one of the standard ASCII letters, digits, or '_'), -or the initial character is a digit, then the name is -mangled as a sequence of encoded Unicode letters. -A Unicode encoding starts with a @samp{U} to indicate -that Unicode escapes are used, followed by the number of -bytes used by the Unicode encoding, followed by the bytes -representing the encoding. ASSCI letters and -non-initial digits are encoded without change. However, all -other characters (including underscore and initial digits) are -translated into a sequence starting with an underscore, -followed by the big-endian 4-hex-digit lower-case encoding of the character. - -If a method name contains Unicode-escaped characters, the -entire mangled method name is followed by a @samp{U}. - -For example, the method @code{X\u0319::M\u002B(int)} is encoded as -@samp{M_002b__U6X_0319iU}. - - -@subsection Pointer and reference types - -A C++ pointer type is mangled as @samp{P} followed by the -mangling of the type pointed to. - -A C++ reference type as mangled as @samp{R} followed by the -mangling of the type referenced. - -A Java object reference type is equivalent -to a C++ pointer parameter, so we mangle such an parameter type -as @samp{P} followed by the mangling of the class name. - -@subsection Squangled type compression - -Squangling (enabled with the @samp{-fsquangle} option), utilizes the -@samp{B} code to indicate reuse of a previously seen type within an -indentifier. Types are recognized in a left to right manner and given -increasing values, which are appended to the code in the standard -manner. Ie, multiple digit numbers are delimited by @samp{_} -characters. A type is considered to be any non primitive type, -regardless of whether its a parameter, template parameter, or entire -template. Certain codes are considered modifiers of a type, and are not -included as part of the type. These are the @samp{C}, @samp{V}, -@samp{P}, @samp{A}, @samp{R}, @samp{U} and @samp{u} codes, denoting -constant, volatile, pointer, array, reference, unsigned, and restrict. -These codes may precede a @samp{B} type in order to make the required -modifications to the type. - -For example: -@example -template <class T> class class1 @{ @}; - -template <class T> class class2 @{ @}; - -class class3 @{ @}; - -int f(class2<class1<class3> > a ,int b, const class1<class3>&c, class3 *d) @{ @} - - B0 -> class2<class1<class3> - B1 -> class1<class3> - B2 -> class3 -@end example -Produces the mangled name @samp{f__FGt6class21Zt6class11Z6class3iRCB1PB2}. -The int parameter is a basic type, and does not receive a B encoding... - -@subsection Qualified names - -Both C++ and Java allow a class to be lexically nested inside another -class. C++ also supports namespaces (not yet implemented by G++). -Java also supports packages. - -These are all mangled the same way: First the letter @samp{Q} -indicates that we are emitting a qualified name. -That is followed by the number of parts in the qualified name. -If that number is 9 or less, it is emitted with no delimiters. -Otherwise, an underscore is written before and after the count. -Then follows each part of the qualified name, as described above. - -For example @code{Foo::\u0319::Bar} is encoded as -@samp{Q33FooU5_03193Bar}. - -Squangling utilizes the the letter @samp{K} to indicate a -remembered portion of a qualified name. As qualified names are processed -for an identifier, the names are numbered and remembered in a -manner similar to the @samp{B} type compression code. -Names are recognized left to right, and given increasing values, which are -appended to the code in the standard manner. ie, multiple digit numbers -are delimited by @samp{_} characters. - -For example -@example -class Andrew -@{ - class WasHere - @{ - class AndHereToo - @{ - @}; - @}; -@}; - -f(Andrew&r1, Andrew::WasHere& r2, Andrew::WasHere::AndHereToo& r3) @{ @} - - K0 -> Andrew - K1 -> Andrew::WasHere - K2 -> Andrew::WasHere::AndHereToo -@end example -Function @samp{f()} would be mangled as : -@samp{f__FR6AndrewRQ2K07WasHereRQ2K110AndHereToo} - -There are some occasions when either a @samp{B} or @samp{K} code could -be chosen, preference is always given to the @samp{B} code. Ie, the example -in the section on @samp{B} mangling could have used a @samp{K} code -instead of @samp{B2}. - -@subsection Templates - -A class template instantiation is encoded as the letter @samp{t}, -followed by the encoding of the template name, followed -the number of template parameters, followed by encoding of the template -parameters. If a template parameter is a type, it is written -as a @samp{Z} followed by the encoding of the type. - -A function template specialization (either an instantiation or an -explicit specialization) is encoded by an @samp{H} followed by the -encoding of the template parameters, as described above, followed by an -@samp{_}, the encoding of the argument types to the template function -(not the specialization), another @samp{_}, and the return type. (Like -the argument types, the return type is the return type of the function -template, not the specialization.) Template parameters in the argument -and return types are encoded by an @samp{X} for type parameters, or a -@samp{Y} for constant parameters, an index indicating their position -in the template parameter list declaration, and their template depth. - -@subsection Arrays - -C++ array types are mangled by emitting @samp{A}, followed by -the length of the array, followed by an @samp{_}, followed by -the mangling of the element type. Of course, normally -array parameter types decay into a pointer types, so you -don't see this. - -Java arrays are objects. A Java type @code{T[]} is mangled -as if it were the C++ type @code{JArray<T>}. -For example @code{java.lang.String[]} is encoded as -@samp{Pt6JArray1ZPQ34java4lang6String}. - -@subsection Static fields - -Both C++ and Java classes can have static fields. -These are allocated statically, and are shared among all instances. - -The mangling starts with a prefix (@samp{_} in most systems), which is -followed by the mangling -of the class name, followed by the "joiner" and finally the field name. -The joiner (see @code{JOINER} in @code{cp-tree.h}) is a special -separator character. For historical reasons (and idiosyncracies -of assembler syntax) it can @samp{$} or @samp{.} (or even -@samp{_} on a few systems). If the joiner is @samp{_} then the prefix -is @samp{__static_} instead of just @samp{_}. - -For example @code{Foo::Bar::var} (or @code{Foo.Bar.var} in Java syntax) -would be encoded as @samp{_Q23Foo3Bar$var} or @samp{_Q23Foo3Bar.var} -(or rarely @samp{__static_Q23Foo3Bar_var}). - -If the name of a static variable needs Unicode escapes, -the Unicode indicator @samp{U} comes before the "joiner". -This @code{\u1234Foo::var\u3445} becomes @code{_U8_1234FooU.var_3445}. - -@subsection Table of demangling code characters - -The following special characters are used in mangling: - -@table @samp -@item A -Indicates a C++ array type. - -@item b -Encodes the C++ @code{bool} type, -and the Java @code{boolean} type. - -@item B -Used for squangling. Similar in concept to the 'T' non-squangled code. - -@item c -Encodes the C++ @code{char} type, and the Java @code{byte} type. - -@item C -A modifier to indicate a @code{const} type. -Also used to indicate a @code{const} member function -(in which cases it precedes the encoding of the method's class). - -@item d -Encodes the C++ and Java @code{double} types. - -@item e -Indicates extra unknown arguments @code{...}. - -@item E -Indicates the opening parenthesis of an expression. - -@item f -Encodes the C++ and Java @code{float} types. - -@item F -Used to indicate a function type. - -@item H -Used to indicate a template function. - -@item i -Encodes the C++ and Java @code{int} types. - -@item I -Encodes typedef names of the form @code{int@var{n}_t}, where @var{n} is a -positive decimal number. The @samp{I} is followed by either two -hexidecimal digits, which encode the value of @var{n}, or by an -arbitrary number of hexidecimal digits between underscores. For -example, @samp{I40} encodes the type @code{int64_t}, and @samp{I_200_} -encodes the type @code{int512_t}. - -@item J -Indicates a complex type. - -@item K -Used by squangling to compress qualified names. - -@item l -Encodes the C++ @code{long} type. - -@item n -Immediate repeated type. Followed by the repeat count. - -@item N -Repeated type. Followed by the repeat count of the repeated type, -followed by the type index of the repeated type. Due to a bug in -g++ 2.7.2, this is only generated if index is 0. Superceded by -@samp{n} when squangling. - -@item P -Indicates a pointer type. Followed by the type pointed to. - -@item Q -Used to mangle qualified names, which arise from nested classes. -Also used for namespaces. -In Java used to mangle package-qualified names, and inner classes. - -@item r -Encodes the GNU C++ @code{long double} type. - -@item R -Indicates a reference type. Followed by the referenced type. - -@item s -Encodes the C++ and java @code{short} types. - -@item S -A modifier that indicates that the following integer type is signed. -Only used with @code{char}. - -Also used as a modifier to indicate a static member function. - -@item t -Indicates a template instantiation. - -@item T -A back reference to a previously seen type. - -@item U -A modifier that indicates that the following integer type is unsigned. -Also used to indicate that the following class or namespace name -is encoded using Unicode-mangling. - -@item u -The @code{restrict} type qualifier. - -@item v -Encodes the C++ and Java @code{void} types. - -@item V -A modifier for a @code{volatile} type or method. - -@item w -Encodes the C++ @code{wchar_t} type, and the Java @code{char} types. - -@item W -Indicates the closing parenthesis of an expression. - -@item x -Encodes the GNU C++ @code{long long} type, and the Java @code{long} type. - -@item X -Encodes a template type parameter, when part of a function type. - -@item Y -Encodes a template constant parameter, when part of a function type. - -@item Z -Used for template type parameters. - -@end table - -The letters @samp{G}, @samp{M}, @samp{O}, and @samp{p} -also seem to be used for obscure purposes ... - -@node Vtables, Concept Index, Mangling, Top -@section Virtual Tables - -In order to invoke virtual functions, GNU C++ uses virtual tables. Each -virtual function gets an index, and the table entry points to the -overridden function to call. Sometimes, and adjustment to the this -pointer has to be made before calling a virtual function: - -@example -struct A@{ - int i; - virtual void foo(); -@}; - -struct B@{ - int j; - virtual void bar(); -@}; - -struct C:A,B@{ - virtual void bar(); -@}; - -void C::bar() -@{ - i++; -@} - -int main() -@{ - C *c = new C; - B *b = c; - c->bar(); -@} -@end example - -Here, casting from @samp{c} to @samp{b} adds an offset. When @samp{bar} -is called, this offset needs to be subtracted, so that @samp{C::bar} can -properly access @samp{i}. One approach of achieving this is to use -@emph{thunks}, which are small half-functions put into the virtual -table. The modify the first argument (the @samp{this} pointer), and then -jump into the real function. - -The other (traditional) approach is to have an additional integer in the -virtual table which is added to this. This is an additional overhead -both at the function call, and in the size of virtual tables: In the -case of single inheritance (or for the first base class), these integers -will always be zero. - -@subsection Virtual Base Classes with Virtual Tables - -In case of virtual bases, the code is even more -complicated. Constructors and destructors need to know whether they are -"in charge" of the virtual bases, and an implicit integer -@samp{__in_chrg} for that purpose. - -@example -struct A@{ - int i; - virtual void bar(); - void call_bar()@{bar();@} -@}; - -struct B:virtual A@{ - B(); - int j; - virtual void bar(); -@}; - -B::B()@{ - call_bar(); -@} - -struct C@{ - int k; -@}; - -struct D:C,B@{ - int l; - virtual void bar(); -@}; - -@end example - -When constructing an instance of B, it will have the following layout: -@samp{vbase pointer to A}, @samp{j}, @samp{A virtual table}, @samp{i}. -On a 32-bit machine, downcasting from @samp{A*} to @samp{B*} would need -to subtract 8, which would be the thunk executed when calling -@samp{B::bar} inside @samp{call_bar}. - -When constructing an instance of D, it will have a different layout: -@samp{k}, @samp{vbase pointer to A}, @samp{j}, @samp{l}, @samp{A virtual -table}, @samp{i}. So, when downcasting from @samp{A*} to @samp{B*} in a -@samp{D} object, the offset would be @samp{12}. - -This means that during construction of the @samp{B} base of a @samp{D} -object, a virtual table is needed which has a @samp{-12} thunk to -@samp{B::bar}. This is @emph{only} needed during construction and -destruction, as the full object will use a @samp{-16} thunk to -@samp{D::bar}. - -In order to implement this, the compiler generates an implicit argument -(in addition to @code{__in_chrg}): the virtual list argument -@code{__vlist}. This is a list of virtual tables needed during -construction and destruction. The virtual pointers are ordered in the -way they are used during construction; the destructors will process the -array in reverse order. The ordering is as follows: -@itemize @bullet -@item -If the class is in charge, the vlist starts with virtual table pointers -for the virtual bases that have virtual bases themselves. Here, only -@emph{polymorphic} virtual bases (pvbases) are interesting: if a vbase -has no virtual functions, it doesn't have a virtual table. - -@item -Next, the vlist has virtual tables for the initialization of the -non-virtual bases. These bases are not in charge, so the layout is -recursive, but ignores virtual bases during recursion. - -@item -Next, there is a number of virtual tables for each virtual base. These -are sorted in the order in which virtual bases are constructed. Each -virtual base may have more than one @code{vfield}, and therefore require -more than one @code{vtable}. The order of vtables is the same as used -when initializing vfields of non-virtual bases in a constructor. -@end itemize - -The compiler emits a virtual table list in a variable mangled as -@code{__vl.classname}. - -Class with virtual bases, but without pvbases, only have the -@code{__in_chrg} argument to their ctors and dtors: they don't have any -vfields in the vbases to initialize. - -A further problem arises with virtual destructors: A destructor -typically has only the @code{__in_chrg} argument, which also indicates -whether the destructor should call @code{operator delete}. A dtor of a -class with pvbases has an additional argument. Unfortunately, a caller -of a virtual dtor might not know whether to pass that argument or not. -Therefore, the dtor processes the @code{__vlist} argument in an -automatic variable, which is initialized from the class' vlist if the -__in_chrg flag has a zero value in bit 2 (bit mask 4), or from the -argument @code{__vlist1} if bit 2 of the __in_chrg parameter is set to -one. - -@subsection Specification of non-thunked vtables - -In the traditional implementation of vtables, each slot contains three -fields: The offset to be added to the this pointer before invoking a -virtual function, an unused field that is always zero, and the pointer -to the virtual function. The first two fields are typically 16 bits -wide. The unused field is called `index'; it may be non-zero in -pointer-to-member-functions, which use the same layout. - -The virtual table then is an array of vtable slots. The first slot is -always the virtual type info function, the other slots are in the order -in which the virtual functions appear in the class declaration. - -If a class has base classes, it may inherit other bases' vfields. Each -class may have a primary vfield; the primary vfield of the derived class -is the primary vfield of the left-most non-virtual base class. If a -class inherits a primary vfield, any new virtual functions in the -derived class are appended to the virtual table of the primary -vfield. If there are new virtual functions in the derived class, and no -primary vfield is inherited, a new vfield is introduced which becomes -primary. The redefined virtual functions fill the vtable slots inherited -from the base; new virtual functions are put into the primary vtable in -the order of declaration. If no new virtual functions are introduced, no -primary vfield is allocated. - -In a base class that has pvbases, virtual tables are needed which are -used only in the constructor (see example above). At run-time, the -virtual tables of the base class are adjusted, to reflect the new offset -of the pvbase. The compiler knows statically what offset the pvbase has -for a complete object. At run-time, the offset of the pvbase can be -extracted from the vbase pointer, which is set in the constructor of the -complete object. These two offsets result in a delta, which is used to -adjust the deltas in the vtable (the adjustment might be different for -different vtable slots). To adjust the vtables, the compiler emits code -that creates a vtable on the stack. This vtable is initialized with the -vtable for the complete base type, and then adjusted. - -In order to call a virtual function, the compiler gets the offset field -from the vtable entry, and adds it to the this pointer. It then -indirectly calls the virtual function pointer, passing the adjusted this -pointer, and any arguments the virtual function may have. - -To implement dynamic casting, the dynamic_cast function needs typeinfos -for the complete type, and the pointer to the complete type. The -typeinfo pointer is obtained by calling the virtual typeinfo function -(which doesn't take a this parameter). The pointer to the complete -object is obtained by adding the offset of the virtual typeinfo vtable -slot, since this virtual function is always implemented in the complete -object. - -@subsection Specification of thunked vtables - -For vtable thunks, each slot only consists of a pointer to the virtual -function, which might be a thunk function. The first slot in the vtable -is an offset of the this pointer to the complete object, which is needed -as a parameter to __dynamic_cast. The second slot is the virtual -typeinfo function. All other slots are allocated with the same procedure -as in the non-thunked case. Allocation of vfields also uses the same -procedure as described above. - -If the virtual function needs an adjusted this pointer, a thunk function -is emitted. If supported by the target architecture, this is only a -half-function. Such a thunk has no stack frame; it merely adjusts the -first argument of the function, and then directly branches into the -implementation of the virtual function. If the architecture does not -support half-functions (i.e. if ASM_OUTPUT_MI_THUNK is not defined), the -compiler emits a wrapper function, which copies all arguments, adjust -the this pointer, and then calls the original function. Since objects of -non-aggregate type are passed by invisible reference, this copies only -POD arguments. The approach fails for virtual functions with a variable -number of arguments. - -In order to support the vtables needed in base constructors with -pvbases, the compiler passes an implicit __vlist argument as described -above, if the version 2 thunks are used. For version 1 thunks, the base -class constructor will fill in the vtables for the complete base class, -which will incorrectly adjust the this pointer, leading to a dynamic -error. - -@node Concept Index, , Vtables, Top - -@section Concept Index - -@printindex cp - -@bye diff --git a/contrib/gcc/cp/inc/exception b/contrib/gcc/cp/inc/exception deleted file mode 100644 index 32efb9f82cae..000000000000 --- a/contrib/gcc/cp/inc/exception +++ /dev/null @@ -1,39 +0,0 @@ -// Exception Handling support header for -*- C++ -*- -// Copyright (C) 1995, 96-97, 1998 Free Software Foundation - -#ifndef __EXCEPTION__ -#define __EXCEPTION__ - -#pragma interface "exception" - -extern "C++" { - -namespace std { - -class exception { -public: - exception () { } - virtual ~exception () { } - virtual const char* what () const; -}; - -class bad_exception : public exception { -public: - bad_exception () { } - virtual ~bad_exception () { } -}; - -typedef void (*terminate_handler) (); -typedef void (*unexpected_handler) (); - -terminate_handler set_terminate (terminate_handler); -void terminate () __attribute__ ((__noreturn__)); -unexpected_handler set_unexpected (unexpected_handler); -void unexpected () __attribute__ ((__noreturn__)); -bool uncaught_exception (); - -} // namespace std - -} // extern "C++" - -#endif diff --git a/contrib/gcc/cp/inc/new b/contrib/gcc/cp/inc/new deleted file mode 100644 index b66673dc3a6b..000000000000 --- a/contrib/gcc/cp/inc/new +++ /dev/null @@ -1,42 +0,0 @@ -// The -*- C++ -*- dynamic memory management header. -// Copyright (C) 1994, 96-97, 1998 Free Software Foundation - -#ifndef __NEW__ -#define __NEW__ - -#pragma interface "new" -#include <stddef.h> -#include <exception> - -extern "C++" { - -namespace std { - - class bad_alloc : public exception { - public: - virtual const char* what() const throw() { return "bad_alloc"; } - }; - - struct nothrow_t {}; - extern const nothrow_t nothrow; - typedef void (*new_handler)(); - new_handler set_new_handler (new_handler); - -} // namespace std - -// replaceable signatures -void *operator new (size_t) throw (std::bad_alloc); -void *operator new[] (size_t) throw (std::bad_alloc); -void operator delete (void *) throw(); -void operator delete[] (void *) throw(); -void *operator new (size_t, const std::nothrow_t&) throw(); -void *operator new[] (size_t, const std::nothrow_t&) throw(); -void operator delete (void *, const std::nothrow_t&) throw(); -void operator delete[] (void *, const std::nothrow_t&) throw(); - -// default placement versions of operator new -inline void *operator new(size_t, void *place) throw() { return place; } -inline void *operator new[](size_t, void *place) throw() { return place; } -} // extern "C++" - -#endif diff --git a/contrib/gcc/cp/inc/new.h b/contrib/gcc/cp/inc/new.h deleted file mode 100644 index 006be7efb07f..000000000000 --- a/contrib/gcc/cp/inc/new.h +++ /dev/null @@ -1,11 +0,0 @@ -// -*- C++ -*- forwarding header. - -#ifndef __NEW_H__ -#define __NEW_H__ - -#include <new> - -using std::new_handler; -using std::set_new_handler; - -#endif // __NEW_H__ diff --git a/contrib/gcc/cp/inc/typeinfo b/contrib/gcc/cp/inc/typeinfo deleted file mode 100644 index 934784968c54..000000000000 --- a/contrib/gcc/cp/inc/typeinfo +++ /dev/null @@ -1,58 +0,0 @@ -// RTTI support for -*- C++ -*- -// Copyright (C) 1994, 95-97, 1998 Free Software Foundation - -#ifndef __TYPEINFO__ -#define __TYPEINFO__ - -#pragma interface "typeinfo" - -#include <exception> - -extern "C++" { - -namespace std { - -class type_info { -private: - // assigning type_info is not supported. made private. - type_info& operator= (const type_info&); - type_info (const type_info&); - -protected: - explicit type_info (const char *n): _name (n) { } - - const char *_name; - -public: - // destructor - virtual ~type_info (); - - bool before (const type_info& arg) const; - const char* name () const - { return _name; } - bool operator== (const type_info& arg) const; - bool operator!= (const type_info& arg) const; -}; - -inline bool type_info:: -operator!= (const type_info& arg) const -{ - return !operator== (arg); -} - -class bad_cast : public exception { -public: - bad_cast() { } - virtual ~bad_cast() { } -}; - -class bad_typeid : public exception { - public: - bad_typeid () { } - virtual ~bad_typeid () { } -}; - -} // namespace std - -} // extern "C++" -#endif diff --git a/contrib/gcc/cp/input.c b/contrib/gcc/cp/input.c deleted file mode 100644 index 9148c8656233..000000000000 --- a/contrib/gcc/cp/input.c +++ /dev/null @@ -1,207 +0,0 @@ -/* Input handling for G++. - Copyright (C) 1992, 93-98, 1999 Free Software Foundation, Inc. - Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing. - -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. */ - -/* G++ needs to do enough saving and re-parsing of text that it is - necessary to abandon the simple FILE* model and use a mechanism where - we can pre-empt one input stream with another derived from saved text; - we may need to do this arbitrarily often, and cannot depend on having - the GNU library available, so FILE objects just don't cut it. - - This file is written as a separate module, but can be included by - lex.c for very minor efficiency gains (primarily in function - inlining). */ - -#include "system.h" - -extern FILE *finput; - -struct input_source { - /* saved string */ - char *str; - int length; - /* current position, when reading as input */ - int offset; - /* linked list maintenance */ - struct input_source *next; - /* values to restore after reading all of current string */ - char *filename; - int lineno; - struct pending_input *input; - int putback_char; -}; - -static struct input_source *input, *free_inputs; - -extern char *input_filename; -extern int lineno; - -#if USE_CPPLIB -extern unsigned char *yy_cur, *yy_lim; -extern int yy_get_token (); -#define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ()) -#else -#define GETC() getc (finput) -#endif - -extern void feed_input PROTO((char *, int)); -extern void put_input PROTO((int)); -extern void put_back PROTO((int)); -extern int getch PROTO((void)); -extern int input_redirected PROTO((void)); - -static inline struct input_source * allocate_input PROTO((void)); -static inline void free_input PROTO((struct input_source *)); -static inline void end_input PROTO((void)); -static inline int sub_getch PROTO((void)); - -static inline struct input_source * -allocate_input () -{ - struct input_source *inp; - if (free_inputs) - { - inp = free_inputs; - free_inputs = inp->next; - inp->next = 0; - return inp; - } - inp = (struct input_source *) xmalloc (sizeof (struct input_source)); - inp->next = 0; - return inp; -} - -static inline void -free_input (inp) - struct input_source *inp; -{ - inp->str = 0; - inp->length = 0; - inp->next = free_inputs; - free_inputs = inp; -} - -static int putback_char = -1; - -/* Some of these external functions are declared inline in case this file - is included in lex.c. */ - -inline -void -feed_input (str, len) - char *str; - int len; -{ - struct input_source *inp = allocate_input (); - - /* This shouldn't be necessary. */ - while (len && !str[len-1]) - len--; - - inp->str = str; - inp->length = len; - inp->offset = 0; - inp->next = input; - inp->filename = input_filename; - inp->lineno = lineno; - inp->input = save_pending_input (); - inp->putback_char = putback_char; - putback_char = -1; - input = inp; -} - -struct pending_input *to_be_restored; /* XXX */ -extern int end_of_file; - -static inline void -end_input () -{ - struct input_source *inp = input; - - end_of_file = 0; - input = inp->next; - input_filename = inp->filename; - lineno = inp->lineno; - /* Get interface/implementation back in sync. */ - extract_interface_info (); - putback_char = inp->putback_char; - restore_pending_input (inp->input); - free_input (inp); -} - -static inline int -sub_getch () -{ - if (putback_char != -1) - { - int ch = putback_char; - putback_char = -1; - return ch; - } - if (input) - { - if (input->offset >= input->length) - { - my_friendly_assert (putback_char == -1, 223); - ++(input->offset); - if (input->offset - input->length < 64) - return EOF; - - /* We must be stuck in an error-handling rule; give up. */ - end_input (); - return getch (); - } - return (unsigned char)input->str[input->offset++]; - } - return GETC (); -} - -inline -void -put_back (ch) - int ch; -{ - if (ch != EOF) - { - my_friendly_assert (putback_char == -1, 224); - putback_char = ch; - } -} - -extern int linemode; - -int -getch () -{ - int ch = sub_getch (); - if (linemode && ch == '\n') - { - put_back (ch); - ch = EOF; - } - return ch; -} - -inline -int -input_redirected () -{ - return input != 0; -} diff --git a/contrib/gcc/cp/new.cc b/contrib/gcc/cp/new.cc deleted file mode 100644 index 3197012150d8..000000000000 --- a/contrib/gcc/cp/new.cc +++ /dev/null @@ -1,42 +0,0 @@ -// Implementation file for the -*- C++ -*- dynamic memory management header. -// Copyright (C) 1996, 1997, 1998 Free Software Foundation - -// 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. - -// As a special exception, if you link this library with other files, -// some of which are compiled with GCC, to produce an executable, -// this library does not by itself cause the resulting executable -// to be covered by the GNU General Public License. -// This exception does not however invalidate any other reasons why -// the executable file might be covered by the GNU General Public License. - -#pragma implementation "new" -#include "new" - -const std::nothrow_t std::nothrow = { }; - -using std::new_handler; -new_handler __new_handler; - -new_handler -set_new_handler (new_handler handler) -{ - new_handler prev_handler = __new_handler; - __new_handler = handler; - return prev_handler; -} diff --git a/contrib/gcc/cp/new1.cc b/contrib/gcc/cp/new1.cc deleted file mode 100644 index 73fbcd2b1fd4..000000000000 --- a/contrib/gcc/cp/new1.cc +++ /dev/null @@ -1,89 +0,0 @@ -// Support routines for the -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998 Free Software Foundation - -// 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. - -// As a special exception, if you link this library with other files, -// some of which are compiled with GCC, to produce an executable, -// this library does not by itself cause the resulting executable -// to be covered by the GNU General Public License. -// This exception does not however invalidate any other reasons why -// the executable file might be covered by the GNU General Public License. - -#include "new" -using std::new_handler; -using std::bad_alloc; - -extern "C" void *malloc (size_t); -extern new_handler __new_handler; - -#define WEAK(x) \ - x __attribute__ ((weak)); \ - x - -#ifdef L_op_newnt -WEAK (void * operator new (size_t sz, const std::nothrow_t&) throw()) -{ - void *p; - - /* malloc (0) is unpredictable; avoid it. */ - if (sz == 0) - sz = 1; - p = (void *) malloc (sz); - while (p == 0) - { - new_handler handler = __new_handler; - if (! handler) - return 0; - try - { - handler (); - } - catch (bad_alloc &) - { - return 0; - } - - p = (void *) malloc (sz); - } - - return p; -} -#endif - -#ifdef L_op_new -WEAK (void * operator new (size_t sz) throw (std::bad_alloc)) -{ - void *p; - - /* malloc (0) is unpredictable; avoid it. */ - if (sz == 0) - sz = 1; - p = (void *) malloc (sz); - while (p == 0) - { - new_handler handler = __new_handler; - if (! handler) - throw bad_alloc (); - handler (); - p = (void *) malloc (sz); - } - - return p; -} -#endif diff --git a/contrib/gcc/cp/new2.cc b/contrib/gcc/cp/new2.cc deleted file mode 100644 index 2833ea23414d..000000000000 --- a/contrib/gcc/cp/new2.cc +++ /dev/null @@ -1,80 +0,0 @@ -// Boilerplate support routines for -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998 Free Software Foundation - -// 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. - -// As a special exception, if you link this library with other files, -// some of which are compiled with GCC, to produce an executable, -// this library does not by itself cause the resulting executable -// to be covered by the GNU General Public License. -// This exception does not however invalidate any other reasons why -// the executable file might be covered by the GNU General Public License. - -#include "new" - -extern "C" void free (void *); - -#define WEAK(x) \ - x __attribute__ ((weak)); \ - x - -#ifdef L_op_vnew -WEAK(void * operator new[] (size_t sz) throw (std::bad_alloc)) -{ - return ::operator new(sz); -} -#endif - -#ifdef L_op_vnewnt -WEAK(void *operator new[] (size_t sz, const std::nothrow_t& nothrow) throw()) -{ - return ::operator new(sz, nothrow); -} -#endif - -#ifdef L_op_delete -WEAK (void operator delete (void *ptr) throw ()) -{ - if (ptr) - free (ptr); -} -#endif - -#ifdef L_op_vdel -WEAK (void operator delete[] (void *ptr) throw ()) -{ - if (ptr) - free (ptr); -} -#endif - -#ifdef L_op_delnt -WEAK (void operator delete (void *ptr, const std::nothrow_t&) throw ()) -{ - if (ptr) - free (ptr); -} -#endif - -#ifdef L_op_vdelnt -WEAK (void operator delete[] (void *ptr, const std::nothrow_t&) throw ()) -{ - if (ptr) - free (ptr); -} -#endif diff --git a/contrib/gcc/cp/sig.c b/contrib/gcc/cp/sig.c deleted file mode 100644 index f170df52a606..000000000000 --- a/contrib/gcc/cp/sig.c +++ /dev/null @@ -1,1067 +0,0 @@ -/* Functions dealing with signatures and signature pointers/references. - Copyright (C) 1992, 93-97, 1998 Free Software Foundation, Inc. - Contributed by Gerald Baumgartner (gb@cs.purdue.edu) - -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 "obstack.h" -#include "tree.h" -#include "cp-tree.h" -#include "flags.h" -#include "assert.h" -#include "toplev.h" - -extern struct obstack *current_obstack; -extern struct obstack permanent_obstack; -extern struct obstack *saveable_obstack; - -static tree save_this PROTO((tree)); -static tree build_sptr_ref PROTO((tree)); -static tree build_member_function_pointer PROTO((tree)); -static void undo_casts PROTO((tree)); -static tree build_signature_pointer_or_reference_name - PROTO((tree, int, int)); -static void build_signature_pointer_or_reference_decl - PROTO((tree, tree)); -static tree build_signature_pointer_or_reference_type - PROTO((tree, int, int)); -static tree get_sigtable_name PROTO((tree, tree)); -static tree build_signature_table_constructor PROTO((tree, tree)); -static int match_method_types PROTO((tree, tree)); -static tree build_sigtable PROTO((tree, tree, tree)); - -/* Used to help generate globally unique names for signature tables. */ - -static int global_sigtable_name_counter; - -/* Build an identifier for a signature pointer or reference, so we - can use it's name in function name mangling. */ - -static tree -build_signature_pointer_or_reference_name (to_type, type_quals, refp) - tree to_type; - int type_quals; - int refp; -{ - const char * sig_name = TYPE_NAME_STRING (to_type); - int name_len = TYPE_NAME_LENGTH (to_type) + 3 /* Enough room for - C,V,R. */; - char * name; - - const char *const_rep = (type_quals & TYPE_QUAL_CONST) ? "C" : ""; - const char *restrict_rep = (type_quals & TYPE_QUAL_RESTRICT) ? "R" : ""; - const char *volatile_rep = (type_quals & TYPE_QUAL_VOLATILE) ? "C" : ""; - - if (refp) - { - name = (char *) alloca (name_len + sizeof (SIGNATURE_REFERENCE_NAME) +2); - sprintf (name, SIGNATURE_REFERENCE_NAME_FORMAT, - const_rep, volatile_rep, restrict_rep, sig_name); - } - else - { - name = (char *) alloca (name_len + sizeof (SIGNATURE_POINTER_NAME) + 2); - sprintf (name, SIGNATURE_POINTER_NAME_FORMAT, - const_rep, volatile_rep, restrict_rep, sig_name); - } - return get_identifier (name); -} - -/* Build a DECL node for a signature pointer or reference, so we can - tell the debugger the structure of signature pointers/references. - This function is called at most eight times for a given signature, - once for each [const] [volatile] signature pointer/reference. */ - -static void -build_signature_pointer_or_reference_decl (type, name) - tree type, name; -{ - tree decl; - - /* We don't enter this declaration in any sort of symbol table. */ - decl = build_decl (TYPE_DECL, name, type); - TYPE_NAME (type) = decl; - TREE_CHAIN (type) = decl; -} - -/* Construct, lay out and return the type of pointers or references to - signature TO_TYPE. If such a type has already been constructed, - reuse it. If TYPE_QUALS are specified, qualify the `optr'. If we - are constructing a const/volatile type variant and the main type - variant doesn't exist yet, it is built as well. If REFP is 1, we - construct a signature reference, otherwise a signature pointer is - constructed. - - This function is a subroutine of `build_signature_pointer_type' and - `build_signature_reference_type'. */ - -static tree -build_signature_pointer_or_reference_type (to_type, type_quals, refp) - tree to_type; - int type_quals; - int refp; -{ - register tree t, m; - register struct obstack *ambient_obstack = current_obstack; - register struct obstack *ambient_saveable_obstack = saveable_obstack; - - m = refp ? SIGNATURE_REFERENCE_TO (to_type) : SIGNATURE_POINTER_TO (to_type); - - /* If we don't have the main variant yet, construct it. */ - if (m == NULL_TREE && type_quals != TYPE_UNQUALIFIED) - m = build_signature_pointer_or_reference_type (to_type, - TYPE_UNQUALIFIED, refp); - - /* Treat any nonzero argument as 1. */ - refp = !!refp; - - /* If not generating auxiliary info, search the chain of variants to see - if there is already one there just like the one we need to have. If so, - use that existing one. - - We don't do this in the case where we are generating aux info because - in that case we want each typedef names to get it's own distinct type - node, even if the type of this new typedef is the same as some other - (existing) type. */ - - if (m && !flag_gen_aux_info) - for (t = m; t; t = TYPE_NEXT_VARIANT (t)) - if (type_quals == CP_TYPE_QUALS (TREE_TYPE (TREE_TYPE - (TYPE_FIELDS (t))))) - return t; - - /* We need a new one. If TO_TYPE is permanent, make this permanent too. */ - if (TREE_PERMANENT (to_type)) - { - current_obstack = &permanent_obstack; - saveable_obstack = &permanent_obstack; - } - - /* A signature pointer or reference to a signature `s' looks like this: - - struct { - void * optr; - const s * sptr; - }; - - A `const' signature pointer/reference is a - - struct { - const void * optr; - const s * sptr; - }; - - Similarly, for `volatile' and `const volatile'. */ - - t = make_lang_type (RECORD_TYPE); - { - tree obj_type = build_qualified_type (void_type_node, type_quals); - tree optr_type = build_pointer_type (obj_type); - tree optr, sptr; - - optr = build_lang_field_decl (FIELD_DECL, - get_identifier (SIGNATURE_OPTR_NAME), - optr_type); - DECL_FIELD_CONTEXT (optr) = t; - DECL_CLASS_CONTEXT (optr) = t; - - if (m) - /* We can share the `sptr' field among type variants. */ - sptr = TREE_CHAIN (TYPE_FIELDS (m)); - else - { - tree sig_tbl_type = - cp_build_qualified_type (to_type, TYPE_QUAL_CONST); - - sptr = build_lang_field_decl (FIELD_DECL, - get_identifier (SIGNATURE_SPTR_NAME), - build_pointer_type (sig_tbl_type)); - DECL_FIELD_CONTEXT (sptr) = t; - DECL_CLASS_CONTEXT (sptr) = t; - TREE_CHAIN (sptr) = NULL_TREE; - } - - TREE_CHAIN (optr) = sptr; - TYPE_FIELDS (t) = optr; - /* Allow signature pointers/references to be grabbed 2 words at a time. - For this to work on a Sparc, we need 8-byte alignment. */ - TYPE_ALIGN (t) = MAX (TYPE_ALIGN (double_type_node), - TYPE_ALIGN (optr_type)); - - /* A signature pointer/reference type isn't a `real' class type. */ - SET_IS_AGGR_TYPE (t, 0); - } - - { - tree name = build_signature_pointer_or_reference_name (to_type, - type_quals, - refp); - - /* Build a DECL node for this type, so the debugger has access to it. */ - build_signature_pointer_or_reference_decl (t, name); - } - - CLASSTYPE_GOT_SEMICOLON (t) = 1; - IS_SIGNATURE_POINTER (t) = ! refp; - IS_SIGNATURE_REFERENCE (t) = refp; - SIGNATURE_TYPE (t) = to_type; - - if (m) - { - /* Add this type to the chain of variants of TYPE. - Every type has to be its own TYPE_MAIN_VARIANT. */ - TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (m); - TYPE_NEXT_VARIANT (m) = t; - } - else if (refp) - /* Record this type as the reference to TO_TYPE. */ - SIGNATURE_REFERENCE_TO (to_type) = t; - else - /* Record this type as the pointer to TO_TYPE. */ - SIGNATURE_POINTER_TO (to_type) = t; - - /* Lay out the type. This function has many callers that are concerned - with expression-construction, and this simplifies them all. - Also, it guarantees the TYPE_SIZE is permanent if the type is. */ - layout_type (t); - - current_obstack = ambient_obstack; - saveable_obstack = ambient_saveable_obstack; - - /* Output debug information for this type. */ - rest_of_type_compilation (t, 1); - - return t; -} - -/* Construct, lay out and return the type of pointers to signature TO_TYPE. */ - -tree -build_signature_pointer_type (to_type) - tree to_type; -{ - return - build_signature_pointer_or_reference_type (TYPE_MAIN_VARIANT (to_type), - CP_TYPE_QUALS (to_type), 0); -} - -/* Construct, lay out and return the type of pointers to signature TO_TYPE. */ - -tree -build_signature_reference_type (to_type) - tree to_type; -{ - return - build_signature_pointer_or_reference_type (TYPE_MAIN_VARIANT (to_type), - CP_TYPE_QUALS (to_type), 1); -} - -/* Return the name of the signature table (as an IDENTIFIER_NODE) - for the given signature type SIG_TYPE and rhs type RHS_TYPE. */ - -static tree -get_sigtable_name (sig_type, rhs_type) - tree sig_type, rhs_type; -{ - tree sig_type_id = build_typename_overload (sig_type); - tree rhs_type_id = build_typename_overload (rhs_type); - char *buf = (char *) alloca (sizeof (SIGTABLE_NAME_FORMAT_LONG) - + IDENTIFIER_LENGTH (sig_type_id) - + IDENTIFIER_LENGTH (rhs_type_id) + 20); - const char *sig_ptr = IDENTIFIER_POINTER (sig_type_id); - const char *rhs_ptr = IDENTIFIER_POINTER (rhs_type_id); - int i, j; - - for (i = 0; sig_ptr[i] == OPERATOR_TYPENAME_FORMAT[i]; i++) - /* do nothing */; - while (sig_ptr[i] >= '0' && sig_ptr[i] <= '9') - i += 1; - - for (j = 0; rhs_ptr[j] == OPERATOR_TYPENAME_FORMAT[j]; j++) - /* do nothing */; - while (rhs_ptr[j] >= '0' && rhs_ptr[j] <= '9') - j += 1; - - if (IS_SIGNATURE (rhs_type)) - sprintf (buf, SIGTABLE_NAME_FORMAT_LONG, sig_ptr+i, rhs_ptr+j, - global_sigtable_name_counter++); - else - sprintf (buf, SIGTABLE_NAME_FORMAT, sig_ptr+i, rhs_ptr+j); - return get_identifier (buf); -} - -/* Build a field decl that points to a signature member function. */ - -static tree -build_member_function_pointer (member) - tree member; -{ - const char *namstr = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (member)); - int namlen = IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (member)); - char *name; - tree entry; - - name = (char *) alloca (namlen + sizeof (SIGNATURE_FIELD_NAME) + 2); - sprintf (name, SIGNATURE_FIELD_NAME_FORMAT, namstr); - - /* @@ Do we really want to xref signature table fields? */ - GNU_xref_ref (current_function_decl, name); - - entry = build_lang_field_decl (FIELD_DECL, get_identifier (name), - sigtable_entry_type); - TREE_CONSTANT (entry) = 1; - TREE_READONLY (entry) = 1; - - /* @@ Do we really want to xref signature table fields? */ - GNU_xref_decl (current_function_decl, entry); - - return entry; -} - -/* For each FUNCTION_DECL in a signature we construct a member function - pointer of the appropriate type. We also need two flags to test - whether the member function pointer points to a virtual function or - to a default implementation. Those flags will be the two lower order - bits of the member function pointer (or the two higher order bits, - based on the configuration). - - The new FIELD_DECLs are appended at the end of the last (and only) - sublist of `list_of_fieldlists.' - - T is the signature type. - - As a side effect, each member function in the signature gets the - `decl.ignored' bit turned on, so we don't output debug info for it. */ - -void -append_signature_fields (t) - tree t; -{ - tree x; - tree mfptr; - tree last_mfptr = NULL_TREE; - tree mfptr_list = NULL_TREE; - - for (x = TYPE_METHODS (t); x; x = TREE_CHAIN (x)) - { - if (TREE_CODE (x) == FUNCTION_DECL) - { - mfptr = build_member_function_pointer (x); - DECL_MEMFUNC_POINTER_TO (x) = mfptr; - DECL_MEMFUNC_POINTING_TO (mfptr) = x; - DECL_IGNORED_P (x) = 1; - DECL_IN_AGGR_P (mfptr) = 1; - if (! mfptr_list) - mfptr_list = last_mfptr = mfptr; - else - { - TREE_CHAIN (last_mfptr) = mfptr; - last_mfptr = mfptr; - } - } - } - - /* The member function pointers must come after the TYPE_DECLs, in - this case, because build_signature_table_constructor depends on - finding opaque TYPE_DECLS before the functions that make use of - them. */ - if (last_mfptr) - TYPE_FIELDS (t) = chainon (TYPE_FIELDS (t), mfptr_list); -} - -/* Compare the types of a signature member function and a class member - function. Returns 1 if the types are in the C++ `<=' relationship. - - If we have a signature pointer/reference as argument or return type - we don't want to do a recursive conformance check. The conformance - check only succeeds if both LHS and RHS refer to the same signature - pointer. Otherwise we need to keep information about parameter types - around at run time to initialize the signature table correctly. */ - -static int -match_method_types (sig_mtype, class_mtype) - tree sig_mtype, class_mtype; -{ - tree sig_return_type = TREE_TYPE (sig_mtype); - tree sig_arg_types = TYPE_ARG_TYPES (sig_mtype); - tree class_return_type = TREE_TYPE (class_mtype); - tree class_arg_types = TYPE_ARG_TYPES (class_mtype); - - /* The return types have to be the same. */ - if (!same_type_p (sig_return_type, class_return_type)) - return 0; - - /* Compare the first argument `this.' */ - { - /* Get the type of what the `optr' is pointing to. */ - tree sig_this - = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_VALUE (sig_arg_types)))); - tree class_this = TREE_VALUE (class_arg_types); - - if (TREE_CODE (class_this) == RECORD_TYPE) /* Is `this' a sig ptr? */ - class_this = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (class_this))); - else - class_this = TREE_TYPE (class_this); - - /* If a signature method's `this' is const or volatile, so has to be - the corresponding class method's `this.' */ - if (!at_least_as_qualified_p (class_this, sig_this)) - return 0; - } - - sig_arg_types = TREE_CHAIN (sig_arg_types); - class_arg_types = TREE_CHAIN (class_arg_types); - - /* The number of arguments and the argument types have to be the same. */ - return compparms (sig_arg_types, class_arg_types); -} - -/* Undo casts of opaque type variables to the RHS types. */ - -static void -undo_casts (sig_ty) - tree sig_ty; -{ - tree field = TYPE_FIELDS (sig_ty); - - /* Since all the FIELD_DECLs for the signature table entries are at the end - of the chain (see `append_signature_fields'), we can do it this way. */ - for (; field && TREE_CODE (field) != FIELD_DECL; field = TREE_CHAIN (field)) - if (TYPE_MAIN_VARIANT (TREE_TYPE (field)) == opaque_type_node) - TREE_TYPE (TREE_TYPE (field)) = TREE_TYPE (ptr_type_node); -} - -/* Do the type checking necessary to see whether the `rhs' conforms to - the lhs's `sig_ty'. Depending on the type of `rhs' return a NULL_TREE, - an integer_zero_node, a constructor, or an expression offsetting the - `rhs' signature table. */ - -static tree -build_signature_table_constructor (sig_ty, rhs) - tree sig_ty, rhs; -{ - tree rhstype = TREE_TYPE (rhs); - tree sig_field = TYPE_FIELDS (sig_ty); - tree result = NULL_TREE; - tree first_rhs_field = NULL_TREE; - tree last_rhs_field = NULL_TREE; - int sig_ptr_p = IS_SIGNATURE (rhstype); - int offset_p = sig_ptr_p; - - rhstype = sig_ptr_p ? rhstype : TREE_TYPE (rhstype); - - if (CLASSTYPE_TAGS (sig_ty)) - { - sorry ("conformance check with signature containing class declarations"); - return error_mark_node; - } - - for (; sig_field; sig_field = TREE_CHAIN (sig_field)) - { - tree basetype_path, baselink, basetypes; - tree sig_method, sig_mname, sig_mtype; - tree rhs_method, tbl_entry; - - if (TREE_CODE (sig_field) == TYPE_DECL) - { - tree sig_field_type = TREE_TYPE (sig_field); - - if (TYPE_MAIN_VARIANT (sig_field_type) == opaque_type_node) - { - /* We've got an opaque type here. */ - tree oty_name = DECL_NAME (sig_field); - tree oty_type = lookup_field (rhstype, oty_name, 1, 1); - - if (oty_type == NULL_TREE || oty_type == error_mark_node) - { - cp_error ("class `%T' does not contain type `%T'", - rhstype, oty_type); - undo_casts (sig_ty); - return error_mark_node; - } - oty_type = TREE_TYPE (oty_type); - - /* Cast `sig_field' to be of type `oty_type'. This will be - undone in `undo_casts' by walking over all the TYPE_DECLs. */ - TREE_TYPE (sig_field_type) = TREE_TYPE (oty_type); - } - /* If we don't have an opaque type, we can ignore the `typedef'. */ - continue; - } - - /* Find the signature method corresponding to `sig_field'. */ - sig_method = DECL_MEMFUNC_POINTING_TO (sig_field); - sig_mname = DECL_NAME (sig_method); - sig_mtype = TREE_TYPE (sig_method); - - basetype_path = TYPE_BINFO (rhstype); - baselink = lookup_fnfields (basetype_path, sig_mname, 0); - if (baselink == NULL_TREE || baselink == error_mark_node) - { - if (! IS_DEFAULT_IMPLEMENTATION (sig_method)) - { - cp_error ("class `%T' does not contain method `%D'", - rhstype, sig_mname); - undo_casts (sig_ty); - return error_mark_node; - } - else - { - /* We use the signature's default implementation. */ - rhs_method = sig_method; - } - } - else - { - /* Find the class method of the correct type. */ - tree rhs_methods; - basetypes = TREE_PURPOSE (baselink); - if (TREE_CODE (basetypes) == TREE_LIST) - basetypes = TREE_VALUE (basetypes); - - rhs_methods = TREE_VALUE (baselink); - for (; rhs_methods; rhs_methods = OVL_NEXT (rhs_methods)) - if ((rhs_method = OVL_CURRENT (rhs_methods)) - && sig_mname == DECL_NAME (rhs_method) - && ! DECL_STATIC_FUNCTION_P (rhs_method) - && match_method_types (sig_mtype, TREE_TYPE (rhs_method))) - break; - - if (rhs_methods == NULL_TREE - || !accessible_p (basetypes, rhs_method)) - { - cp_error ("`%T' does not contain a method conforming to `%#D'", - rhstype, sig_method); - undo_casts (sig_ty); - return error_mark_node; - } - } - - if (sig_ptr_p && rhs_method != sig_method) - { - tree rhs_field = DECL_MEMFUNC_POINTER_TO (rhs_method); - - if (first_rhs_field == NULL_TREE) - { - first_rhs_field = rhs_field; - last_rhs_field = rhs_field; - } - else if (TREE_CHAIN (last_rhs_field) == rhs_field) - last_rhs_field = rhs_field; - else - offset_p = 0; - - tbl_entry = build_component_ref (rhs, DECL_NAME (rhs_field), - NULL_TREE, 1); - } - else - { - tree tag, vb_off, delta, idx, pfn = NULL_TREE, vt_off = NULL_TREE; - tree tag_decl, vb_off_decl, delta_decl, index_decl; - tree pfn_decl, vt_off_decl; - - if (rhs_method == sig_method) - { - /* default implementation */ - tag = build_unary_op (NEGATE_EXPR, integer_one_node, 0); - vb_off = build_unary_op (NEGATE_EXPR, integer_one_node, 0); - delta = integer_zero_node; - idx = integer_zero_node; - pfn = build_addr_func (rhs_method); - TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (rhs_method)) = 1; - TREE_TYPE (pfn) = ptr_type_node; - TREE_ADDRESSABLE (rhs_method) = 1; - offset_p = 0; /* we can't offset the rhs sig table */ - } - else if (DECL_VINDEX (rhs_method)) - { - /* virtual member function */ - tag = integer_one_node; - vb_off = build_unary_op (NEGATE_EXPR, integer_one_node, 0); - if (flag_vtable_thunks) - delta = BINFO_OFFSET - (get_binfo (DECL_CONTEXT (rhs_method), rhstype, 1)); - else - delta = BINFO_OFFSET - (get_binfo (DECL_CLASS_CONTEXT (rhs_method), rhstype, 1)); - idx = DECL_VINDEX (rhs_method); - vt_off = get_vfield_offset (get_binfo (DECL_CONTEXT (rhs_method), - rhstype, 0)); - } - else - { - /* non-virtual member function */ - tag = integer_zero_node; - vb_off = build_unary_op (NEGATE_EXPR, integer_one_node, 0); - delta = BINFO_OFFSET (get_binfo (DECL_CLASS_CONTEXT (rhs_method), - rhstype, 1)); - idx = integer_zero_node; - pfn = build_addr_func (rhs_method); - TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (rhs_method)) = 1; - TREE_TYPE (pfn) = ptr_type_node; - TREE_ADDRESSABLE (rhs_method) = 1; - } - - /* Since digest_init doesn't handle initializing selected fields - of a struct (i.e., anonymous union), we build the constructor - by hand, without calling digest_init. */ - tag_decl = TYPE_FIELDS (sigtable_entry_type); - vb_off_decl = TREE_CHAIN (tag_decl); - delta_decl = TREE_CHAIN (vb_off_decl); - index_decl = TREE_CHAIN (delta_decl); - pfn_decl = TREE_CHAIN (index_decl); - vt_off_decl = TREE_CHAIN (pfn_decl); - - tag = cp_convert (TREE_TYPE (tag_decl), tag); - vb_off = cp_convert (TREE_TYPE (vb_off_decl), vb_off); - delta = cp_convert (TREE_TYPE (delta_decl), delta); - idx = cp_convert (TREE_TYPE (index_decl), idx); - - if (DECL_VINDEX (rhs_method)) - { - vt_off = cp_convert (TREE_TYPE (vt_off_decl), vt_off); - - tbl_entry = build_tree_list (vt_off_decl, vt_off); - } - else - { - pfn = cp_convert (TREE_TYPE (pfn_decl), pfn); - - tbl_entry = build_tree_list (pfn_decl, pfn); - } - tbl_entry = tree_cons (delta_decl, delta, - tree_cons (index_decl, idx, tbl_entry)); - tbl_entry = tree_cons (tag_decl, tag, - tree_cons (vb_off_decl, vb_off, tbl_entry)); - tbl_entry = build (CONSTRUCTOR, sigtable_entry_type, - NULL_TREE, tbl_entry); - - TREE_CONSTANT (tbl_entry) = 1; - } - - /* Chain those function address expressions together. */ - if (result) - result = tree_cons (NULL_TREE, tbl_entry, result); - else - result = build_tree_list (NULL_TREE, tbl_entry); - } - - if (result == NULL_TREE) - { - /* The signature was empty, we don't need a signature table. */ - undo_casts (sig_ty); - return NULL_TREE; - } - - if (offset_p) - { - if (first_rhs_field == TYPE_FIELDS (rhstype)) - { - /* The sptr field on the lhs can be copied from the rhs. */ - undo_casts (sig_ty); - return integer_zero_node; - } - else - { - /* The sptr field on the lhs will point into the rhs sigtable. */ - undo_casts (sig_ty); - return build_component_ref (rhs, DECL_NAME (first_rhs_field), - NULL_TREE, 0); - } - } - - /* We need to construct a new signature table. */ - result = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (result)); - TREE_HAS_CONSTRUCTOR (result) = 1; - TREE_CONSTANT (result) = !sig_ptr_p; - - undo_casts (sig_ty); - return result; -} - -/* Build a signature table declaration and initialize it or return an - existing one if we built one already. If we don't get a constructor - as initialization expression, we don't need a new signature table - variable and just hand back the init expression. - - The declaration processing is done by hand instead of using `cp_finish_decl' - so that we can make signature pointers global variables instead of - static ones. */ - -static tree -build_sigtable (sig_type, rhs_type, init_from) - tree sig_type, rhs_type, init_from; -{ - tree name = NULL_TREE; - tree decl = NULL_TREE; - tree init_expr; - - push_obstacks_nochange (); - end_temporary_allocation (); - - if (! IS_SIGNATURE (rhs_type)) - { - name = get_sigtable_name (sig_type, rhs_type); - decl = IDENTIFIER_GLOBAL_VALUE (name); - } - if (decl == NULL_TREE) - { - tree init = NULL_TREE; - - /* We allow only one signature table to be generated for signatures - with opaque types. Otherwise we create a loophole in the type - system since we could cast data from one classes implementation - of the opaque type to that of another class. */ - if (SIGNATURE_HAS_OPAQUE_TYPEDECLS (sig_type) - && SIGTABLE_HAS_BEEN_GENERATED (sig_type)) - { - error ("signature with opaque type implemented by multiple classes"); - return error_mark_node; - } - SIGTABLE_HAS_BEEN_GENERATED (sig_type) = 1; - - init_expr = build_signature_table_constructor (sig_type, init_from); - if (init_expr == NULL_TREE || TREE_CODE (init_expr) != CONSTRUCTOR) - return init_expr; - - if (name == NULL_TREE) - name = get_sigtable_name (sig_type, rhs_type); - { - tree context = current_function_decl; - - /* Make the signature table global, not just static in whichever - function a signature pointer/ref is used for the first time. */ - current_function_decl = NULL_TREE; - decl = pushdecl_top_level (build_decl (VAR_DECL, name, sig_type)); - current_function_decl = context; - } - SET_IDENTIFIER_GLOBAL_VALUE (name, decl); - store_init_value (decl, init_expr); - if (IS_SIGNATURE (rhs_type)) - { - init = DECL_INITIAL (decl); - DECL_INITIAL (decl) = error_mark_node; - } - - DECL_ALIGN (decl) = MAX (TYPE_ALIGN (double_type_node), - DECL_ALIGN (decl)); -#if 0 - /* GDB-4.7 doesn't find the initialization value of a signature table - when it is constant. */ - TREE_READONLY (decl) = 1; -#endif - TREE_STATIC (decl) = 1; - TREE_USED (decl) = 1; - - make_decl_rtl (decl, NULL, 1); - if (IS_SIGNATURE (rhs_type)) - expand_static_init (decl, init); - } - - pop_obstacks (); - - return decl; -} - -/* Create a constructor or modify expression if the LHS of an assignment - is a signature pointer or a signature reference. If LHS is a record - type node, we build a constructor, otherwise a compound expression. */ - -tree -build_signature_pointer_constructor (lhs, rhs) - tree lhs, rhs; -{ - register struct obstack *ambient_obstack = current_obstack; - register struct obstack *ambient_saveable_obstack = saveable_obstack; - int initp = (TREE_CODE (lhs) == RECORD_TYPE); - tree lhstype = initp ? lhs : TREE_TYPE (lhs); - tree rhstype = TREE_TYPE (rhs); - tree sig_ty = SIGNATURE_TYPE (lhstype); - tree sig_tbl, sptr_expr, optr_expr; - tree result; - - if (! ((TREE_CODE (rhstype) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (rhstype)) == RECORD_TYPE) - || (TYPE_LANG_SPECIFIC (rhstype) - && (IS_SIGNATURE_POINTER (rhstype) - || IS_SIGNATURE_REFERENCE (rhstype))))) - { - error ("invalid assignment to signature pointer or reference"); - return error_mark_node; - } - - if (TYPE_SIZE (sig_ty) == NULL_TREE) - { - cp_error ("undefined signature `%T' used in signature %s declaration", - sig_ty, - IS_SIGNATURE_POINTER (lhstype) ? "pointer" : "reference"); - return error_mark_node; - } - - /* If SIG_TY is permanent, make the signature table constructor and - the signature pointer/reference constructor permanent too. */ - if (TREE_PERMANENT (sig_ty)) - { - current_obstack = &permanent_obstack; - saveable_obstack = &permanent_obstack; - } - - if (TYPE_LANG_SPECIFIC (rhstype) - && (IS_SIGNATURE_POINTER (rhstype) || IS_SIGNATURE_REFERENCE (rhstype))) - { - if (SIGNATURE_TYPE (rhstype) == sig_ty) - { - /* LHS and RHS are signature pointers/refs of the same signature. */ - optr_expr = build_optr_ref (rhs); - sptr_expr = build_sptr_ref (rhs); - } - else - { - /* We need to create a new signature table and copy - elements from the rhs signature table. */ - tree rhs_sptr_ref = build_sptr_ref (rhs); - tree rhs_tbl = build1 (INDIRECT_REF, SIGNATURE_TYPE (rhstype), - rhs_sptr_ref); - - sig_tbl = build_sigtable (sig_ty, SIGNATURE_TYPE (rhstype), rhs_tbl); - if (sig_tbl == error_mark_node) - return error_mark_node; - - optr_expr = build_optr_ref (rhs); - if (sig_tbl == NULL_TREE) - /* The signature was empty. The signature pointer is - pretty useless, but the user has been warned. */ - sptr_expr = copy_node (null_pointer_node); - else if (sig_tbl == integer_zero_node) - sptr_expr = rhs_sptr_ref; - else - sptr_expr = build_unary_op (ADDR_EXPR, sig_tbl, 0); - TREE_TYPE (sptr_expr) = build_pointer_type (sig_ty); - } - } - else - { - sig_tbl = build_sigtable (sig_ty, TREE_TYPE (rhstype), rhs); - if (sig_tbl == error_mark_node) - return error_mark_node; - - optr_expr = rhs; - if (sig_tbl == NULL_TREE) - /* The signature was empty. The signature pointer is - pretty useless, but the user has been warned. */ - { - sptr_expr = copy_node (null_pointer_node); - TREE_TYPE (sptr_expr) = build_pointer_type (sig_ty); - } - else - sptr_expr = build_unary_op (ADDR_EXPR, sig_tbl, 0); - } - - if (initp) - { - result = tree_cons (NULL_TREE, optr_expr, - build_tree_list (NULL_TREE, sptr_expr)); - result = build_nt (CONSTRUCTOR, NULL_TREE, result); - result = digest_init (lhstype, result, 0); - } - else - { - if (TREE_READONLY (lhs) || CP_TYPE_CONST_P (lhstype)) - readonly_error (lhs, "assignment", 0); - - optr_expr = build_modify_expr (build_optr_ref (lhs), NOP_EXPR, - optr_expr); - sptr_expr = build_modify_expr (build_sptr_ref (lhs), NOP_EXPR, - sptr_expr); - - result = tree_cons (NULL_TREE, optr_expr, - tree_cons (NULL_TREE, sptr_expr, - build_tree_list (NULL_TREE, lhs))); - result = build_compound_expr (result); - } - - current_obstack = ambient_obstack; - saveable_obstack = ambient_saveable_obstack; - return result; -} - -/* Build a temporary variable declaration for the instance of a signature - member function call if it isn't a declaration node already. Simply - using a SAVE_EXPR doesn't work since we need `this' in both branches - of a conditional expression. */ - -static tree -save_this (instance) - tree instance; -{ - tree decl; - - if (TREE_CODE_CLASS (TREE_CODE (instance)) == 'd') - decl = instance; - else - { - decl = build_decl (VAR_DECL, NULL_TREE, TREE_TYPE (instance)); - DECL_REGISTER (decl) = 1; - layout_decl (decl, 0); - expand_decl (decl); - } - - return decl; -} - -/* Build a signature member function call. Looks up the signature table - entry corresponding to FUNCTION. Depending on the value of the CODE - field, either call the function in PFN directly, or use OFFSET to - index the object's virtual function table. */ - -tree -build_signature_method_call (function, parms) - tree function, parms; -{ - tree instance = TREE_VALUE (parms); - tree saved_instance = save_this (instance); /* Create temp for `this'. */ - tree object_ptr = build_optr_ref (saved_instance); - tree new_object_ptr, new_parms; - tree signature_tbl_ptr = build_sptr_ref (saved_instance); - tree sig_field_name = DECL_NAME (DECL_MEMFUNC_POINTER_TO (function)); - tree basetype = DECL_CONTEXT (function); - tree basetype_path = TYPE_BINFO (basetype); - tree tbl_entry = build_component_ref (build1 (INDIRECT_REF, basetype, - signature_tbl_ptr), - sig_field_name, basetype_path, 1); - tree tag, delta, pfn, vt_off, idx, vfn; - tree deflt_call = NULL_TREE, direct_call, virtual_call, result; - - tbl_entry = save_expr (tbl_entry); - tag = build_component_ref (tbl_entry, tag_identifier, NULL_TREE, 1); - delta = build_component_ref (tbl_entry, delta_identifier, NULL_TREE, 1); - pfn = build_component_ref (tbl_entry, pfn_identifier, NULL_TREE, 1); - vt_off = build_component_ref (tbl_entry, vt_off_identifier, NULL_TREE, 1); - idx = build_component_ref (tbl_entry, index_identifier, NULL_TREE, 1); - TREE_TYPE (pfn) = build_pointer_type (TREE_TYPE (function)); - - if (IS_DEFAULT_IMPLEMENTATION (function)) - { - pfn = save_expr (pfn); - deflt_call = build_function_call (pfn, parms); - } - - new_object_ptr = build (PLUS_EXPR, build_pointer_type (basetype), - cp_convert (ptrdiff_type_node, object_ptr), - cp_convert (ptrdiff_type_node, delta)); - - parms = tree_cons (NULL_TREE, - cp_convert (build_pointer_type (basetype), object_ptr), - TREE_CHAIN (parms)); - new_parms = tree_cons (NULL_TREE, new_object_ptr, TREE_CHAIN (parms)); - - { - /* Cast the signature method to have `this' of a normal pointer type. */ - tree old_this = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (pfn)))); - - TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (pfn)))) - = build_qualified_type (build_pointer_type (basetype), - TYPE_QUALS (old_this)); - - direct_call = build_function_call (pfn, new_parms); - - { - tree vfld, vtbl, aref; - - vfld = build (PLUS_EXPR, - build_pointer_type (build_pointer_type (vtbl_type_node)), - cp_convert (ptrdiff_type_node, object_ptr), - cp_convert (ptrdiff_type_node, vt_off)); - vtbl = build_indirect_ref (build_indirect_ref (vfld, NULL_PTR), - NULL_PTR); - aref = build_array_ref (vtbl, idx); - - if (flag_vtable_thunks) - vfn = aref; - else - vfn = build_component_ref (aref, pfn_identifier, NULL_TREE, 0); - - TREE_TYPE (vfn) = build_pointer_type (TREE_TYPE (function)); - - virtual_call = build_function_call (vfn, new_parms); - } - - /* Undo the cast, make `this' a signature pointer again. */ - TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (pfn)))) = old_this; - } - - /* Once the function was found, there should be no reason why we - couldn't build the member function pointer call. */ - if (!direct_call || direct_call == error_mark_node - || !virtual_call || virtual_call == error_mark_node - || (IS_DEFAULT_IMPLEMENTATION (function) - && (!deflt_call || deflt_call == error_mark_node))) - { - compiler_error ("cannot build call of signature member function `%s'", - fndecl_as_string (function, 1)); - return error_mark_node; - } - - if (IS_DEFAULT_IMPLEMENTATION (function)) - { - tree test = build_binary_op_nodefault (LT_EXPR, tag, integer_zero_node, - LT_EXPR); - result = build_conditional_expr (tag, - build_conditional_expr (test, - deflt_call, - virtual_call), - direct_call); - } - else - result = build_conditional_expr (tag, virtual_call, direct_call); - - /* If we created a temporary variable for `this', initialize it first. */ - if (instance != saved_instance) - result = build (COMPOUND_EXPR, TREE_TYPE (result), - build_modify_expr (saved_instance, NOP_EXPR, instance), - result); - - return result; -} - -/* Create a COMPONENT_REF expression for referencing the OPTR field - of a signature pointer or reference. */ - -tree -build_optr_ref (instance) - tree instance; -{ - tree field = get_identifier (SIGNATURE_OPTR_NAME); - - return build_component_ref (instance, field, NULL_TREE, 1); -} - -/* Create a COMPONENT_REF expression for referencing the SPTR field - of a signature pointer or reference. */ - -static tree -build_sptr_ref (instance) - tree instance; -{ - tree field = get_identifier (SIGNATURE_SPTR_NAME); - - return build_component_ref (instance, field, NULL_TREE, 1); -} diff --git a/contrib/gcc/cp/tinfo.cc b/contrib/gcc/cp/tinfo.cc deleted file mode 100644 index 5269cb5940e4..000000000000 --- a/contrib/gcc/cp/tinfo.cc +++ /dev/null @@ -1,134 +0,0 @@ -// Methods for type_info for -*- C++ -*- Run Time Type Identification. -// Copyright (C) 1994, 1996, 1998 Free Software Foundation - -// 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. - -// As a special exception, if you link this library with other files, -// some of which are compiled with GCC, to produce an executable, -// this library does not by itself cause the resulting executable -// to be covered by the GNU General Public License. -// This exception does not however invalidate any other reasons why -// the executable file might be covered by the GNU General Public License. - -#pragma implementation "typeinfo" - -#include <stddef.h> -#include "tinfo.h" -#include "new" // for placement new - -// This file contains the minimal working set necessary to link with code -// that uses virtual functions and -frtti but does not actually use RTTI -// functionality. - -std::type_info:: -~type_info () -{ } - -// We can't rely on common symbols being shared between shared objects. -bool std::type_info:: -operator== (const std::type_info& arg) const -{ - return (&arg == this) || (strcmp (name (), arg.name ()) == 0); -} - -extern "C" void -__rtti_class (void *addr, const char *name, - const __class_type_info::base_info *bl, size_t bn) -{ new (addr) __class_type_info (name, bl, bn); } - -extern "C" void -__rtti_si (void *addr, const char *n, const std::type_info *ti) -{ - new (addr) __si_type_info - (n, static_cast <const __user_type_info &> (*ti)); -} - -extern "C" void -__rtti_user (void *addr, const char *name) -{ new (addr) __user_type_info (name); } - -// dynamic_cast helper methods. -// Returns a pointer to the desired sub-object or 0. - -void * __user_type_info:: -dcast (const type_info& to, int, void *addr, const type_info *, void *) const -{ return (*this == to) ? addr : 0; } - -void * __si_type_info:: -dcast (const type_info& to, int require_public, void *addr, - const type_info *sub, void *subptr) const -{ - if (*this == to) - return addr; - return base.dcast (to, require_public, addr, sub, subptr); -} - -void* __class_type_info:: -dcast (const type_info& desired, int is_public, void *objptr, - const type_info *sub, void *subptr) const -{ - if (*this == desired) - return objptr; - - void *match_found = 0; - for (size_t i = 0; i < n_bases; i++) - { - if (is_public && base_list[i].access != PUBLIC) - continue; - - void *p = (char *)objptr + base_list[i].offset; - if (base_list[i].is_virtual) - p = *(void **)p; - p = base_list[i].base->dcast (desired, is_public, p, sub, subptr); - if (p) - { - if (match_found == 0) - match_found = p; - else if (match_found != p) - { - if (sub) - { - // Perhaps we're downcasting from *sub to desired; see if - // subptr is a subobject of exactly one of {match_found,p}. - - const __user_type_info &d = - static_cast <const __user_type_info &> (desired); - - void *os = d.dcast (*sub, 1, match_found); - void *ns = d.dcast (*sub, 1, p); - - if (os == ns) - /* ambiguous -- subptr is a virtual base */; - else if (os == subptr) - continue; - else if (ns == subptr) - { - match_found = p; - continue; - } - } - - // base found at two different pointers, - // conversion is not unique - return 0; - } - } - } - - return match_found; -} diff --git a/contrib/gcc/cp/tinfo.h b/contrib/gcc/cp/tinfo.h deleted file mode 100644 index e0b9eec78970..000000000000 --- a/contrib/gcc/cp/tinfo.h +++ /dev/null @@ -1,55 +0,0 @@ -// RTTI support internals for -*- C++ -*- -// Copyright (C) 1994, 1995, 1996, 1998 Free Software Foundation - -#include "typeinfo" - -// Class declarations shared between the typeinfo implementation files. - -// type_info for a class with no base classes (or an enum). - -struct __user_type_info : public std::type_info { - __user_type_info (const char *n) : type_info (n) {} - - // If our type can be converted to the desired type, - // return the pointer, adjusted accordingly; else return 0. - virtual void* dcast (const type_info &, int, void *, - const type_info * = 0, void * = 0) const; -}; - -// type_info for a class with one public, nonvirtual base class. - -class __si_type_info : public __user_type_info { - const __user_type_info &base; - -public: - __si_type_info (const char *n, const __user_type_info &b) - : __user_type_info (n), base (b) { } - - virtual void *dcast (const type_info &, int, void *, - const type_info * = 0, void * = 0) const; -}; - -// type_info for a general class. - -typedef unsigned int USItype __attribute__ ((mode (SI))); - -struct __class_type_info : public __user_type_info { - enum access { PUBLIC = 1, PROTECTED = 2, PRIVATE = 3 }; - - struct base_info { - const __user_type_info *base; - USItype offset: 29; - bool is_virtual: 1; - enum access access: 2; - }; - - const base_info *base_list; - size_t n_bases; - - __class_type_info (const char *name, const base_info *bl, size_t bn) - : __user_type_info (name), base_list (bl), n_bases (bn) {} - - // This is a little complex. - virtual void* dcast (const type_info &, int, void *, - const type_info * = 0, void * = 0) const; -}; diff --git a/contrib/gcc/cp/tinfo2.cc b/contrib/gcc/cp/tinfo2.cc deleted file mode 100644 index b101db3c0548..000000000000 --- a/contrib/gcc/cp/tinfo2.cc +++ /dev/null @@ -1,300 +0,0 @@ -// Methods for type_info for -*- C++ -*- Run Time Type Identification. -// Copyright (C) 1994, 96-97, 1998 Free Software Foundation - -// 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. - -// As a special exception, if you link this library with other files, -// some of which are compiled with GCC, to produce an executable, -// this library does not by itself cause the resulting executable -// to be covered by the GNU General Public License. -// This exception does not however invalidate any other reasons why -// the executable file might be covered by the GNU General Public License. - -#include <stddef.h> -#include "tinfo.h" -#include "new" // for placement new - -using std::type_info; - -bool -type_info::before (const type_info &arg) const -{ - return strcmp (name (), arg.name ()) < 0; -} - -// type info for pointer type. - -struct __pointer_type_info : public type_info { - const type_info& type; - - __pointer_type_info (const char *n, const type_info& ti) - : type_info (n), type (ti) {} -}; - -// type info for attributes - -struct __attr_type_info : public type_info { - enum cv { NONE = 0, CONST = 1, VOLATILE = 2, CONSTVOL = 1 | 2 }; - - const type_info& type; - cv attr; - - __attr_type_info (const char *n, cv a, const type_info& t) - : type_info (n), type (t), attr (a) {} -}; - -// type_info for builtin type - -struct __builtin_type_info : public type_info { - __builtin_type_info (const char *n): type_info (n) {} -}; - -// type info for function. - -struct __func_type_info : public type_info { - __func_type_info (const char *n) : type_info (n) {} -}; - -// type info for pointer to member function. - -struct __ptmf_type_info : public type_info { - __ptmf_type_info (const char *n) : type_info (n) {} -}; - -// type info for pointer to data member. - -struct __ptmd_type_info : public type_info { - __ptmd_type_info (const char *n): type_info (n) {} -}; - -// type info for array. - -struct __array_type_info : public type_info { - __array_type_info (const char *n): type_info (n) {} -}; - -// Entry points for the compiler. - -/* Low level match routine used by compiler to match types of catch - variables and thrown objects. */ - -extern "C" void* -__throw_type_match_rtti (const void *catch_type_r, const void *throw_type_r, - void *objptr) -{ - const type_info &catch_type = *(const type_info *)catch_type_r; - const type_info &throw_type = *(const type_info *)throw_type_r; - - if (catch_type == throw_type) - return objptr; - -#if 0 - printf ("We want to match a %s against a %s!\n", - throw_type.name (), catch_type.name ()); -#endif - - void *new_objptr = 0; - - if (const __user_type_info *p - = dynamic_cast <const __user_type_info *> (&throw_type)) - { - /* The 1 skips conversions to private bases. */ - new_objptr = p->dcast (catch_type, 1, objptr); - } - else if (const __pointer_type_info *fr = - dynamic_cast <const __pointer_type_info *> (&throw_type)) - { - const __pointer_type_info *to = - dynamic_cast <const __pointer_type_info *> (&catch_type); - - if (! to) - goto fail; - - const type_info *subfr = &fr->type, *subto = &to->type; - __attr_type_info::cv cvfrom, cvto; - - if (const __attr_type_info *at - = dynamic_cast <const __attr_type_info *> (subfr)) - { - cvfrom = at->attr; - subfr = &at->type; - } - else - cvfrom = __attr_type_info::NONE; - - if (const __attr_type_info *at - = dynamic_cast <const __attr_type_info *> (subto)) - { - cvto = at->attr; - subto = &at->type; - } - else - cvto = __attr_type_info::NONE; - - if (((cvfrom & __attr_type_info::CONST) - > (cvto & __attr_type_info::CONST)) - || ((cvfrom & __attr_type_info::VOLATILE) - > (cvto & __attr_type_info::VOLATILE))) - goto fail; - - if (*subto == *subfr) - new_objptr = objptr; - else if (*subto == typeid (void) - && dynamic_cast <const __func_type_info *> (subfr) == 0) - new_objptr = objptr; - else if (const __user_type_info *p - = dynamic_cast <const __user_type_info *> (subfr)) - { - /* The 1 skips conversions to private bases. */ - new_objptr = p->dcast (*subto, 1, objptr); - } - else if (const __pointer_type_info *pfr - = dynamic_cast <const __pointer_type_info *> (subfr)) - { - // Multi-level pointer conversion. - - const __pointer_type_info *pto - = dynamic_cast <const __pointer_type_info *> (subto); - - if (! pto) - goto fail; - - bool constp = (cvto & __attr_type_info::CONST); - for (subto = &pto->type, subfr = &pfr->type; ; - subto = &pto->type, subfr = &pfr->type) - { - if (const __attr_type_info *at - = dynamic_cast <const __attr_type_info *> (subfr)) - { - cvfrom = at->attr; - subfr = &at->type; - } - else - cvfrom = __attr_type_info::NONE; - - if (const __attr_type_info *at - = dynamic_cast <const __attr_type_info *> (subto)) - { - cvto = at->attr; - subto = &at->type; - } - else - cvto = __attr_type_info::NONE; - - if (((cvfrom & __attr_type_info::CONST) - > (cvto & __attr_type_info::CONST)) - || ((cvfrom & __attr_type_info::VOLATILE) - > (cvto & __attr_type_info::VOLATILE))) - goto fail; - - if (! constp - && (((cvfrom & __attr_type_info::CONST) - < (cvto & __attr_type_info::CONST)) - || ((cvfrom & __attr_type_info::VOLATILE) - < (cvto & __attr_type_info::VOLATILE)))) - goto fail; - - if (*subto == *subfr) - { - new_objptr = objptr; - break; - } - - pto = dynamic_cast <const __pointer_type_info *> (subto); - pfr = dynamic_cast <const __pointer_type_info *> (subfr); - if (! pto || ! pfr) - goto fail; - - if (! (cvto & __attr_type_info::CONST)) - constp = false; - } - } - } - fail: - -#if 0 - if (new_objptr) - printf ("It converts, delta is %d\n", new_objptr-objptr); -#endif - return new_objptr; -} - -/* Called from __cp_pop_exception. Is P the type_info node for a pointer - of some kind? */ - -bool -__is_pointer (void *p) -{ - const type_info *t = reinterpret_cast <const type_info *>(p); - const __pointer_type_info *pt = - dynamic_cast <const __pointer_type_info *> (t); - return pt != 0; -} - -extern "C" void -__rtti_ptr (void *addr, const char *n, const type_info *ti) -{ new (addr) __pointer_type_info (n, *ti); } - -extern "C" void -__rtti_attr (void *addr, const char *n, int attrval, const type_info *ti) -{ - new (addr) __attr_type_info - (n, static_cast <__attr_type_info::cv> (attrval), *ti); -} - -extern "C" void -__rtti_func (void *addr, const char *name) -{ new (addr) __func_type_info (name); } - -extern "C" void -__rtti_ptmf (void *addr, const char *name) -{ new (addr) __ptmf_type_info (name); } - -extern "C" void -__rtti_ptmd (void *addr, const char *name) -{ new (addr) __ptmd_type_info (name); } - -extern "C" void -__rtti_array (void *addr, const char *name) -{ new (addr) __array_type_info (name); } - -extern "C" void * -__dynamic_cast (const type_info& (*from)(void), const type_info& (*to)(void), - int require_public, void *address, - const type_info & (*sub)(void), void *subptr) -{ - return static_cast <const __user_type_info &> (from ()).dcast - (to (), require_public, address, &(sub ()), subptr); -} - -// type_info nodes and functions for the builtin types. The mangling here -// must match the mangling in gcc/cp/rtti.c. - -#define BUILTIN(mangled) \ -unsigned char __ti##mangled [sizeof (__builtin_type_info)] \ - __attribute__ ((aligned (__alignof__ (void *)))); \ -extern "C" const type_info &__tf##mangled (void) { \ - if ((*(void **) __ti##mangled) == 0) \ - new (__ti##mangled) __builtin_type_info (#mangled); \ - return *(type_info *)__ti##mangled; \ -} - -BUILTIN (v); BUILTIN (x); BUILTIN (l); BUILTIN (i); BUILTIN (s); BUILTIN (b); -BUILTIN (c); BUILTIN (w); BUILTIN (r); BUILTIN (d); BUILTIN (f); -BUILTIN (Ui); BUILTIN (Ul); BUILTIN (Ux); BUILTIN (Us); BUILTIN (Uc); -BUILTIN (Sc); diff --git a/contrib/gcc/cp/xref.c b/contrib/gcc/cp/xref.c deleted file mode 100644 index 4560c4a2c6f3..000000000000 --- a/contrib/gcc/cp/xref.c +++ /dev/null @@ -1,829 +0,0 @@ -/* Code for handling XREF output from GNU C++. - Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 2000, 2002 Free Software Foundation, Inc. - Contributed by Michael Tiemann (tiemann@cygnus.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. */ - - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "cp-tree.h" -#include "input.h" -#include "toplev.h" - -/* The character(s) used to join a directory specification (obtained with - getwd or equivalent) with a non-absolute file name. */ - -#ifndef FILE_NAME_JOINER -#define FILE_NAME_JOINER "/" -#endif - -/* Nonzero if NAME as a file name is absolute. */ -#ifndef FILE_NAME_ABSOLUTE_P -#define FILE_NAME_ABSOLUTE_P(NAME) ((NAME)[0] == '/') -#endif - -/* For cross referencing. */ - -int flag_gnu_xref; - -/************************************************************************/ -/* */ -/* Common definitions */ -/* */ -/************************************************************************/ - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -#define PALLOC(TYP) ((TYP *) xcalloc (1, sizeof (TYP))) - - -/* Return a malloc'd copy of STR. */ -#define SALLOC(STR) ((char *) ((STR) == NULL ? NULL : xstrdup (STR))) -#define SFREE(STR) ((STR) != NULL && (free (STR), 0)) - -#define STREQL(S1,S2) (strcmp ((S1), (S2)) == 0) -#define STRNEQ(S1,S2) (strcmp ((S1), (S2)) != 0) -#define STRLSS(S1,S2) (strcmp ((S1), (S2)) < 0) -#define STRLEQ(S1,S2) (strcmp ((S1), (S2)) <= 0) -#define STRGTR(S1,S2) (strcmp ((S1), (S2)) > 0) -#define STRGEQ(S1,S2) (strcmp ((S1), (S2)) >= 0) - -/************************************************************************/ -/* */ -/* Type definitions */ -/* */ -/************************************************************************/ - - -typedef struct _XREF_FILE * XREF_FILE; -typedef struct _XREF_SCOPE * XREF_SCOPE; - -typedef struct _XREF_FILE -{ - const char *name; - const char *outname; - XREF_FILE next; -} XREF_FILE_INFO; - -typedef struct _XREF_SCOPE -{ - int gid; - int lid; - XREF_FILE file; - int start; - XREF_SCOPE outer; -} XREF_SCOPE_INFO; - -/************************************************************************/ -/* */ -/* Local storage */ -/* */ -/************************************************************************/ - -static char doing_xref = 0; -static FILE * xref_file = NULL; -static char xref_name[1024]; -static XREF_FILE all_files = NULL; -static char * wd_name = NULL; -static XREF_SCOPE cur_scope = NULL; -static int scope_ctr = 0; -static XREF_FILE last_file = NULL; -static tree last_fndecl = NULL; - -/************************************************************************/ -/* */ -/* Forward definitions */ -/* */ -/************************************************************************/ -static void gen_assign PARAMS ((XREF_FILE, tree)); -static XREF_FILE find_file PARAMS ((const char *)); -static const char * filename PARAMS ((XREF_FILE)); -static const char * fctname PARAMS ((tree)); -static const char * declname PARAMS ((tree)); -static void simplify_type PARAMS ((char *)); -static const char * fixname PARAMS ((const char *, char *)); -static void open_xref_file PARAMS ((const char *)); -static const char * classname PARAMS ((tree)); - -/* Start cross referencing. FILE is the name of the file we xref. */ - -void -GNU_xref_begin (file) - const char *file; -{ - doing_xref = 1; - - if (file != NULL && STRNEQ (file,"-")) - { - open_xref_file(file); - GNU_xref_file(file); - } -} - -/* Finish cross-referencing. ERRCNT is the number of errors - we encountered. */ - -void -GNU_xref_end (ect) - int ect; -{ - XREF_FILE xf; - - if (!doing_xref) return; - - xf = find_file (input_filename); - if (xf == NULL) return; - - while (cur_scope != NULL) - GNU_xref_end_scope(cur_scope->gid,0,0,0); - - doing_xref = 0; - - if (xref_file == NULL) return; - - fclose (xref_file); - - xref_file = NULL; - all_files = NULL; - - if (ect > 0) unlink (xref_name); -} - -/* Write out xref for file named NAME. */ - -void -GNU_xref_file (name) - const char *name; -{ - XREF_FILE xf; - - if (!doing_xref || name == NULL) return; - - if (xref_file == NULL) - { - open_xref_file (name); - if (!doing_xref) return; - } - - if (all_files == NULL) - fprintf(xref_file,"SCP * 0 0 0 0 RESET\n"); - - xf = find_file (name); - if (xf != NULL) return; - - xf = PALLOC (XREF_FILE_INFO); - xf->name = SALLOC (name); - xf->next = all_files; - all_files = xf; - - if (wd_name == NULL) - wd_name = getpwd (); - - if (FILE_NAME_ABSOLUTE_P (name) || ! wd_name) - xf->outname = xf->name; - else - xf->outname = name = concat (wd_name, FILE_NAME_JOINER, name, NULL); - - fprintf (xref_file, "FIL %s %s 0\n", name, wd_name); - - filename (xf); - fctname (NULL); -} - -/* Start a scope identified at level ID. */ - -void -GNU_xref_start_scope (id) - HOST_WIDE_INT id; -{ - XREF_SCOPE xs; - XREF_FILE xf; - - if (!doing_xref) return; - xf = find_file (input_filename); - - xs = PALLOC (XREF_SCOPE_INFO); - xs->file = xf; - xs->start = lineno; - if (xs->start <= 0) xs->start = 1; - xs->gid = id; - xs->lid = ++scope_ctr; - xs->outer = cur_scope; - cur_scope = xs; -} - -/* Finish a scope at level ID. - INID is ??? - PRM is ??? - KEEP is nonzero iff this scope is retained (nonzero if it's - a compiler-generated invisible scope). - TRNS is ??? */ - -void -GNU_xref_end_scope (id,inid,prm,keep) - HOST_WIDE_INT id; - HOST_WIDE_INT inid; - int prm,keep; -{ - XREF_FILE xf; - XREF_SCOPE xs,lxs,oxs; - const char *stype; - - if (!doing_xref) return; - xf = find_file (input_filename); - if (xf == NULL) return; - - lxs = NULL; - for (xs = cur_scope; xs != NULL; xs = xs->outer) - { - if (xs->gid == id) break; - lxs = xs; - } - if (xs == NULL) return; - - if (inid != 0) { - for (oxs = cur_scope; oxs != NULL; oxs = oxs->outer) { - if (oxs->gid == inid) break; - } - if (oxs == NULL) return; - inid = oxs->lid; - } - - if (prm == 2) stype = "SUE"; - else if (prm != 0) stype = "ARGS"; - else if (keep == 2 || inid != 0) stype = "INTERN"; - else stype = "EXTERN"; - - fprintf (xref_file, "SCP %s %d %d %d ", - filename (xf), xs->start, lineno,xs->lid); - fprintf (xref_file, HOST_WIDE_INT_PRINT_DEC, inid); - fprintf (xref_file, " %s\n", stype); - - if (lxs == NULL) cur_scope = xs->outer; - else lxs->outer = xs->outer; - - free (xs); -} - -/* Output a reference to NAME in FNDECL. */ - -void -GNU_xref_ref (fndecl,name) - tree fndecl; - const char *name; -{ - XREF_FILE xf; - - if (!doing_xref) return; - xf = find_file (input_filename); - if (xf == NULL) return; - - fprintf (xref_file, "REF %s %d %s %s\n", - filename (xf), lineno, fctname (fndecl), name); -} - -/* Output a reference to DECL in FNDECL. */ - -void -GNU_xref_decl (fndecl,decl) - tree fndecl; - tree decl; -{ - XREF_FILE xf,xf1; - const char *cls = 0; - const char *name; - char buf[10240]; - int uselin; - - if (!doing_xref) return; - xf = find_file (input_filename); - if (xf == NULL) return; - - uselin = FALSE; - - if (TREE_CODE (decl) == TYPE_DECL) cls = "TYPEDEF"; - else if (TREE_CODE (decl) == FIELD_DECL) cls = "FIELD"; - else if (TREE_CODE (decl) == VAR_DECL) - { - if (fndecl == NULL && TREE_STATIC(decl) - && TREE_READONLY(decl) && DECL_INITIAL(decl) != 0 - && !TREE_PUBLIC(decl) && !DECL_EXTERNAL(decl) - && DECL_MODE(decl) != BLKmode) cls = "CONST"; - else if (DECL_EXTERNAL(decl)) cls = "EXTERN"; - else if (TREE_PUBLIC(decl)) cls = "EXTDEF"; - else if (TREE_STATIC(decl)) cls = "STATIC"; - else if (DECL_REGISTER(decl)) cls = "REGISTER"; - else cls = "AUTO"; - } - else if (TREE_CODE (decl) == PARM_DECL) cls = "PARAM"; - else if (TREE_CODE (decl) == FIELD_DECL) cls = "FIELD"; - else if (TREE_CODE (decl) == CONST_DECL) cls = "CONST"; - else if (TREE_CODE (decl) == FUNCTION_DECL) - { - if (DECL_EXTERNAL (decl)) cls = "EXTERN"; - else if (TREE_PUBLIC (decl)) cls = "EFUNCTION"; - else cls = "SFUNCTION"; - } - else if (TREE_CODE (decl) == LABEL_DECL) cls = "LABEL"; - else if (TREE_CODE (decl) == UNION_TYPE) - { - cls = "UNIONID"; - decl = TYPE_NAME (decl); - uselin = TRUE; - } - else if (TREE_CODE (decl) == RECORD_TYPE) - { - if (CLASSTYPE_DECLARED_CLASS (decl)) cls = "CLASSID"; - else cls = "STRUCTID"; - decl = TYPE_NAME (decl); - uselin = TRUE; - } - else if (TREE_CODE (decl) == ENUMERAL_TYPE) - { - cls = "ENUMID"; - decl = TYPE_NAME (decl); - uselin = TRUE; - } - else if (TREE_CODE (decl) == TEMPLATE_DECL) - { - if (TREE_CODE (DECL_RESULT (decl)) == TYPE_DECL) - cls = "CLASSTEMP"; - else if (TREE_CODE (DECL_RESULT (decl)) == FUNCTION_DECL) - cls = "FUNCTEMP"; - else if (TREE_CODE (DECL_RESULT (decl)) == VAR_DECL) - cls = "VARTEMP"; - else - abort (); - uselin = TRUE; - } - else cls = "UNKNOWN"; - - if (decl == NULL || DECL_NAME (decl) == NULL) return; - - if (uselin && decl->decl.linenum > 0 && decl->decl.filename != NULL) - { - xf1 = find_file (decl->decl.filename); - if (xf1 != NULL) - { - lineno = decl->decl.linenum; - xf = xf1; - } - } - - if (DECL_ASSEMBLER_NAME (decl)) - name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); - else - name = IDENTIFIER_POINTER (DECL_NAME (decl)); - - strcpy (buf, type_as_string (TREE_TYPE (decl), 0)); - simplify_type (buf); - - fprintf (xref_file, "DCL %s %d %s %d %s %s %s\n", - filename(xf), lineno, name, - (cur_scope != NULL ? cur_scope->lid : 0), - cls, fctname(fndecl), buf); - - if (STREQL (cls, "STRUCTID") || STREQL (cls, "UNIONID")) - { - cls = "CLASSID"; - fprintf (xref_file, "DCL %s %d %s %d %s %s %s\n", - filename(xf), lineno,name, - (cur_scope != NULL ? cur_scope->lid : 0), - cls, fctname(fndecl), buf); - } -} - -/* Output a reference to a call to NAME in FNDECL. */ - -void -GNU_xref_call (fndecl, name) - tree fndecl; - const char *name; -{ - XREF_FILE xf; - char buf[1024]; - const char *s; - - if (!doing_xref) return; - xf = find_file (input_filename); - if (xf == NULL) return; - name = fixname (name, buf); - - for (s = name; *s != 0; ++s) - if (*s == '_' && s[1] == '_') break; - if (*s != 0) GNU_xref_ref (fndecl, name); - - fprintf (xref_file, "CAL %s %d %s %s\n", - filename (xf), lineno, name, fctname (fndecl)); -} - -/* Output cross-reference info about FNDECL. If non-NULL, - ARGS are the arguments for the function (i.e., before the FUNCTION_DECL - has been fully built). */ - -void -GNU_xref_function (fndecl, args) - tree fndecl; - tree args; -{ - XREF_FILE xf; - int ct; - char buf[1024]; - - if (!doing_xref) return; - xf = find_file (input_filename); - if (xf == NULL) return; - - ct = 0; - buf[0] = 0; - if (args == NULL) args = DECL_ARGUMENTS (fndecl); - - GNU_xref_decl (NULL, fndecl); - - for ( ; args != NULL; args = TREE_CHAIN (args)) - { - GNU_xref_decl (fndecl,args); - if (ct != 0) strcat (buf,","); - strcat (buf, declname (args)); - ++ct; - } - - fprintf (xref_file, "PRC %s %d %s %d %d %s\n", - filename(xf), lineno, declname(fndecl), - (cur_scope != NULL ? cur_scope->lid : 0), - ct, buf); -} - -/* Output cross-reference info about an assignment to NAME. */ - -void -GNU_xref_assign(name) - tree name; -{ - XREF_FILE xf; - - if (!doing_xref) return; - xf = find_file(input_filename); - if (xf == NULL) return; - - gen_assign(xf, name); -} - -static void -gen_assign(xf, name) - XREF_FILE xf; - tree name; -{ - const char *s; - - s = NULL; - - switch (TREE_CODE (name)) - { - case IDENTIFIER_NODE : - s = IDENTIFIER_POINTER(name); - break; - case VAR_DECL : - s = declname(name); - break; - case COMPONENT_REF : - gen_assign(xf, TREE_OPERAND(name, 0)); - gen_assign(xf, TREE_OPERAND(name, 1)); - break; - case INDIRECT_REF : - case OFFSET_REF : - case ARRAY_REF : - case BUFFER_REF : - gen_assign(xf, TREE_OPERAND(name, 0)); - break; - case COMPOUND_EXPR : - gen_assign(xf, TREE_OPERAND(name, 1)); - break; - default : - break; - } - - if (s != NULL) - fprintf(xref_file, "ASG %s %d %s\n", filename(xf), lineno, s); -} - -static const char * -classname (cls) - tree cls; -{ - if (cls && TYPE_P (cls)) - cls = TYPE_NAME (cls); - if (cls && DECL_P (cls)) - cls = DECL_NAME (cls); - if (cls && TREE_CODE (cls) == IDENTIFIER_NODE) - return IDENTIFIER_POINTER (cls); - return "?"; -} - -/* Output cross-reference info about a class hierarchy. - CLS is the class type of interest. BASE is a baseclass - for CLS. PUB and VIRT give the access info about - the class derivation. FRND is nonzero iff BASE is a friend - of CLS. - - ??? Needs to handle nested classes. */ - -void -GNU_xref_hier(cls, base, pub, virt, frnd) - tree cls; - tree base; - int pub; - int virt; - int frnd; -{ - XREF_FILE xf; - - if (!doing_xref) return; - xf = find_file(input_filename); - if (xf == NULL) return; - - fprintf(xref_file, "HIE %s %d %s %s %d %d %d\n", - filename(xf), lineno, classname (cls), classname (base), - pub, virt, frnd); -} - -/* Output cross-reference info about class members. CLS - is the containing type; FLD is the class member. */ - -void -GNU_xref_member(cls, fld) - tree cls; - tree fld; -{ - XREF_FILE xf; - const char *prot; - int confg, pure; - const char *d; -#ifdef XREF_SHORT_MEMBER_NAMES - int i; -#endif - char buf[1024], bufa[1024]; - - if (!doing_xref) return; - xf = find_file(fld->decl.filename); - if (xf == NULL) return; - - if (TREE_PRIVATE (fld)) prot = "PRIVATE"; - else if (TREE_PROTECTED(fld)) prot = "PROTECTED"; - else prot = "PUBLIC"; - - confg = 0; - if (TREE_CODE (fld) == FUNCTION_DECL && DECL_CONST_MEMFUNC_P(fld)) - confg = 1; - else if (TREE_CODE (fld) == CONST_DECL) - confg = 1; - - pure = 0; - if (TREE_CODE (fld) == FUNCTION_DECL && DECL_PURE_VIRTUAL_P(fld)) - pure = 1; - - d = IDENTIFIER_POINTER(cls); - sprintf(buf, "%d%s", (int) strlen(d), d); -#ifdef XREF_SHORT_MEMBER_NAMES - i = strlen(buf); -#endif - strcpy(bufa, declname(fld)); - -#ifdef XREF_SHORT_MEMBER_NAMES - for (p = &bufa[1]; *p != 0; ++p) - { - if (p[0] == '_' && p[1] == '_' && ISDIGIT (p[2])) { - if (strncmp(&p[2], buf, i) == 0) *p = 0; - break; - } - else if (p[0] == '_' && p[1] == '_' && p[2] == 'C' && ISDIGIT (p[3])) { - if (strncmp(&p[3], buf, i) == 0) *p = 0; - break; - } - } -#endif - - fprintf(xref_file, "MEM %s %d %s %s %s %d %d %d %d %d %d %d\n", - filename(xf), fld->decl.linenum, d, bufa, prot, - (TREE_CODE (fld) == FUNCTION_DECL ? 0 : 1), - (DECL_INLINE (fld) ? 1 : 0), - (DECL_LANG_SPECIFIC(fld) && DECL_FRIEND_P(fld) ? 1 : 0), - (DECL_VINDEX(fld) ? 1 : 0), - (TREE_STATIC(fld) ? 1 : 0), - pure, confg); -} - -/* Find file entry given name. */ - -static XREF_FILE -find_file(name) - const char *name; -{ - XREF_FILE xf; - - for (xf = all_files; xf != NULL; xf = xf->next) { - if (STREQL(name, xf->name)) break; - } - - return xf; -} - -/* Return filename for output purposes. */ - -static const char * -filename(xf) - XREF_FILE xf; -{ - if (xf == NULL) { - last_file = NULL; - return "*"; - } - - if (last_file == xf) return "*"; - - last_file = xf; - - return xf->outname; -} - -/* Return function name for output purposes. */ - -static const char * -fctname(fndecl) - tree fndecl; -{ - static char fctbuf[1024]; - const char *s; - - if (fndecl == NULL && last_fndecl == NULL) return "*"; - - if (fndecl == NULL) - { - last_fndecl = NULL; - return "*TOP*"; - } - - if (fndecl == last_fndecl) return "*"; - - last_fndecl = fndecl; - - s = declname(fndecl); - s = fixname(s, fctbuf); - - return s; -} - -/* Return decl name for output purposes. */ - -static const char * -declname(dcl) - tree dcl; -{ - if (DECL_NAME (dcl) == NULL) return "?"; - - if (DECL_ASSEMBLER_NAME (dcl)) - return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (dcl)); - else - return IDENTIFIER_POINTER (DECL_NAME (dcl)); -} - -/* Simplify a type string by removing unneeded parenthesis. */ - -static void -simplify_type(typ) - char *typ; -{ - char *s; - int lvl, i; - - i = strlen(typ); - while (i > 0 && ISSPACE((unsigned char) typ[i-1])) typ[--i] = 0; - - if (i > 7 && STREQL(&typ[i-5], "const")) - { - typ[i-5] = 0; - i -= 5; - } - - if (typ[i-1] != ')') return; - - s = &typ[i-2]; - lvl = 1; - while (*s != 0) { - if (*s == ')') ++lvl; - else if (*s == '(') - { - --lvl; - if (lvl == 0) - { - s[1] = ')'; - s[2] = 0; - break; - } - } - --s; - } - - if (*s != 0 && s[-1] == ')') - { - --s; - --s; - if (*s == '(') s[2] = 0; - else if (*s == ':') { - while (*s != '(') --s; - s[1] = ')'; - s[2] = 0; - } - } -} - -/* Fixup a function name (take care of embedded spaces). */ - -static const char * -fixname(nam, buf) - const char *nam; - char *buf; -{ - const char *s; - char *t; - int fg; - - s = nam; - t = buf; - fg = 0; - - while (*s != 0) - { - if (*s == ' ') - { - *t++ = '\36'; - ++fg; - } - else *t++ = *s; - ++s; - } - *t = 0; - - if (fg == 0) return nam; - - return buf; -} - -/* Open file for xreffing. */ - -static void -open_xref_file(file) - const char *file; -{ - const char *s; - char *t; - -#ifdef XREF_FILE_NAME - XREF_FILE_NAME (xref_name, file); -#else - s = strrchr (file, '/'); - if (s == NULL) - sprintf (xref_name, ".%s.gxref", file); - else - { - ++s; - strcpy (xref_name, file); - t = strrchr (xref_name, '/'); - ++t; - *t++ = '.'; - strcpy (t, s); - strcat (t, ".gxref"); - } -#endif /* no XREF_FILE_NAME */ - - xref_file = fopen(xref_name, "w"); - - if (xref_file == NULL) - { - error("can't create cross-reference file `%s'", xref_name); - doing_xref = 0; - } -} diff --git a/contrib/gcc/cpp.texi b/contrib/gcc/cpp.texi deleted file mode 100644 index ca5013795775..000000000000 --- a/contrib/gcc/cpp.texi +++ /dev/null @@ -1,2967 +0,0 @@ -\input texinfo -@setfilename cpp.info -@settitle The C Preprocessor - -@ifinfo -@dircategory Programming -@direntry -* Cpp: (cpp). The GNU C preprocessor. -@end direntry -@end ifinfo - -@c @smallbook -@c @cropmarks -@c @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. Currently this only works if you -have turned trigraphs on with @samp{-trigraphs} or @samp{-ansi}; in the -future this restriction will be removed. - -@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 -gcc -@findex -gcc -Define the macros @var{__GNUC__} and @var{__GNUC_MINOR__}. These are -defined automatically when you use @samp{gcc -E}; you can turn them off -in that case with @samp{-no-gcc}. - -@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 and all macros that preceded it on the -command line. - -@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 -x c -@itemx -x c++ -@itemx -x objective-c -@itemx -x assembler-with-cpp -@findex -x c -@findex -x objective-c -@findex -x assembler-with-cpp -Specify the source language: C, C++, Objective-C, or assembly. This has -nothing to do with standards conformance or extensions; it merely -selects which base syntax to expect. If you give none of these options, -cpp will deduce the language from the extension of the source file: -@samp{.c}, @samp{.cc}, @samp{.m}, or @samp{.S}. Some other common -extensions for C++ and assembly are also recognized. If cpp does not -recognize the extension, it will treat the file as C; this is the most -generic mode. - -@strong{Note:} Previous versions of cpp accepted a @samp{-lang} option -which selected both the language and the standards conformance level. -This option has been removed, because it conflicts with the @samp{-l} -option. - -@item -std=@var{standard} -@itemx -ansi -@findex -std -@findex -ansi -Specify the standard to which the code should conform. Currently cpp -only knows about the standards for C; other language standards will be -added in the future. - -@var{standard} -may be one of: -@table @code -@item iso9899:1990 -The ISO C standard from 1990. - -@item iso9899:199409 -@itemx c89 -The 1990 C standard, as amended in 1994. @samp{c89} is the customary -shorthand for this version of the standard. - -The @samp{-ansi} option is equivalent to @samp{-std=c89}. - -@item iso9899:199x -@itemx c9x -The revised ISO C standard, which is expected to be promulgated some -time in 1999. It has not been approved yet, hence the @samp{x}. - -@item gnu89 -The 1990 C standard plus GNU extensions. This is the default. - -@item gnu9x -The 199x C standard plus GNU extensions. -@end table - -@item -Wp,-lint -@findex -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}. - -Because of the clash with @samp{-l}, you must use the awkward syntax -above. In a future release, this option will be replaced by -@samp{-flint} or @samp{-Wlint}; we are not sure which yet. - -@item -$ -@findex -$ -Forbid the use of @samp{$} in identifiers. The C standard does not -permit this, but it is a common extension. - -@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/contrib/gcc/cppalloc.c b/contrib/gcc/cppalloc.c deleted file mode 100644 index 5c96aff7cb81..000000000000 --- a/contrib/gcc/cppalloc.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Part of CPP library. (memory allocation - xmalloc etc) - Copyright (C) 1986, 87, 89, 92, 93, 94, 1995, 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 PROTO ((void)) ATTRIBUTE_NORETURN; - -static void -memory_full () -{ - cpp_notice ("%s: Memory exhausted.\n", progname); - exit (FATAL_EXIT_CODE); -} - -PTR -xmalloc (size) - size_t size; -{ - register PTR ptr = (PTR) malloc (size); - if (ptr == 0) - memory_full (); - return ptr; -} - -PTR -xcalloc (number, size) - size_t number, size; -{ - register PTR ptr = (PTR) calloc (number, size); - if (ptr == 0) - memory_full (); - return ptr; -} - -PTR -xrealloc (old, size) - PTR old; - size_t size; -{ - register PTR ptr; - if (old) - ptr = (PTR) realloc (old, size); - else - ptr = (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/contrib/gcc/cppulp.c b/contrib/gcc/cppulp.c deleted file mode 100644 index 7e7457c68c08..000000000000 --- a/contrib/gcc/cppulp.c +++ /dev/null @@ -1,26 +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" - -#include "output.h" - -const char *user_label_prefix = 0; diff --git a/contrib/gcc/cross-make b/contrib/gcc/cross-make deleted file mode 100644 index 84be67fd605b..000000000000 --- a/contrib/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/contrib/gcc/doprint.c b/contrib/gcc/doprint.c deleted file mode 100644 index 2dc4ddef9761..000000000000 --- a/contrib/gcc/doprint.c +++ /dev/null @@ -1,295 +0,0 @@ -/* Provide a version _doprnt in terms of fprintf. - Copyright (C) 1998 Free Software Foundation, Inc. - Contributed by Kaveh Ghazi (ghazi@caip.rutgers.edu) 3/29/98 - -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" -#undef _doprnt - -#ifdef TEST /* Make sure to use the internal one. */ -#define _doprnt my_doprnt -#endif - -#define COPY_VA_INT \ - do { \ - const int value = abs (va_arg (ap, int)); \ - char buf[32]; \ - ptr++; /* Go past the asterisk. */ \ - *sptr = '\0'; /* NULL terminate sptr. */ \ - sprintf(buf, "%d", value); \ - strcat(sptr, buf); \ - while (*sptr) sptr++; \ - } while (0) - -#define PRINT_CHAR(CHAR) \ - do { \ - putc(CHAR, stream); \ - ptr++; \ - total_printed++; \ - continue; \ - } while (0) - -#define PRINT_TYPE(TYPE) \ - do { \ - int result; \ - TYPE value = va_arg (ap, TYPE); \ - *sptr++ = *ptr++; /* Copy the type specifier. */ \ - *sptr = '\0'; /* NULL terminate sptr. */ \ - result = fprintf(stream, specifier, value); \ - if (result == -1) \ - return -1; \ - else \ - { \ - total_printed += result; \ - continue; \ - } \ - } while (0) - -int -_doprnt (format, ap, stream) - const char * format; - va_list ap; - FILE * stream; -{ - const char * ptr = format; - char specifier[128]; - int total_printed = 0; - - while (*ptr != '\0') - { - if (*ptr != '%') /* While we have regular characters, print them. */ - PRINT_CHAR(*ptr); - else /* We got a format specifier! */ - { - char * sptr = specifier; - int wide_width = 0, short_width = 0; - - *sptr++ = *ptr++; /* Copy the % and move forward. */ - - while (strchr ("-+ #0", *ptr)) /* Move past flags. */ - *sptr++ = *ptr++; - - if (*ptr == '*') - COPY_VA_INT; - else - while (isdigit(*ptr)) /* Handle explicit numeric value. */ - *sptr++ = *ptr++; - - if (*ptr == '.') - { - *sptr++ = *ptr++; /* Copy and go past the period. */ - if (*ptr == '*') - COPY_VA_INT; - else - while (isdigit(*ptr)) /* Handle explicit numeric value. */ - *sptr++ = *ptr++; - } - while (strchr ("hlL", *ptr)) - { - switch (*ptr) - { - case 'h': - short_width = 1; - break; - case 'l': - wide_width++; - break; - case 'L': - wide_width = 2; - break; - default: - abort(); - } - *sptr++ = *ptr++; - } - - switch (*ptr) - { - case 'd': - case 'i': - case 'o': - case 'u': - case 'x': - case 'X': - case 'c': - { - /* Short values are promoted to int, so just copy it - as an int and trust the C library printf to cast it - to the right width. */ - if (short_width) - PRINT_TYPE(int); - else - { - switch (wide_width) - { - case 0: - PRINT_TYPE(int); - break; - case 1: - PRINT_TYPE(long); - break; - case 2: - default: -#if defined(__GNUC__) || defined(HAVE_LONG_LONG) - PRINT_TYPE(long long); -#else - PRINT_TYPE(long); /* Fake it and hope for the best. */ -#endif - break; - } /* End of switch (wide_width) */ - } /* End of else statement */ - } /* End of integer case */ - break; - case 'f': - case 'e': - case 'E': - case 'g': - case 'G': - { - if (wide_width == 0) - PRINT_TYPE(double); - else - { -#if defined(__GNUC__) || defined(HAVE_LONG_DOUBLE) - PRINT_TYPE(long double); -#else - PRINT_TYPE(double); /* Fake it and hope for the best. */ -#endif - } - } - break; - case 's': - PRINT_TYPE(char *); - break; - case 'p': - PRINT_TYPE(void *); - break; - case '%': - PRINT_CHAR('%'); - break; - default: - abort(); - } /* End of switch (*ptr) */ - } /* End of else statement */ - } - - return total_printed; -} - -#ifdef TEST - -#include <math.h> -#ifndef M_PI -#define M_PI (3.1415926535897932385) -#endif - -#define RESULT(x) do \ -{ \ - int i = (x); \ - printf ("printed %d characters\n", i); \ - fflush(stdin); \ -} while (0) - -static int checkit PVPROTO ((const char * format, ...)) ATTRIBUTE_PRINTF_1; - -static int -checkit VPROTO ((const char* format, ...)) -{ - va_list args; - int result; - -#ifndef ANSI_PROTOTYPES - char *format; -#endif - - VA_START (args, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (args, char *); -#endif - - result = _doprnt (format, args, stdout); - va_end(args); - - return result; -} - -int -main () -{ - RESULT(checkit ("<%d>\n", 0x12345678)); - RESULT(printf ("<%d>\n", 0x12345678)); - - RESULT(checkit ("<%200d>\n", 5)); - RESULT(printf ("<%200d>\n", 5)); - - RESULT(checkit ("<%.300d>\n", 6)); - RESULT(printf ("<%.300d>\n", 6)); - - RESULT(checkit ("<%100.150d>\n", 7)); - RESULT(printf ("<%100.150d>\n", 7)); - - RESULT(checkit ("<%s>\n", - "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\ -777777777777777777333333333333366666666666622222222222777777777777733333")); - RESULT(printf ("<%s>\n", - "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\ -777777777777777777333333333333366666666666622222222222777777777777733333")); - - RESULT(checkit ("<%f><%0+#f>%s%d%s>\n", - 1.0, 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx")); - RESULT(printf ("<%f><%0+#f>%s%d%s>\n", - 1.0, 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx")); - - RESULT(checkit ("<%4f><%.4f><%%><%4.4f>\n", M_PI, M_PI, M_PI)); - RESULT(printf ("<%4f><%.4f><%%><%4.4f>\n", M_PI, M_PI, M_PI)); - - RESULT(checkit ("<%*f><%.*f><%%><%*.*f>\n", 3, M_PI, 3, M_PI, 3, 3, M_PI)); - RESULT(printf ("<%*f><%.*f><%%><%*.*f>\n", 3, M_PI, 3, M_PI, 3, 3, M_PI)); - - RESULT(checkit ("<%d><%i><%o><%u><%x><%X><%c>\n", - 75, 75, 75, 75, 75, 75, 75)); - RESULT(printf ("<%d><%i><%o><%u><%x><%X><%c>\n", - 75, 75, 75, 75, 75, 75, 75)); - - RESULT(checkit ("<%d><%i><%o><%u><%x><%X><%c>\n", - 75, 75, 75, 75, 75, 75, 75)); - RESULT(printf ("<%d><%i><%o><%u><%x><%X><%c>\n", - 75, 75, 75, 75, 75, 75, 75)); - - RESULT(checkit ("Testing (hd) short: <%d><%ld><%hd><%hd><%d>\n", 123, (long)234, 345, 123456789, 456)); - RESULT(printf ("Testing (hd) short: <%d><%ld><%hd><%hd><%d>\n", 123, (long)234, 345, 123456789, 456)); - -#if defined(__GNUC__) || defined (HAVE_LONG_LONG) - RESULT(checkit ("Testing (lld) long long: <%d><%lld><%d>\n", 123, 234234234234234234LL, 345)); - RESULT(printf ("Testing (lld) long long: <%d><%lld><%d>\n", 123, 234234234234234234LL, 345)); - RESULT(checkit ("Testing (Ld) long long: <%d><%Ld><%d>\n", 123, 234234234234234234LL, 345)); - RESULT(printf ("Testing (Ld) long long: <%d><%Ld><%d>\n", 123, 234234234234234234LL, 345)); -#endif - -#if defined(__GNUC__) || defined (HAVE_LONG_DOUBLE) - RESULT(checkit ("Testing (Lf) long double: <%.20f><%.20Lf><%0+#.20f>\n", - 1.23456, 1.234567890123456789L, 1.23456)); - RESULT(printf ("Testing (Lf) long double: <%.20f><%.20Lf><%0+#.20f>\n", - 1.23456, 1.234567890123456789L, 1.23456)); -#endif - - return 0; -} -#endif /* TEST */ diff --git a/contrib/gcc/dostage2 b/contrib/gcc/dostage2 deleted file mode 100755 index bb33f7dc27ed..000000000000 --- a/contrib/gcc/dostage2 +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -make -k LANGUAGES=c $1 CC=stage1/xgcc XCFLAGS=-Bstage1/ CFLAGS="-g $2" >log2 2>&1 diff --git a/contrib/gcc/dostage3 b/contrib/gcc/dostage3 deleted file mode 100755 index 21f17fc11c7b..000000000000 --- a/contrib/gcc/dostage3 +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -make -k LANGUAGES=c $1 CC=stage2/xgcc XCFLAGS=-Bstage2/ CFLAGS="-g $2" >log3 2>&1 - diff --git a/contrib/gcc/dwarfout.h b/contrib/gcc/dwarfout.h deleted file mode 100644 index 29c8dd39d5f0..000000000000 --- a/contrib/gcc/dwarfout.h +++ /dev/null @@ -1,42 +0,0 @@ -/* dwarfout.h - Various declarations for functions found in dwarfout.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. */ - -extern void dwarfout_init PROTO ((FILE *asm_out_file, - char *main_input_filename)); -extern void dwarfout_finish PROTO ((void)); - -extern void dwarfout_define PROTO ((unsigned, char *)); -extern void dwarfout_undef PROTO ((unsigned, char *)); -extern void dwarfout_file_scope_decl PROTO ((tree , int)); -extern void dwarfout_start_new_source_file PROTO ((char *)); -extern void dwarfout_resume_previous_source_file PROTO((unsigned)); - -extern void dwarfout_begin_function PROTO ((void)); -extern void dwarfout_end_function PROTO ((void)); -extern void dwarfout_begin_epilogue PROTO ((void)); -extern void dwarfout_end_epilogue PROTO ((void)); -extern void dwarfout_begin_block PROTO ((unsigned)); -extern void dwarfout_end_block PROTO ((unsigned)); - -#ifdef RTX_CODE -extern void dwarfout_label PROTO ((rtx)); -#endif -extern void dwarfout_line PROTO ((char *, unsigned)); - diff --git a/contrib/gcc/eh-common.h b/contrib/gcc/eh-common.h deleted file mode 100644 index c0ff7e73b1a4..000000000000 --- a/contrib/gcc/eh-common.h +++ /dev/null @@ -1,142 +0,0 @@ -/* EH stuff - Copyright (C) 1997, 1998 Free Software Foundation, Inc. - -This file is part of GNU CC. - -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. */ - - -/* This file contains the structures required for the language - independant exception handling model. Both the static compiler and - the runtime library share this file. */ - -/* The runtime flag flag_new_exceptions is used to determine whether the - compiler supports the new runtime typechecking mechanism or not. Under - the new model, runtime info is contained in the exception table, and - the __throw() library routine determines which handler to call based - on the results of a call to a matching function provided by the expcetion - thrower. Otherwise the old scheme of calling any handler which matches - an exception range is used, and the handler is responsible for all - checking of runtime conditions. If the handler wasn't suppose to - get the exception, it performs a re-throw. */ - - -/* The handler_label field MUST be the first field in this structure. The - __throw() library routine expects uses __eh_stub() from except.c, which - simply dereferences the context pointer to get the handler. - The routine get_dynamic_handler_chain() also has a dependancy on - the location of 'dynamic_handler_chain'. If its location is changed, - that routine must be modified as well. */ - -struct eh_context -{ - void *handler_label; - void **dynamic_handler_chain; - /* This is language dependent part of the eh context. */ - void *info; - /* This is used to remember where we threw for re-throws */ - void *table_index; /* address of exception table entry to rethrow from */ -}; - -#ifndef EH_TABLE_LOOKUP - -typedef struct old_exception_table -{ - void *start_region; - void *end_region; - void *exception_handler; -} old_exception_table; - -typedef struct exception_table -{ - void *start_region; - void *end_region; - void *exception_handler; - void *match_info; /* runtime type info */ -} exception_table; - - -/* The language identifying portion of an exception table */ - -typedef struct exception_lang_info -{ - short language; - short version; -} exception_lang_info; - -/* This value in the first field of the exception descriptor - identifies the descriptor as the new model format. This value would never - be present in this location under the old model */ - -#define NEW_EH_RUNTIME ((void *) -2) - -/* Each function has an exception_descriptor which contains the - language info, and a table of exception ranges and handlers */ - -typedef struct exception_descriptor -{ - void *runtime_id_field; - exception_lang_info lang; - exception_table table[1]; -} exception_descriptor; - - -/* A pointer to a matching function is initialized at runtime by the - specific language if run-time exceptions are supported. - The function takes 3 parameters - 1 - runtime exception that has been thrown info. (__eh_info *) - 2 - Match info pointer from the region being considered (void *) - 3 - exception table region is in (exception descriptor *) -*/ - -typedef void * (*__eh_matcher) PROTO ((void *, void *, void *)); - -/* This value is to be checked as a 'match all' case in the runtime field. */ - -#define CATCH_ALL_TYPE ((void *) -1) - -/* This is the runtime exception information. This forms the minimum required - information for an exception info pointer in an eh_context structure. */ - - -typedef struct __eh_info -{ - __eh_matcher match_function; - short language; - short version; -} __eh_info; - -/* Convienient language codes for ID the originating language. Similar - to the codes in dwarf2.h. */ - -enum exception_source_language - { - EH_LANG_C89 = 0x0001, - EH_LANG_C = 0x0002, - EH_LANG_Ada83 = 0x0003, - EH_LANG_C_plus_plus = 0x0004, - EH_LANG_Cobol74 = 0x0005, - EH_LANG_Cobol85 = 0x0006, - EH_LANG_Fortran77 = 0x0007, - EH_LANG_Fortran90 = 0x0008, - EH_LANG_Pascal83 = 0x0009, - EH_LANG_Modula2 = 0x000a, - EH_LANG_Java = 0x000b, - EH_LANG_Mips_Assembler = 0x8001 - }; - -#endif /* EH_TABLE_LOOKUP */ - - diff --git a/contrib/gcc/exgettext b/contrib/gcc/exgettext deleted file mode 100755 index 93d553cba764..000000000000 --- a/contrib/gcc/exgettext +++ /dev/null @@ -1,118 +0,0 @@ -#! /bin/sh -# Wrapper around gettext for GCC sources. -# Copyright 1998 Free Software Foundation, Inc. - -# Written by Paul Eggert <eggert@twinsun.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. - -# Set environment to default value, if not already set. -: ${AWK=awk} - -# The argument to this wrapper is the xgettext command to be executed. -# Extract the xgettext program name from the rest of the command. -xgettext=${1?} -shift - -# Save work if we're just wrapping a no-op. -case $xgettext in -:) exit;; -esac - -# Find the files to be scanned, and the directory to scan them from. -directory=. -files= -for i -do - case $i in - --directory=*) - directory=`expr " $i" : ' --directory=\(.*\)'`;; - --files-from=*) - files_from=`expr " $i" : ' --files-from=\(.*\)'` - files=`$AWK '/^[^#]/ { print }' $files_from`;; - esac -done - -# Generate keyword options for xgettext, -# by scanning for declarations of functions -# whose parameter names end in "msgid". -generate_keyword_options=' - /^[A-Z_a-z].*\(.*msgid[,)]/ { - - paren_index = index($0, "(") - - name = substr($0, 1, paren_index - 1) - sub(/[^0-9A-Z_a-z]*$/, "", name) - sub(/[ ]+PARAMS/, "", name) - sub(/[ ]+VPROTO/, "", name) - sub(/.*[^0-9A-Z_a-z]/, "", name) - - args = substr($0, paren_index) - sub(/msgid[,)].*/, "", args) - for (n = 1; sub(/^[^,]*,/, "", args); n++) { - continue; - } - - if (n == 1) { - keyword = name - } else { - keyword = name ":" n - } - - if (! keyword_seen[keyword]++) { - print "--keyword=" keyword - } - } -' -keyword_options=`( - cd $directory && - $AWK "$generate_keyword_options" $files < /dev/null -)` || exit - -# Generate temporary file reflecting the %e strings in the scanned files. -tmp=tmp-emsgids.c - -generate_emsgids=' - /%e.*}/ { - line = $0 - while ((percent_index = index(line, "%e")) != 0) { - line = substr(line, percent_index + 2) - bracket_index = index(line, "}") - if (bracket_index == 0) { - continue - } - msgid = substr(line, 1, bracket_index - 1) - if (index(msgid, "%") != 0) { - continue - } - printf "#line %d \"%s\"\n", FNR, FILENAME - printf "_(\"%s\")\n", msgid - line = substr(line, bracket_index + 1) - } - } -' -(cd $directory && - $AWK "$generate_emsgids" $files < /dev/null -) > $directory/$tmp || exit - -# Run the xgettext command, with temporary added as a file to scan. -"$xgettext" $keyword_options ${1+"$@"} $tmp || exit - -# Clean up. -# If we don't get here, `make clean' will remove this file later. -rm -f $directory/$tmp diff --git a/contrib/gcc/extend.texi b/contrib/gcc/extend.texi deleted file mode 100644 index f969f65b1892..000000000000 --- a/contrib/gcc/extend.texi +++ /dev/null @@ -1,3782 +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 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. -* 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. -* Deprecated Features:: Things might disappear from g++. -@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. -* 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. -* Deprecated Features:: Things might disappear from g++. -@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). - -@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. - -@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. Among these usages are: use of varargs, use of -alloca, use of variable sized data types (@pxref{Variable Length}), -use of computed goto (@pxref{Labels as Values}), use of nonlocal goto, -and nested functions (@pxref{Nested Functions}). Using @samp{-Winline} -will warn when a function marked @code{inline} could not be substituted, -and will give the reason for the failure. - -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; @}) -@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}. - -@subsection i386 floating point asm operands - -There are several rules on the usage of stack-like regs in -asm_operands insns. These rules apply only to the operands that are -stack-like regs: - -@enumerate -@item -Given a set of input regs that die in an asm_operands, it is -necessary to know which are implicitly popped by the asm, and -which must be explicitly popped by gcc. - -An input reg that is implicitly popped by the asm must be -explicitly clobbered, unless it is constrained to match an -output operand. - -@item -For any input reg that is implicitly popped by an asm, it is -necessary to know how to adjust the stack to compensate for the pop. -If any non-popped input is closer to the top of the reg-stack than -the implicitly popped reg, it would not be possible to know what the -stack looked like --- it's not clear how the rest of the stack ``slides -up''. - -All implicitly popped input regs must be closer to the top of -the reg-stack than any input that is not implicitly popped. - -It is possible that if an input dies in an insn, reload might -use the input reg for an output reload. Consider this example: - -@example -asm ("foo" : "=t" (a) : "f" (b)); -@end example - -This asm says that input B is not popped by the asm, and that -the asm pushes a result onto the reg-stack, ie, the stack is one -deeper after the asm than it was before. But, it is possible that -reload will think that it can use the same reg for both the input and -the output, if input B dies in this insn. - -If any input operand uses the @code{f} constraint, all output reg -constraints must use the @code{&} earlyclobber. - -The asm above would be written as - -@example -asm ("foo" : "=&t" (a) : "f" (b)); -@end example - -@item -Some operands need to be in particular places on the stack. All -output operands fall in this category --- there is no other way to -know which regs the outputs appear in unless the user indicates -this in the constraints. - -Output operands must specifically indicate which reg an output -appears in after an asm. @code{=f} is not allowed: the operand -constraints must select a class with a single reg. - -@item -Output operands may not be ``inserted'' between existing stack regs. -Since no 387 opcode uses a read/write operand, all output operands -are dead before the asm_operands, and are pushed by the asm_operands. -It makes no sense to push anywhere but the top of the reg-stack. - -Output operands must start at the top of the reg-stack: output -operands may not ``skip'' a reg. - -@item -Some asm statements may need extra stack space for internal -calculations. This can be guaranteed by clobbering stack registers -unrelated to the inputs and outputs. - -@end enumerate - -Here are a couple of reasonable asms to want to write. This asm -takes one input, which is internally popped, and produces two outputs. - -@example -asm ("fsincos" : "=t" (cos), "=u" (sin) : "0" (inp)); -@end example - -This asm takes two inputs, which are popped by the @code{fyl2xp1} opcode, -and replaces them with one output. The user must code the @code{st(1)} -clobber for reg-stack.c to know that @code{fyl2xp1} pops both inputs. - -@example -asm ("fyl2xp1" : "=t" (result) : "0" (x), "u" (y) : "st(1)"); -@end example - -@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 - -@findex __extension__ -@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 Deprecated Features -@section Deprecated Features - -In the past, the GNU C++ compiler was extended to experiment with new -features, at a time when the C++ language was still evolving. Now that -the C++ standard is complete, some of those features are superceded by -superior alternatives. Using the old features might cause a warning in -some cases that the feature will be dropped in the future. In other -cases, the feature might be gone already. - -While the list below is not exhaustive, it documents some of the options -that are now deprecated: - -@table @code -@item -fthis-is-variable -In early versions of C++, assignment to this could be used to implement -application-defined memory allocation. Now, allocation functions -(@samp{operator new}) are the standard-conforming way to achieve the -same effect. - -@item -fexternal-templates -@itemx -falt-external-templates -These are two of the many ways for g++ to implement template -instantiation. @xref{Template Instantiation}. The C++ standard clearly -defines how template definitions have to be organized across -implementation units. g++ has an implicit instantiation mechanism that -should work just fine for standard-conforming code. - -@end table - -@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/contrib/gcc/f/BUGS b/contrib/gcc/f/BUGS deleted file mode 100644 index 6f04b2b08f79..000000000000 --- a/contrib/gcc/f/BUGS +++ /dev/null @@ -1,159 +0,0 @@ -*Note:* This file is automatically generated from the files -`bugs0.texi' and `bugs.texi'. `BUGS' is *not* a source file, although -it is normally included within source distributions. - - This file lists known bugs in the GCC-2.95 version of the GNU -Fortran compiler. Copyright (C) 1995-1999 Free Software Foundation, -Inc. You may copy, distribute, and modify it freely as long as you -preserve this copyright notice and permission notice. - -Known Bugs In GNU Fortran -************************* - - This section identifies bugs that `g77' *users* might run into in -the GCC-2.95 version of `g77'. This includes bugs that are actually in -the `gcc' back end (GBE) or in `libf2c', because those sets of code are -at least somewhat under the control of (and necessarily intertwined -with) `g77', so it isn't worth separating them out. - - For information on bugs in *other* versions of `g77', see -`egcs/gcc/f/NEWS'. There, lists of bugs fixed in various versions of -`g77' can help determine what bugs existed in prior versions. - - *Warning:* The information below is still under development, and -might not accurately reflect the `g77' code base of which it is a part. -Efforts are made to keep it somewhat up-to-date, but they are -particularly concentrated on any version of this information that is -distributed as part of a *released* `g77'. - - In particular, while this information is intended to apply to the -GCC-2.95 version of `g77', only an official *release* of that version -is expected to contain documentation that is most consistent with the -`g77' product in that version. - - An online, "live" version of this document (derived directly from -the mainline, development version of `g77' within `egcs') is available -via `http://www.gnu.org/software/gcc/onlinedocs/g77_bugs.html'. Follow the -"Known Bugs" link. - - For information on bugs that might afflict people who configure, -port, build, and install `g77', see "Problems Installing" in -`egcs/gcc/f/INSTALL'. - - The following information was last updated on 1999-06-29: - - * `g77' fails to warn about use of a "live" iterative-DO variable as - an implied-DO variable in a `WRITE' or `PRINT' statement (although - it does warn about this in a `READ' statement). - - * Something about `g77''s straightforward handling of label - references and definitions sometimes prevents the GBE from - unrolling loops. Until this is solved, try inserting or removing - `CONTINUE' statements as the terminal statement, using the `END DO' - form instead, and so on. - - * Some confusion in diagnostics concerning failing `INCLUDE' - statements from within `INCLUDE''d or `#include''d files. - - * `g77' assumes that `INTEGER(KIND=1)' constants range from `-2**31' - to `2**31-1' (the range for two's-complement 32-bit values), - instead of determining their range from the actual range of the - type for the configuration (and, someday, for the constant). - - Further, it generally doesn't implement the handling of constants - very well in that it makes assumptions about the configuration - that it no longer makes regarding variables (types). - - Included with this item is the fact that `g77' doesn't recognize - that, on IEEE-754/854-compliant systems, `0./0.' should produce a - NaN and no warning instead of the value `0.' and a warning. This - is to be fixed in version 0.6, when `g77' will use the `gcc' back - end's constant-handling mechanisms to replace its own. - - * `g77' uses way too much memory and CPU time to process large - aggregate areas having any initialized elements. - - For example, `REAL A(1000000)' followed by `DATA A(1)/1/' takes up - way too much time and space, including the size of the generated - assembler file. This is to be mitigated somewhat in version 0.6. - - Version 0.5.18 improves cases like this--specifically, cases of - *sparse* initialization that leave large, contiguous areas - uninitialized--significantly. However, even with the - improvements, these cases still require too much memory and CPU - time. - - (Version 0.5.18 also improves cases where the initial values are - zero to a much greater degree, so if the above example ends with - `DATA A(1)/0/', the compile-time performance will be about as good - as it will ever get, aside from unrelated improvements to the - compiler.) - - Note that `g77' does display a warning message to notify the user - before the compiler appears to hang. - - * `g77' doesn't emit variable and array members of common blocks for - use with a debugger (the `-g' command-line option). The code is - present to do this, but doesn't work with at least one debug - format--perhaps it works with others. And it turns out there's a - similar bug for local equivalence areas, so that has been disabled - as well. - - As of Version 0.5.19, a temporary kludge solution is provided - whereby some rudimentary information on a member is written as a - string that is the member's value as a character string. - - * When debugging, after starting up the debugger but before being - able to see the source code for the main program unit, the user - must currently set a breakpoint at `MAIN__' (or `MAIN___' or - `MAIN_' if `MAIN__' doesn't exist) and run the program until it - hits the breakpoint. At that point, the main program unit is - activated and about to execute its first executable statement, but - that's the state in which the debugger should start up, as is the - case for languages like C. - - * Debugging `g77'-compiled code using debuggers other than `gdb' is - likely not to work. - - Getting `g77' and `gdb' to work together is a known - problem--getting `g77' to work properly with other debuggers, for - which source code often is unavailable to `g77' developers, seems - like a much larger, unknown problem, and is a lower priority than - making `g77' and `gdb' work together properly. - - On the other hand, information about problems other debuggers have - with `g77' output might make it easier to properly fix `g77', and - perhaps even improve `gdb', so it is definitely welcome. Such - information might even lead to all relevant products working - together properly sooner. - - * `g77' doesn't work perfectly on 64-bit configurations such as the - Digital Semiconductor ("DEC") Alpha. - - This problem is largely resolved as of version 0.5.23. Version - 0.6 should solve most or all remaining problems (such as - cross-compiling involving 64-bit machines). - - * `g77' currently inserts needless padding for things like `COMMON - A,IPAD' where `A' is `CHARACTER*1' and `IPAD' is `INTEGER(KIND=1)' - on machines like x86, because the back end insists that `IPAD' be - aligned to a 4-byte boundary, but the processor has no such - requirement (though it is usually good for performance). - - The `gcc' back end needs to provide a wider array of - specifications of alignment requirements and preferences for - targets, and front ends like `g77' should take advantage of this - when it becomes available. - - * The `libf2c' routines that perform some run-time arithmetic on - `COMPLEX' operands were modified circa version 0.5.20 of `g77' to - work properly even in the presence of aliased operands. - - While the `g77' and `netlib' versions of `libf2c' differ on how - this is accomplished, the main differences are that we believe the - `g77' version works properly even in the presence of *partially* - aliased operands. - - However, these modifications have reduced performance on targets - such as x86, due to the extra copies of operands involved. - diff --git a/contrib/gcc/f/INSTALL b/contrib/gcc/f/INSTALL deleted file mode 100644 index 91858800958d..000000000000 --- a/contrib/gcc/f/INSTALL +++ /dev/null @@ -1,352 +0,0 @@ -*Note:* This file is automatically generated from the files -`install0.texi' and `g77install.texi'. `INSTALL' is *not* a source -file, although it is normally included within source distributions. - - This file contains installation information for the GNU Fortran -compiler. Copyright (C) {No Value For "copyrights-install"} Free -Software Foundation, Inc. You may copy, distribute, and modify it -freely as long as you preserve this copyright notice and permission -notice. - -Installing GNU Fortran -********************** - - The following information describes how to install `g77'. - - Note that, for users of the GCC-2.95 version of `g77', much of the -information is obsolete, and is superceded by the GCC installation -procedures. Such information is accordingly omitted and flagged as -such. - - *Warning:* The information below is still under development, and -might not accurately reflect the `g77' code base of which it is a part. -Efforts are made to keep it somewhat up-to-date, but they are -particularly concentrated on any version of this information that is -distributed as part of a *released* `g77'. - - In particular, while this information is intended to apply to the -GCC-2.95 version of `g77', only an official *release* of that version -is expected to contain documentation that is most consistent with the -`g77' product in that version. - - The following information was last updated on 1999-07-17: - -Prerequisites -============= - - For users of the GCC-2.95 version of `g77', this information is -superceded by the GCC installation instructions. - -Problems Installing -=================== - - This is a list of problems (and some apparent problems which don't -really mean anything is wrong) that show up when configuring, building, -installing, or porting GNU Fortran. - - *Note Installation Problems: (gcc)Installation Problems, for more -information on installation problems that can afflict either `gcc' or -`g77'. - -General Problems ----------------- - - These problems can occur on most or all systems. - -GNU C Required -.............. - - Compiling `g77' requires GNU C, not just ANSI C. Fixing this -wouldn't be very hard (just tedious), but the code using GNU extensions -to the C language is expected to be rewritten for 0.6 anyway, so there -are no plans for an interim fix. - - This requirement does not mean you must already have `gcc' installed -to build `g77'. As long as you have a working C compiler, you can use a -"bootstrap" build to automate the process of first building `gcc' using -the working C compiler you have, then building `g77' and rebuilding -`gcc' using that just-built `gcc', and so on. - -Patching GNU CC -............... - - `g77' no longer requires application of a patch file to the `gcc' -compiler tree. In fact, no such patch file is distributed with `g77'. -This is as of version 0.5.23 and `egcs' version 1.0. - -Building GNU CC Necessary -......................... - - It should be possible to build the runtime without building `cc1' -and other non-Fortran items, but, for now, an easy way to do that is -not yet established. - -Missing strtoul or bsearch -.......................... - - This information does not apply to the GCC-2.95 version of `g77', - -Cleanup Kills Stage Directories -............................... - - It'd be helpful if `g77''s `Makefile.in' or `Make-lang.in' would -create the various `stageN' directories and their subdirectories, so -developers and expert installers wouldn't have to reconfigure after -cleaning up. - - That help has arrived as of version 0.5.23 of `g77' and version 1.1 -of `egcs'. Configuration itself no longer creates any particular -directories that are unique to `g77'. The build procedures in -`Make-lang.in' take care of that, on demand. - -LANGUAGES Macro Ignored -....................... - - Prior to version 0.5.23 of `g77' and version 1.1 of `egcs', `g77' -would sometimes ignore the absence of `f77' and `F77' in the -`LANGUAGES' macro definition used for the `make' command being -processed. - - As of `g77' version 0.5.23 and `egcs' version 1.1, `g77' now obeys -this macro in all relevant situations. - - However, in versions of `gcc' through 2.8.1, non-`g77' portions of -`gcc', such as `g++', are known to go ahead and perform various -language-specific activities when their respective language strings do -not appear in the `LANGUAGES' macro in effect during that invocation of -`make'. - - It is expected that these remaining problems will be fixed in a -future version of `gcc'. - -System-specific Problems ------------------------- - - A linker bug on some versions of AIX 4.1 might prevent building when -`g77' is built within `gcc'. It might also occur when building within -`egcs'. - -Cross-compiler Problems ------------------------ - - `g77' has been in alpha testing since September of 1992, and in -public beta testing since February of 1995. Alpha testing was done by -a small number of people worldwide on a fairly wide variety of -machines, involving self-compilation in most or all cases. Beta -testing has been done primarily via self-compilation, but in more and -more cases, cross-compilation (and "criss-cross compilation", where a -version of a compiler is built on one machine to run on a second and -generate code that runs on a third) has been tried and has succeeded, -to varying extents. - - Generally, `g77' can be ported to any configuration to which `gcc', -`f2c', and `libf2c' can be ported and made to work together, aside from -the known problems described in this manual. If you want to port `g77' -to a particular configuration, you should first make sure `gcc' and -`libf2c' can be ported to that configuration before focusing on `g77', -because `g77' is so dependent on them. - - Even for cases where `gcc' and `libf2c' work, you might run into -problems with cross-compilation on certain machines, for several -reasons. - - * There is one known bug (a design bug to be fixed in 0.6) that - prevents configuration of `g77' as a cross-compiler in some cases, - though there are assumptions made during configuration that - probably make doing non-self-hosting builds a hassle, requiring - manual intervention. - - * `gcc' might still have some trouble being configured for certain - combinations of machines. For example, it might not know how to - handle floating-point constants. - - * Improvements to the way `libg2c' is built could make building - `g77' as a cross-compiler easier--for example, passing and using - `$(LD)' and `$(AR)' in the appropriate ways. (This is improved in - the `egcs' version of `g77', especially as of version 1.1.) - - * There are still some challenges putting together the right - run-time libraries (needed by `libg2c') for a target system, - depending on the systems involved in the configuration. (This is - a general problem with cross-compilation, and with `gcc' in - particular.) - -Changing Settings Before Building -================================= - - Here are some internal `g77' settings that can be changed by editing -source files in `egcs/gcc/f/' before building. - - This information, and perhaps even these settings, represent -stop-gap solutions to problems people doing various ports of `g77' have -encountered. As such, none of the following information is expected to -be pertinent in future versions of `g77'. - -Larger File Unit Numbers ------------------------- - - As distributed, whether as part of `f2c' or `g77', `libf2c' accepts -file unit numbers only in the range 0 through 99. For example, a -statement such as `WRITE (UNIT=100)' causes a run-time crash in -`libf2c', because the unit number, 100, is out of range. - - If you know that Fortran programs at your installation require the -use of unit numbers higher than 99, you can change the value of the -`MXUNIT' macro, which represents the maximum unit number, to an -appropriately higher value. - - To do this, edit the file `egcs/libf2c/libI77/fio.h' in your `g77' -source tree, changing the following line: - - #define MXUNIT 100 - - Change the line so that the value of `MXUNIT' is defined to be at -least one *greater* than the maximum unit number used by the Fortran -programs on your system. - - (For example, a program that does `WRITE (UNIT=255)' would require -`MXUNIT' set to at least 256 to avoid crashing.) - - Then build or rebuild `g77' as appropriate. - - *Note:* Changing this macro has *no* effect on other limits your -system might place on the number of files open at the same time. That -is, the macro might allow a program to do `WRITE (UNIT=100)', but the -library and operating system underlying `libf2c' might disallow it if -many other files have already been opened (via `OPEN' or implicitly via -`READ', `WRITE', and so on). Information on how to increase these -other limits should be found in your system's documentation. - -Always Flush Output -------------------- - - Some Fortran programs require output (writes) to be flushed to the -operating system (under UNIX, via the `fflush()' library call) so that -errors, such as disk full, are immediately flagged via the relevant -`ERR=' and `IOSTAT=' mechanism, instead of such errors being flagged -later as subsequent writes occur, forcing the previously written data -to disk, or when the file is closed. - - Essentially, the difference can be viewed as synchronous error -reporting (immediate flagging of errors during writes) versus -asynchronous, or, more precisely, buffered error reporting (detection -of errors might be delayed). - - `libg2c' supports flagging write errors immediately when it is built -with the `ALWAYS_FLUSH' macro defined. This results in a `libg2c' that -runs slower, sometimes quite a bit slower, under certain -circumstances--for example, accessing files via the networked file -system NFS--but the effect can be more reliable, robust file I/O. - - If you know that Fortran programs requiring this level of precision -of error reporting are to be compiled using the version of `g77' you -are building, you might wish to modify the `g77' source tree so that -the version of `libg2c' is built with the `ALWAYS_FLUSH' macro defined, -enabling this behavior. - - To do this, find this line in `egcs/libf2c/f2c.h' in your `g77' -source tree: - - /* #define ALWAYS_FLUSH */ - - Remove the leading `/* ', so the line begins with `#define', and the -trailing ` */'. - - Then build or rebuild `g77' as appropriate. - -Maximum Stackable Size ----------------------- - - `g77', on most machines, puts many variables and arrays on the stack -where possible, and can be configured (by changing -`FFECOM_sizeMAXSTACKITEM' in `egcs/gcc/f/com.c') to force smaller-sized -entities into static storage (saving on stack space) or permit -larger-sized entities to be put on the stack (which can improve -run-time performance, as it presents more opportunities for the GBE to -optimize the generated code). - - *Note:* Putting more variables and arrays on the stack might cause -problems due to system-dependent limits on stack size. Also, the value -of `FFECOM_sizeMAXSTACKITEM' has no effect on automatic variables and -arrays. *Note But-bugs::, for more information. - -Floating-point Bit Patterns ---------------------------- - - The `g77' build will crash if an attempt is made to build it as a -cross-compiler for a target when `g77' cannot reliably determine the -bit pattern of floating-point constants for the target. Planned -improvements for version 0.6 of `g77' will give it the capabilities it -needs to not have to crash the build but rather generate correct code -for the target. (Currently, `g77' would generate bad code under such -circumstances if it didn't crash during the build, e.g. when compiling -a source file that does something like `EQUIVALENCE (I,R)' and `DATA -R/9.43578/'.) - -Initialization of Large Aggregate Areas ---------------------------------------- - - A warning message is issued when `g77' sees code that provides -initial values (e.g. via `DATA') to an aggregate area (`COMMON' or -`EQUIVALENCE', or even a large enough array or `CHARACTER' variable) -that is large enough to increase `g77''s compile time by roughly a -factor of 10. - - This size currently is quite small, since `g77' currently has a -known bug requiring too much memory and time to handle such cases. In -`egcs/gcc/f/data.c', the macro `FFEDATA_sizeTOO_BIG_INIT_' is defined -to the minimum size for the warning to appear. The size is specified -in storage units, which can be bytes, words, or whatever, on a -case-by-case basis. - - After changing this macro definition, you must (of course) rebuild -and reinstall `g77' for the change to take effect. - - Note that, as of version 0.5.18, improvements have reduced the scope -of the problem for *sparse* initialization of large arrays, especially -those with large, contiguous uninitialized areas. However, the warning -is issued at a point prior to when `g77' knows whether the -initialization is sparse, and delaying the warning could mean it is -produced too late to be helpful. - - Therefore, the macro definition should not be adjusted to reflect -sparse cases. Instead, adjust it to generate the warning when densely -initialized arrays begin to cause responses noticeably slower than -linear performance would suggest. - -Alpha Problems Fixed --------------------- - - `g77' used to warn when it was used to compile Fortran code for a -target configuration that is not basically a 32-bit machine (such as an -Alpha, which is a 64-bit machine, especially if it has a 64-bit -operating system running on it). That was because `g77' was known to -not work properly on such configurations. - - As of version 0.5.20, `g77' is believed to work well enough on such -systems. So, the warning is no longer needed or provided. - - However, support for 64-bit systems, especially in areas such as -cross-compilation and handling of intrinsics, is still incomplete. The -symptoms are believed to be compile-time diagnostics rather than the -generation of bad code. It is hoped that version 0.6 will completely -support 64-bit systems. - -Quick Start -=========== - - For users of the GCC-2.95 version of `g77', this information is -superceded by the GCC installation instructions. - -Complete Installation -===================== - - For users of the GCC-2.95 version of `g77', this information is -superceded by the GCC installation instructions. - -Distributing Binaries -===================== - - For users of the GCC-2.95 version of `g77', this information is -superceded by the GCC installation instructions. - diff --git a/contrib/gcc/f/Makefile.in b/contrib/gcc/f/Makefile.in deleted file mode 100644 index 96975a5d7cdb..000000000000 --- a/contrib/gcc/f/Makefile.in +++ /dev/null @@ -1,529 +0,0 @@ -# Makefile for GNU F77 compiler. -# Copyright (C) 1995-1998 Free Software Foundation, Inc. - -#This file is part of GNU Fortran. - -#GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -#the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -#02111-1307, USA. - -# The makefile built from this file lives in the language subdirectory. -# Its purpose is to provide support for: -# -# 1) recursion where necessary, and only then (building .o's), and -# 2) building and debugging f771 from the language subdirectory, and -# 3) nothing else. -# -# The parent makefile handles all other chores, with help from the -# language makefile fragment, of course. -# -# The targets for external use are: -# all, TAGS, ???mostlyclean, ???clean. - -# Suppress smart makes who think they know how to automake Yacc files -.y.c: - -# Variables that exist for you to override. -# See below for how to change them for certain systems. - -ALLOCA = - -# 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 -# XCFLAGS is used for most compilations but not when using the GCC just built. -XCFLAGS = -CFLAGS = -g -BOOT_CFLAGS = -O $(CFLAGS) -# These exists to be overridden by the x-* and t-* files, respectively. -X_CFLAGS = -T_CFLAGS = - -X_CPPFLAGS = -T_CPPFLAGS = - -CC = @CC@ -BISON = bison -BISONFLAGS = -LEX = flex -LEXFLAGS = -AR = ar -AR_FLAGS = rc -SHELL = /bin/sh -MAKEINFO = makeinfo -TEXI2DVI = texi2dvi - -# 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 = - -# This is used in the definition of SUBDIR_USE_ALLOCA. -# ??? Perhaps it would be better if it just looked for *gcc*. -OLDCC = cc - -# This is used instead of ALL_CFLAGS when compiling with GCC_FOR_TARGET. -# It omits XCFLAGS, and specifies -B./. -# It also specifies -B$(tooldir)/ to find as and ld for a cross compiler. -GCC_CFLAGS=$(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) - -# Tools to use when building a cross-compiler. -# These are used because `configure' appends `cross-make' -# to the makefile when making a cross-compiler. - -target=@target@ -xmake_file=@dep_host_xmake_file@ -tmake_file=@dep_tmake_file@ - -# Directory where sources are, from where we are. -srcdir = @srcdir@ -VPATH = @srcdir@ - -# Additional system libraries to link with. -CLIB= - -# Change this to a null string if obstacks are installed in the -# system library. -OBSTACK=obstack.o - -# Choose the real default target. -ALL=all - -# 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. -all: all.indirect - -# 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@ -# -# Now figure out from those variables how to compile and link. - -all.indirect: Makefile ../f771$(exeext) - -# IN_GCC tells obstack.h that we are using gcc's <stddef.h> file. -INTERNAL_CFLAGS = $(CROSS) -DIN_GCC @extra_c_flags@ - -# This is the variable actually used when we compile. -ALL_CFLAGS = $(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) $(XCFLAGS) -W -Wall - -# Likewise. -ALL_CPPFLAGS = $(CPPFLAGS) $(X_CPPFLAGS) $(T_CPPFLAGS) - -# We should be compiling with the built compiler, for which -# BOOT_LDFLAGS is appropriate. (Formerly we had a separate -# F771_LDFLAGS, but the ld flags can be taken care of by the target -# configuration files in egcs.) -LDFLAGS=$(BOOT_LDFLAGS) - -# Even if ALLOCA is set, don't use it if compiling with GCC. - -SUBDIR_OBSTACK = `if [ x$(OBSTACK) != x ]; then echo ../$(OBSTACK); else true; fi` -SUBDIR_USE_ALLOCA = `case "${CC}" in "${OLDCC}") if [ x$(ALLOCA) != x ]; then echo ../$(ALLOCA); else true; fi ;; esac` -SUBDIR_MALLOC = `if [ x$(MALLOC) != x ]; then echo ../$(MALLOC); else true; fi` - -# How to link with both our special library facilities -# and the system's installed libraries. -LIBS = $(SUBDIR_OBSTACK) $(SUBDIR_USE_ALLOCA) $(SUBDIR_MALLOC) $(CLIB) - -# 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.. -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../config -I$(srcdir)/../../include - -# Always use -I$(srcdir)/config when compiling. -.c.o: - $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< - -# -# Lists of files for various purposes. - -# Language-specific object files for g77 - -F77_OBJS = \ - bad.o \ - bit.o \ - bld.o \ - com.o \ - data.o \ - equiv.o \ - expr.o \ - global.o \ - implic.o \ - info.o \ - intrin.o \ - lab.o \ - lex.o \ - malloc.o \ - name.o \ - parse.o \ - proj.o \ - src.o \ - st.o \ - sta.o \ - stb.o \ - stc.o \ - std.o \ - ste.o \ - storag.o \ - stp.o \ - str.o \ - sts.o \ - stt.o \ - stu.o \ - stv.o \ - stw.o \ - symbol.o \ - target.o \ - top.o \ - type.o \ - version.o \ - where.o - -# Language-independent object files. -OBJS = `cat ../stamp-objlist` -OBJDEPS = ../stamp-objlist - -compiler: ../f771$(exeext) -../f771$(exeext): $(P) $(F77_OBJS) $(OBJDEPS) $(LIBDEPS) - rm -f f771$(exeext) - $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(F77_OBJS) $(OBJS) $(LIBS) - -Makefile: $(srcdir)/Makefile.in $(srcdir)/../configure - cd ..; $(SHELL) config.status - -native: config.status ../f771$(exeext) -# -# Compiling object files from source files. - -# Note that dependencies on obstack.h are not written -# because that file is not part of GCC. - -# F77 language-specific files. - -# These macros expand to the corresponding g77-source .j files plus -# the gcc-source files involved (each file itself, plus whatever -# files on which it depends, but without including stuff resulting -# from configuration, since we can't guess at that). The files -# that live in a distclean'd gcc source directory have "$(srcdir)/" -# prefixes, while the others don't because they'll be created -# only in the build directory. -ASSERT_H = $(srcdir)/assert.j $(srcdir)/../assert.h -CONFIG_H = $(srcdir)/config.j ../config.h -CONVERT_H = $(srcdir)/convert.j $(srcdir)/../convert.h -FLAGS_H = $(srcdir)/flags.j $(srcdir)/../flags.h -GLIMITS_H = $(srcdir)/glimits.j $(srcdir)/../glimits.h -HCONFIG_H = $(srcdir)/hconfig.j ../hconfig.h -INPUT_H = $(srcdir)/input.j $(srcdir)/../input.h -OUTPUT_H = $(srcdir)/output.j $(srcdir)/../output.h -RTL_H = $(srcdir)/rtl.j $(srcdir)/../rtl.h $(srcdir)/../rtl.def \ - $(srcdir)/../machmode.h $(srcdir)/../machmode.def -SYSTEM_H = $(srcdir)/system.j $(srcdir)/../system.h -TCONFIG_H = $(srcdir)/tconfig.j ../tconfig.h -TM_H = $(srcdir)/tm.j ../tm.h -TOPLEV_H = $(srcdir)/toplev.j $(srcdir)/../toplev.h -TREE_H = $(srcdir)/tree.j $(srcdir)/../tree.h $(srcdir)/../real.h \ - $(srcdir)/../tree.def $(srcdir)/../machmode.h $(srcdir)/../machmode.def - -#Build the first part of this list with the command line: -# cd gcc/; make deps-kinda -f f/Makefile.in -#Note that this command uses the host C compiler; -# use HOST_CC="./xgcc -B./" to use GCC in the build directory, for example. -#Also note that this particular build file seems to want to use -# substitions: $(CONFIG_H) for config.h; $(TREE_H) for tree.h; -# $(RTL_H) for rtl.h; etc.. deps-kinda uses a sed script to do those -# substitutions, plus others for elegance. - -ansify.o: ansify.c $(HCONFIG_H) $(SYSTEM_H) $(ASSERT_H) -bad.o: bad.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) bad.h bad.def where.h \ - $(GLIMITS_H) top.h malloc.h $(FLAGS_H) com.h com-rt.def $(TREE_H) bld.h \ - bld-op.def bit.h info.h info-b.def info-k.def info-w.def target.h \ - lex.h type.h intrin.h intrin.def lab.h symbol.h symbol.def equiv.h \ - storag.h global.h name.h $(TOPLEV_H) -bit.o: bit.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) $(GLIMITS_H) bit.h \ - malloc.h -bld.o: bld.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) bld.h bld-op.def bit.h \ - malloc.h com.h com-rt.def $(TREE_H) info.h info-b.def info-k.def \ - info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h lex.h \ - type.h lab.h storag.h symbol.h symbol.def equiv.h global.h name.h \ - intrin.h intrin.def -com.o: com.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) $(FLAGS_H) $(RTL_H) $(TOPLEV_H) \ - $(TREE_H) $(OUTPUT_H) $(CONVERT_H) com.h com-rt.def bld.h bld-op.def bit.h \ - malloc.h info.h info-b.def info-k.def info-w.def target.h bad.h \ - bad.def where.h $(GLIMITS_H) top.h lex.h type.h intrin.h intrin.def \ - lab.h symbol.h symbol.def equiv.h storag.h global.h name.h expr.h \ - implic.h src.h st.h -data.o: data.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) data.h bld.h \ - bld-op.def bit.h malloc.h com.h com-rt.def $(TREE_H) info.h info-b.def \ - info-k.def info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h \ - lex.h type.h lab.h storag.h symbol.h symbol.def equiv.h global.h \ - name.h intrin.h intrin.def expr.h st.h -equiv.o: equiv.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) equiv.h bld.h \ - bld-op.def bit.h malloc.h com.h com-rt.def $(TREE_H) info.h info-b.def \ - info-k.def info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h \ - lex.h type.h lab.h storag.h symbol.h symbol.def global.h name.h \ - intrin.h intrin.def data.h -expr.o: expr.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) expr.h bld.h \ - bld-op.def bit.h malloc.h com.h com-rt.def $(TREE_H) info.h info-b.def \ - info-k.def info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h \ - lex.h type.h lab.h storag.h symbol.h symbol.def equiv.h global.h \ - name.h intrin.h intrin.def implic.h src.h st.h stamp-str -fini.o: fini.c proj.h $(HCONFIG_H) $(SYSTEM_H) $(ASSERT_H) malloc.h -global.o: global.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) global.h info.h \ - info-b.def info-k.def info-w.def target.h $(TREE_H) bad.h bad.def \ - where.h $(GLIMITS_H) top.h malloc.h lex.h type.h name.h symbol.h \ - symbol.def bld.h bld-op.def bit.h com.h com-rt.def lab.h storag.h \ - intrin.h intrin.def equiv.h -implic.o: implic.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) implic.h info.h \ - info-b.def info-k.def info-w.def target.h $(TREE_H) bad.h bad.def \ - where.h $(GLIMITS_H) top.h malloc.h lex.h type.h symbol.h symbol.def \ - bld.h bld-op.def bit.h com.h com-rt.def lab.h storag.h intrin.h \ - intrin.def equiv.h global.h name.h src.h -info.o: info.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) info.h info-b.def \ - info-k.def info-w.def target.h $(TREE_H) bad.h bad.def where.h $(GLIMITS_H) \ - top.h malloc.h lex.h type.h -intdoc.o: intdoc.c $(HCONFIG_H) $(SYSTEM_H) $(ASSERT_H) intrin.h intrin.def \ - intdoc.h0 intdoc.h0 -intrin.o: intrin.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) intrin.h \ - intrin.def bld.h bld-op.def bit.h malloc.h com.h com-rt.def $(TREE_H) \ - info.h info-b.def info-k.def info-w.def target.h bad.h bad.def \ - where.h $(GLIMITS_H) top.h lex.h type.h lab.h storag.h symbol.h \ - symbol.def equiv.h global.h name.h expr.h src.h -lab.o: lab.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) lab.h com.h com-rt.def \ - $(TREE_H) bld.h bld-op.def bit.h malloc.h info.h info-b.def info-k.def \ - info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h lex.h \ - type.h intrin.h intrin.def symbol.h symbol.def equiv.h storag.h \ - global.h name.h -lex.o: lex.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) top.h malloc.h where.h \ - $(GLIMITS_H) bad.h bad.def com.h com-rt.def $(TREE_H) bld.h bld-op.def \ - bit.h info.h info-b.def info-k.def info-w.def target.h lex.h type.h \ - intrin.h intrin.def lab.h symbol.h symbol.def equiv.h storag.h \ - global.h name.h src.h $(FLAGS_H) $(INPUT_H) $(TOPLEV_H) $(OUTPUT_H) -malloc.o: malloc.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) malloc.h -name.o: name.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) bad.h bad.def where.h \ - $(GLIMITS_H) top.h malloc.h name.h global.h info.h info-b.def info-k.def \ - info-w.def target.h $(TREE_H) lex.h type.h symbol.h symbol.def bld.h \ - bld-op.def bit.h com.h com-rt.def lab.h storag.h intrin.h intrin.def \ - equiv.h src.h -parse.o: parse.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) top.h malloc.h \ - where.h $(GLIMITS_H) com.h com-rt.def $(TREE_H) bld.h bld-op.def bit.h \ - info.h info-b.def info-k.def info-w.def target.h bad.h bad.def lex.h \ - type.h intrin.h intrin.def lab.h symbol.h symbol.def equiv.h storag.h \ - global.h name.h version.h $(FLAGS_H) -proj.o: proj.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) $(GLIMITS_H) -src.o: src.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) src.h bad.h bad.def \ - where.h $(GLIMITS_H) top.h malloc.h -st.o: st.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) st.h bad.h bad.def \ - where.h $(GLIMITS_H) top.h malloc.h lex.h symbol.h symbol.def bld.h \ - bld-op.def bit.h com.h com-rt.def $(TREE_H) info.h info-b.def info-k.def \ - info-w.def target.h type.h lab.h storag.h intrin.h intrin.def equiv.h \ - global.h name.h sta.h stamp-str stb.h expr.h stp.h stt.h stc.h std.h \ - stv.h stw.h ste.h sts.h stu.h -sta.o: sta.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) sta.h bad.h bad.def \ - where.h $(GLIMITS_H) top.h malloc.h lex.h stamp-str symbol.h symbol.def \ - bld.h bld-op.def bit.h com.h com-rt.def $(TREE_H) info.h info-b.def \ - info-k.def info-w.def target.h type.h lab.h storag.h intrin.h \ - intrin.def equiv.h global.h name.h implic.h stb.h expr.h stp.h stt.h \ - stc.h std.h stv.h stw.h -stb.o: stb.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) stb.h bad.h bad.def \ - where.h $(GLIMITS_H) top.h malloc.h expr.h bld.h bld-op.def bit.h com.h \ - com-rt.def $(TREE_H) info.h info-b.def info-k.def info-w.def target.h \ - lex.h type.h lab.h storag.h symbol.h symbol.def equiv.h global.h \ - name.h intrin.h intrin.def stp.h stt.h stamp-str src.h sta.h stc.h -stc.o: stc.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) stc.h bad.h bad.def \ - where.h $(GLIMITS_H) top.h malloc.h bld.h bld-op.def bit.h com.h \ - com-rt.def $(TREE_H) info.h info-b.def info-k.def info-w.def target.h \ - lex.h type.h lab.h storag.h symbol.h symbol.def equiv.h global.h \ - name.h intrin.h intrin.def expr.h stp.h stt.h stamp-str data.h implic.h \ - src.h sta.h std.h stv.h stw.h -std.o: std.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) std.h bld.h bld-op.def \ - bit.h malloc.h com.h com-rt.def $(TREE_H) info.h info-b.def info-k.def \ - info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h lex.h \ - type.h lab.h storag.h symbol.h symbol.def equiv.h global.h name.h \ - intrin.h intrin.def stp.h stt.h stamp-str stv.h stw.h sta.h ste.h sts.h -ste.o: ste.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) $(RTL_H) $(TOPLEV_H) ste.h \ - bld.h bld-op.def bit.h malloc.h com.h com-rt.def $(TREE_H) info.h \ - info-b.def info-k.def info-w.def target.h bad.h bad.def where.h \ - $(GLIMITS_H) top.h lex.h type.h lab.h storag.h symbol.h symbol.def \ - equiv.h global.h name.h intrin.h intrin.def stp.h stt.h stamp-str sts.h \ - stv.h stw.h expr.h sta.h -storag.o: storag.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) storag.h bld.h \ - bld-op.def bit.h malloc.h com.h com-rt.def $(TREE_H) info.h info-b.def \ - info-k.def info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h \ - lex.h type.h lab.h symbol.h symbol.def equiv.h global.h name.h \ - intrin.h intrin.def data.h -stp.o: stp.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) stp.h bld.h bld-op.def \ - bit.h malloc.h com.h com-rt.def $(TREE_H) info.h info-b.def info-k.def \ - info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h lex.h \ - type.h lab.h storag.h symbol.h symbol.def equiv.h global.h name.h \ - intrin.h intrin.def stt.h -str.o: str.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) src.h bad.h bad.def \ - where.h $(GLIMITS_H) top.h malloc.h stamp-str lex.h -sts.o: sts.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) sts.h malloc.h com.h \ - com-rt.def $(TREE_H) bld.h bld-op.def bit.h info.h info-b.def info-k.def \ - info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h lex.h \ - type.h intrin.h intrin.def lab.h symbol.h symbol.def equiv.h storag.h \ - global.h name.h -stt.o: stt.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) stt.h top.h malloc.h \ - where.h $(GLIMITS_H) bld.h bld-op.def bit.h com.h com-rt.def $(TREE_H) \ - info.h info-b.def info-k.def info-w.def target.h bad.h bad.def lex.h \ - type.h lab.h storag.h symbol.h symbol.def equiv.h global.h name.h \ - intrin.h intrin.def stp.h expr.h sta.h stamp-str -stu.o: stu.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) bld.h bld-op.def bit.h \ - malloc.h com.h com-rt.def $(TREE_H) info.h info-b.def info-k.def \ - info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h lex.h \ - type.h lab.h storag.h symbol.h symbol.def equiv.h global.h name.h \ - intrin.h intrin.def implic.h stu.h sta.h stamp-str -stv.o: stv.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) stv.h lab.h com.h \ - com-rt.def $(TREE_H) bld.h bld-op.def bit.h malloc.h info.h info-b.def \ - info-k.def info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h \ - lex.h type.h intrin.h intrin.def symbol.h symbol.def equiv.h storag.h \ - global.h name.h -stw.o: stw.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) stw.h bld.h bld-op.def \ - bit.h malloc.h com.h com-rt.def $(TREE_H) info.h info-b.def info-k.def \ - info-w.def target.h bad.h bad.def where.h $(GLIMITS_H) top.h lex.h \ - type.h lab.h storag.h symbol.h symbol.def equiv.h global.h name.h \ - intrin.h intrin.def stv.h sta.h stamp-str -symbol.o: symbol.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) symbol.h \ - symbol.def bld.h bld-op.def bit.h malloc.h com.h com-rt.def $(TREE_H) \ - info.h info-b.def info-k.def info-w.def target.h bad.h bad.def \ - where.h $(GLIMITS_H) top.h lex.h type.h lab.h storag.h intrin.h \ - intrin.def equiv.h global.h name.h src.h st.h -target.o: target.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) $(GLIMITS_H) \ - target.h $(TREE_H) bad.h bad.def where.h top.h malloc.h info.h \ - info-b.def info-k.def info-w.def type.h lex.h -top.o: top.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) top.h malloc.h where.h \ - $(GLIMITS_H) bad.h bad.def bit.h bld.h bld-op.def com.h com-rt.def \ - $(TREE_H) info.h info-b.def info-k.def info-w.def target.h lex.h type.h \ - lab.h storag.h symbol.h symbol.def equiv.h global.h name.h intrin.h \ - intrin.def data.h expr.h implic.h src.h st.h $(FLAGS_H) $(TOPLEV_H) -type.o: type.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) type.h malloc.h -version.o: version.c -where.o: where.c proj.h $(CONFIG_H) $(SYSTEM_H) $(ASSERT_H) where.h $(GLIMITS_H) \ - top.h malloc.h lex.h - -# The rest of this list (Fortran 77 language-specific files) is hand-generated. - -stamp-str: str-1t.h str-1t.j str-2t.h str-2t.j \ - str-fo.h str-fo.j str-io.h str-io.j str-nq.h str-nq.j \ - str-op.h str-op.j str-ot.h str-ot.j - touch stamp-str - -str-1t.h str-1t.j: fini str-1t.fin - ./fini `echo $(srcdir)/str-1t.fin | sed 's,^\./,,'` str-1t.j str-1t.h - -str-2t.h str-2t.j: fini str-2t.fin - ./fini `echo $(srcdir)/str-2t.fin | sed 's,^\./,,'` str-2t.j str-2t.h - -str-fo.h str-fo.j: fini str-fo.fin - ./fini `echo $(srcdir)/str-fo.fin | sed 's,^\./,,'` str-fo.j str-fo.h - -str-io.h str-io.j: fini str-io.fin - ./fini `echo $(srcdir)/str-io.fin | sed 's,^\./,,'` str-io.j str-io.h - -str-nq.h str-nq.j: fini str-nq.fin - ./fini `echo $(srcdir)/str-nq.fin | sed 's,^\./,,'` str-nq.j str-nq.h - -str-op.h str-op.j: fini str-op.fin - ./fini `echo $(srcdir)/str-op.fin | sed 's,^\./,,'` str-op.j str-op.h - -str-ot.h str-ot.j: fini str-ot.fin - ./fini `echo $(srcdir)/str-ot.fin | sed 's,^\./,,'` str-ot.j str-ot.h - -fini: fini.o proj-h.o - $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o fini fini.o proj-h.o - -fini.o: - $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) \ - `echo $(srcdir)/fini.c | sed 's,^\./,,'` -o $@ - -# Like proj.o, but depends on hconfig.h instead of config.h. -proj-h.o: proj.c proj.h $(HCONFIG_H) $(SYSTEM_H) $(ASSERT_H) $(GLIMITS_H) - $(HOST_CC) -c -DUSE_HCONFIG $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) \ - `echo $(srcdir)/proj.c | sed 's,^\./,,'` -o $@ - -# Other than str-*.j, the *.j files are dummy #include files -# that normally just #include the corresponding back-end *.h -# files, but not if MAKING_DEPENDENCIES is #defined. The str-*.j -# files also are not actually included if MAKING_DEPENDENCIES -# is #defined. The point of all this is to come up with a clean -# dependencies list whether working in a clean directory, such -# that str-*.j and such do not exist, or in a directory full -# of already-built files. Any dependency on a str-*.j file -# implies a dependency on str.h, so we key on that to replace -# it with stamp-str, and dependencies on the other *.j files -# are generally left alone (modulo special macros like RTL_H) -# because we might not want to recompile all of g77 just -# because a back-end file changes. MG is usually "-MG" but -# should be defined with "make MG= deps-kinda..." if using -# a compiler that doesn't support -MG (gcc does as of 2.6) -- -# it prevents diagnostics when an #include file is missing, -# as will be the case with proj.h in a clean directory. -MG=-MG -deps-kinda: - $(HOST_CC) -DMAKING_DEPENDENCIES -MM $(MG) *.c 2>&1 | \ - sed -e 's: \([.]/\)*assert[.]j: $$(ASSERT_H):g' \ - -e 's: \([.]/\)*config[.]j: $$(CONFIG_H):g' \ - -e 's: \([.]/\)*convert[.]j: $$(CONVERT_H):g' \ - -e 's: \([.]/\)*flags[.]j: $$(FLAGS_H):g' \ - -e 's: \([.]/\)*glimits[.]j: $$(GLIMITS_H):g' \ - -e 's: \([.]/\)*hconfig[.]j: $$(HCONFIG_H):g' \ - -e 's: \([.]/\)*input[.]j: $$(INPUT_H):g' \ - -e 's: \([.]/\)*output[.]j: $$(OUTPUT_H):g' \ - -e 's: \([.]/\)*rtl[.]j: $$(RTL_H):g' \ - -e 's: \([.]/\)*system[.]j: $$(SYSTEM_H):g' \ - -e 's: \([.]/\)*tconfig[.]j: $$(TCONFIG_H):g' \ - -e 's: \([.]/\)*tm[.]j: $$(TM_H):g' \ - -e 's: \([.]/\)*toplev[.]j: $$(TOPLEV_H):g' \ - -e 's: \([.]/\)*tree[.]j: $$(TREE_H):g' \ - -e 's: \([.]/\)*str[.]h: stamp-str:g' \ - -e 's:.*g77spec.*::g' \ - -e 's%^\(.*\)[ ]*: %\1: %g' - -# This rule is just a handy way to build the g77 derived files without -# having the gcc source tree around. -g77-only: force - if [ -f g77.texi ] ; then \ - (cd ..; $(MAKE) srcdir=. HOST_CC=cc HOST_CFLAGS=-g -f f/Make-lang.in f77.rebuilt); \ - else \ - $(MAKE) srcdir=. HOST_CC=cc HOST_CFLAGS=-g -f f/Make-lang.in f77.rebuilt; \ - fi - -# -# These exist for maintenance purposes. - -# Update the tags table. -TAGS: force - cd $(srcdir)/f ; \ - etags *.c *.h ; \ - echo 'l' | tr 'l' '\f' >> TAGS ; \ - etags -a ../*.h ../*.c; - -.PHONY: none all all.indirect f77.rebuilt compiler native deps-kinda g77-only TAGS force - -force: diff --git a/contrib/gcc/f/NEWS b/contrib/gcc/f/NEWS deleted file mode 100644 index b8b524309ca5..000000000000 --- a/contrib/gcc/f/NEWS +++ /dev/null @@ -1,412 +0,0 @@ -*Note:* This file is automatically generated from the files -`news0.texi' and `news.texi'. `NEWS' is *not* a source file, although -it is normally included within source distributions. - - This file lists news about the GCC-2.95 version (and some other -versions) of the GNU Fortran compiler. Copyright (C) 1995-1999 Free -Software Foundation, Inc. You may copy, distribute, and modify it -freely as long as you preserve this copyright notice and permission -notice. - -News About GNU Fortran -********************** - - Changes made to recent versions of GNU Fortran are listed below, -with the most recent version first. - - The changes are generally listed in order: - - 1. Code-generation and run-time-library bug-fixes - - 2. Compiler and run-time-library crashes involving valid code that - have been fixed - - 3. New features - - 4. Fixes and enhancements to existing features - - 5. New diagnostics - - 6. Internal improvements - - 7. Miscellany - - This order is not strict--for example, some items involve a -combination of these elements. - - Note that two variants of `g77' are tracked below. The `egcs' -variant is described vis-a-vis previous versions of `egcs' and/or an -official FSF version, as appropriate. - - Therefore, `egcs' versions sometimes have multiple listings to help -clarify how they differ from other versions, though this can make -getting a complete picture of what a particular `egcs' version contains -somewhat more difficult. - - *Warning:* The information below is still under development, and -might not accurately reflect the `g77' code base of which it is a part. -Efforts are made to keep it somewhat up-to-date, but they are -particularly concentrated on any version of this information that is -distributed as part of a *released* `g77'. - - In particular, while this information is intended to apply to the -GCC-2.95 version of `g77', only an official *release* of that version -is expected to contain documentation that is most consistent with the -`g77' product in that version. - - Nevertheless, information on *previous* releases of `g77', below, is -likely to be more up-to-date and accurate than the equivalent -information that accompanied those releases, assuming the last-updated -date of the information below is later than the dates of those releases. - - That's due to attempts to keep this development version of news -about previous `g77' versions up-to-date. - - An online, "live" version of this document (derived directly from -the mainline, development version of `g77' within `egcs') is available -at `http://www.gnu.org/software/gcc/onlinedocs/g77_news.html'. - - The following information was last updated on 1999-07-08: - -In 0.5.25, `GCC' 2.95 (`EGCS' 1.2) versus `EGCS' 1.1.2: -======================================================= - - 1. `g77' no longer generates bad code for assignments, or other - conversions, of `REAL' or `COMPLEX' constant expressions to type - `INTEGER(KIND=2)' (often referred to as `INTEGER*8'). - - For example, `INTEGER*8 J; J = 4E10' now works as documented. - - 2. `g77' no longer truncates `INTEGER(KIND=2)' (usually `INTEGER*8') - subscript expressions when evaluating array references on systems - with pointers widers than `INTEGER(KIND=1)' (such as Alphas). - - 3. `g77' no longer generates bad code for an assignment to a - `COMPLEX' variable or array that partially overlaps one or more of - the sources of the same assignment (a very rare construction). It - now assigns through a temporary, in cases where such partial - overlap is deemed possible. - - 4. `libg2c' (`libf2c') no longer loses track of the file being worked - on during a `BACKSPACE' operation. - - 5. `libg2c' (`libf2c') fixes a bug whereby input to a `NAMELIST' read - involving a repeat count, such as `K(5)=10*3', was not properly - handled by `libf2c'. The first item was written to `K(5)', but - the remaining nine were written elsewhere (still within the array), - not necessarily starting at `K(6)'. - - 6. Automatic arrays now seem to be working on HP-UX systems. - - 7. The `Date' intrinsic now returns the correct result on big-endian - systems. - - 8. Fix `g77' so it no longer crashes when compiling I/O statements - using keywords that define `INTEGER' values, such as `IOSTAT=J', - where J is other than default `INTEGER' (such as `INTEGER*2'). - Instead, it issues a diagnostic. - - 9. Fix `g77' so it properly handles `DATA A/RPT*VAL/', where RPT is - not default `INTEGER', such as `INTEGER*2', instead of producing a - spurious diagnostic. Also fix `DATA (A(I),I=1,N)', where `N' is - not default `INTEGER' to work instead of crashing `g77'. - - 10. The `-ax' option is now obeyed when compiling Fortran programs. - (It is passed to the `f771' driver.) - - * The new `-fbounds-check' option causes `g77' to compile run-time - bounds checks of array subscripts, as well as of substring start - and end points. - - * `libg2c' now supports building as multilibbed library, which - provides better support for systems that require options such as - `-mieee' to work properly. - - * Source file names with the suffixes `.FOR' and `.FPP' now are - recognized by `g77' as if they ended in `.for' and `.fpp', - respectively. - - * The order of arguments to the *subroutine* forms of the `CTime', - `DTime', `ETime', and `TtyNam' intrinsics has been swapped. The - argument serving as the returned value for the corresponding - function forms now is the *second* argument, making these - consistent with the other subroutine forms of `libU77' intrinsics. - - * `g77' now warns about a reference to an intrinsic that has an - interface that is not Year 2000 (Y2K) compliant. Also, `libg2c' - has been changed to increase the likelihood of catching references - to the implementations of these intrinsics using the `EXTERNAL' - mechanism (which would avoid the new warnings). - - 11. `g77' now warns about a reference to a function when the - corresponding *subsequent* function program unit disagrees with - the reference concerning the type of the function. - - * `-fno-emulate-complex' is now the default option. This should - result in improved performance of code that uses the `COMPLEX' - data type. - - * The `-malign-double' option now reliably aligns *all* - double-precision variables and arrays on Intel x86 targets. - - 12. Even without the `-malign-double' option, `g77' reliably aligns - local double-precision variables that are not in `EQUIVALENCE' - areas and not `SAVE''d. - - 13. `g77' now open-codes ("inlines") division of `COMPLEX' operands - instead of generating a run-time call to the `libf2c' routines - `c_div' or `z_div', unless the `-Os' option is specified. - - * `g77' no longer generates code to maintain `errno', a C-language - concept, when performing operations such as the `SqRt' intrinsic. - - 14. `g77' developers can temporarily use the `-fflatten-arrays' option - to compare how the compiler handles code generation using C-like - constructs as compared to the Fortran-like method constructs - normally used. - - 15. A substantial portion of the `g77' front end's code-generation - component was rewritten. It now generates code using facilities - more robustly supported by the `gcc' back end. One effect of this - rewrite is that some codes no longer produce a spurious "label LAB - used before containing binding contour" message. - - * Support for the `-fugly' option has been removed. - - 16. Improve documentation and indexing, including information on Year - 2000 (Y2K) compliance, and providing more information on internals - of the front end. - - 17. Upgrade to `libf2c' as of 1999-05-10. - -In 0.5.24 versus 0.5.23: -======================== - - There is no `g77' version 0.5.24 at this time, or planned. 0.5.24 -is the version number designated for bug fixes and, perhaps, some new -features added, to 0.5.23. Version 0.5.23 requires `gcc' 2.8.1, as -0.5.24 was planned to require. - - Due to `EGCS' becoming `GCC' (which is now an acronym for "GNU -Compiler Collection"), and `EGCS' 1.2 becoming officially designated -`GCC' 2.95, there seems to be no need for an actual 0.5.24 release. - - To reduce the confusion already resulting from use of 0.5.24 to -designate `g77' versions within `EGCS' versions 1.0 and 1.1, as well as -in versions of `g77' documentation and notices during that period, -"mainline" `g77' version numbering resumes at 0.5.25 with `GCC' 2.95 -(`EGCS' 1.2), skipping over 0.5.24 as a placeholder version number. - - To repeat, there is no `g77' 0.5.24, but there is now a 0.5.25. -Please remain calm and return to your keypunch units. - -In `EGCS' 1.1.2 versus `EGCS' 1.1.1: -==================================== - - * Fix the `IDate' intrinsic (VXT) (in `libg2c') so the returned year - is in the documented, non-Y2K-compliant range of 0-99, instead of - being returned as 100 in the year 2000. - - * Fix the `Date_and_Time' intrinsic (in `libg2c') to return the - milliseconds value properly in VALUES(8). - - * Fix the `LStat' intrinsic (in `libg2c') to return device-ID - information properly in SARRAY(7). - - * Improve documentation. - -In `EGCS' 1.1.1 versus `EGCS' 1.1: -================================== - - * Fix `libg2c' so it performs an implicit `ENDFILE' operation (as - appropriate) whenever a `REWIND' is done. - - (This bug was introduced in 0.5.23 and `egcs' 1.1 in `g77''s - version of `libf2c'.) - - * Fix `libg2c' so it no longer crashes with a spurious diagnostic - upon doing any I/O following a direct formatted write. - - (This bug was introduced in 0.5.23 and `egcs' 1.1 in `g77''s - version of `libf2c'.) - - * Fix `g77' so it no longer crashes compiling references to the - `Rand' intrinsic on some systems. - - * Fix `g77' portion of installation process so it works better on - some systems (those with shells requiring `else true' clauses on - `if' constructs for the completion code to be set properly). - -In `EGCS' 1.1 versus `EGCS' 1.0.3: -================================== - - 18. Fix bugs in the `libU77' intrinsic `HostNm' that wrote one byte - beyond the end of its `CHARACTER' argument, and in the `libU77' - intrinsics `GMTime' and `LTime' that overwrote their arguments. - - 19. Assumed arrays with negative bounds (such as `REAL A(-1:*)') no - longer elicit spurious diagnostics from `g77', even on systems - with pointers having different sizes than integers. - - This bug is not known to have existed in any recent version of - `gcc'. It was introduced in an early release of `egcs'. - - 20. Valid combinations of `EXTERNAL', passing that external as a dummy - argument without explicitly giving it a type, and, in a subsequent - program unit, referencing that external as an external function - with a different type no longer crash `g77'. - - 21. `CASE DEFAULT' no longer crashes `g77'. - - 22. The `-Wunused' option no longer issues a spurious warning about - the "master" procedure generated by `g77' for procedures - containing `ENTRY' statements. - - * Support `FORMAT(I<EXPR>)' when EXPR is a compile-time constant - `INTEGER' expression. - - * Fix `g77' `-g' option so procedures that use `ENTRY' can be - stepped through, line by line, in `gdb'. - - * Allow any `REAL' argument to intrinsics `Second' and `CPU_Time'. - - * Use `tempnam', if available, to open scratch files (as in - `OPEN(STATUS='SCRATCH')') so that the `TMPDIR' environment - variable, if present, is used. - - * `g77''s version of `libf2c' separates out the setting of global - state (such as command-line arguments and signal handling) from - `main.o' into distinct, new library archive members. - - This should make it easier to write portable applications that - have their own (non-Fortran) `main()' routine properly set up the - `libf2c' environment, even when `libf2c' (now `libg2c') is a - shared library. - - 23. `g77' no longer installs the `f77' command and `f77.1' man page in - the `/usr' or `/usr/local' heirarchy, even if the `f77-install-ok' - file exists in the source or build directory. See the - installation documentation for more information. - - 24. `g77' no longer installs the `libf2c.a' library and `f2c.h' - include file in the `/usr' or `/usr/local' heirarchy, even if the - `f2c-install-ok' or `f2c-exists-ok' files exist in the source or - build directory. See the installation documentation for more - information. - - 25. The `libf2c.a' library produced by `g77' has been renamed to - `libg2c.a'. It is installed only in the `gcc' "private" directory - heirarchy, `gcc-lib'. This allows system administrators and users - to choose which version of the `libf2c' library from `netlib' they - wish to use on a case-by-case basis. See the installation - documentation for more information. - - 26. The `f2c.h' include (header) file produced by `g77' has been - renamed to `g2c.h'. It is installed only in the `gcc' "private" - directory heirarchy, `gcc-lib'. This allows system administrators - and users to choose which version of the include file from - `netlib' they wish to use on a case-by-case basis. See the - installation documentation for more information. - - * The `g77' command now expects the run-time library to be named - `libg2c.a' instead of `libf2c.a', to ensure that a version other - than the one built and installed as part of the same `g77' version - is picked up. - - 27. During the configuration and build process, `g77' creates - subdirectories it needs only as it needs them. Other cleaning up - of the configuration and build process has been performed as well. - - 28. `install-info' now used to update the directory of Info - documentation to contain an entry for `g77' (during installation). - - * Some diagnostics have been changed from warnings to errors, to - prevent inadvertent use of the resulting, probably buggy, programs. - These mostly include diagnostics about use of unsupported features - in the `OPEN', `INQUIRE', `READ', and `WRITE' statements, and - about truncations of various sorts of constants. - - 29. Improve compilation of `FORMAT' expressions so that a null byte is - appended to the last operand if it is a constant. This provides a - cleaner run-time diagnostic as provided by `libf2c' for statements - like `PRINT '(I1', 42'. - - 30. Improve documentation and indexing. - - 31. The upgrade to `libf2c' as of 1998-06-18 should fix a variety of - problems, including those involving some uses of the `T' format - specifier, and perhaps some build (porting) problems as well. - -In `EGCS' 1.1 versus `g77' 0.5.23: -================================== - - 32. Fix a code-generation bug that afflicted Intel x86 targets when - `-O2' was specified compiling, for example, an old version of the - `DNRM2' routine. - - The x87 coprocessor stack was being mismanaged in cases involving - assigned `GOTO' and `ASSIGN'. - - 33. `g77' no longer produces incorrect code and initial values for - `EQUIVALENCE' and `COMMON' aggregates that, due to "unnatural" - ordering of members vis-a-vis their types, require initial padding. - - 34. Fix `g77' crash compiling code containing the construct - `CMPLX(0.)' or similar. - - 35. `g77' no longer crashes when compiling code containing - specification statements such as `INTEGER(KIND=7) PTR'. - - 36. `g77' no longer crashes when compiling code such as `J = SIGNAL(1, - 2)'. - - * `g77' now treats `%LOC(EXPR)' and `LOC(EXPR)' as "ordinary" - expressions when they are used as arguments in procedure calls. - This change applies only to global (filewide) analysis, making it - consistent with how `g77' actually generates code for these cases. - - Previously, `g77' treated these expressions as denoting special - "pointer" arguments for the purposes of filewide analysis. - - 37. Fix `g77' crash (or apparently infinite run-time) when compiling - certain complicated expressions involving `COMPLEX' arithmetic - (especially multiplication). - - * Align static double-precision variables and arrays on Intel x86 - targets regardless of whether `-malign-double' is specified. - - Generally, this affects only local variables and arrays having the - `SAVE' attribute or given initial values via `DATA'. - - * The `g77' driver now ensures that `-lg2c' is specified in the link - phase prior to any occurrence of `-lm'. This prevents - accidentally linking to a routine in the SunOS4 `-lm' library when - the generated code wants to link to the one in `libf2c' (`libg2c'). - - * `g77' emits more debugging information when `-g' is used. - - This new information allows, for example, `which __g77_length_a' - to be used in `gdb' to determine the type of the phantom length - argument supplied with `CHARACTER' variables. - - This information pertains to internally-generated type, variable, - and other information, not to the longstanding deficiencies - vis-a-vis `COMMON' and `EQUIVALENCE'. - - * The F90 `Date_and_Time' intrinsic now is supported. - - * The F90 `System_Clock' intrinsic allows the optional arguments - (except for the `Count' argument) to be omitted. - - 38. Upgrade to `libf2c' as of 1998-06-18. - - 39. Improve documentation and indexing. - -In previous versions: -===================== - - Information on previous versions is not provided in this -`egcs/gcc/f/NEWS' file, to keep it short. See `egcs/gcc/f/news.texi', -or any of its other derivations (Info, HTML, dvi forms) for such -information. - diff --git a/contrib/gcc/f/assert.j b/contrib/gcc/f/assert.j deleted file mode 100644 index d9b9daafdd21..000000000000 --- a/contrib/gcc/f/assert.j +++ /dev/null @@ -1,27 +0,0 @@ -/* assert.j -- Wrapper for GCC's assert.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_assert -#define _J_f_assert -#include "assert.h" -#endif -#endif diff --git a/contrib/gcc/f/config.j b/contrib/gcc/f/config.j deleted file mode 100644 index fda03eb1e29a..000000000000 --- a/contrib/gcc/f/config.j +++ /dev/null @@ -1,27 +0,0 @@ -/* config.j -- Wrapper for GCC's config.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_config -#define _J_f_config -#include "config.h" -#endif -#endif diff --git a/contrib/gcc/f/convert.j b/contrib/gcc/f/convert.j deleted file mode 100644 index 76b8e024b9a9..000000000000 --- a/contrib/gcc/f/convert.j +++ /dev/null @@ -1,28 +0,0 @@ -/* convert.j -- Wrapper for GCC's convert.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_convert -#define _J_f_convert -#include "tree.j" -#include "convert.h" -#endif -#endif diff --git a/contrib/gcc/f/flags.j b/contrib/gcc/f/flags.j deleted file mode 100644 index 44587a495229..000000000000 --- a/contrib/gcc/f/flags.j +++ /dev/null @@ -1,27 +0,0 @@ -/* flags.j -- Wrapper for GCC's flags.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_flags -#define _J_f_flags -#include "flags.h" -#endif -#endif diff --git a/contrib/gcc/f/g77install.texi b/contrib/gcc/f/g77install.texi deleted file mode 100644 index abc639635549..000000000000 --- a/contrib/gcc/f/g77install.texi +++ /dev/null @@ -1,2251 +0,0 @@ -@c Copyright (C) 1995-1999 Free Software Foundation, Inc. -@c This is part of the G77 manual. -@c For copying conditions, see the file g77.texi. - -@c The text of this file appears in the file INSTALL -@c in the G77 distribution, as well as in the G77 manual. - -@c Keep this the same as the dates above, since it's used -@c in the standalone derivations of this file (e.g. INSTALL). -@set copyrights 1995-1999 - -@set last-update-install 1999-07-17 - -@include root.texi - -@ifset DOC-INSTALL -@c The immediately following lines apply to the INSTALL file -@c which is generated using this file. -@emph{Note:} This file is automatically generated from the files -@file{install0.texi} and @file{g77install.texi}. -@file{INSTALL} is @emph{not} a source file, -although it is normally included within source distributions. - -This file contains installation information for the GNU Fortran compiler. -Copyright (C) @value{copyrights-install} Free Software Foundation, Inc. -You may copy, distribute, and modify it freely as long as you preserve -this copyright notice and permission notice. - -@node Top,,, (dir) -@chapter Installing GNU Fortran -@end ifset - -@set version-autoconf 2.12 -@set version-bison 1.25 -@set version-gperf 2.5 -@set version-gzip 1.2.4 -@set version-make 3.76.1 -@set version-makeinfo 1.68 -@set version-patch 2.5 -@set version-sed 2.05 -@set version-tar 1.12 -@set version-texinfo 3.12 - -@ifset DOC-G77 -@node Installation -@chapter Installing GNU Fortran -@cindex installing, GNU Fortran -@end ifset - -The following information describes how to install @code{g77}. - -@clear OMIT-FSF-G77 - -@ifset EGCS-G77 -@set OMIT-FSF-G77 -@end ifset - -@ifset GCC-G77 -@set OMIT-FSF-G77 -@end ifset - -@ifset OMIT-FSF-G77 -Note that, for users of the @value{which-g77} version of @code{g77}, -much of the information is obsolete, -and is superceded by the -@value{which-gcc} installation procedures. -Such information is accordingly omitted and flagged as such. -@end ifset - -@ifclear OMIT-FSF-G77 -The information in this file generally pertains to dealing -with @emph{source} distributions of @code{g77} and @code{gcc}. -It is possible that some of this information will be applicable -to some @emph{binary} distributions of these products---however, -since these distributions are not made by the maintainers of -@code{g77}, responsibility for binary distributions rests with -whoever built and first distributed them. - -Nevertheless, efforts to make @code{g77} easier to both build -and install from source and package up as a binary distribution -are ongoing. -@end ifclear - -@ifset DEVELOPMENT -@emph{Warning:} The information below is still under development, -and might not accurately reflect the @code{g77} code base -of which it is a part. -Efforts are made to keep it somewhat up-to-date, -but they are particularly concentrated -on any version of this information -that is distributed as part of a @emph{released} @code{g77}. - -In particular, while this information is intended to apply to -the @value{which-g77} version of @code{g77}, -only an official @emph{release} of that version -is expected to contain documentation that is -most consistent with the @code{g77} product in that version. -@end ifset - -The following information was last updated on @value{last-update-install}: - -@menu -* Prerequisites:: Make sure your system is ready for @code{g77}. -* Problems Installing:: Known trouble areas. -* Settings:: Changing @code{g77} internals before building. -* Quick Start:: The easier procedure for non-experts. -* Complete Installation:: For experts, or those who want to be: the details. -* Distributing Binaries:: If you plan on distributing your @code{g77}. -@end menu - -@node Prerequisites -@section Prerequisites -@cindex prerequisites - -@ifset OMIT-FSF-G77 -For users of the @value{which-g77} version of @code{g77}, -this information is superceded by the -@value{which-gcc} installation instructions. -@end ifset - -@ifclear OMIT-FSF-G77 -The procedures described to unpack, configure, build, and -install @code{g77} assume your system has certain programs -already installed. - -The following prerequisites should be met by your -system before you follow the @code{g77} installation instructions: - -@table @asis -@item @code{gzip} and @code{tar} -To unpack the @code{gcc} and @code{g77} distributions, -you'll need the @code{gunzip} utility in the @code{gzip} -distribution. -Most UNIX systems already have @code{gzip} installed. -If yours doesn't, you can get it from the FSF. - -Note that you'll need @code{tar} and other utilities -as well, but all UNIX systems have these. -There are GNU versions of all these available---in fact, -a complete GNU UNIX system can be put together on -most systems, if desired. - -The version of GNU @code{gzip} used to package this release -is @value{version-gzip}. -(The version of GNU @code{tar} used to package this release -is @value{version-tar}.) - -@item @file{gcc-@value{version-gcc}.tar.gz} -You need to have this, or some other applicable, version -of @code{gcc} on your system. -The version should be an exact copy of a distribution -from the FSF. -Its size is approximately 8.4MB. - -If you've already unpacked @file{gcc-@value{version-gcc}.tar.gz} into a -directory (named @file{gcc-@value{version-gcc}}) called the @dfn{source tree} -for @code{gcc}, you can delete the distribution -itself, but you'll need to remember to skip any instructions to unpack -this distribution. - -Without an applicable @code{gcc} source tree, you cannot -build @code{g77}. -You can obtain an FSF distribution of @code{gcc} from the FSF. - -@item @file{g77-@value{version-g77}.tar.gz} -You probably have already unpacked this package, -or you are reading an advance copy of these installation instructions, -which are contained in this distribution. -The size of this package is approximately 1.4MB. - -You can obtain an FSF distribution of @code{g77} from the FSF, -the same way you obtained @code{gcc}. - -@item Enough disk space -The amount of disk space needed to unpack, build, install, -and use @code{g77} depends on the type of system you're -using, how you build @code{g77}, and how much of it you -install (primarily, which languages you install). - -The sizes shown below assume all languages distributed in -@c As of `Version 2.249', texinfo.tex loses on a construction like -@c @code{...@value{...-...}...} since the hyphen is expanded as -@c -@discretionary{}{}{}, even though @value resets its catcode. -@c Fortunately this is currently the only instance. Kluge, kluge. -@iftex -@begingroup @let@codedash=@realdash -@end iftex -@code{gcc-@value{version-gcc}}, -@iftex -@endgroup -@end iftex -plus @code{g77}, will be built and installed. -These sizes are indicative of GNU/Linux systems on -Intel x86 running COFF and on Digital Alpha (AXP) systems -running ELF. -These should be fairly representative of 32-bit and 64-bit -systems, respectively. - -Note that all sizes are approximate and subject to change without -notice! -They are based on preliminary releases of g77 made shortly -before the public beta release. - -@itemize --- -@item -@code{gcc} and @code{g77} distributions occupy 10MB -packed, 40MB unpacked. -These consist of the source code and documentation, -plus some derived files (mostly documentation), for -@code{gcc} and @code{g77}. -Any deviations from these numbers for different -kinds of systems are likely to be very minor. - -@item -A ``bootstrap'' build requires an additional 91MB -for a total of 132MB on an ix86, and an additional -136MB for a total of 177MB on an Alpha. - -@item -Removing @file{gcc/stage1} after the build recovers -13MB for a total of 119MB on an ix86, and recovers -21MB for a total of 155MB on an Alpha. - -After doing this, the integrity of the build can -still be verified via @samp{make compare}, and the -@code{gcc} compiler modified and used to build itself for -testing fairly quickly, using the copy of the compiler -kept in @code{gcc/stage2}. - -@item -Removing @file{gcc/stage2} after the build further -recovers 39MB for a total of 80MB, and recovers -57MB for a total of 98MB on an Alpha. - -After doing this, the compiler can still be installed, -especially if GNU @code{make} is used to avoid -gratuitous rebuilds (or, the installation can be done -by hand). - -@item -Installing @code{gcc} and @code{g77} copies -23MB onto the @samp{--prefix} disk for a total of 103MB -on an ix86, and copies 31MB onto the @samp{--prefix} -disk for a total of 130MB on an Alpha. -@end itemize - -After installation, if no further modifications and -builds of @code{gcc} or @code{g77} are planned, the -source and build directory may be removed, leaving -the total impact on a system's disk storage as -that of the amount copied during installation. - -Systems with the appropriate version of @code{gcc} -installed don't require the complete -bootstrap build. -Doing a ``straight build'' requires about as much -space as does a bootstrap build followed by removing -both the @file{gcc/stage1} and @file{gcc/stage2} -directories. - -Installing @code{gcc} and @code{g77} over existing -versions might require less @emph{new} disk space, -but note that, unlike many products, @code{gcc} -installs itself in a way that avoids overwriting other -installed versions of itself, so that other versions may -easily be invoked (via @samp{gcc -V @var{version}}). - -So, the amount of space saved as a result of having -an existing version of @code{gcc} and @code{g77} -already installed is not much---typically only the -command drivers (@code{gcc}, @code{g77}, @code{g++}, -and so on, which are small) and the documentation -is overwritten by the new installation. -The rest of the new installation is done without -replacing existing installed versions (assuming -they have different version numbers). - -@item @code{make} -Your system must have @code{make}, and you will probably save -yourself a lot of trouble if it is GNU @code{make} (sometimes -referred to as @code{gmake}). -In particular, you probably need GNU @code{make} -to build outside the source directory -(with @code{configure}'s @samp{--srcdir} option.) - -The version of GNU @code{make} used to develop this release -is @value{version-make}. - -@item @code{cc} -Your system must have a working C compiler. -If it doesn't, you might be able to obtain -a prebuilt binary of some version of @code{gcc} -from the network or on CD-ROM, -perhaps from the FSF@. -The best source of information about binaries -is probably a system-specific Usenet news group, -initially via its FAQ. - -@xref{Installation,,Installing GNU CC,gcc,Using and Porting GNU CC}, -for more information on prerequisites for installing @code{gcc}. - -@item @code{sed} -All UNIX systems have @code{sed}, but some have a broken -version that cannot handle configuring, building, or -installing @code{gcc} or @code{g77}. - -The version of GNU @code{sed} used to develop this release -is @value{version-sed}. -(Note that GNU @code{sed} version 3.0 was withdrawn by the -FSF---if you happen to have this version installed, replace -it with version @value{version-sed} immediately. -See a GNU distribution site for further explanation.) - -@item @code{root} access or equivalent -To perform the complete installation procedures on a system, -you need to have @code{root} access to that system, or -equivalent access to the @samp{--prefix} directory tree -specified on the @code{configure} command line. - -Portions of the procedure (such as configuring and building -@code{g77}) can be performed by any user with enough disk -space and virtual memory. - -However, these instructions are oriented towards less-experienced -users who want to install @code{g77} on their own personal -systems. - -System administrators with more experience will want to -determine for themselves how they want to modify the -procedures described below to suit the needs of their -installation. - -@item @code{autoconf} -The version of GNU @code{autoconf} used to develop this release -is @value{version-autoconf}. - -@code{autoconf} is not needed in the typical case of -installing @code{gcc} and @code{g77}. -@xref{Missing tools?}, for information on when it -might be needed and how to work around not having it. - -@item @code{bison} -The version of GNU @code{bison} used to develop this release -is @value{version-bison}. - -@code{bison} is not needed in the typical case of -installing @code{gcc} and @code{g77}. -@xref{Missing tools?}, for information on when it -might be needed and how to work around not having it. - -@item @code{gperf} -The version of GNU @code{gperf} used to develop this release -is @value{version-gperf}. - -@code{gperf} is not needed in the typical case of -installing @code{gcc} and @code{g77}. -@xref{Missing tools?}, for information on when it -might be needed and how to work around not having it. - -@item @code{makeinfo} -The version of GNU @code{makeinfo} used to develop this release -is @value{version-makeinfo}. - -@code{makeinfo} is part of the GNU @code{texinfo} package; -@code{makeinfo} version @value{version-makeinfo} -is distributed as part of -GNU @code{texinfo} version @value{version-texinfo}. - -@code{makeinfo} is not needed in the typical case of -installing @code{gcc} and @code{g77}. -@xref{Missing tools?}, for information on when it -might be needed and how to work around not having it. - -An up-to-date version of GNU @code{makeinfo} is still convenient -when obtaining a new version of a GNU distribution such as -@code{gcc} or @code{g77}, -as it allows you to obtain the @file{.diff.gz} file -instead of the entire @file{.tar.gz} distribution -(assuming you have installed @code{patch}). - -@item @code{patch} -The version of GNU @code{patch} used to develop this release -is @value{version-patch}. - -Beginning with @code{g77} version 0.5.23, it is no longer -necessary to patch the @code{gcc} back end to build @code{g77}. - -An up-to-date version of GNU @code{patch} is still convenient -when obtaining a new version of a GNU distribution such as -@code{gcc} or @code{g77}, -as it allows you to obtain the @file{.diff.gz} file -instead of the entire @file{.tar.gz} distribution -(assuming you have installed the tools needed -to rebuild derived files, such as @code{makeinfo}). -@end table - -@end ifclear - -@node Problems Installing -@section Problems Installing -@cindex problems installing -@cindex installation problems - -This is a list of problems (and some apparent problems which don't -really mean anything is wrong) that show up when configuring, -building, installing, or porting GNU Fortran. - -@xref{Installation Problems,,,gcc,Using and Porting GNU CC}, -for more information on installation problems that can afflict -either @code{gcc} or @code{g77}. - -@menu -* General Problems:: Problems afflicting most or all systems. -* System-specific Problems:: Problems afflicting particular systems. -* Cross-compiler Problems:: Problems afflicting cross-compilation setups. -@end menu - -@node General Problems -@subsection General Problems - -These problems can occur on most or all systems. - -@menu -* GNU C Required:: Why even ANSI C is not enough. -* Patching GNU CC:: Why @code{gcc} needn't be patched. -* Building GNU CC Necessary:: Why you can't build @emph{just} Fortran. -* Missing strtoul or bsearch:: When linking @code{f771} fails. -* Cleanup Kills Stage Directories:: For @code{g77} developers. -* LANGUAGES Macro Ignored:: Sometimes @code{LANGUAGES} is ignored. -@end menu - -@node GNU C Required -@subsubsection GNU C Required -@cindex GNU C required -@cindex requirements, GNU C - -Compiling @code{g77} requires GNU C, not just ANSI C. -Fixing this wouldn't -be very hard (just tedious), but the code using GNU extensions to -the C language is expected to be rewritten for 0.6 anyway, -so there are no plans for an interim fix. - -This requirement does not mean you must already have @code{gcc} -installed to build @code{g77}. -As long as you have a working C compiler, you can use a -``bootstrap'' build to automate the process of first building -@code{gcc} using the working C compiler you have, then building -@code{g77} and rebuilding @code{gcc} using that just-built @code{gcc}, -and so on. - -@node Patching GNU CC -@subsubsection Patching GNU CC -@cindex patch files -@cindex GBE - -@code{g77} no longer requires application of a patch file -to the @code{gcc} compiler tree. -In fact, no such patch file is distributed with @code{g77}. -This is as of version 0.5.23 -and @code{egcs} version 1.0. - -@node Building GNU CC Necessary -@subsubsection Building GNU CC Necessary -@cindex @code{gcc}, building -@cindex building gcc - -It should be possible to build the runtime without building @code{cc1} -and other non-Fortran items, but, for now, an easy way to do that -is not yet established. - -@node Missing strtoul or bsearch -@subsubsection Missing strtoul or bsearch -@cindex bsearch -@cindex _bsearch -@cindex strtoul -@cindex _strtoul -@cindex undefined reference (_bsearch) -@cindex undefined reference (_strtoul) -@cindex f771, linking error for -@cindex linking error for f771 -@cindex @code{ld}, error linking f771 -@cindex @code{ld}, can't find _bsearch -@cindex @code{ld}, can't find _strtoul -@cindex SunOS4 - -@ifset OMIT-FSF-G77 -This information does not apply to -the @value{which-g77} version of @code{g77}, -@end ifset - -@ifclear OMIT-FSF-G77 -On SunOS4 systems, linking the @code{f771} program used to -produce an error message concerning an undefined symbol named -@samp{_strtoul}, because the @code{strtoul} library function -is not provided on that system. - -Other systems have, in the past, been reported to not provide -their own @code{strtoul} or @code{bsearch} function. - -Some versions @code{g77} tried to default to providing bare-bones -versions of @code{bsearch} and @code{strtoul} automatically, -but every attempt at this has failed for at least one kind of system. - -To limit the failures to those few systems actually missing the -required routines, the bare-bones versions are still provided, -in @file{@value{path-g77}/proj.c}, -if the appropriate macros are defined. -These are @code{NEED_BSEARCH} for @code{bsearch} and -@code{NEED_STRTOUL} for @code{NEED_STRTOUL}. - -Therefore, if you are sure your system is missing -@code{bsearch} or @code{strtoul} in its library, -define the relevant macro(s) before building @code{g77}. -This can be done by editing @file{@value{path-g77}/proj.c} and inserting -either or both of the following @samp{#define} statements -before the comment shown: - -@smallexample -/* Insert #define statements here. */ - -#define NEED_BSEARCH -#define NEED_STRTOUL -@end smallexample - -Then, continue configuring and building @code{g77} as usual. - -Or, you can define these on the @code{make} command line. -To build with the bundled @code{cc} on SunOS4, for example, try: -@smallexample -make bootstrap BOOT_CFLAGS='-O2 -g -DNEED_STRTOUL' -@end smallexample - -If you then encounter problems compiling @file{@value{path-g77}/proj.c}, -it might be due to a discrepancy between how @code{bsearch} -or @code{strtoul} are defined by that file and how they're -declared by your system's header files. - -In that case, you'll have to use some basic knowledge of C -to work around the problem, perhaps by editing @file{@value{path-g77}/proj.c} -somewhat. - -@end ifclear - -@node Cleanup Kills Stage Directories -@subsubsection Cleanup Kills Stage Directories -@cindex stage directories -@cindex make clean - -It'd be helpful if @code{g77}'s @file{Makefile.in} or @file{Make-lang.in} -would create the various @file{stage@var{n}} directories and their -subdirectories, so developers and expert installers wouldn't have to -reconfigure after cleaning up. - -That help has arrived as of version 0.5.23 of @code{g77} -and version 1.1 of @code{egcs}. -Configuration itself no longer creates any particular directories -that are unique to @code{g77}. -The build procedures in @file{Make-lang.in} take care of -that, on demand. - -@node LANGUAGES Macro Ignored -@subsubsection LANGUAGES Macro Ignored -@cindex @code{LANGUAGES} macro ignored -@cindex ignoring @code{LANGUAGES} macro - -Prior to version 0.5.23 of @code{g77} -and version 1.1 of @code{egcs}, -@code{g77} would sometimes ignore -the absence of @code{f77} and @code{F77} in the -@code{LANGUAGES} macro definition used for the -@code{make} command being processed. - -As of @code{g77} version 0.5.23 -and @code{egcs} version 1.1, -@code{g77} now obeys this macro -in all relevant situations. - -However, in versions of @code{gcc} through 2.8.1, -non-@code{g77} portions of @code{gcc}, -such as @code{g++}, -are known to go ahead and perform various -language-specific activities when their -respective language strings do not appear -in the @code{LANGUAGES} macro in effect -during that invocation of @code{make}. - -It is expected that these remaining problems will -be fixed in a future version of @code{gcc}. - -@node System-specific Problems -@subsection System-specific Problems - -@cindex AIX -A linker bug on some versions of AIX 4.1 might prevent building -when @code{g77} is built within @code{gcc}. -It might also occur when building within @code{egcs}. -@ifset DOC-G77 -@xref{LINKFAIL}. -@end ifset - -@node Cross-compiler Problems -@subsection Cross-compiler Problems -@cindex cross-compiler, problems - -@code{g77} has been in alpha testing since September of -1992, and in public beta testing since February of 1995. -Alpha testing was done by a small number of people worldwide on a fairly -wide variety of machines, involving self-compilation in most or -all cases. -Beta testing has been done primarily via self-compilation, -but in more and more cases, cross-compilation (and ``criss-cross -compilation'', where a version of a compiler is built on one machine -to run on a second and generate code that runs on a third) has -been tried and has succeeded, to varying extents. - -Generally, @code{g77} can be ported to any configuration to which -@code{gcc}, @code{f2c}, and @code{libf2c} can be ported and made -to work together, aside from the known problems described in this -manual. -If you want to port @code{g77} to a particular configuration, -you should first make sure @code{gcc} and @code{libf2c} can be -ported to that configuration before focusing on @code{g77}, because -@code{g77} is so dependent on them. - -Even for cases where @code{gcc} and @code{libf2c} work, -you might run into problems with cross-compilation on certain machines, -for several reasons. - -@itemize @bullet -@item -There is one known bug -(a design bug to be fixed in 0.6) that prevents configuration of -@code{g77} as a cross-compiler in some cases, -though there are assumptions made during -configuration that probably make doing non-self-hosting builds -a hassle, requiring manual intervention. - -@item -@code{gcc} might still have some trouble being configured -for certain combinations of machines. -For example, it might not know how to handle floating-point -constants. - -@item -Improvements to the way @code{libg2c} is built could make -building @code{g77} as a cross-compiler easier---for example, -passing and using @samp{$(LD)} and @samp{$(AR)} in the appropriate -ways. -(This is improved in the @code{egcs} version of @code{g77}, -especially as of version 1.1.) - -@item -There are still some challenges putting together the right -run-time libraries (needed by @code{libg2c}) for a target -system, depending on the systems involved in the configuration. -(This is a general problem with cross-compilation, and with -@code{gcc} in particular.) -@end itemize - -@node Settings -@section Changing Settings Before Building - -Here are some internal @code{g77} settings that can be changed -by editing source files in @file{@value{path-g77}/} before building. - -This information, and perhaps even these settings, represent -stop-gap solutions to problems people doing various ports -of @code{g77} have encountered. -As such, none of the following information is expected to -be pertinent in future versions of @code{g77}. - -@menu -* Larger File Unit Numbers:: Raising @code{MXUNIT}. -* Always Flush Output:: Synchronizing write errors. -* Maximum Stackable Size:: Large arrays forced off the stack. -* Floating-point Bit Patterns:: Possible programs building @code{g77} - as a cross-compiler. -* Large Initialization:: Large arrays with @code{DATA} - initialization. -* Alpha Problems Fixed:: Problems with 64-bit systems like - Alphas now fixed? -@end menu - -@node Larger File Unit Numbers -@subsection Larger File Unit Numbers -@cindex MXUNIT -@cindex unit numbers -@cindex maximum unit number -@cindex illegal unit number -@cindex increasing maximum unit number - -As distributed, whether as part of @code{f2c} or @code{g77}, -@code{libf2c} accepts file unit numbers only in the range -0 through 99. -For example, a statement such as @samp{WRITE (UNIT=100)} causes -a run-time crash in @code{libf2c}, because the unit number, -100, is out of range. - -If you know that Fortran programs at your installation require -the use of unit numbers higher than 99, you can change the -value of the @code{MXUNIT} macro, which represents the maximum unit -number, to an appropriately higher value. - -To do this, edit the file @file{@value{path-libf2c}/libI77/fio.h} in your -@code{g77} source tree, changing the following line: - -@example -#define MXUNIT 100 -@end example - -Change the line so that the value of @code{MXUNIT} is defined to be -at least one @emph{greater} than the maximum unit number used by -the Fortran programs on your system. - -(For example, a program that does @samp{WRITE (UNIT=255)} would require -@code{MXUNIT} set to at least 256 to avoid crashing.) - -Then build or rebuild @code{g77} as appropriate. - -@emph{Note:} Changing this macro has @emph{no} effect on other limits -your system might place on the number of files open at the same time. -That is, the macro might allow a program to do @samp{WRITE (UNIT=100)}, -but the library and operating system underlying @code{libf2c} might -disallow it if many other files have already been opened (via @code{OPEN} or -implicitly via @code{READ}, @code{WRITE}, and so on). -Information on how to increase these other limits should be found -in your system's documentation. - -@node Always Flush Output -@subsection Always Flush Output -@cindex ALWAYS_FLUSH -@cindex synchronous write errors -@cindex disk full -@cindex flushing output -@cindex fflush() -@cindex I/O, flushing -@cindex output, flushing -@cindex writes, flushing -@cindex NFS -@cindex network file system - -Some Fortran programs require output -(writes) to be flushed to the operating system (under UNIX, -via the @code{fflush()} library call) so that errors, -such as disk full, are immediately flagged via the relevant -@code{ERR=} and @code{IOSTAT=} mechanism, instead of such -errors being flagged later as subsequent writes occur, forcing -the previously written data to disk, or when the file is -closed. - -Essentially, the difference can be viewed as synchronous error -reporting (immediate flagging of errors during writes) versus -asynchronous, or, more precisely, buffered error reporting -(detection of errors might be delayed). - -@code{libg2c} supports flagging write errors immediately when -it is built with the @code{ALWAYS_FLUSH} macro defined. -This results in a @code{libg2c} that runs slower, sometimes -quite a bit slower, under certain circumstances---for example, -accessing files via the networked file system NFS---but the -effect can be more reliable, robust file I/O. - -If you know that Fortran programs requiring this level of precision -of error reporting are to be compiled using the -version of @code{g77} you are building, you might wish to -modify the @code{g77} source tree so that the version of -@code{libg2c} is built with the @code{ALWAYS_FLUSH} macro -defined, enabling this behavior. - -To do this, find this line in @file{@value{path-libf2c}/f2c.h} in -your @code{g77} source tree: - -@example -/* #define ALWAYS_FLUSH */ -@end example - -Remove the leading @samp{/*@w{ }}, -so the line begins with @samp{#define}, -and the trailing @samp{@w{ }*/}. - -Then build or rebuild @code{g77} as appropriate. - -@node Maximum Stackable Size -@subsection Maximum Stackable Size -@vindex FFECOM_sizeMAXSTACKITEM -@cindex code, stack variables -@cindex maximum stackable size -@cindex stack, allocation -@cindex segmentation violation -@code{g77}, on most machines, puts many variables and arrays on the stack -where possible, and can be configured (by changing -@code{FFECOM_sizeMAXSTACKITEM} in @file{@value{path-g77}/com.c}) to force -smaller-sized entities into static storage (saving -on stack space) or permit larger-sized entities to be put on the -stack (which can improve run-time performance, as it presents -more opportunities for the GBE to optimize the generated code). - -@emph{Note:} Putting more variables and arrays on the stack -might cause problems due to system-dependent limits on stack size. -Also, the value of @code{FFECOM_sizeMAXSTACKITEM} has no -effect on automatic variables and arrays. -@xref{But-bugs}, for more information. - -@node Floating-point Bit Patterns -@subsection Floating-point Bit Patterns - -@cindex cross-compiler, building -@cindex floating-point bit patterns -@cindex bit patterns -The @code{g77} build will crash if an attempt is made to build -it as a cross-compiler -for a target when @code{g77} cannot reliably determine the bit pattern of -floating-point constants for the target. -Planned improvements for version 0.6 of @code{g77} -will give it the capabilities it needs to not have to crash the build -but rather generate correct code for the target. -(Currently, @code{g77} -would generate bad code under such circumstances if it didn't crash -during the build, e.g. when compiling a source file that does -something like @samp{EQUIVALENCE (I,R)} and @samp{DATA R/9.43578/}.) - -@node Large Initialization -@subsection Initialization of Large Aggregate Areas - -@cindex speed, of compiler -@cindex slow compiler -@cindex memory utilization -@cindex large initialization -@cindex aggregate initialization -A warning message is issued when @code{g77} sees code that provides -initial values (e.g. via @code{DATA}) to an aggregate area (@code{COMMON} -or @code{EQUIVALENCE}, or even a large enough array or @code{CHARACTER} -variable) -that is large enough to increase @code{g77}'s compile time by roughly -a factor of 10. - -This size currently is quite small, since @code{g77} -currently has a known bug requiring too much memory -and time to handle such cases. -In @file{@value{path-g77}/data.c}, the macro -@code{FFEDATA_sizeTOO_BIG_INIT_} is defined -to the minimum size for the warning to appear. -The size is specified in storage units, -which can be bytes, words, or whatever, on a case-by-case basis. - -After changing this macro definition, you must -(of course) rebuild and reinstall @code{g77} for -the change to take effect. - -Note that, as of version 0.5.18, improvements have -reduced the scope of the problem for @emph{sparse} -initialization of large arrays, especially those -with large, contiguous uninitialized areas. -However, the warning is issued at a point prior to -when @code{g77} knows whether the initialization is sparse, -and delaying the warning could mean it is produced -too late to be helpful. - -Therefore, the macro definition should not be adjusted to -reflect sparse cases. -Instead, adjust it to generate the warning when densely -initialized arrays begin to cause responses noticeably slower -than linear performance would suggest. - -@node Alpha Problems Fixed -@subsection Alpha Problems Fixed - -@cindex Alpha, support -@cindex 64-bit systems -@code{g77} used to warn when it was used to compile Fortran code -for a target configuration that is not basically a 32-bit -machine (such as an Alpha, which is a 64-bit machine, especially -if it has a 64-bit operating system running on it). -That was because @code{g77} was known to not work -properly on such configurations. - -As of version 0.5.20, @code{g77} is believed to work well -enough on such systems. -So, the warning is no longer needed or provided. - -However, support for 64-bit systems, especially in -areas such as cross-compilation and handling of -intrinsics, is still incomplete. -The symptoms -are believed to be compile-time diagnostics rather -than the generation of bad code. -It is hoped that version 0.6 will completely support 64-bit -systems. - -@node Quick Start -@section Quick Start -@cindex quick start - -@ifset OMIT-FSF-G77 -For users of the @value{which-g77} version of @code{g77}, -this information is superceded by the -@value{which-gcc} installation instructions. -@end ifset - -@ifclear OMIT-FSF-G77 -This procedure configures, builds, and installs @code{g77} -``out of the box'' and works on most UNIX systems. -Each command is identified by a unique number, -used in the explanatory text that follows. -For the most part, the output of each command is not shown, -though indications of the types of responses are given in a -few cases. - -To perform this procedure, the installer must be logged -in as user @code{root}. -Much of it can be done while not logged in as @code{root}, -and users experienced with UNIX administration should be -able to modify the procedure properly to do so. - -Following traditional UNIX conventions, it is assumed that -the source trees for @code{g77} and @code{gcc} will be -placed in @file{/usr/src}. -It also is assumed that the source distributions themselves -already reside in @file{/usr/FSF}, a naming convention -used by the author of @code{g77} on his own system: - -@example -/usr/FSF/gcc-@value{version-gcc}.tar.gz -/usr/FSF/g77-@value{version-g77}.tar.gz -@end example - -@c (You can use @file{gcc-2.7.2.1.tar.gz} instead, or -@c the equivalent of it obtained by applying the -@c patch distributed as @file{gcc-2.7.2-2.7.2.1.diff.gz} -@c to version 2.7.2 of @code{gcc}, -@c if you remember to make the appropriate adjustments in the -@c instructions below.) - -@c @cindex SunOS4 -@c Users of the following systems should not blindly follow -@c these quick-start instructions, because of problems their -@c systems have coping with straightforward installation of -@c @code{g77}: -@c -@c @itemize @bullet -@c @item -@c SunOS4 -@c @end itemize -@c -@c Instead, see @ref{Complete Installation}, for detailed information -@c on how to configure, build, and install @code{g77} for your -@c particular system. -@c Also, see @ref{Trouble,,Known Causes of Trouble with GNU Fortran}, -@c for information on bugs and other problems known to afflict the -@c installation process, and how to report newly discovered ones. -@c -@c If your system is @emph{not} on the above list, and @emph{is} -@c a UNIX system or one of its variants, you should be able to -@c follow the instructions below. - -If you vary @emph{any} of the steps below, you might run into -trouble, including possibly breaking existing programs for -other users of your system. -Before doing so, it is wise to review the explanations of some -of the steps. -These explanations follow this list of steps. - -@example -sh[ 1]# @kbd{cd /usr/src} -@set source-dir 1 -sh[ 2]# @kbd{gunzip -c < /usr/FSF/gcc-@value{version-gcc}.tar.gz | tar xf -} -[Might say "Broken pipe"...that is normal on some systems.] -@set unpack-gcc 2 -sh[ 3]# @kbd{gunzip -c < /usr/FSF/g77-@value{version-g77}.tar.gz | tar xf -} -["Broken pipe" again possible.] -@set unpack-g77 3 -sh[ 4]# @kbd{ln -s gcc-@value{version-gcc} gcc} -@set link-gcc 4 -sh[ 5]# @kbd{ln -s g77-@value{version-g77} g77} -@set link-g77 5 -sh[ 6]# @kbd{mv -i g77/* gcc} -[No questions should be asked by mv here; or, you made a mistake.] -@set merge-g77 6 -sh[ 7]# @kbd{cd gcc} -sh[ 8]# @kbd{./configure --prefix=/usr} -[Do not do the above if gcc is not installed in /usr/bin. -You might need a different @kbd{--prefix=@dots{}}, as -described below.] -@set configure-gcc 8 -sh[ 9]# @kbd{make bootstrap} -[This takes a long time, and is where most problems occur.] -@set build-gcc 9 -sh[10]# @kbd{make compare} -[This verifies that the compiler is `sane'. -If any files are printed, you have likely found a g77 bug.] -@set compare-gcc 10 -sh[11]# @kbd{rm -fr stage1} -@set rm-stage1 11 -sh[12]# @kbd{make -k install} -[The actual installation.] -@set install-g77 12 -sh[13]# @kbd{g77 -v} -[Verify that g77 is installed, obtain version info.] -@set show-version 13 -sh[14]# -@set end-procedure 14 -@end example - -@xref{Updating Documentation,,Updating Your Info Directory}, for -information on how to update your system's top-level @code{info} -directory to contain a reference to this manual, so that -users of @code{g77} can easily find documentation instead -of having to ask you for it. - -Elaborations of many of the above steps follows: - -@table @asis -@item Step @value{source-dir}: @kbd{cd /usr/src} -You can build @code{g77} pretty much anyplace. -By convention, this manual assumes @file{/usr/src}. -It might be helpful if other users on your system -knew where to look for the source code for the -installed version of @code{g77} and @code{gcc} in any case. - -@c @item Step @value{unpack-gcc}: @kbd{gunzip -d @dots{}} -@c Here, you might wish to use @file{gcc-2.7.2.1.tar.gz} -@c instead, or apply @file{gcc-2.7.2-2.7.2.1.diff.gz} to achieve -@c similar results. - -@item Step @value{unpack-g77}: @kbd{gunzip -d < /usr/FSF/g77-@value{version-g77}.tar.gz | tar xf -} -It is not always necessary to obtain the latest version of -@code{g77} as a complete @file{.tar.gz} file if you have -a complete, earlier distribution of @code{g77}. -If appropriate, you can unpack that earlier -version of @code{g77}, and then apply the appropriate patches -to achieve the same result---a source tree containing version -@value{version-g77} of @code{g77}. - -@item Step @value{link-gcc}: @kbd{ln -s gcc-@value{version-gcc} gcc} -@item Step @value{link-g77}: @kbd{ln -s g77-@value{version-g77} g77} -These commands mainly help reduce typing, -and help reduce visual clutter in examples -in this manual showing what to type to install @code{g77}. - -@c Of course, if appropriate, @kbd{ln -s gcc-2.7.2.1 gcc} or -@c similar. - -@xref{Unpacking}, for information on -using distributions of @code{g77} made by organizations -other than the FSF. - -@item Step @value{merge-g77}: @kbd{mv -i g77/* gcc} -After doing this, you can, if you like, type -@samp{rm g77} and @samp{rmdir g77-@value{version-g77}} to remove -the empty directory and the symbol link to it. -But, it might be helpful to leave them around as -quick reminders of which version(s) of @code{g77} are -installed on your system. - -@xref{Unpacking}, for information -on the contents of the @file{g77} directory (as merged -into the @file{gcc} directory). - -@item Step @value{configure-gcc}: @kbd{./configure --prefix=/usr} -This is where you specify that -the @file{g77} and @file{gcc} executables are to be -installed in @file{/usr/bin/}, -the @code{g77} and @code{gcc} documentation is -to be installed in @file{/usr/info/} and @file{/usr/man/}, -and so on. - -You should ensure that any existing installation of the @file{gcc} -executable is in @file{/usr/bin/}. - -However, if that existing version of @code{gcc} is not @value{version-gcc}, -or if you simply wish to avoid risking overwriting it with a -newly built copy of the same version, -you can specify @samp{--prefix=/usr/local} -(which is the default) -or some other path, -and invoke the newly installed version -directly from that path's @file{bin} directory. - -@xref{Where to Install,,Where in the World Does Fortran (and GNU CC) Go?}, -for more information on determining where to install @code{g77}. -@xref{Configuring gcc}, for more information on the -configuration process triggered by invoking the @file{./configure} -script. - -@item Step @value{build-gcc}: @kbd{make bootstrap} -@xref{Installation,,Installing GNU CC, -gcc,Using and Porting GNU CC}, for information -on the kinds of diagnostics you should expect during -this procedure. - -@xref{Building gcc}, for complete @code{g77}-specific -information on this step. - -@item Step @value{compare-gcc}: @kbd{make compare} -@xref{Bug Lists,,Where to Port Bugs}, for information -on where to report that you observed files -having different contents during this -phase. - -@xref{Bug Reporting,,How to Report Bugs}, for -information on @emph{how} to report bugs like this. - -@item Step @value{rm-stage1}: @kbd{rm -fr stage1} -You don't need to do this, but it frees up disk space. - -@item Step @value{install-g77}: @kbd{make -k install} -If this doesn't seem to work, try: - -@example -make -k install install-libf77 -@end example - -Or, make sure you're using GNU @code{make}. - -@xref{Installation of Binaries}, for more information. - -@xref{Updating Documentation,,Updating Your Info Directory}, -for information on entering this manual into your -system's list of texinfo manuals. - -@item Step @value{show-version}: @kbd{g77 -v} -If this command prints approximately 25 lines of output, -including the GNU Fortran Front End version number (which -should be the same as the version number for the version -of @code{g77} you just built and installed) and the -version numbers for the three parts of the @code{libf2c} -library (@code{libF77}, @code{libI77}, @code{libU77}), and -those version numbers are all in agreement, then there is -a high likelihood that the installation has been successfully -completed. - -You might consider doing further testing. -For example, log in as a non-privileged user, then create -a small Fortran program, such as: - -@example - PROGRAM SMTEST - DO 10 I=1, 10 - PRINT *, 'Hello World #', I -10 CONTINUE - END -@end example - -Compile, link, and run the above program, and, assuming you named -the source file @file{smtest.f}, the session should look like this: - -@example -sh# @kbd{g77 -o smtest smtest.f} -sh# @kbd{./smtest} - Hello World # 1 - Hello World # 2 - Hello World # 3 - Hello World # 4 - Hello World # 5 - Hello World # 6 - Hello World # 7 - Hello World # 8 - Hello World # 9 - Hello World # 10 -sh# -@end example - -If invoking @code{g77} doesn't seem to work, -the problem might be that you've installed it in -a location that is not in your shell's search path. -For example, if you specified @samp{--prefix=/gnu}, -and @file{/gnu/bin} is not in your @code{PATH} -environment variable, -you must explicitly specify the location of the compiler -via @kbd{/gnu/bin/g77 -o smtest smtest.f}. - -After proper installation, you don't -need to keep your gcc and g77 source and build directories -around anymore. -Removing them can free up a lot of disk space. -@end table - -@end ifclear - -@node Complete Installation -@section Complete Installation - -@ifset OMIT-FSF-G77 -For users of the @value{which-g77} version of @code{g77}, -this information is superceded by the -@value{which-gcc} installation instructions. -@end ifset - -@ifclear OMIT-FSF-G77 -Here is the complete @code{g77}-specific information on how -to configure, build, and install @code{g77}. - -@menu -* Unpacking:: -* Merging Distributions:: -* Where to Install:: -* Configuring gcc:: -* Building gcc:: -* Pre-installation Checks:: -* Installation of Binaries:: -* Updating Documentation:: -* Missing tools?:: -@end menu - -@node Unpacking -@subsection Unpacking -@cindex unpacking distributions -@cindex distributions, unpacking -@cindex code, source -@cindex source code -@cindex source tree -@cindex packages - -The @code{gcc} source distribution is a stand-alone distribution. -It is designed to be unpacked (producing the @code{gcc} -source tree) and built as is, assuming certain -prerequisites are met (including the availability of compatible -UNIX programs such as @code{make}, @code{cc}, and so on). - -However, before building @code{gcc}, you will want to unpack -and merge the @code{g77} distribution in with it, so that you -build a Fortran-capable version of @code{gcc}, which includes -the @code{g77} command, the necessary run-time libraries, -and this manual. - -Unlike @code{gcc}, the @code{g77} source distribution -is @emph{not} a stand-alone distribution. -It is designed to be unpacked and, afterwards, immediately merged -into an applicable @code{gcc} source tree. -That is, the @code{g77} distribution @emph{augments} a -@code{gcc} distribution---without @code{gcc}, generally -only the documentation is immediately usable. - -A sequence of commands typically used to unpack @code{gcc} -and @code{g77} is: - -@example -sh# @kbd{cd /usr/src} -sh# @kbd{gunzip -c /usr/FSF/gcc-@value{version-gcc}.tar.gz | tar xf -} -sh# @kbd{gunzip -c /usr/FSF/g77-@value{version-g77}.tar.gz | tar xf -} -sh# @kbd{ln -s gcc-@value{version-gcc} gcc} -sh# @kbd{ln -s g77-@value{version-g77} g77} -sh# @kbd{mv -i g77/* gcc} -@end example - -@emph{Notes:} The commands beginning with @samp{gunzip@dots{}} might -print @samp{Broken pipe@dots{}} as they complete. -That is nothing to worry about, unless you actually -@emph{hear} a pipe breaking. -The @code{ln} commands are helpful in reducing typing -and clutter in installation examples in this manual. -Hereafter, the top level of @code{gcc} source tree is referred to -as @file{gcc}, and the top level of just the @code{g77} -source tree (prior to issuing the @code{mv} command, above) -is referred to as @file{g77}. - -There are three top-level names in a @code{g77} distribution: - -@example -g77/COPYING.g77 -g77/README.g77 -g77/f -@end example - -All three entries should be moved (or copied) into a @code{gcc} -source tree (typically named after its version number and -as it appears in the FSF distributions---e.g. @file{gcc-@value{version-gcc}}). - -@file{g77/f} is the subdirectory containing all of the -code, documentation, and other information that is specific -to @code{g77}. -The other two files exist to provide information on @code{g77} -to someone encountering a @code{gcc} source tree with @code{g77} -already present, who has not yet read these installation -instructions and thus needs help understanding that the -source tree they are looking at does not come from a single -FSF distribution. -They also help people encountering an unmerged @code{g77} source -tree for the first time. - -@cindex modifying @code{g77} -@cindex code, modifying -@cindex Pentium optimizations -@cindex optimization, for Pentium -@emph{Note:} Please use @strong{only} @code{gcc} and @code{g77} -source trees as distributed by the FSF. -Use of modified versions is likely to result in problems that appear to be -in the @code{g77} code but, in fact, are not. -Do not use such modified versions -unless you understand all the differences between them and the versions -the FSF distributes---in which case you should be able to modify the -@code{g77} (or @code{gcc}) source trees appropriately so @code{g77} -and @code{gcc} can coexist as they do in the stock FSF distributions. - -@node Merging Distributions -@subsection Merging Distributions -@cindex merging distributions -@cindex @code{gcc}, versions supported by @code{g77} -@cindex versions, of @code{gcc} -@cindex support, @code{gcc} versions - -After merging the @code{g77} source tree into the @code{gcc} source tree, -you have put together a complete @code{g77} source tree. - -@cindex @code{gcc}, version number -@cindex version number -@cindex @code{g77}, version number -@cindex GNU version numbering -As of version 0.5.23, @code{g77} no longer modifies -the version number of @code{gcc}, -nor does it patch @code{gcc} itself. - -@code{g77} still depends on being merged with an -appropriate version of @code{gcc}. -For version @value{version-g77} of @code{g77}, -the specific version of @code{gcc} supported is @value{version-gcc}. - -However, other versions of @code{gcc} might be suitable -``hosts'' for this version of @code{g77}. - -GNU version numbers make it easy to figure out whether a -particular version of a distribution is newer or older than -some other version of that distribution. -The format is, -generally, @var{major}.@var{minor}.@var{patch}, with -each field being a decimal number. -(You can safely ignore -leading zeros; for example, 1.5.3 is the same as 1.5.03.) -The @var{major} field only increases with time. -The other two fields are reset to 0 when the field to -their left is incremented; otherwise, they, too, only -increase with time. -So, version 2.6.2 is newer than version 2.5.8, and -version 3.0 is newer than both. -(Trailing @samp{.0} fields often are omitted in -announcements and in names for distributions and -the directories they create.) - -If your version of @code{gcc} is older than the oldest version -supported by @code{g77} -(as casually determined by listing the contents of @file{@value{path-g77}/INSTALL/}, -which contains these installation instructions in plain-text format), -you should obtain a newer, supported version of @code{gcc}. -(You could instead obtain an older version of @code{g77}, -or try and get your @code{g77} to work with the old -@code{gcc}, but neither approach is recommended, and -you shouldn't bother reporting any bugs you find if you -take either approach, because they're probably already -fixed in the newer versions you're not using.) - -If your version of @code{gcc} is newer than the newest version -supported by @code{g77}, it is possible that your @code{g77} -will work with it anyway. -If the version number for @code{gcc} differs only in the -@var{patch} field, you might as well try that version of @code{gcc}. -Since it has the same @var{major} and @var{minor} fields, -the resulting combination is likely to work. - -So, for example, if a particular version of @code{g77} has support for -@code{gcc} versions 2.8.0 and 2.8.1, -it is likely that @file{gcc-2.8.2} would work well with @code{g77}. - -However, @file{gcc-2.9.0} would almost certainly -not work with that version of @code{g77} -without appropriate modifications, -so a new version of @code{g77} would be needed. - -@cindex distributions, why separate -@cindex separate distributions -@cindex why separate distributions -This complexity is the result of @code{gcc} and @code{g77} being -separate distributions. -By keeping them separate, each product is able to be independently -improved and distributed to its user base more frequently. - -However, the GBE interface defined by @code{gcc} typically -undergoes some incompatible changes at least every time the -@var{minor} field of the version number is incremented, -and such changes require corresponding changes to -the @code{g77} front end (FFE). - -@c @pindex config-lang.in -@c @emph{Note:} @code{g77}'s configuration file @file{@value{path-g77}/config-lang.in} -@c sometimes ensures that the source code for the version of @code{gcc} -@c being configured has at least one indication of being an appropriate -@c version as required specifically by @code{g77}. -@c This configuration-time -@c checking should catch failures to use the proper version of @code{gcc} and, -@c if so caught, should abort the configuration with an explanation. -@c @emph{Please} do not try to disable this check, -@c otherwise @code{g77} might well appear to build -@c and install correctly, and even appear to compile correctly, -@c but could easily produce broken code. - -@node Where to Install -@subsection Where in the World Does Fortran (and GNU CC) Go? -@cindex language f77 not recognized -@cindex @code{gcc}, will not compile Fortran programs - -Before configuring, you should make sure you know -where you want the @code{g77} and @code{gcc} -binaries to be installed after they're built, -because this information is given to the configuration -tool and used during the build itself. - -A @code{g77} installation normally includes installation of -a Fortran-aware version of @code{gcc}, so that the @code{gcc} -command recognizes Fortran source files and knows how to compile -them. - -For this to work, the version of @code{gcc} that you will be building -as part of @code{g77} @strong{must} be installed as the ``active'' -version of @code{gcc} on the system. - -Sometimes people make the mistake of installing @code{gcc} as -@file{/usr/local/bin/gcc}, -leaving an older, non-Fortran-aware version in @file{/usr/bin/gcc}. -(Or, the opposite happens.) -This can result in @code{gcc} being unable to compile Fortran -source files, -because when the older version of @code{gcc} is invoked, -it complains that it does not -recognize the language, or the file name suffix. - -So, determine whether @code{gcc} already is installed on your system, -and, if so, @emph{where} it is installed, and prepare to configure the -new version of @code{gcc} you'll be building so that it installs -over the existing version of @code{gcc}. - -You might want to back up your existing copy of @file{/usr/bin/gcc}, and -the entire @file{/usr/lib} directory, before -you perform the actual installation (as described in this manual). - -Existing @code{gcc} installations typically are -found in @file{/usr} or @file{/usr/local}. -(This means the commands are installed in @file{/usr/bin} or -@file{/usr/local/bin}, -the libraries in @file{/usr/lib} or @file{/usr/local/lib}, -and so on.) - -If you aren't certain where the currently -installed version of @code{gcc} and its -related programs reside, look at the output -of this command: - -@example -gcc -v -o /tmp/delete-me -xc /dev/null -xnone -@end example - -All sorts of interesting information on the locations of various -@code{gcc}-related programs and data files should be visible -in the output of the above command. -(The output also is likely to include a diagnostic from -the linker, since there's no @samp{main_()} function.) -However, you do have to sift through it yourself; @code{gcc} -currently provides no easy way to ask it where it is installed -and where it looks for the various programs and data files it -calls on to do its work. - -Just @emph{building} @code{g77} should not overwrite any installed -programs---but, usually, after you build @code{g77}, you will want -to install it, so backing up anything it might overwrite is -a good idea. -(This is true for any package, not just @code{g77}, -though in this case it is intentional that @code{g77} overwrites -@code{gcc} if it is already installed---it is unusual that -the installation process for one distribution intentionally -overwrites a program or file installed by another distribution, -although, in this case, @code{g77} is an augmentation of the -@code{gcc} distribution.) - -Another reason to back up the existing version first, -or make sure you can restore it easily, is that it might be -an older version on which other users have come to depend -for certain behaviors. -However, even the new version of @code{gcc} you install -will offer users the ability to specify an older version of -the actual compilation programs if desired, and these -older versions need not include any @code{g77} components. -@xref{Target Options,,Specifying Target Machine and Compiler Version, -gcc,Using and Porting GNU CC}, for information on the @samp{-V} -option of @code{gcc}. - -@node Configuring gcc -@subsection Configuring GNU CC - -@code{g77} is configured automatically when you configure -@code{gcc}. -There are two parts of @code{g77} that are configured in two -different ways---@code{g77}, which ``camps on'' to the -@code{gcc} configuration mechanism, and @code{libg2c}, which -uses a variation of the GNU @code{autoconf} configuration -system. - -Generally, you shouldn't have to be concerned with -either @code{g77} or @code{libg2c} configuration, unless -you're configuring @code{g77} as a cross-compiler. -In this case, the @code{libg2c} configuration, and possibly the -@code{g77} and @code{gcc} configurations as well, -might need special attention. -(This also might be the case if you're porting @code{gcc} to -a whole new system---even if it is just a new operating system -on an existing, supported CPU.) - -To configure the system, see -@ref{Installation,,Installing GNU CC,gcc,Using and Porting GNU CC}, -following the instructions for running @file{./configure}. -Pay special attention to the @samp{--prefix=} option, which -you almost certainly will need to specify. - -(Note that @code{gcc} installation information is provided -as a plain-text file in @file{gcc/INSTALL}.) - -The information printed by the invocation of @file{./configure} -should show that the @file{f} directory (the Fortran language) -has been configured. -If it does not, there is a problem. - -@emph{Note:} Configuring with the @samp{--srcdir} argument, -or by starting in an empty directory -and typing a command such as @kbd{../gcc/configure} to -build with separate build and source directories, -is known to work with GNU @code{make}, -but it is known to not work with other variants of @code{make}. -Irix5.2 and SunOS4.1 versions of @code{make} definitely -won't work outside the source directory at present. - -@code{g77}'s portion of the @file{configure} script -used to issue a warning message about this -when configuring for building binaries outside the source directory, -but no longer does this as of version 0.5.23. - -Instead, @code{g77} simply rejects most common attempts -to build it using a non-GNU @code{make} when the -build directory is not the same as the source directory, -issuing an explanatory diagnostic. - -@node Building gcc -@subsection Building GNU CC -@cindex building @code{gcc} -@cindex building @code{g77} - -@cindex @code{LANGUAGES} macro -Building @code{g77} requires building enough of @code{gcc} that -these instructions assume you're going to build all of -@code{gcc}, including @code{g++}, @code{protoize}, and so on. -You can save a little time and disk space by changes the -@code{LANGUAGES} macro definition in @code{gcc/Makefile.in} -or @code{gcc/Makefile}, but if you do that, you're on your own. -One change is almost @emph{certainly} going to cause failures: -removing @code{c} or @code{f77} from the definition of the -@code{LANGUAGES} macro. - -After configuring @code{gcc}, which configures @code{g77} and -@code{libg2c} automatically, you're ready to start the actual -build by invoking @code{make}. - -@pindex configure -@emph{Note:} You @strong{must} have run the @file{configure} -script in @code{gcc} before you run @code{make}, -even if you're using an already existing @code{gcc} development directory, -because @file{./configure} does the work to recognize that you've added -@code{g77} to the configuration. - -There are two general approaches to building GNU CC from -scratch: - -@table @dfn -@item bootstrap -This method uses minimal native system facilities to -build a barebones, unoptimized @code{gcc}, that is then -used to compile (``bootstrap'') the entire system. - -@item straight -This method assumes a more complete native system -exists, and uses that just once to build the entire -system. -@end table - -On all systems without a recent version of @code{gcc} -already installed, the @i{bootstrap} method must be -used. -In particular, @code{g77} uses extensions to the C -language offered, apparently, only by @code{gcc}. - -On most systems with a recent version of @code{gcc} -already installed, the @i{straight} method can be -used. -This is an advantage, because it takes less CPU time -and disk space for the build. -However, it does require that the system have fairly -recent versions of many GNU programs and other -programs, which are not enumerated here. - -@menu -* Bootstrap Build:: For all systems. -* Straight Build:: For systems with a recent version of @code{gcc}. -@end menu - -@node Bootstrap Build -@subsubsection Bootstrap Build -@cindex bootstrap build -@cindex build, bootstrap - -A complete bootstrap build is done by issuing a command -beginning with @samp{make bootstrap @dots{}}, as -described in @ref{Installation,,Installing GNU CC, -gcc,Using and Porting GNU CC}. -This is the most reliable form of build, but it does require -the most disk space and CPU time, since the complete system -is built twice (in Stages 2 and 3), after an initial build -(during Stage 1) of a minimal @code{gcc} compiler using -the native compiler and libraries. - -You might have to, or want to, control the way a bootstrap -build is done by entering the @code{make} commands to build -each stage one at a time, as described in the @code{gcc} -manual. -For example, to save time or disk space, you might want -to not bother doing the Stage 3 build, in which case you -are assuming that the @code{gcc} compiler you have built -is basically sound (because you are giving up the opportunity -to compare a large number of object files to ensure they're -identical). - -To save some disk space during installation, after Stage 2 -is built, you can type @samp{rm -fr stage1} to remove the -binaries built during Stage 1. - -Also, see @ref{Installation,,Installing GNU CC,gcc,Using and Porting GNU CC}, -for important information on building @code{gcc} that is -not described in this @code{g77} manual. -For example, explanations of diagnostic messages -and whether they're expected, or indicate trouble, -are found there. - -@node Straight Build -@subsubsection Straight Build -@cindex straight build -@cindex build, straight - -If you have a recent version of @code{gcc} -already installed on your system, and if you're -reasonably certain it produces code that is -object-compatible with the version of @code{gcc} -you want to build as part of building @code{g77}, -you can save time and disk space by doing a straight -build. - -To build just the compilers along with the -necessary run-time libraries, issue the following -command: - -@example -make -k CC=gcc -@end example - -If you run into problems using this method, you have -two options: - -@itemize @bullet -@item -Abandon this approach and do a bootstrap build. - -@item -Try to make this approach work by diagnosing the -problems you're running into and retrying. -@end itemize - -Especially if you do the latter, you might consider -submitting any solutions as bug/fix reports. -@xref{Trouble,,Known Causes of Trouble with GNU Fortran}. - -However, understand that many problems preventing a -straight build from working are not @code{g77} problems, -and, in such cases, are not likely to be addressed in -future versions of @code{g77}. -Consider treating them as @code{gcc} bugs instead. - -@node Pre-installation Checks -@subsection Pre-installation Checks -@cindex pre-installation checks -@cindex installing, checking before - -Before installing the system, which includes installing -@code{gcc}, you might want to do some minimum checking -to ensure that some basic things work. - -Here are some commands you can try, and output typically -printed by them when they work: - -@example -sh# @kbd{cd /usr/src/gcc} -sh# @kbd{./g77 -B./ -v} -g77 version @value{version-g77} -Driving: ./g77 -B./ -v -c -xf77-version /dev/null -xnone -Reading specs from ./specs -gcc version @value{version-gcc} - cpp -lang-c -v -isystem ./include -undef -D__GNUC__=2 @dots{} -GNU CPP version @value{version-gcc} (Alpha GNU/Linux with ELF) -#include "..." search starts here: -#include <...> search starts here: - include - /usr/alpha-linux/include - /usr/lib/gcc-lib/alpha-linux/@value{version-gcc}/include - /usr/include -End of search list. - ./f771 -fnull-version -quiet -dumpbase g77-version.f -version @dots{} -GNU F77 version @value{version-gcc} (alpha-linux) compiled @dots{} -GNU Fortran Front End version @value{version-g77} - as -nocpp -o /tmp/cca14485.o /tmp/cca14485.s - ld -m elf64alpha -G 8 -O1 -dynamic-linker /lib/ld-linux.so.2 @dots{} - /tmp/cca14485 -__G77_LIBF77_VERSION__: @value{version-g77} -@@(#)LIBF77 VERSION 19970919 -__G77_LIBI77_VERSION__: @value{version-g77} -@@(#) LIBI77 VERSION pjw,dmg-mods 19980405 -__G77_LIBU77_VERSION__: @value{version-g77} -@@(#) LIBU77 VERSION 19970919 -sh# @kbd{./xgcc -B./ -v -o /tmp/delete-me -xc /dev/null -xnone} -Reading specs from ./specs -gcc version @value{version-gcc} - ./cpp -lang-c -v -isystem ./include -undef @dots{} -GNU CPP version @value{version-gcc} (Alpha GNU/Linux with ELF) -#include "..." search starts here: -#include <...> search starts here: - include - /usr/alpha-linux/include - /usr/lib/gcc-lib/alpha-linux/@value{version-gcc}/include - /usr/include -End of search list. - ./cc1 /tmp/cca18063.i -quiet -dumpbase null.c -version @dots{} -GNU C version @value{version-gcc} (alpha-linux) compiled @dots{} - as -nocpp -o /tmp/cca180631.o /tmp/cca18063.s - ld -m elf64alpha -G 8 -O1 -dynamic-linker /lib/ld-linux.so.2 @dots{} -/usr/lib/crt1.o: In function `_start': -../sysdeps/alpha/elf/start.S:77: undefined reference to `main' -../sysdeps/alpha/elf/start.S:77: undefined reference to `main' -sh# -@end example - -(Note that long lines have been truncated, and @samp{@dots{}} -used to indicate such truncations.) - -The above two commands test whether @code{g77} and @code{gcc}, -respectively, are able to compile empty (null) source files, -whether invocation of the C preprocessor works, whether libraries -can be linked, and so on. - -If the output you get from either of the above two commands -is noticeably different, especially if it is shorter or longer -in ways that do not look consistent with the above sample -output, you probably should not install @code{gcc} and @code{g77} -until you have investigated further. - -For example, you could try compiling actual applications and -seeing how that works. -(You might want to do that anyway, even if the above tests -work.) - -To compile using the not-yet-installed versions of @code{gcc} -and @code{g77}, use the following commands to invoke them. - -To invoke @code{g77}, type: - -@example -/usr/src/gcc/g77 -B/usr/src/gcc/ @dots{} -@end example - -To invoke @code{gcc}, type: - -@example -/usr/src/gcc/xgcc -B/usr/src/gcc/ @dots{} -@end example - -@node Installation of Binaries -@subsection Installation of Binaries -@cindex installation of binaries -@cindex @code{g77}, installation of -@cindex @code{gcc}, installation of - -After configuring, building, and testing @code{g77} and @code{gcc}, -when you are ready to install them on your system, type: - -@example -make -k CC=gcc install -@end example - -As described in @ref{Installation,,Installing GNU CC, -gcc,Using and Porting GNU CC}, the values for -the @code{CC} and @code{LANGUAGES} macros should -be the same as those you supplied for the build -itself. - -So, the details of the above command might vary -if you used a bootstrap build (where you might be -able to omit both definitions, or might have to -supply the same definitions you used when building -the final stage) or if you deviated from the -instructions for a straight build. - -If the above command does not install @file{libg2c.a} -as expected, try this: - -@example -make -k @dots{} install install-libf77 -@end example - -We don't know why some non-GNU versions of @code{make} sometimes -require this alternate command, but they do. -(Remember to supply the appropriate definition for @code{CC} -where you see @samp{@dots{}} in the above command.) - -Note that using the @samp{-k} option tells @code{make} to -continue after some installation problems, like not having -@code{makeinfo} installed on your system. -It might not be necessary for your system. - -@emph{Note:} @code{g77} no longer installs -files not directly part of @code{g77}, -such as @file{/usr/bin/f77}, @file{/usr/lib/libf2c.a}, -and @file{/usr/include/f2c.h}, or their -@file{/usr/local} equivalents. - -@xref{Distributing Binaries}, for information on -how to accommodate systems with no existing non-@code{g77} -@code{f77} compiler and systems with @code{f2c} installed. - -@node Updating Documentation -@subsection Updating Your Info Directory -@cindex updating info directory -@cindex info, updating directory -@cindex directory, updating info -@pindex /usr/info/dir -@pindex g77.info -@cindex texinfo -@cindex documentation - -As part of installing @code{g77}, you should make sure users -of @code{info} can easily access this manual on-line. - -@code{g77} does this automatically by -invoking the @code{install-info} command -when you use @samp{make install} to install @code{g77}. - -If that fails, or if the @code{info} directory -it updates is not the one normally accessed by users, -consider invoking it yourself. -For example: - -@smallexample -install-info --info-dir=/usr/info /usr/info/g77.info -@end smallexample - -The above example assumes the @code{g77} documentation -already is installed in @file{/usr/info} -and that @file{/usr/info/dir} is the file -you wish to update. -Adjust the command accordingly, -if those assumptions are wrong. - -@node Missing tools? -@subsection Missing tools? -@cindex command missing -@cindex command not found -@cindex file not found -@cindex not found - -A build of @code{gcc} might fail due to one or more tools -being called upon by @code{make} -(during the build or install process), -when those tools are not installed on your system. - -This situation can result from any of the following actions -(performed by you or someone else): - -@itemize @bullet -@item -Changing the source code or documentation yourself -(as a developer or technical writer). - -@item -Applying a patch that changes the source code or documentation -(including, sometimes, the official patches distributed by -the FSF). - -@item -Deleting the files that are created by the (missing) tools. - -The @samp{make maintainer-clean} command is supposed -to delete these files, so invoking this command without -having all the appropriate tools installed is not recommended. - -@item -Creating the source directory using a method that -does not preserve the date-time-modified information -in the original distribution. - -For example, the UNIX @samp{cp -r} command copies a -directory tree without preserving the date-time-modified -information. -Use @samp{cp -pr} instead. -@end itemize - -The reason these activities cause @code{make} to try and -invoke tools that it probably wouldn't when building -from a perfectly ``clean'' source directory containing -@code{gcc} and @code{g77} is that some files in the -source directory (and the corresponding distribution) -aren't really source files, but @emph{derived} files -that are produced by running tools with the corresponding -source files as input. -These derived files @dfn{depend}, in @code{make} terminology, -on the corresponding source files. - -@code{make} determines that a file that depends on another -needs to be updated if the date-time-modified information for -the source file shows that it is newer than the corresponding -information for the derived file. - -If it makes that determination, @code{make} runs the appropriate -commands (specified in the ``Makefile'') to update the -derived file, and this process typically calls upon one or -more installed tools to do the work. - -The ``safest'' approach to dealing with this situation -is to recreate the @code{gcc} and @code{g77} source -directories from complete @code{gcc} and @code{g77} distributions -known to be provided by the FSF. - -Another fairly ``safe'' approach is to simply install -the tools you need to complete the build process. -This is especially appropriate if you've changed the -source code or applied a patch to do so. - -However, if you're certain that the problem is limited -entirely to incorrect date-time-modified information, -that there are no discrepancies between the contents of -source files and files derived from them in the source -directory, you can often update the date-time-modified -information for the derived files to work around the -problem of not having the appropriate tools installed. - -On UNIX systems, the simplest way to update the date-time-modified -information of a file is to use the use the @code{touch} -command. - -How to use @code{touch} to update the derived files -updated by each of the tools is described below. -@emph{Note:} New versions of @code{g77} might change the set of -files it generates by invoking each of these tools. -If you cannot figure -out for yourself how to handle such a situation, try an -older version of @code{g77} until you find someone who can -(or until you obtain and install the relevant tools). - -@menu -* autoconf: Missing autoconf?. -* bison: Missing bison?. -* gperf: Missing gperf?. -* makeinfo: Missing makeinfo?. -@end menu - -@node Missing autoconf? -@subsubsection Missing @code{autoconf}? -@cindex @code{autoconf} -@cindex missing @code{autoconf} - -If you cannot install @code{autoconf}, make sure you have started -with a @emph{fresh} distribution of @code{gcc} and @code{g77}, -do @emph{not} do @samp{make maintainer-clean}, and, to ensure that -@code{autoconf} is not invoked by @code{make} during the build, -type these commands: - -@example -sh# @kbd{cd @value{path-libf2c}} -sh# @kbd{touch configure libU77/configure} -sh# @kbd{cd ../../..} -sh# -@end example - -@node Missing bison? -@subsubsection Missing @code{bison}? -@cindex @code{bison} -@cindex missing @code{bison} - -If you cannot install @code{bison}, make sure you have started -with a @emph{fresh} distribution of @code{gcc}, do @emph{not} -do @samp{make maintainer-clean}, and, to ensure that -@code{bison} is not invoked by @code{make} during the build, -type these commands: - -@example -sh# @kbd{cd gcc} -sh# @kbd{touch bi-parser.c bi-parser.h c-parse.c c-parse.h cexp.c} -sh# @kbd{touch cp/parse.c cp/parse.h objc-parse.c} -sh# @kbd{cd ..} -sh# -@end example - -@node Missing gperf? -@subsubsection Missing @code{gperf}? -@cindex @code{gperf} -@cindex missing @code{gperf} - -If you cannot install @code{gperf}, make sure you have started -with a @emph{fresh} distribution of @code{gcc}, do @emph{not} -do @samp{make maintainer-clean}, and, to ensure that -@code{gperf} is not invoked by @code{make} during the build, -type these commands: - -@example -sh# @kbd{cd gcc} -sh# @kbd{touch c-gperf.h} -sh# @kbd{cd ..} -sh# -@end example - -@node Missing makeinfo? -@subsubsection Missing @code{makeinfo}? -@cindex @code{makeinfo} -@cindex missing @code{makeinfo} -@cindex @code{libg2c.a} not found -@cindex missing @code{libg2c.a} - -If @code{makeinfo} is needed but unavailable -when installing (via @code{make install}), -some files, like @file{libg2c.a}, -might not be installed, -because once @code{make} determines that it cannot -invoke @code{makeinfo}, it cancels any further processing. - -If you cannot install @code{makeinfo}, an easy work-around is to -specify @samp{MAKEINFO=true} on the @code{make} command line, -or to specify the @samp{-k} option (@kbd{make -k install}). - -Another approach is to force the relevant files to be up-to-date -by typing these commands and then re-trying the installation step: - -@example -sh# @kbd{cd gcc} -sh# @kbd{touch f/g77.info f/BUGS f/INSTALL f/NEWS} -sh# @kbd{cd ..} -sh# -@end example - -@end ifclear - -@node Distributing Binaries -@section Distributing Binaries -@cindex binaries, distributing -@cindex code, distributing - -@ifset OMIT-FSF-G77 -For users of the @value{which-g77} version of @code{g77}, -this information is superceded by the -@value{which-gcc} installation instructions. -@end ifset - -@ifclear OMIT-FSF-G77 -If you are building @code{g77} for distribution to others in binary form, -first make sure you are aware of your legal responsibilities (read -the file @file{gcc/COPYING} thoroughly). - -Then, consider your target audience and decide where @code{g77} should -be installed. - -For systems like GNU/Linux that have no native Fortran compiler (or -where @code{g77} could be considered the native compiler for Fortran and -@code{gcc} for C, etc.), you should definitely configure -@code{g77} for installation -in @file{/usr/bin} instead of @file{/usr/local/bin}. -Specify the -@samp{--prefix=/usr} option when running @file{./configure}. - -You might also want to set up the distribution -so the @file{f77} command is a link to @file{g77}, -although a script that accepts ``classic'' UNIX @code{f77} -options and translates the command-line to the -appropriate @code{g77} command line would be more appropriate. -If you do this, @emph{please} also provide a ``man page'' in -@file{man/man1/f77.1} describing the command. -(A link to @file{man/man1/g77.1} is appropriate -if @file{bin/f77} is a link to @file{bin/g77}.) - -For a system that might already have @code{f2c} installed, -consider whether inter-operation with @code{g77} will be -important to users of @code{f2c} on that system. -If you want to improve the likelihood -that users will be able to use both @code{f2c} and @code{g77} -to compile code for a single program -without encountering link-time or run-time incompatibilities, -make sure that, -whenever they intend to combine @code{f2c}-produced code -with @code{g77}-produced code in an executable, they: - -@itemize @bullet -@item -Use the @file{lib/gcc-lib/@dots{}/include/g2c.h} file -generated by the @code{g77} build -in place of the @file{f2c.h} file -that normally comes with @code{f2c} -(or versions of @code{g77} prior to 0.5.23) -when compiling @emph{all} of the @code{f2c}-produced C code - -@item -Link to the @code{lib/gcc-lib/@dots{}/libg2c.a} library -built by the @code{g77} build -instead of the @file{libf2c.a} library -that normally comes with @code{f2c} -(or versions of @code{g77} prior to 0.5.23) -@end itemize - -How you choose to effect the above depends on whether -the existing installation of @code{f2c} must be -maintained. - -In any case, it is important to try and ensure that -the installation keeps working properly even after -subsequent re-installation of @code{f2c}, -which probably involves overwriting -@file{/usr/local/lib/libf2c.a} and -@file{/usr/local/include/f2c.h}, -or similar. - -At least, copying @file{libg2c.a} and @file{g2c.h} into -the appropriate ``public'' directories -allows users to more easily select the version of -@code{libf2c} they wish to use for a particular -build. -The names are changed by @code{g77} to make this -coexistence easier to maintain; -even if @code{f2c} is installed later, -the @code{g77} files normally installed -by its installation process aren't disturbed. -Use of symbolic links from one set of files to -another might result in problems after a subsequent -reinstallation of either @code{f2c} or @code{g77}, -so be sure to alert users of your distribution -accordingly. - -(Make sure you clearly document, in the description of -your distribution, how installation of your distribution will -affect existing installations of @code{gcc}, @code{f2c}, -@code{f77}, @file{libf2c.a}, and so on. -Similarly, you should clearly document any requirements -you assume will be met by users of your distribution.) - -For other systems with native @code{f77} (and @code{cc}) compilers, -configure @code{g77} as you (or most of your audience) would -configure @code{gcc} for their installations. -Typically this is for installation in @file{/usr/local}, -and would not include a new version of @file{/usr/bin/f77} -or @file{/usr/local/bin/f77}, -so users could still use the native @code{f77}. - -In any case, for @code{g77} to work properly, you @strong{must} ensure -that the binaries you distribute include: - -@table @file -@item bin/g77 -This is the command most users use to compile Fortran. - -@item bin/gcc -This is the command some users use to compile Fortran, -typically when compiling programs written in other languages -at the same time. -The @file{bin/gcc} executable file must have been built -from a @code{gcc} source tree into which a @code{g77} source -tree was merged and configured, or it will not know how -to compile Fortran programs. - -@item info/g77.info* -This is the documentation for @code{g77}. -If it is not included, users will have trouble understanding -diagnostics messages and other such things, and will send -you a lot of email asking questions. - -Please edit this documentation (by editing @file{@value{path-g77}/*.texi} -and doing @samp{make doc} from the @file{/usr/src/gcc} directory) -to reflect any changes you've made to @code{g77}, or at -least to encourage users of your binary distribution to -report bugs to you first. - -Also, whether you distribute binaries or install @code{g77} -on your own system, it might be helpful for everyone to -add a line listing this manual by name and topic to the -top-level @code{info} node in @file{/usr/info/dir}. -That way, users can find @code{g77} documentation more -easily. -@xref{Updating Documentation,,Updating Your Info Directory}. - -@item man/man1/g77.1 -This is the short man page for @code{g77}. -It is not always kept up-to-date, -but you might as well include it -for people who really like ``man'' pages. - -@cindex gcc-lib directory -@cindex directories, gcc-lib -@item lib/gcc-lib -This is the directory containing the ``private'' files -installed by and for @code{gcc}, @code{g77}, @code{g++}, -and other GNU compilers. - -@item lib/gcc-lib/@dots{}/f771 -This is the actual Fortran compiler. - -@item lib/gcc-lib/@dots{}/libg2c.a -This is the run-time library for @code{g77}-compiled programs. -@end table - -Whether you want to include the slightly updated (and possibly -improved) versions of @file{cc1}, @file{cc1plus}, and whatever other -binaries get rebuilt with the changes the GNU Fortran distribution -makes to the GNU back end, is up to you. -These changes are highly unlikely to break any compilers, -because they involve doing things like adding to the -list of acceptable compiler options -(so, for example, @file{cc1plus} accepts, and ignores, -options that only @file{f771} actually processes). - -Please assure users that unless -they have a specific need for their existing, -older versions of @file{gcc} command, -they are unlikely to experience any problems by overwriting -it with your version---though they could certainly protect -themselves by making backup copies first! - -Otherwise, users might try and install your binaries -in a ``safe'' place, find they cannot compile Fortran -programs with your distribution (because, perhaps, they're -invoking their old version of the @file{gcc} command, -which does not recognize Fortran programs), and assume -that your binaries (or, more generally, GNU Fortran -distributions in general) are broken, at least for their -system. - -Finally, @strong{please} ask for bug reports to go to you first, at least -until you're sure your distribution is widely used and has been -well tested. -This especially goes for those of you making any -changes to the @code{g77} sources to port @code{g77}, e.g. to OS/2. -@email{fortran@@gnu.org} has received a fair number of bug -reports that turned out to be problems with other peoples' ports -and distributions, about which nothing could be done for the -user. -Once you are quite certain a bug report does not involve -your efforts, you can forward it to us. - -@end ifclear diff --git a/contrib/gcc/f/glimits.j b/contrib/gcc/f/glimits.j deleted file mode 100644 index 0262258423ac..000000000000 --- a/contrib/gcc/f/glimits.j +++ /dev/null @@ -1,28 +0,0 @@ -/* glimits.j -- Wrapper for GCC's glimits.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#if !USE_HOST_LIMITS -#include "glimits.h" -#else -#include <limits.h> -#endif -#endif diff --git a/contrib/gcc/f/hconfig.j b/contrib/gcc/f/hconfig.j deleted file mode 100644 index c73930cf9e83..000000000000 --- a/contrib/gcc/f/hconfig.j +++ /dev/null @@ -1,27 +0,0 @@ -/* hconfig.j -- Wrapper for GCC's hconfig.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_hconfig -#define _J_f_hconfig -#include "hconfig.h" -#endif -#endif diff --git a/contrib/gcc/f/input.j b/contrib/gcc/f/input.j deleted file mode 100644 index cc9ff24b0730..000000000000 --- a/contrib/gcc/f/input.j +++ /dev/null @@ -1,27 +0,0 @@ -/* input.j -- Wrapper for GCC's input.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_input -#define _J_f_input -#include "input.h" -#endif -#endif diff --git a/contrib/gcc/f/output.j b/contrib/gcc/f/output.j deleted file mode 100644 index 8816b75e6667..000000000000 --- a/contrib/gcc/f/output.j +++ /dev/null @@ -1,27 +0,0 @@ -/* output.j -- Wrapper for GCC's output.h - Copyright (C) 1998 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_output -#define _J_f_output -#include "output.h" -#endif -#endif diff --git a/contrib/gcc/f/proj.c b/contrib/gcc/f/proj.c deleted file mode 100644 index 237ebe0ddf41..000000000000 --- a/contrib/gcc/f/proj.c +++ /dev/null @@ -1,68 +0,0 @@ -/* proj.c file for GNU Fortran - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#include "proj.h" -#include "glimits.j" - -#ifndef HAVE_STRTOUL -unsigned long int -strtoul (const char *nptr, char **endptr, int base) -{ - unsigned long int number = 0; - unsigned long int old_number = 0; - - assert (base == 10); - assert (endptr == NULL); - - while (ISDIGIT (*nptr)) - { - number = old_number * 10 + (*(nptr++) - '0'); - if ((number <= old_number) && (old_number != 0)) - return ULONG_MAX; - old_number = number; - } - - return number; -} -#endif - -#ifndef HAVE_BSEARCH -void * -bsearch (const void *key, const void *base, size_t nmemb, size_t size, - int (*compar) (const void *, const void *)) -{ - size_t i; - int cmp; - - /* We do a dumb incremental search, not a binary search, for now. */ - - for (i = 0; i < nmemb; ++i) - { - if ((cmp = (*compar) (key, base)) == 0) - return base; - if (cmp < 0) - break; - base += size; - } - - return NULL; -} -#endif diff --git a/contrib/gcc/f/rtl.j b/contrib/gcc/f/rtl.j deleted file mode 100644 index ab78e3a7736d..000000000000 --- a/contrib/gcc/f/rtl.j +++ /dev/null @@ -1,28 +0,0 @@ -/* rtl.j -- Wrapper for GCC's rtl.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_rtl -#define _J_f_rtl -#include "config.j" -#include "rtl.h" -#endif -#endif diff --git a/contrib/gcc/f/system.j b/contrib/gcc/f/system.j deleted file mode 100644 index 38547c830086..000000000000 --- a/contrib/gcc/f/system.j +++ /dev/null @@ -1,27 +0,0 @@ -/* system.j -- Wrapper for GCC's system.h - Copyright (C) 1998 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_system -#define _J_f_system -#include "system.h" -#endif -#endif diff --git a/contrib/gcc/f/tconfig.j b/contrib/gcc/f/tconfig.j deleted file mode 100644 index 9c4c3ecf360c..000000000000 --- a/contrib/gcc/f/tconfig.j +++ /dev/null @@ -1,27 +0,0 @@ -/* tconfig.j -- Wrapper for GCC's tconfig.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_tconfig -#define _J_f_tconfig -#include "tconfig.h" -#endif -#endif diff --git a/contrib/gcc/f/tm.j b/contrib/gcc/f/tm.j deleted file mode 100644 index e0d759426396..000000000000 --- a/contrib/gcc/f/tm.j +++ /dev/null @@ -1,27 +0,0 @@ -/* tm.j -- Wrapper for GCC's tm.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_tm -#define _J_f_tm -#include "tm.h" -#endif -#endif diff --git a/contrib/gcc/f/toplev.j b/contrib/gcc/f/toplev.j deleted file mode 100644 index 4b8b7970cd05..000000000000 --- a/contrib/gcc/f/toplev.j +++ /dev/null @@ -1,27 +0,0 @@ -/* toplev.j -- Wrapper for GCC's toplev.h - Copyright (C) 1998 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_toplev -#define _J_f_toplev -#include "toplev.h" -#endif -#endif diff --git a/contrib/gcc/f/tree.j b/contrib/gcc/f/tree.j deleted file mode 100644 index b0bf98a73fdd..000000000000 --- a/contrib/gcc/f/tree.j +++ /dev/null @@ -1,28 +0,0 @@ -/* tree.j -- Wrapper for GCC's tree.h - Copyright (C) 1995 Free Software Foundation, Inc. - Contributed by James Craig Burley. - -This file is part of GNU Fortran. - -GNU Fortran 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 Fortran 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 Fortran; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#ifndef MAKING_DEPENDENCIES -#ifndef _J_f_tree -#define _J_f_tree -#include "config.j" -#include "tree.h" -#endif -#endif diff --git a/contrib/gcc/fixcpp b/contrib/gcc/fixcpp deleted file mode 100755 index 044353f3a43f..000000000000 --- a/contrib/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/contrib/gcc/fixinc-nt.sed b/contrib/gcc/fixinc-nt.sed deleted file mode 100644 index a8119b93030d..000000000000 --- a/contrib/gcc/fixinc-nt.sed +++ /dev/null @@ -1,5 +0,0 @@ -s/!__STDC__/!defined (__STRICT_ANSI__)/g -s/getcwd(char \*, int)/getcwd(char *, size_t)/ -s/Format\[\]/Format\[1\]/ -s/^#if !defined (__cplusplus)/#if 0/ -s/^#define DECLSPEC_IMPORT __declspec(dllimport)/#define DECLSPEC_IMPORT/ diff --git a/contrib/gcc/fixincludes b/contrib/gcc/fixincludes deleted file mode 100755 index e5cc1c373b69..000000000000 --- a/contrib/gcc/fixincludes +++ /dev/null @@ -1,3265 +0,0 @@ -#! /bin/sh -# Install modified versions of certain ANSI-incompatible system header files -# which are fixed to work correctly with ANSI C -# and placed in a directory that GNU C will search. - -# See README-fixinc for more information. - -# Directory containing the original header files. -# (This was named INCLUDES, but that conflicts with a name in Makefile.in.) -if [ "x$1" = "x" ] -then echo fixincludes: no output directory specified -exit 1 -fi - -LIB=${1} -shift - -# Make sure it exists. -if [ ! -d $LIB ]; then - mkdir $LIB || { - echo fixincludes: output dir '`'$LIB"' cannot be created" - exit 1 - } -else - ( \cd $LIB && touch DONE && rm DONE ) || { - echo fixincludes: output dir '`'$LIB"' is an invalid directory" - exit 1 - } -fi - -# Define what target system we're fixing. -# -if test -r ./Makefile; then - target_canonical="`sed -n -e 's,^target[ ]*=[ ]*\(.*\)$,\1,p' < Makefile`" -fi - -# If not from the Makefile, then try config.guess -# -if test -z "${target_canonical}" ; then - if test -x ./config.guess ; then - target_canonical="`config.guess`" ; fi - test -z "${target_canonical}" && target_canonical=unknown -fi -export target_canonical - -# # # # # # # # # # # # # # # # # # # # # -# -# Define PWDCMD as a command to use to get the working dir -# in the form that we want. -PWDCMD=pwd - -case "`$PWDCMD`" in -//*) - # On an Apollo, discard everything before `/usr'. - PWDCMD="eval pwd | sed -e 's,.*/usr/,/usr/,'" - ;; -esac - -# Original directory. -ORIGDIR=`${PWDCMD}` - -# Make LIB absolute only if needed to avoid problems with the amd. -case $LIB in -/*) - ;; -*) - cd $LIB; LIB=`${PWDCMD}` - ;; -esac - -echo Fixing headers into ${LIB} for ${target_canonical} target - -# Determine whether this system has symbolic links. -if ln -s X $LIB/ShouldNotExist 2>/dev/null; then - rm -f $LIB/ShouldNotExist - LINKS=true -elif ln -s X /tmp/ShouldNotExist 2>/dev/null; then - rm -f /tmp/ShouldNotExist - LINKS=true -else - LINKS=false -fi - -# # # # # # # # # # # # # # # # # # # # # -# -# Search each input directory for broken header files. -# This loop ends near the end of the file. -# -if test $# -eq 0 -then - INPUTLIST="/usr/include" -else - INPUTLIST="$@" -fi - -for INPUT in ${INPUTLIST} ; do - -cd ${ORIGDIR} - -cd ${INPUT} || continue -INPUT=`${PWDCMD}` - -# -# # # # # # # # # # # # # # # # # # # # # -# -echo Finding directories and links to directories - -# Find all directories and all symlinks that point to directories. -# Put the list in $files. -# Each time we find a symlink, add it to newdirs -# so that we do another find within the dir the link points to. -# Note that $files may have duplicates in it; -# later parts of this file are supposed to ignore them. -dirs="." -levels=2 -while [ -n "$dirs" ] && [ $levels -gt 0 ] -do - levels=`expr $levels - 1` - newdirs= - for d in $dirs - do - echo " Searching $INPUT/$d" - - # Find all directories under $d, relative to $d, excluding $d itself. - # (The /. is needed after $d in case $d is a symlink.) - files="$files `find $d/. -type d -print | \ - sed -e '/\/\.$/d' -e 's@/./@/@g'`" - # Find all links to directories. - # Using `-exec test -d' in find fails on some systems, - # and trying to run test via sh fails on others, - # so this is the simplest alternative left. - # First find all the links, then test each one. - theselinks= - $LINKS && \ - theselinks=`find $d/. -type l -print | sed -e 's@/./@/@g'` - for d1 in $theselinks --dummy-- - do - # If the link points to a directory, - # add that dir to $newdirs - if [ -d $d1 ] - then - files="$files $d1" - if [ "`ls -ld $d1 | sed -n 's/.*-> //p'`" != "." ] - then - newdirs="$newdirs $d1" - fi - fi - done - done - - dirs="$newdirs" -done - -dirs= -echo "All directories (including links to directories):" -echo $files - -for file in $files; do - rm -rf $LIB/$file - if [ ! -d $LIB/$file ] - then mkdir $LIB/$file - fi -done -mkdir $LIB/root - -# treetops gets an alternating list -# of old directories to copy -# and the new directories to copy to. -treetops="${INPUT} ${LIB}" - -if $LINKS; then - echo 'Making symbolic directory links' - for file in $files; do - dest=`ls -ld $file | sed -n 's/.*-> //p'` - if [ "$dest" ]; then - cwd=`${PWDCMD}` - # In case $dest is relative, get to $file's dir first. - cd ${INPUT} - cd `echo ./$file | sed -n 's&[^/]*$&&p'` - # Check that the target directory exists. - # Redirections changed to avoid bug in sh on Ultrix. - (cd $dest) > /dev/null 2>&1 - if [ $? = 0 ]; then - cd $dest - # X gets the dir that the link actually leads to. - x=`${PWDCMD}` - # Canonicalize ${INPUT} now to minimize the time an - # automounter has to change the result of ${PWDCMD}. - cinput=`cd ${INPUT}; ${PWDCMD}` - # If a link points to ., make a similar link to . - if [ $x = ${cinput} ]; then - echo $file '->' . ': Making link' - rm -fr ${LIB}/$file > /dev/null 2>&1 - ln -s . ${LIB}/$file > /dev/null 2>&1 - # If link leads back into ${INPUT}, - # make a similar link here. - elif expr $x : "${cinput}/.*" > /dev/null; then - # Y gets the actual target dir name, relative to ${INPUT}. - y=`echo $x | sed -n "s&${cinput}/&&p"` - # DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}. - dots=`echo "$file" | - sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'` - echo $file '->' $dots$y ': Making link' - rm -fr ${LIB}/$file > /dev/null 2>&1 - ln -s $dots$y ${LIB}/$file > /dev/null 2>&1 - else - # If the link is to a dir $target outside ${INPUT}, - # repoint the link at ${INPUT}/root$target - # and process $target into ${INPUT}/root$target - # treat this directory as if it actually contained the files. - echo $file '->' root$x ': Making link' - if [ -d $LIB/root$x ] - then true - else - dirname=root$x/ - dirmade=. - cd $LIB - while [ x$dirname != x ]; do - component=`echo $dirname | sed -e 's|/.*$||'` - mkdir $component >/dev/null 2>&1 - cd $component - dirmade=$dirmade/$component - dirname=`echo $dirname | sed -e 's|[^/]*/||'` - done - fi - # Duplicate directory structure created in ${LIB}/$file in new - # root area. - for file2 in $files; do - case $file2 in - $file/*) - dupdir=${LIB}/root$x/`echo $file2 | sed -n "s|^${file}/||p"` - echo "Duplicating ${file}'s ${dupdir}" - if [ -d ${dupdir} ] - then true - else - mkdir ${dupdir} - fi - ;; - *) - ;; - esac - done - # Get the path from ${LIB} to $file, accounting for symlinks. - parent=`echo "$file" | sed -e 's@/[^/]*$@@'` - libabs=`cd ${LIB}; ${PWDCMD}` - file2=`cd ${LIB}; cd $parent; ${PWDCMD} | sed -e "s@^${libabs}@@"` - # DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}. - dots=`echo "$file2" | sed -e 's@/[^/]*@../@g'` - rm -fr ${LIB}/$file > /dev/null 2>&1 - ln -s ${dots}root$x ${LIB}/$file > /dev/null 2>&1 - treetops="$treetops $x ${LIB}/root$x" - fi - fi - cd $cwd - fi - done -fi - -required= -set x $treetops -shift -while [ $# != 0 ]; do - # $1 is an old directory to copy, and $2 is the new directory to copy to. - cd ${INPUT} - cd $1 -# The same dir can appear more than once in treetops. -# There's no need to scan it more than once. - if [ -f $2/DONE ] - then - files= - else - touch $2/DONE - echo Fixing directory $1 into $2 -# Check .h files which are symlinks as well as those which are files. -# A link to a header file will not be processed by anything but this. - if $LINKS; then - files=`find . -name '*.h' \( -type f -o -type l \) -print` - else - files=`find . -name '*.h' -type f -print` - fi - echo Checking header files - fi -# Note that BSD43_* are used on recent MIPS systems. - for file in $files; do -# This call to egrep is essential, since checking a file with egrep -# is much faster than actually trying to fix it. -# It is also essential that most files *not* match! -# Thus, matching every #endif is unacceptable. -# But the argument to egrep must be kept small, or many versions of egrep -# won't be able to handle it. -# -# We use the pattern [!-.0-z{|}~] instead of [^/ ] to match a noncomment -# following #else or #endif because some buggy egreps think [^/] matches -# newline, and they thus think `#else ' matches `#e[ndiflse]*[ ]+[^/ ]'. -# [!-.0-~] does not work properly on AIX 4.1. -# -# We use the pattern [^a-zA-Z0-9_][_a-ce-km-z][a-z0-9] to match an identifier -# following #if or #elif that is not surrounded by __. The `a-ce-km-z' -# in this pattern lacks `d' and `l'; this means we don't worry about -# identifiers starting with `d' or `l'. This is OK, since none of the -# identifiers below start with `d' or `l'. It also greatly improves -# performance, since many files contain lines of the form `#if ... defined ...' -# or `#if lint'. - if egrep '//|[ _]_IO|CTRL|^#define.NULL|^#e[nl][ds][ief]*[ ]+[!-.0-z\{\|\}\~]|^#[el]*if.*[^a-zA-Z0-9_][_a-ce-km-zA-Z][a-zA-Z0-9]' $file >/dev/null; then - if [ -r $file ]; then - cp $file $2/$file >/dev/null 2>&1 \ - || echo "Can't copy $file" - chmod +w $2/$file - chmod a+r $2/$file - # The fixinc_eol stuff is to work around a bug in the sed - # program on HP/UX 10.20. - # Here is how the sed commands in braces work. - # (It doesn't work to put the comments inside the sed commands.) - # Surround each word with spaces, to simplify matching below. - # ANSIfy each pre-ANSI machine-dependent symbol - # by surrounding it with __ __. - # Remove the spaces that we inserted around each word. - sed -e ' - :loop - /\\$/ N - s/\\$/\\*fixinc_eol*/ - /\\$/ b loop - s/\\\*fixinc_eol\*/\\/g - s%^\([ ]*#[ ]*else\)[ ]*/[^*].*%\1% - s%^\([ ]*#[ ]*else\)[ ]*[^/ ].*%\1% - s%^\([ ]*#[ ]*endif\)[ ]*/[^*].*%\1% - s%^\([ ]*#[ ]*endif\)[ ]*\*[^/].*%\1% - s%^\([ ]*#[ ]*endif\)[ ]*[^/* ].*%\1% - /\/\/[^*]/ s|//\(.*\)$|/*\1*/| - /^[ ]*\/\/[ ]*/s/// - /[ ]_IO[A-Z]*[ ]*(/ s/\(_IO[A-Z]*[ ]*(\)\(.\),/\1'\''\2'\'',/ - /[ ]BSD43__IO[A-Z]*[ ]*(/ s/(\(.\),/('\''\1'\'',/ - /#[ ]*define[ ]*[ ]_IO/ s/'\''\([cgxtf]\)'\''/\1/g - /#[ ]*define[ ]*[ ]BSD43__IO/ s/'\''\([cgx]\)'\''/\1/g - /#[ ]*define[ ]*[ ]DESIOC/ s/'\''\([cdgx]\)'\''/\1/g - /[^A-Z0-9_]CTRL[ ]*(/ s/\([^'\'']\))/'\''\1'\'')/ - /[^A-Z0-9]_CTRL[ ]*(/ s/\([^'\'']\))/'\''\1'\'')/ - /#[ ]*define[ ]*[ ]CTRL/ s/'\''\([cgx]\)'\''/\1/g - /#[ ]*define[ ]*[ ]_CTRL/ s/'\''\([cgx]\)'\''/\1/g - /#[ ]*define.BSD43_CTRL/ s/'\''\([cgx]\)'\''/\1/g - /#[ ]*define[ ]*[ ][_]*ISCTRL/ s/'\''\([cgx]\)'\''/\1/g - /#[ ]*[el]*if/{ - s/[a-zA-Z0-9_][a-zA-Z0-9_]*/ & /g - - s/ bsd4\([0-9]\) / __bsd4\1__ /g - s/ _*host_mips / __host_mips__ /g - s/ _*i386 / __i386__ /g - s/ M32 / __M32__ /g - s/ is68k / __is68k__ /g - s/ m68k / __m68k__ /g - s/ mc680\([0-9]\)0 / __mc680\10__ /g - s/ m88k / __m88k__ /g - s/ _*mips / __mips__ /g - s/ news\([0-9]*\) / __news\1__ /g - s/ ns32000 / __ns32000__ /g - s/ pdp11 / __pdp11__ /g - s/ pyr / __pyr__ /g - s/ sel / __sel__ /g - s/ sony_news / __sony_news__ /g - s/ sparc / __sparc__ /g - s/ sun\([a-z0-9]*\) / __sun\1__ /g - s/ tahoe / __tahoe__ /g - s/ tower\([_0-9]*\) / __tower\1__ /g - s/ u370 / __u370__ /g - s/ u3b\([0-9]*\) / __u3b\1__ /g - s/ unix / __unix__ /g - s/ vax / __vax__ /g - s/ _*MIPSE\([LB]\) / __MIPSE\1__ /g - s/ _*\([Rr][34]\)000 / __\1000__ /g - s/ _*SYSTYPE_\([A-Z0-9]*\) / __SYSTYPE_\1__ /g - - s/ \([a-zA-Z0-9_][a-zA-Z0-9_]*\) /\1/g - } - /^#define.NULL[ ]/ i\ - #undef NULL - ' $2/$file > $2/$file. - mv $2/$file. $2/$file - if cmp $file $2/$file >/dev/null 2>&1 \ - || egrep 'This file is part of the GNU C Library' $2/$file >/dev/null 2>&1; then - rm $2/$file - else - echo Fixed $file - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' $2/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required $1 $dir/$include $2/$dir/$include" - done - fi - fi - fi - done - shift; shift -done - -cd ${INPUT} - -# Install the proper definition of the three standard types in header files -# that they come from. -for file in sys/types.h stdlib.h sys/stdtypes.h stddef.h memory.h unistd.h; do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - echo Fixing size_t, ptrdiff_t and wchar_t in $file - sed \ - -e '/^[ ]*\*[ ]*typedef unsigned int size_t;/N' \ - -e 's/^\([ ]*\*[ ]*typedef unsigned int size_t;\n[ ]*\*\/\)/\1\ -#ifndef __SIZE_TYPE__\ -#define __SIZE_TYPE__ long unsigned int\ -#endif\ -typedef __SIZE_TYPE__ size_t;\ -/' \ - -e '/typedef[ ][ ]*[a-z_][ a-z_]*[ ]size_t/i\ -#ifndef __SIZE_TYPE__\ -#define __SIZE_TYPE__ long unsigned int\ -#endif -' \ - -e 's/typedef[ ][ ]*[a-z_][ a-z_]*[ ]size_t/typedef __SIZE_TYPE__ size_t/' \ - -e '/typedef[ ][ ]*[a-z_][ a-z_]*[ ]ptrdiff_t/i\ -#ifndef __PTRDIFF_TYPE__\ -#define __PTRDIFF_TYPE__ long int\ -#endif -' \ - -e 's/typedef[ ][ ]*[a-z_][ a-z_]*[ ]ptrdiff_t/typedef __PTRDIFF_TYPE__ ptrdiff_t/' \ - -e '/typedef[ ][ ]*[a-z_][ a-z_]*[ ]wchar_t/i\ -#ifndef __WCHAR_TYPE__\ -#define __WCHAR_TYPE__ int\ -#endif\ -#ifndef __cplusplus -' \ - -e '/typedef[ ][ ]*[a-z_][ a-z_]*[ ]wchar_t/a\ -#endif -' \ - -e 's/typedef[ ][ ]*[a-z_][ a-z_]*[ ]wchar_t/typedef __WCHAR_TYPE__ wchar_t/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# Fix #defines under Alpha OSF/1: -# The following files contain '#pragma extern_prefix "_FOO"' followed by -# a '#define something(x,y,z) _FOOsomething(x,y,z)'. The intent of these -# statements is to reduce namespace pollution. While these macros work -# properly in most cases, they don't allow you to take a pointer to the -# "something" being modified. To get around this limitation, change these -# statements to be of the form '#define something _FOOsomething'. -for file in libgen.h dirent.h ftw.h grp.h ndbm.h pthread.h pwd.h signal.h standards.h stdlib.h string.h stropts.h time.h unistd.h -do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - echo Fixing $file extern_prefix - sed -e 's/^[ ]*#[ ]*define[ ]*\([^(]*\)\(([^)]*)\)[ ]*\(_.\)\1\2[ ]*$/#define \1 \3\1/' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# Fix one other error in this file: a mismatched quote not inside a C comment. -file=sundev/vuid_event.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sundev 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file comment - sed -e "s/doesn't/does not/" ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix these Sun OS files to avoid an invalid identifier in an #ifdef. -file=sunwindow/win_cursor.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then -# mkdir ${LIB}/sunwindow 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null -fi -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e "s/ecd.cursor/ecd_cursor/" ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi -file=sunwindow/win_lock.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then -# mkdir ${LIB}/sunwindow 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null -fi -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e "s/ecd.cursor/ecd_cursor/" ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix this Sun file to avoid interfering with stddef.h. -file=sys/stdtypes.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file -sed -e '/[ ]size_t.*;/i\ -#ifndef _GCC_SIZE_T\ -#define _GCC_SIZE_T -' \ - -e '/[ ]size_t.*;/a\ -#endif -' \ - -e '/[ ]ptrdiff_t.*;/i\ -#ifndef _GCC_PTRDIFF_T\ -#define _GCC_PTRDIFF_T -' \ - -e '/[ ]ptrdiff_t.*;/a\ -#endif -' \ - -e '/[ ]wchar_t.*;/i\ -#ifndef _GCC_WCHAR_T\ -#define _GCC_WCHAR_T -' \ - -e '/[ ]wchar_t.*;/a\ -#endif -' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix this ARM/RISCiX file to avoid interfering with the use of __wchar_t -# in cc1plus. -file=stdlib.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e "s/\(#[ ]*ifndef[ ]*\)__wchar_t/\1_GCC_WCHAR_T/" \ - -e "s/\(#[ ]*define[ ]*\)__wchar_t/\1_GCC_WCHAR_T/" \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix this ARM/RISCiX file where ___type is a Compiler hint that is specific to -# the Norcroft compiler. -file=X11/Intrinsic.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e "s/___type p_type/p_type/" \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix this file to avoid interfering with stddef.h, but don't mistakenly -# match ssize_t present in AIX for the ps/2, or typedefs which use (but do not -# set) size_t. -file=sys/types.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file -sed -e '/typedef[ ][ ]*[A-Za-z_][ A-Za-z_]*[ ]size_t/i\ -#ifndef _GCC_SIZE_T\ -#define _GCC_SIZE_T -' \ - -e '/typedef[ ][ ]*[A-Za-z_][ A-Za-z_]*[ ]size_t/a\ -#endif -' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix HP's use of ../machine/inline.h to refer to -# /usr/include/machine/inline.h -file=sys/spinlock.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file -fi -if [ -r ${LIB}/$file ] ; then - echo Fixing $file - sed -e 's,"../machine/inline.h",<machine/inline.h>,' \ - -e 's,"../machine/psl.h",<machine/psl.h>,' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix an error in this file: the #if says _cplusplus, not the double -# underscore __cplusplus that it should be -file=tinfo.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/rpcsvc 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, __cplusplus macro - sed -e 's/[ ]_cplusplus/ __cplusplus/' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix an error in this file: a missing semi-colon at the end of the statsswtch -# structure definition. -file=rpcsvc/rstat.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/rpcsvc 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, definition of statsswtch - sed -e 's/boottime$/boottime;/' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix an error in this file: a missing semi-colon at the end of the nodeent -# structure definition. -file=netdnet/dnetdb.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/netdnet 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, definition of nodeent - sed -e 's/char.*na_addr *$/char *na_addr;/' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Check for bad #ifdef line (in Ultrix 4.1) -file=sys/file.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, bad \#ifdef line - sed -e 's/#ifdef KERNEL/#if defined(KERNEL)/' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Check for (...) in C++ code in HP/UX sys/file.h. -file=sys/file.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - if egrep HPUX_SOURCE ${LIB}/$file > /dev/null; then - echo Fixing $file, use of '(...)' - sed -e 's/(\.\.\.)/(struct file * ...)/' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -fi - -# Check for superfluous `static' (in Ultrix 4.2) -# On Ultrix 4.3, includes of other files (r3_cpu.h,r4_cpu.h) is broken. -file=machine/cpu.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/machine 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, superfluous static and broken includes of other files. - sed -e 's/^static struct tlb_pid_state/struct tlb_pid_state/' \ - -e 's/^#include "r3_cpu\.h"$/#include <machine\/r3_cpu\.h>/' \ - -e 's/^#include "r4_cpu\.h"$/#include <machine\/r4_cpu\.h>/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done -# This file has an alternative name, mips/cpu.h. Fix that name, too. - if cmp machine/cpu.h mips/cpu.h > /dev/null 2>&1; then - mkdir ${LIB}/mips 2>&- -# Don't remove the file first, they may be the same file! - ln ${LIB}/$file ${LIB}/mips/cpu.h > /dev/null 2>&1 - fi - fi -fi - -# Incorrect sprintf declaration in X11/Xmu.h -file=X11/Xmu.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/X11 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file sprintf declaration - sed -e 's,^extern char \* sprintf();$,#ifndef __STDC__\ -extern char * sprintf();\ -#endif /* !defined __STDC__ */,' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Incorrect sprintf declaration in X11/Xmu/Xmu.h -# (It's not clear whether the right file name is this or X11/Xmu.h.) -file=X11/Xmu/Xmu.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/X11/Xmu 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file sprintf declaration - sed -e 's,^extern char \* sprintf();$,#ifndef __STDC__\ -extern char * sprintf();\ -#endif /* !defined __STDC__ */,' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Check for missing ';' in struct -file=netinet/ip.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/netinet 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e '/^struct/,/^};/s/}$/};/' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix the CAT macro in SunOS memvar.h. -file=pixrect/memvar.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/pixrect 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e '/^#define.CAT(a,b)/ i\ -#ifdef __STDC__ \ -#define CAT(a,b) a##b\ -#else -/^#define.CAT(a,b)/ a\ -#endif -' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Check for yet more missing ';' in struct (in SunOS 4.0.x) -file=rpcsvc/rusers.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/rpcsvc 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e '/^struct/,/^};/s/_cnt$/_cnt;/' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix return type of exit and abort in <stdlib.h> on SunOS 4.1. -# Also wrap protection around size_t for m88k-sysv3 systems. -file=stdlib.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - if grep _GCC_SIZE_T ${LIB}/$file >/dev/null - then size_t_pattern='<<< do not double-wrap the size_t typedef >>>' - else size_t_pattern='typedef[ a-zA-Z_]*[ ]size_t[ ]*;' - fi - sed -e 's/int abort/void abort/g' \ - -e 's/int free/void free/g' \ - -e 's/char[ ]*\*[ ]*calloc/void \* calloc/g' \ - -e 's/char[ ]*\*[ ]*malloc/void \* malloc/g' \ - -e 's/char[ ]*\*[ ]*realloc/void \* realloc/g' \ - -e 's/char[ ]*\*[ ]*bsearch/void \* bsearch/g' \ - -e 's/int[ ][ ]*exit/void exit/g' \ - -e "/$size_t_pattern/"'i\ -#ifndef _GCC_SIZE_T\ -#define _GCC_SIZE_T -' \ - -e "/$size_t_pattern/"'a\ -#endif -' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix return type of free and {c,m,re}alloc in <malloc.h> on SunOS 4.1. -# Also fix return type of {m,re}alloc in <malloc.h> on sysV68 -file=malloc.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e 's/typedef[ ]char \* malloc_t/typedef void \* malloc_t/g' \ - -e 's/int[ ][ ]*free/void free/g' \ - -e 's/char\([ ]*\*[ ]*malloc\)/void\1/g' \ - -e 's/char\([ ]*\*[ ]*realloc\)/void\1/g' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix bogus #ifdef in <hsfs/hsfs_spec.h> on SunOS 4.1. -file=hsfs/hsfs_spec.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/hsfs 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e 's/\#ifdef __i386__ || __vax__/\#if __i386__ || __vax__/g' \ - ${LIB}/$file > ${LIB}/${file}. - rm -f ${LIB}/$file; mv ${LIB}/${file}. ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix bogus #ifdef in <hsfs/hsnode.h> on SunOS 4.1. -file=hsfs/hsnode.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/hsfs 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e 's/\#ifdef __i386__ || __sun4c__/\#if __i386__ || __sun4c__/g' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix bogus #ifdef in <hsfs/iso_spec.h> on SunOS 4.1. -file=hsfs/iso_spec.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/hsfs 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e 's/\#ifdef __i386__ || __vax__/\#if __i386__ || __vax__/g' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Incorrect #include in Sony News-OS 3.2. -file=machine/machparam.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/machine 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, incorrect \#include - sed -e 's@"../machine/endian.h"@<machine/endian.h>@' \ - ${LIB}/$file > ${LIB}/${file}. - rm -f ${LIB}/$file; mv ${LIB}/${file}. ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Multiline comment after typedef on IRIX 4.0.1. -file=sys/types.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sys 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, comment in the middle of \#ifdef - sed -e 's@type of the result@type of the result */@' \ - -e 's@of the sizeof@/* of the sizeof@' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Turning // comments into /* */ comments trashes this IRIX 4.0.1 -# header file, which embeds // comments inside multi-line /* */ -# comments. If this looks like the IRIX header file, we refix it by -# just throwing away the // comments. -file=fam.h -if [ -r ${LIB}/$file ]; then - if egrep indigo.esd ${LIB}/$file > /dev/null; then - echo Fixing $file, overeager sed script - rm ${LIB}/$file - sed -e 's|//.*$||g' $file > ${LIB}/$file - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi -fi - -# There is a similar problem with the VxWorks drv/netif/if_med.h file. -file=drv/netif/if_med.h -if [ -r ${LIB}/$file ]; then - if egrep 'Wind River' ${LIB}/$file > /dev/null; then - echo Fixing $file, overeager sed script - rm ${LIB}/$file - sed -e 's|//.*$||g' $file > ${LIB}/$file - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi -fi - -# And also with the HP-UX 10 and HP-UX 11 sys/pci.h file -file=sys/pci.h -if [ -r ${LIB}/$file ]; then - if egrep 'System Private Structures' ${LIB}/$file > /dev/null; then - echo Fixing $file, overeager sed script - rm ${LIB}/$file - sed -e 's|//.*$||g' $file > ${LIB}/$file - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi -fi - -# And also with a few more HP-UX 11 headers which are only broken -# after they are "fixed". -file=sys/ki_iface.h -if [ -r ${LIB}/$file ]; then - if egrep 'These definitions are for HP Internal developers' ${LIB}/$file > /dev/null; then - echo Fixing $file, overeager sed script - rm ${LIB}/$file - fi -fi - -file=sys/ki.h -if [ -r ${LIB}/$file ]; then - if egrep '11.00 HP-UX LP64' ${LIB}/$file > /dev/null; then - echo Fixing $file, overeager sed script - rm ${LIB}/$file - fi -fi - -file=sys/ki_calls.h -if [ -r ${LIB}/$file ]; then - if egrep 'KI_MAX_PROCS is an arbitrary number' ${LIB}/$file > /dev/null; then - echo Fixing $file, overeager sed script - rm ${LIB}/$file - fi -fi - -file=sys/ki_defs.h -if [ -r ${LIB}/$file ] ; then - if egrep 'Kernel Instrumentation Definitions' ${LIB}/$file > /dev/null; then - echo Fixing $file, overeager sed script - rm ${LIB}/$file - fi -fi - -file=sys/time.h -if [ -r ${LIB}/$file ] ; then - if egrep 'For CASPEC, look in' ${LIB}/$file > /dev/null; then - echo Fixing $file, overeager sed script - rm ${LIB}/$file - fi -fi - -# Some IRIX header files contains the string "//" -for file in elf_abi.h elf.h; do - if [ -r ${LIB}/$file ]; then - echo Fixing $file, overeager sed script - sed -e 's|"/\*"\*/|"//"|' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# IRIX 4.0.5 <rpc/auth.h> uses struct sockaddr in prototype without -# previous definition. -file=rpc/auth.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/rpc 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, undefined type - sed -e '/authdes_create.*struct sockaddr/i\ -struct sockaddr; -' \ - ${LIB}/$file > ${LIB}/$file.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# IRIX 4.0.5 <rpc/xdr.h> uses struct __file_s in prototype without previous -# definition. -file=rpc/xdr.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/rpc 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, undefined type - sed -e '/xdrstdio_create.*struct __file_s/i\ -struct __file_s; -' \ - ${LIB}/$file > ${LIB}/$file.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Same problem with a file from SunOS 4.1.3 : a header file containing -# the string "//" embedded in "/**/" -file=sbusdev/audiovar.h -if [ -r ${LIB}/$file ]; then - echo Fixing $file, overeager sed script - rm ${LIB}/$file - sed -e 's|//.*$||g' $file > ${LIB}/$file - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -# Fix non-ANSI memcpy declaration that conflicts with gcc's builtin -# declaration on Sun OS 4.x. We must only fix this on Sun OS 4.x, because -# many other systems have similar text but correct versions of the file. -# To ensure only Sun's is fixed, we grep for a likely unique string. -# Fix also on sysV68 R3V7.1 (head/memory.h\t50.1\t ) -file=memory.h -if [ -r $file ] && egrep '/\* @\(#\)(head/memory.h 50.1 |memory\.h 1\.[2-4] 8./../.. SMI; from S5R2 1\.2 )\*/' $file > /dev/null; then - if [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - if [ -r ${LIB}/$file ]; then - echo Replacing $file - cat > ${LIB}/$file << EOF -/* This file was generated by fixincludes */ -#ifndef __memory_h__ -#define __memory_h__ - -#ifdef __STDC__ -extern void *memccpy(); -extern void *memchr(); -extern void *memcpy(); -extern void *memset(); -#else -extern char *memccpy(); -extern char *memchr(); -extern char *memcpy(); -extern char *memset(); -#endif /* __STDC__ */ - -extern int memcmp(); - -#endif /* __memory_h__ */ -EOF - fi -fi - -# Fix return type of fread and fwrite on sysV68 -file=stdio.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, fread and fwrite return type - sed -e 's/^\(extern int fclose(), fflush()\), \(fread(), fwrite()\)\(.*\)$/extern unsigned int \2;\ -\1\3/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# parameters not const on DECstation Ultrix V4.0 and OSF/1. -file=stdio.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, non-const arg - sed -e 's@perror( char \*__s );@perror( const char *__s );@' \ - -e 's@fputs( char \*__s,@fputs( const char *__s,@' \ - -e 's@fopen( char \*__filename, char \*__type );@fopen( const char *__filename, const char *__type );@' \ - -e 's@fwrite( void \*__ptr,@fwrite( const void *__ptr,@' \ - -e 's@fscanf( FILE \*__stream, char \*__format,@fscanf( FILE *__stream, const char *__format,@' \ - -e 's@scanf( char \*__format,@scanf( const char *__format,@' \ - -e 's@sscanf( char \*__s, char \*__format,@sscanf( const char *__s, const char *__format,@' \ - -e 's@popen(char \*, char \*);@popen(const char *, const char *);@' \ - -e 's@tempnam(char\*,char\*);@tempnam(const char*,const char*);@' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# parameters conflict with C++ new on rs/6000 -for file in stdio.h unistd.h ; do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - echo Fixing $file, parameter name conflicts - sed -e 's@rename(const char \*old, const char \*new)@rename(const char *_old, const char *_new)@' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# function class(double x) conflicts with C++ keyword on rs/6000 -file=math.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - if grep '[^a-zA-Z_]class[(]' ${LIB}/$file >/dev/null; then - echo Fixing $file - sed -e '/class[(]/i\ -#ifndef __cplusplus -' \ - -e '/class[(]/a\ -#endif -' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -fi - -# Wrong fchmod prototype on RS/6000. -file=sys/stat.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sys 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, fchmod prototype - sed -e 's/fchmod(char \*/fchmod(int/' \ - ${LIB}/$file > ${LIB}/$file.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# There are several name conflicts with C++ reserved words in X11 -# header files. These are fixed in some versions, so don't do the -# fixes if we find __cplusplus in the file. These were found on the -# RS/6000. - -# class in X11/ShellP.h -file=X11/ShellP.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sys 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - if grep __cplusplus ${LIB}/$file >/dev/null 2>/dev/null; then - true; - else - echo Fixing $file, field class - sed -e '/char [*]class;/i\ -#ifdef __cplusplus\ - char *c_class;\ -#else -' \ - -e '/char [*]class;/a\ -#endif -' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi -# new in Xm/Traversal.h -file=Xm/Traversal.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sys 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - if grep __cplusplus ${LIB}/$file >/dev/null 2>/dev/null; then - true; - else - echo Fixing $file, uses of new - sed -e '/Widget old, new;/i\ -#ifdef __cplusplus\ - Widget old, c_new;\ -#else -' \ - -e '/Widget old, new;/a\ -#endif -' \ - -e 's/Widget new,/Widget c_new,/g' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi -# class in Xm/BaseClassI.h -file=Xm/BaseClassI.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sys 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - if grep __cplusplus ${LIB}/$file >/dev/null 2>/dev/null; then - true; - else - echo Fixing $file, prototype parameter name - sed -e 's/ class[)]/ c_class)/g' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# NeXT 3.2 adds const prefix to some math functions. These conflict -# with the built-in functions. -file=ansi/math.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null -fi -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e '/^extern.*double.*__const__.*sqrt(/s/__const__//' \ - -e '/^extern.*double.*__const__.*fabs(/s/__const__//' \ - -e '/^extern.*double.*__const__.*cos(/s/__const__//' \ - -e '/^extern.*double.*__const__.*hypot(/s/__const__//' \ - -e '/^extern.*double.*__const__.*sin(/s/__const__//' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# NeXT 3.2 uses the word "template" as a parameter for some -# functions. GCC reports an invalid use of a reserved key word -# with the built-in functions. NeXT 3.2 includes the keyword -# volatile in the prototype for abort(). This conflicts with -# the built-in definition. -file=bsd/libc.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null -fi -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e '/\(.*template\)/s/template//' \ - -e '/extern.*volatile.*void.*abort/s/volatile//' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# NeXT 3.2 includes the keyword volatile in the abort() and -# exit() function prototypes. That conflicts with the -# built-in functions. -file=ansi/stdlib.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null -fi -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e '/extern.*volatile.*void.*exit/s/volatile//' \ - -e '/extern.*volatile.*void.*abort/s/volatile//' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# sys/utsname.h on Ultrix V4.[35] puts the declaration of uname before the -# definition of struct utsname, so the prototype (added by fixproto) causes -# havoc. -file=sys/utsname.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ] \ - && grep 'ULTRIX' ${LIB}/$file >/dev/null; then - echo Fixing $file, uname declaration - sed -e '/^[ ]*extern[ ]*int[ ]*uname();$/i\ -struct utsname; -'\ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# sys/wait.h on AIX 3.2.5 puts the declaration of wait3 before the definition -# of struct rusage, so the prototype (added by fixproto) causes havoc. -file=sys/wait.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ] \ - && grep 'bos325,' ${LIB}/$file >/dev/null; then - echo Fixing $file, wait3 declaration - sed -e '/^extern pid_t wait3();$/i\ -struct rusage; -'\ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# NeXT 2.0 defines 'int wait(union wait*)', which conflicts with Posix.1. -# Note that version 3 of the NeXT system has wait.h in a different directory, -# so that this code won't do anything. But wait.h in version 3 has a -# conditional, so it doesn't need this fix. So everything is okay. -file=sys/wait.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ] \ - && grep 'wait[(]union wait' ${LIB}/$file >/dev/null; then - echo Fixing $file, bad wait formal - sed -e 's@wait(union wait@wait(void@' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Don't use or define the name va_list in stdio.h. -# This is for ANSI and also to interoperate properly with gcc's varargs.h. -file=stdio.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, use of va_list - # Arrange for stdio.h to use stdarg.h to define __gnuc_va_list - if egrep "__need___va_list" ${LIB}/$file >/dev/null 2>&1; then - touch ${LIB}/${file}.sed - else - (echo "#define __need___va_list" - echo "#include <stdarg.h>") > ${LIB}/${file}.sed - fi - # Use __gnuc_va_list in arg types in place of va_list. - # On 386BSD use __gnuc_va_list instead of _VA_LIST_. We're hoping the - # trailing parentheses and semicolon save all other systems from this. - # Define __va_list__ (something harmless and unused) instead of va_list. - # Don't claim to have defined va_list. - sed -e 's@ va_list @ __gnuc_va_list @' \ - -e 's@ va_list)@ __gnuc_va_list)@' \ - -e 's@ _BSD_VA_LIST_));@ __gnuc_va_list));@' \ - -e 's@ _VA_LIST_));@ __gnuc_va_list));@' \ - -e 's@ va_list@ __va_list__@' \ - -e 's@\*va_list@*__va_list__@' \ - -e 's@ __va_list)@ __gnuc_va_list)@' \ - -e 's@GNUC_VA_LIST@GNUC_Va_LIST@' \ - -e 's@_NEED___VA_LIST@_NEED___Va_LIST@' \ - -e 's@VA_LIST@DUMMY_VA_LIST@' \ - -e 's@_Va_LIST@_VA_LIST@' \ - ${LIB}/$file >> ${LIB}/${file}.sed - - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Cancel out ansi_compat.h on Ultrix. Replace it with empty file. -file=ansi_compat.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - if grep -s ULTRIX $file; then - echo "/* This file intentionally left blank. */" > $LIB/$file - fi -fi - -# parameter to atof not const on DECstation Ultrix V4.0 and NEWS-OS 4.2R. -# also get rid of bogus inline definitions in HP-UX 8.0 -file=math.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, non-const arg - sed -e 's@atof(\([ ]*char[ ]*\*[^)]*\))@atof(const \1)@' \ - -e 's@inline int abs(int [a-z][a-z]*) {.*}@extern "C" int abs(int);@' \ - -e 's@inline double abs(double [a-z][a-z]*) {.*}@@' \ - -e 's@inline int sqr(int [a-z][a-z]*) {.*}@@' \ - -e 's@inline double sqr(double [a-z][a-z]*) {.*}@@' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# fix bogus recursive stdlib.h in NEWS-OS 4.0C -file=stdlib.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, recursive inclusion - sed -e '/^#include <stdlib.h>/i\ -#if 0 -' \ - -e '/^#include <stdlib.h>/a\ -#endif -' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Avoid nested comments on Ultrix 4.3. -file=rpc/svc.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/rpc 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, nested comment - sed -e 's@^\( \* int protocol; \)/\*@\1*/ /*@' \ - ${LIB}/$file > ${LIB}/$file.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# This file in RISC/os uses /**/ to concatenate two tokens. -file=bsd43/bsd43_.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi -if [ -r ${LIB}/$file ]; then - sed -e 's|/\*\*/|##|' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -file=rpc/rpc.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/rpc 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, nested comment - sed -e 's@^\(/\*.*rpc/auth_des.h>.*\)/\*@\1*/ /*@' \ - ${LIB}/$file > ${LIB}/$file.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# rpc/types.h on OSF1/2.0 is not C++ ready, even though NO_IMPLICIT_EXTERN_C -# is defined for the alpha. The problem is the declaration of malloc. -file=rpc/types.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/rpc 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi -if [ -r ${LIB}/$file ]; then - if egrep '"C"' ${LIB}/$file >/dev/null 2>&1; then - true - else - echo Fixing $file - echo '#ifdef __cplusplus -extern "C" { -#endif' > ${LIB}/${file}.sed - cat ${LIB}/${file} >> ${LIB}/${file}.sed - echo '#ifdef __cplusplus -} -#endif' >> ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -fi - -# In limits.h, put #ifndefs around things that are supposed to be defined -# in float.h to avoid redefinition errors if float.h is included first. -# On HP/UX this patch does not work, because on HP/UX limits.h uses -# multi line comments and the inserted #endif winds up inside the -# comment. Fortunately, HP/UX already uses #ifndefs in limits.h; if -# we find a #ifndef FLT_MIN we assume that all the required #ifndefs -# are there, and we do not add them ourselves. -# Also fix a nested comment problem in sys/limits.h on Motorola sysV68 R3V7.1 -for file in limits.h sys/limits.h; do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sys 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - if egrep 'ifndef[ ]+FLT_MIN' ${LIB}/$file >/dev/null; then - true - else - echo Fixing $file - sed -e '/[ ]FLT_MIN[ ]/i\ -#ifndef FLT_MIN -'\ - -e '/[ ]FLT_MIN[ ]/a\ -#endif -'\ - -e '/[ ]FLT_MAX[ ]/i\ -#ifndef FLT_MAX -'\ - -e '/[ ]FLT_MAX[ ]/a\ -#endif -'\ - -e '/[ ]FLT_DIG[ ]/i\ -#ifndef FLT_DIG -'\ - -e '/[ ]FLT_DIG[ ]/a\ -#endif -'\ - -e '/[ ]DBL_MIN[ ]/i\ -#ifndef DBL_MIN -'\ - -e '/[ ]DBL_MIN[ ]/a\ -#endif -'\ - -e '/[ ]DBL_MAX[ ]/i\ -#ifndef DBL_MAX -'\ - -e '/[ ]DBL_MAX[ ]/a\ -#endif -'\ - -e '/[ ]DBL_DIG[ ]/i\ -#ifndef DBL_DIG -'\ - -e '/[ ]DBL_DIG[ ]/a\ -#endif -'\ - -e '/^\(\/\*#define HUGE_VAL 3\.[0-9e+]* *\)\/\*/s//\1/'\ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - echo Deleting ${LIB}/$file\; no fixes were needed. - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# In math.h, put #ifndefs around things that might be defined in a gcc -# specific math-*.h file. -file=math.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e '/define[ ]HUGE_VAL[ ]/i\ -#ifndef HUGE_VAL -'\ - -e '/define[ ]HUGE_VAL[ ]/a\ -#endif -'\ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - - # In addition, copy the definition of DBL_MAX from float.h - # if math.h requires one. The Lynx math.h requires it. - if egrep '#define[ ]*HUGE_VAL[ ]+DBL_MAX' $file >/dev/null 2>&1; then - if egrep '#define[ ]+DBL_MAX[ ]+' $file >/dev/null 2>&1; then - true; - else - dbl_max_def=`egrep 'define[ ]+DBL_MAX[ ]+.*' float.h 2>/dev/null` - if [ "$dbl_max_def" != "" ]; then - dbl_max_def=`echo $dbl_max_def | sed 's/.*define[ ]*DBL_MAX[ ]*//'` - sed -e "/define[ ]HUGE_VAL[ ]DBL_MAX/s/DBL_MAX/$dbl_max_def/" \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - fi - fi - - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - echo Deleting ${LIB}/$file\; no fixes were needed. - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Remove erroneous parentheses in sym.h on Alpha OSF/1. -file=sym.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e 's/#ifndef(__mips64)/#ifndef __mips64/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix return value of mem{ccpy,chr,cpy,set} and str{len,spn,cspn} -# in string.h on sysV68 -# Correct the return type for strlen in string.h on Lynx. -# Correct the argument type for ffs in string.h on Alpha OSF/1 V2.0. -# Add missing const for strdup on OSF/1 V3.0. -# On sysV88 layout is slightly different. -file=string.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, mem{ccpy,chr,cpy,set} and str{len,spn,cspn} return value - sed -e 's/extern[ ]*int[ ]*strlen();/extern unsigned int strlen();/' \ - -e 's/extern[ ]*int[ ]*ffs[ ]*(long);/extern int ffs(int);/' \ - -e 's/strdup(char \*s1);/strdup(const char *s1);/' \ - -e '/^extern char$/N' \ - -e 's/^extern char\(\n \*memccpy(),\)$/extern void\1/'\ - -e '/^ strncmp(),$/N'\ - -e 's/^\( strncmp()\),\n\( strlen(),\)$/\1;\ -extern unsigned int\ -\2/'\ - -e '/^extern int$/N'\ - -e 's/^extern int\(\n strlen(),\)/extern size_t\1/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Correct the return type for strlen in strings.h in SunOS 4. -file=strings.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e 's/int[ ]*strlen();/__SIZE_TYPE__ strlen();/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Delete the '#define void int' line from curses.h on Lynx -file=curses.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e '/#[ ]*define[ ][ ]*void[ ]int/d' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix `typedef struct term;' on hppa1.1-hp-hpux9. -file=curses.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e 's/^[ ]*typedef[ ][ ]*\(struct[ ][ ]*term[ ]*;[ ]*\)$/\1/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# For C++, avoid any typedef or macro definition of bool, and use the -# built in type instead. HP/UX 10.20, at least, also has it -# in curses_colr/curses.h. -for file in curses.h curses_colr/curses.h ; do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - if [ -r ${LIB}/$file ] && egrep bool ${LIB}/$file >/dev/null 2>&1; then - echo Fixing $file, typedef or macro for bool is invalid in C++ - sed -e '/^#[ ]*define[ ][ ]*bool[ ][ ]*char[ ]*$/i\ -#ifndef __cplusplus -'\ - -e '/^#[ ]*define[ ][ ]*bool[ ][ ]*char[ ]*$/a\ -#endif -'\ - -e '/^typedef[ ][ ]*char[ ][ ]*bool[ ]*;/i\ -#ifndef __cplusplus -'\ - -e '/^typedef[ ][ ]*char[ ][ ]*bool[ ]*;/a\ -#endif -'\ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# Fix incorrect S_IF* definitions on m88k-sysv3. -file=sys/stat.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e 's/^\(#define[ ]*S_IS[A-Z]*(m)\)[ ]*(m[ ]*&[ ]*\(S_IF[A-Z][A-Z][A-Z][A-Z]*\)[ ]*)/\1 (((m)\&S_IFMT)==\2)/' \ - -e 's/^\(#define[ ]*S_IS[A-Z]*(m)\)[ ]*(m[ ]*&[ ]*\(0[0-9]*\)[ ]*)/\1 (((m)\&S_IFMT)==\2)/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix nested comments in Motorola's <limits.h> and <sys/limits.h> -for file in limits.h sys/limits.h; do - if [ $target_canonical = m88k-motorola-sysv3 -o \ - $target_canonical = m68k-motorola-sysv ]; then - - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - echo "Fixing nested comments in Motorola's $file" - sed \ - -e 's@^\(#undef[ ][ ]*PIPE_BUF[ ]*/\* max # bytes atomic in write to a\)$@\1 */@' \ - -e 's@\(/\*#define HUGE_VAL 3.40282346638528860e+38 \)\(/\*error value returned by Math lib\*/\)$@\1*/ \2@' \ - < ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - fi - fi - fi -done - -# Fix getopt declarations in stdio.h and stdlib.h on Alpha OSF/1 and AIX. -for file in stdio.h stdlib.h; do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - echo Fixing $file, getopt declaration - sed -e 's/getopt(int, char \*\[\],[ ]*char \*)/getopt(int, char *const[], const char *)/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# Fix __page_size* declarations in pthread.h AIX 4.1.[34]. -# The original ones fail if uninitialized externs are not common. -# This is the default for all ANSI standard C++ compilers. -for file in pthread.h; do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - echo Fixing $file, __page_size* declarations - sed -e 's/^int __page_size/extern int __page_size/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# Determine if we're on Interactive Unix 2.2 or later, in which case we -# need to fix some additional files. This is the same test for ISC that -# Autoconf uses. -if test -d /etc/conf/kconfig.d \ - && grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1; then - echo "Fixing ISC __STDC__ goof in several files..." - for name in stdio.h math.h ctype.h sys/limits.h sys/fcntl.h sys/dirent.h; do - echo $name - if test -r ${LIB}/$name; then - file=${LIB}/$name - else - file=${INPUT}/$name - fi - # On Interactive 2.2, certain traditional Unix definitions - # (notably getc and putc in stdio.h) are omitted if __STDC__ is - # defined, not just if _POSIX_SOURCE is defined. This makes it - # impossible to compile any nontrivial program except with -posix. - sed \ -'s/!defined(__STDC__) && !defined(_POSIX_SOURCE)/!defined(_POSIX_SOURCE)/' \ - < $file > ${LIB}/$name. - mv ${LIB}/$name. ${LIB}/$name - done - - echo "Fixing ISC fmod declaration" - # This one's already been fixed for other things. - file=${LIB}/math.h - sed 's/fmod(double)/fmod(double, double)/' <$file >$file. - mv $file. $file - - echo "Fixing nested comments in ISC <sys/limits.h>" - file=sys/limits.h - sed '/CHILD_MAX/s,/\* Max, Max,' < ${INPUT}/$file >${LIB}/$file. - sed '/OPEN_MAX/s,/\* Max, Max,' < ${LIB}/$file. >${LIB}/$file -fi - -# These files in Sun OS 4.x use /**/ to concatenate tokens. -for file in sparc/asm_linkage.h sun3/asm_linkage.h sun3x/asm_linkage.h \ - sun4/asm_linkage.h sun4c/asm_linkage.h sun4m/asm_linkage.h \ - sun4c/debug/asm_linkage.h sun4m/debug/asm_linkage.h; -do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - sed -e 's|/\*\*/|##|g' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# These files in ARM/RISCiX use /**/ to concatenate tokens. -for file in arm/as_support.h arm/mc_type.h arm/xcb.h dev/chardefmac.h \ - dev/ps_irq.h dev/screen.h dev/scsi.h sys/tty.h Xm.acorn/XmP.h -do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - sed -e 's|/\*\*/|##|g' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# libm.a on m88k-motorola-sysv3 contains a stupid optimization for function -# hypot(), which returns the second argument without even looking at its value -# if the other is 0.0 -# Another drawback is that fix-header doesn't fix fabs' prototype, and I have -# no idea why. -file=math.h -if [ $target_canonical = m88k-motorola-sysv3 ]; then - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - echo Fixing $file, fabs/hypot definition - sed \ - -e 's/extern double floor(), ceil(), fmod(), fabs();/extern double floor(), ceil(), fmod(), fabs _PARAMS((double));/' \ - -e '/^extern double hypot();$/a\ -\/* Workaround a stupid Motorola optimization if one\ - of x or y is 0.0 and the other is negative! *\/\ -#ifdef __STDC__\ -static __inline__ double fake_hypot (double x, double y)\ -#else\ -static __inline__ double fake_hypot (x, y)\ - double x, y;\ -#endif\ -{\ - return fabs (hypot (x, y));\ -}\ -#define hypot fake_hypot -' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - fi - fi -fi - -# math.h on SunOS 4 puts the declaration of matherr before the definition -# of struct exception, so the prototype (added by fixproto) causes havoc. -file=math.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, matherr declaration - sed -e '/^struct exception/,$b' \ - -e '/matherr/i\ -struct exception; -'\ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# sys/mman.h on HP/UX is not C++ ready, even though -# NO_IMPLICIT_EXTERN_C is defined on HP/UX. -for file in sys/mman.h; do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - if egrep '"C"' ${LIB}/$file >/dev/null 2>&1 \ - || egrep '__BEGIN_DECLS' ${LIB}/$file >/dev/null 2>&1; then - true - else - echo Fixing $file - echo '#ifdef __cplusplus -extern "C" { -#endif' > ${LIB}/${file}.sed - cat ${LIB}/${file} >> ${LIB}/${file}.sed - echo '#ifdef __cplusplus -} -#endif' >> ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# Fix return value of sbrk in unistd.h on Alpha OSF/1 V2.0 -file=unistd.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, sbrk declaration - sed -e 's/char\([ ]*\*[ ]*sbrk[ ]*(\)/void\1/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix <c_asm.h> on Digital UNIX V4.0: -# It contains a prototype for a DEC C internal asm() function, clashing with -# gcc's asm keyword. So protect this with __DECC. -file=c_asm.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e '/^[ ]*float[ ]*fasm/i\ -#ifdef __DECC -' \ - -e '/^[ ]*#[ ]*pragma[ ]*intrinsic([ ]*dasm/a\ -#endif -' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# This file on SunOS 4 has a very large macro. When the sed loop -# tries pull it in, it overflows the pattern space size of the SunOS -# sed (GNU sed does not have this problem). Since the file does not -# require fixing, we remove it from the fixed directory. -file=sundev/ipi_error.h -if [ -r ${LIB}/$file ]; then - echo "Removing incorrect fix to SunOS <sundev/ipi_error.h>" - rm -f ${LIB}/$file -fi - -# Put cpp wrappers around these include files to avoid redeclaration -# errors during multiple inclusion on m88k-tektronix-sysv3. -for file in time.h sys/time.h ; do - if egrep '#ifndef' $file >/dev/null 2>&1; then - true - else - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - fi - if [ -r ${LIB}/$file ]; then - echo Fixing $file, to protect against multiple inclusion. - cpp_wrapper=`echo $file | sed -e 's,\.,_,g' -e 's,/,_,g'` - (echo "#ifndef __GCC_GOT_${cpp_wrapper}_" - echo "#define __GCC_GOT_${cpp_wrapper}_" - cat ${LIB}/${file} - echo '#endif /* !_GCC_GOT_'${cpp_wrapper}_' */') > ${LIB}/${file}.new - rm -f ${LIB}/$file; mv ${LIB}/${file}.new ${LIB}/$file - fi - fi -done - -# Fix fcntl prototype in fcntl.h on LynxOS. -file=fcntl.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, fcntl declaration - sed -e 's/\(fcntl.*(int, int, \)int)/\1...)/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix definitions of macros used by va-i960.h in VxWorks header file. -file=arch/i960/archI960.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e 's/__vsiz/__vxvsiz/' -e 's/__vali/__vxvali/' \ - -e s'/__vpad/__vxvpad/' -e 's/__alignof__/__vxalignof__/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Make VxWorks header which is almost gcc ready fully gcc ready. -file=types/vxTypesBase.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file - sed -e 's/#ifdef __GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__/#if 1/' \ - -e '/[ ]size_t/i\ -#ifndef _GCC_SIZE_T\ -#define _GCC_SIZE_T -' \ - -e '/[ ]size_t/a\ -#endif -' \ - -e '/[ ]ptrdiff_t/i\ -#ifndef _GCC_PTRDIFF_T\ -#define _GCC_PTRDIFF_T -' \ - -e '/[ ]ptrdiff_t/a\ -#endif -' \ - -e '/[ ]wchar_t/i\ -#ifndef _GCC_WCHAR_T\ -#define _GCC_WCHAR_T -' \ - -e '/[ ]wchar_t/a\ -#endif -' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix VxWorks <sys/stat.h> to not require including <vxWorks.h>. -file=sys/stat.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sys 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - if egrep '#include' ${LIB}/$file >/dev/null 2>&1; then - : - else - if egrep 'ULONG' ${LIB}/$file >/dev/null 2>&1 \ - && [ -r types/vxTypesOld.h ]; then - echo Fixing $file - sed -e '/#define[ ][ ]*__INCstath/a\ -#include <types/vxTypesOld.h> -' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - fi - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix VxWorks <time.h> to not require including <vxTypes.h>. -file=time.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sys 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - if egrep 'uint_t[ ][ ]*_clocks_per_sec' ${LIB}/$file >/dev/null 2>&1; then - echo Fixing $file - sed -e 's/uint_t/unsigned int/' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Fix hpux10.20 <sys/time.h> to avoid invalid forward decl -file=sys/time.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sys 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - if egrep '^extern struct sigevent;' ${LIB}/$file >/dev/null 2>&1; then - echo Fixing $file - sed -e 's/^extern struct sigevent;/struct sigevent;/' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Another bad dependency in VxWorks 5.2 <time.h>. -file=time.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - mkdir ${LIB}/sys 2>/dev/null - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - if egrep VOIDFUNCPTR ${LIB}/$file >/dev/null 2>&1; then - if [ -r vxWorks.h ]; then - echo Fixing $file - sed -e '/VOIDFUNCPTR/i\ -#ifndef __gcc_VOIDFUNCPTR_defined\ -#ifdef __cplusplus\ -typedef void (*__gcc_VOIDFUNCPTR) (...);\ -#else\ -typedef void (*__gcc_VOIDFUNCPTR) ();\ -#endif\ -#define __gcc_VOIDFUNCPTR_defined\ -#endif -' \ - -e 's/VOIDFUNCPTR/__gcc_VOIDFUNCPTR/g' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - fi - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# This file in A/UX 3.0.x/3.1.x contains an __asm directive for c89; gcc -# doesn't understand it. -file=sys/param.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo "Fixing __asm directive in sys/param.h" - sed -e 's|#ifndef NOINLINE|#if !defined(NOINLINE) \&\& !defined(__GNUC__)|' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# signal.h on SunOS defines signal using (), which causes trouble when -# compiling with g++ -pedantic. -for file in signal.h sys/signal.h; do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - echo "Checking for bad C++ prototype in $file" - sed -e '/^void (\*signal())();$/i\ - #ifdef __cplusplus\ - void (*signal(...))(...);\ - #else - ' \ - -e '/^void (\*signal())();$/a\ - #endif - ' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# sys/signal.h on some versions of AIX uses volatile in the typedef of -# sig_atomic_t, which causes gcc to generate a warning about duplicate -# volatile when a sig_atomic_t variable is declared volatile, as -# required by ANSI C. -file=sys/signal.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo "Checking for duplicate volatile in sys/signal.h" - sed -e 's/typedef volatile int sig_atomic_t/typedef int sig_atomic_t/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# Some math.h files define struct exception, which conflicts with -# the class exception defined in the C++ file std/stdexcept.h. We -# redefine it to __math_exception. This is not a great fix, but I -# haven't been able to think of anything better. -file=math.h -if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null -fi - -if [ -r ${LIB}/$file ]; then - echo Fixing $file, exception - sed -e '/struct exception/i\ -#ifdef __cplusplus\ -#define exception __math_exception\ -#endif -'\ - -e '/struct exception/a\ -#ifdef __cplusplus\ -#undef exception\ -#endif -' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if egrep 'matherr()' ${LIB}/$file >/dev/null 2>&1; then - sed -e '/matherr/i\ -#ifdef __cplusplus\ -#define exception __math_exception\ -#endif -'\ - -e '/matherr/a\ -#ifdef __cplusplus\ -#undef exception\ -#endif -' ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - fi - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -fi - -# rpc/auth.h on SunOS needs prototypes for its AUTH->auth_ops function pointers -# Similarly for -# rpc/clnt.h CLIENT->clnt_ops -# rpc/svc.h SVCXPRT->xp_ops -# rpc/xdr.h XDR->xdr_ops -for file in rpc/auth.h rpc/clnt.h rpc/svc.h rpc/xdr.h; do - # each file has a different name to replace, so if you add a file to - # that list please update the following case statement. - case "$file" in - rpc/auth.h) - prefix="ah_" - ;; - rpc/clnt.h) - prefix="cl_" - ;; - rpc/svc.h) - prefix="xp_" - ;; - rpc/xdr.h) - prefix="x_" - ;; - *) - # Oh Oh, we shouldn't be here - exit 1; - ;; - esac - - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - echo "Checking for needed C++ prototype in $file" - sed -e 's/^\(.*\)\*\('$prefix'.*\)();\(.*\)/\ -#ifdef __cplusplus\ -\1*\2(...);\3\ -#else\ -\1*\2();\3\ -#endif/g' \ - $LIB/$file > ${LIB}/${file}.sed - - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi -done - -# sys/lc_core.h on some versions of OSF1/4.x pollutes the namespace by -# defining regex.h types. This causes C++ library build and usage failures. -# Fixing this correctly requires checking and modifying 3 files. -for file in reg_types.h regex.h sys/lc_core.h; do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi -done -if [ -r ${LIB}/reg_types.h ]; then - if egrep '} regex_t;' ${LIB}/reg_types.h >/dev/null 2>&1; then - if [ -r ${LIB}/sys/lc_core.h ]; then - if egrep ' regex_t ' ${LIB}/sys/lc_core.h >/dev/null 2>&1; then - if [ -r ${LIB}/regex.h ]; then - if egrep '__regex_t' ${LIB}/regex.h >/dev/null 2>&1; then - true; - else - echo Fixing reg_types.h, regex.h, sys/lc_core.h - for file in reg_types.h sys/lc_core.h; do - sed -e 's/regex_t/__regex_t/g' \ - -e 's/regoff_t/__regoff_t/g' \ - -e 's/regmatch_t/__regmatch_t/g' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - done - sed -e '/#include <reg_types.h>/a\ -typedef __regex_t regex_t;\ -typedef __regoff_t regoff_t;\ -typedef __regmatch_t regmatch_t;\ -' \ - ${LIB}/regex.h > ${LIB}/regex.h.sed - rm -f ${LIB}/regex.h; mv ${LIB}/regex.h.sed ${LIB}/regex.h - fi - fi - fi - fi - fi -fi -for file in reg_types.h regex.h sys/lc_core.h; do - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi -done - -# AIX headers define NULL to be cast to a void pointer, which is illegal -# in ANSI C++. -for file in curses.h dbm.h locale.h stdio.h stdlib.h string.h time.h unistd.h sys/dir.h sys/param.h sys/types.h ; do - if [ -r $file ] && [ ! -r ${LIB}/$file ]; then - cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" - chmod +w ${LIB}/$file 2>/dev/null - chmod a+r ${LIB}/$file 2>/dev/null - fi - - if [ -r ${LIB}/$file ]; then - if egrep '#.*define.*NULL.*void' ${LIB}/$file >/dev/null 2>&1; then - echo "Fixing $file, bad NULL macro" - sed -e 's/^#[ ]*define[ ]*NULL[ ]*((void[ ]*\*)0)/#define NULL 0/' \ - ${LIB}/$file > ${LIB}/${file}.sed - rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file - if cmp $file ${LIB}/$file >/dev/null 2>&1; then - rm -f ${LIB}/$file - else - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - fi - fi -done - -# HPUX 10.x sys/param.h defines MAXINT which clashes with values.h -file=sys/param.h -base=`basename $file` -if [ -r ${LIB}/$file ]; then - file_to_fix=${LIB}/$file -else - if [ -r ${INPUT}/$file ]; then - file_to_fix=${INPUT}/$file - else - file_to_fix="" - fi -fi -if [ \! -z "$file_to_fix" ]; then - echo Checking $file_to_fix - sed -e '/^#[ ]*define[ ]*MAXINT[ ]/i\ -#ifndef MAXINT -'\ - -e '/^#[ ]*define[ ]*MAXINT[ ]/a\ -#endif -' $file_to_fix > /tmp/$base - if cmp $file_to_fix /tmp/$base >/dev/null 2>&1; then \ - true - else - echo Fixed $file_to_fix - rm -f ${LIB}/$file - cp /tmp/$base ${LIB}/$file - chmod a+r ${LIB}/$file - # Find any include directives that use "file". - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $file | sed -e s'|/[^/]*$||'` - required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" - done - fi - rm -f /tmp/$base -fi - - -# This loop does not appear to do anything, because it uses file -# rather than $file when setting target. It also appears to be -# unnecessary, since the main loop processes symbolic links. -#if $LINKS; then -# echo 'Making internal symbolic non-directory links' -# cd ${INPUT} -# files=`find . -type l -print` -# for file in $files; do -# dest=`ls -ld $file | sed -n 's/.*-> //p'` -# if expr "$dest" : '[^/].*' > /dev/null; then -# target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"` -# if [ -f $target ]; then -# ln -s $dest ${LIB}/$file >/dev/null 2>&1 -# fi -# fi -# done -#fi - -# Make sure that any include files referenced using double quotes -# exist in the fixed directory. This comes last since otherwise -# we might end up deleting some of these files "because they don't -# need any change." -set x $required -shift -while [ $# != 0 ]; do - newreq= - while [ $# != 0 ]; do - # $1 is the directory to copy from, $2 is the unfixed file, - # $3 is the fixed file name. - cd ${INPUT} - cd $1 - if [ -r $2 ] && [ ! -r $3 ]; then - cp $2 $3 >/dev/null 2>&1 || echo "Can't copy $2" - chmod +w $3 2>/dev/null - chmod a+r $3 2>/dev/null - echo Copied $2 - for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' $3 | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do - dir=`echo $2 | sed -e s'|/[^/]*$||'` - dir2=`echo $3 | sed -e s'|/[^/]*$||'` - newreq="$newreq $1 $dir/$include $dir2/$include" - done - fi - shift; shift; shift - done - set x $newreq - shift -done - -echo 'Cleaning up DONE files.' -cd $LIB -find . -name DONE -exec rm -f '{}' ';' - -echo 'Removing unneeded directories:' -cd $LIB -files=`find . -type d \! -name '.' -print | sort -r` -for file in $files; do - rmdir $LIB/$file > /dev/null 2>&1 -done - -# # # # # # # # # # # # # # # # # # # # # -# -# End of for INPUT directories -# -done -# -# # # # # # # # # # # # # # # # # # # # # - -cd $ORIGDIR -rm -f include/assert.h -cp ${srcdir}/assert.h include/assert.h || exit 1 -chmod a+r include/assert.h - -exit 0 diff --git a/contrib/gcc/frame.c b/contrib/gcc/frame.c deleted file mode 100644 index 990a0ac81174..000000000000 --- a/contrib/gcc/frame.c +++ /dev/null @@ -1,872 +0,0 @@ -/* Subroutines needed for unwinding stack frames for exception handling. */ -/* Compile this one with gcc. */ -/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. - Contributed by Jason Merrill <jason@cygnus.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. */ - -/* As a special exception, if you link this library with other files, - some of which are compiled with GCC, to produce an executable, - this library does not by itself cause the resulting executable - to be covered by the GNU General Public License. - This exception does not however invalidate any other reasons why - the executable file might be covered by the GNU General Public License. */ - -/* It is incorrect to include config.h here, because this file is being - compiled for the target, and hence definitions concerning only the host - do not apply. */ - -#include "tconfig.h" - -/* We disable this when inhibit_libc, so that gcc can still be built without - needing header files first. */ -/* ??? This is not a good solution, since prototypes may be required in - some cases for correct code. See also libgcc2.c. */ -#ifndef inhibit_libc -/* fixproto guarantees these system headers exist. */ -#include <stdlib.h> -#include <unistd.h> -#endif - -#include "defaults.h" - -#ifdef DWARF2_UNWIND_INFO -#include "dwarf2.h" -#include <stddef.h> -#include "frame.h" -#include "gthr.h" - -#ifdef __GTHREAD_MUTEX_INIT -static __gthread_mutex_t object_mutex = __GTHREAD_MUTEX_INIT; -#else -static __gthread_mutex_t object_mutex; -#endif - -/* Don't use `fancy_abort' here even if config.h says to use it. */ -#ifdef abort -#undef abort -#endif - -/* Some types used by the DWARF 2 spec. */ - -typedef int sword __attribute__ ((mode (SI))); -typedef unsigned int uword __attribute__ ((mode (SI))); -typedef unsigned int uaddr __attribute__ ((mode (pointer))); -typedef int saddr __attribute__ ((mode (pointer))); -typedef unsigned char ubyte; - -/* Terminology: - CIE - Common Information Element - FDE - Frame Descriptor Element - - There is one per function, and it describes where the function code - is located, and what the register lifetimes and stack layout are - within the function. - - The data structures are defined in the DWARF specfication, although - not in a very readable way (see LITERATURE). - - Every time an exception is thrown, the code needs to locate the FDE - for the current function, and starts to look for exception regions - from that FDE. This works in a two-level search: - a) in a linear search, find the shared image (i.e. DLL) containing - the PC - b) using the FDE table for that shared object, locate the FDE using - binary search (which requires the sorting). */ - -/* The first few fields of a CIE. The CIE_id field is 0 for a CIE, - to distinguish it from a valid FDE. FDEs are aligned to an addressing - unit boundary, but the fields within are unaligned. */ - -struct dwarf_cie { - uword length; - sword CIE_id; - ubyte version; - char augmentation[0]; -} __attribute__ ((packed, aligned (__alignof__ (void *)))); - -/* The first few fields of an FDE. */ - -struct dwarf_fde { - uword length; - sword CIE_delta; - void* pc_begin; - uaddr pc_range; -} __attribute__ ((packed, aligned (__alignof__ (void *)))); - -typedef struct dwarf_fde fde; - -/* Objects to be searched for frame unwind info. */ - -static struct object *objects; - -/* The information we care about from a CIE. */ - -struct cie_info { - char *augmentation; - void *eh_ptr; - int code_align; - int data_align; - unsigned ra_regno; -}; - -/* The current unwind state, plus a saved copy for DW_CFA_remember_state. */ - -struct frame_state_internal -{ - struct frame_state s; - struct frame_state_internal *saved_state; -}; - -/* This is undefined below if we need it to be an actual function. */ -#define init_object_mutex_once() - -#if __GTHREADS -#ifdef __GTHREAD_MUTEX_INIT_FUNCTION - -/* Helper for init_object_mutex_once. */ - -static void -init_object_mutex (void) -{ - __GTHREAD_MUTEX_INIT_FUNCTION (&object_mutex); -} - -/* Call this to arrange to initialize the object mutex. */ - -#undef init_object_mutex_once -static void -init_object_mutex_once (void) -{ - static __gthread_once_t once = __GTHREAD_ONCE_INIT; - __gthread_once (&once, init_object_mutex); -} - -#endif /* __GTHREAD_MUTEX_INIT_FUNCTION */ -#endif /* __GTHREADS */ - -/* Decode the unsigned LEB128 constant at BUF into the variable pointed to - by R, and return the new value of BUF. */ - -static void * -decode_uleb128 (unsigned char *buf, unsigned *r) -{ - unsigned shift = 0; - unsigned result = 0; - - while (1) - { - unsigned byte = *buf++; - result |= (byte & 0x7f) << shift; - if ((byte & 0x80) == 0) - break; - shift += 7; - } - *r = result; - return buf; -} - -/* Decode the signed LEB128 constant at BUF into the variable pointed to - by R, and return the new value of BUF. */ - -static void * -decode_sleb128 (unsigned char *buf, int *r) -{ - unsigned shift = 0; - unsigned result = 0; - unsigned byte; - - while (1) - { - byte = *buf++; - result |= (byte & 0x7f) << shift; - shift += 7; - if ((byte & 0x80) == 0) - break; - } - if (shift < (sizeof (*r) * 8) && (byte & 0x40) != 0) - result |= - (1 << shift); - - *r = result; - return buf; -} - -/* Read unaligned data from the instruction buffer. */ - -union unaligned { - void *p; - unsigned b2 __attribute__ ((mode (HI))); - unsigned b4 __attribute__ ((mode (SI))); - unsigned b8 __attribute__ ((mode (DI))); -} __attribute__ ((packed)); -static inline void * -read_pointer (void *p) -{ union unaligned *up = p; return up->p; } -static inline unsigned -read_1byte (void *p) -{ return *(unsigned char *)p; } -static inline unsigned -read_2byte (void *p) -{ union unaligned *up = p; return up->b2; } -static inline unsigned -read_4byte (void *p) -{ union unaligned *up = p; return up->b4; } -static inline unsigned long -read_8byte (void *p) -{ union unaligned *up = p; return up->b8; } - -/* Ordering function for FDEs. Functions can't overlap, so we just compare - their starting addresses. */ - -static inline saddr -fde_compare (fde *x, fde *y) -{ - return (saddr)x->pc_begin - (saddr)y->pc_begin; -} - -/* Return the address of the FDE after P. */ - -static inline fde * -next_fde (fde *p) -{ - return (fde *)(((char *)p) + p->length + sizeof (p->length)); -} - -/* Sorting an array of FDEs by address. - (Ideally we would have the linker sort the FDEs so we don't have to do - it at run time. But the linkers are not yet prepared for this.) */ - -/* This is a special mix of insertion sort and heap sort, optimized for - the data sets that actually occur. They look like - 101 102 103 127 128 105 108 110 190 111 115 119 125 160 126 129 130. - I.e. a linearly increasing sequence (coming from functions in the text - section), with additionally a few unordered elements (coming from functions - in gnu_linkonce sections) whose values are higher than the values in the - surrounding linear sequence (but not necessarily higher than the values - at the end of the linear sequence!). - The worst-case total run time is O(N) + O(n log (n)), where N is the - total number of FDEs and n is the number of erratic ones. */ - -typedef struct fde_vector -{ - fde **array; - size_t count; -} fde_vector; - -typedef struct fde_accumulator -{ - fde_vector linear; - fde_vector erratic; -} fde_accumulator; - -static inline void -start_fde_sort (fde_accumulator *accu, size_t count) -{ - accu->linear.array = (fde **) malloc (sizeof (fde *) * count); - accu->erratic.array = (fde **) malloc (sizeof (fde *) * count); - accu->linear.count = 0; - accu->erratic.count = 0; -} - -static inline void -fde_insert (fde_accumulator *accu, fde *this_fde) -{ - accu->linear.array[accu->linear.count++] = this_fde; -} - -/* Split LINEAR into a linear sequence with low values and an erratic - sequence with high values, put the linear one (of longest possible - length) into LINEAR and the erratic one into ERRATIC. This is O(N). */ -static inline void -fde_split (fde_vector *linear, fde_vector *erratic) -{ - size_t count = linear->count; - size_t linear_max = (size_t) -1; - size_t previous_max[count]; - size_t i, j; - - for (i = 0; i < count; i++) - { - for (j = linear_max; - j != (size_t) -1 - && fde_compare (linear->array[i], linear->array[j]) < 0; - j = previous_max[j]) - { - erratic->array[erratic->count++] = linear->array[j]; - linear->array[j] = (fde *) NULL; - } - previous_max[i] = j; - linear_max = i; - } - - for (i = 0, j = 0; i < count; i++) - if (linear->array[i] != (fde *) NULL) - linear->array[j++] = linear->array[i]; - linear->count = j; -} - -/* This is O(n log(n)). BSD/OS defines heapsort in stdlib.h, so we must - use a name that does not conflict. */ -static inline void -frame_heapsort (fde_vector *erratic) -{ - /* For a description of this algorithm, see: - Samuel P. Harbison, Guy L. Steele Jr.: C, a reference manual, 2nd ed., - p. 60-61. */ - fde ** a = erratic->array; - /* A portion of the array is called a "heap" if for all i>=0: - If i and 2i+1 are valid indices, then a[i] >= a[2i+1]. - If i and 2i+2 are valid indices, then a[i] >= a[2i+2]. */ -#define SWAP(x,y) do { fde * tmp = x; x = y; y = tmp; } while (0) - size_t n = erratic->count; - size_t m = n; - size_t i; - - while (m > 0) - { - /* Invariant: a[m..n-1] is a heap. */ - m--; - for (i = m; 2*i+1 < n; ) - { - if (2*i+2 < n - && fde_compare (a[2*i+2], a[2*i+1]) > 0 - && fde_compare (a[2*i+2], a[i]) > 0) - { - SWAP (a[i], a[2*i+2]); - i = 2*i+2; - } - else if (fde_compare (a[2*i+1], a[i]) > 0) - { - SWAP (a[i], a[2*i+1]); - i = 2*i+1; - } - else - break; - } - } - while (n > 1) - { - /* Invariant: a[0..n-1] is a heap. */ - n--; - SWAP (a[0], a[n]); - for (i = 0; 2*i+1 < n; ) - { - if (2*i+2 < n - && fde_compare (a[2*i+2], a[2*i+1]) > 0 - && fde_compare (a[2*i+2], a[i]) > 0) - { - SWAP (a[i], a[2*i+2]); - i = 2*i+2; - } - else if (fde_compare (a[2*i+1], a[i]) > 0) - { - SWAP (a[i], a[2*i+1]); - i = 2*i+1; - } - else - break; - } - } -#undef SWAP -} - -/* Merge V1 and V2, both sorted, and put the result into V1. */ -static void -fde_merge (fde_vector *v1, const fde_vector *v2) -{ - size_t i1, i2; - fde * fde2; - - i2 = v2->count; - if (i2 > 0) - { - i1 = v1->count; - do { - i2--; - fde2 = v2->array[i2]; - while (i1 > 0 && fde_compare (v1->array[i1-1], fde2) > 0) - { - v1->array[i1+i2] = v1->array[i1-1]; - i1--; - } - v1->array[i1+i2] = fde2; - } while (i2 > 0); - v1->count += v2->count; - } -} - -static fde ** -end_fde_sort (fde_accumulator *accu, size_t count) -{ - if (accu->linear.count != count) - abort (); - fde_split (&accu->linear, &accu->erratic); - if (accu->linear.count + accu->erratic.count != count) - abort (); - frame_heapsort (&accu->erratic); - fde_merge (&accu->linear, &accu->erratic); - free (accu->erratic.array); - return accu->linear.array; -} - -static size_t -count_fdes (fde *this_fde) -{ - size_t count; - - for (count = 0; this_fde->length != 0; this_fde = next_fde (this_fde)) - { - /* Skip CIEs and linked once FDE entries. */ - if (this_fde->CIE_delta == 0 || this_fde->pc_begin == 0) - continue; - - ++count; - } - - return count; -} - -static void -add_fdes (fde *this_fde, fde_accumulator *accu, void **beg_ptr, void **end_ptr) -{ - void *pc_begin = *beg_ptr; - void *pc_end = *end_ptr; - - for (; this_fde->length != 0; this_fde = next_fde (this_fde)) - { - /* Skip CIEs and linked once FDE entries. */ - if (this_fde->CIE_delta == 0 || this_fde->pc_begin == 0) - continue; - - fde_insert (accu, this_fde); - - if (this_fde->pc_begin < pc_begin) - pc_begin = this_fde->pc_begin; - if (this_fde->pc_begin + this_fde->pc_range > pc_end) - pc_end = this_fde->pc_begin + this_fde->pc_range; - } - - *beg_ptr = pc_begin; - *end_ptr = pc_end; -} - -/* Set up a sorted array of pointers to FDEs for a loaded object. We - count up the entries before allocating the array because it's likely to - be faster. */ - -static void -frame_init (struct object* ob) -{ - size_t count; - fde_accumulator accu; - void *pc_begin, *pc_end; - - if (ob->fde_array) - { - fde **p = ob->fde_array; - for (count = 0; *p; ++p) - count += count_fdes (*p); - } - else - count = count_fdes (ob->fde_begin); - - ob->count = count; - - start_fde_sort (&accu, count); - pc_begin = (void*)(uaddr)-1; - pc_end = 0; - - if (ob->fde_array) - { - fde **p = ob->fde_array; - for (; *p; ++p) - add_fdes (*p, &accu, &pc_begin, &pc_end); - } - else - add_fdes (ob->fde_begin, &accu, &pc_begin, &pc_end); - - ob->fde_array = end_fde_sort (&accu, count); - ob->pc_begin = pc_begin; - ob->pc_end = pc_end; -} - -/* Return a pointer to the FDE for the function containing PC. */ - -static fde * -find_fde (void *pc) -{ - struct object *ob; - size_t lo, hi; - - init_object_mutex_once (); - __gthread_mutex_lock (&object_mutex); - - for (ob = objects; ob; ob = ob->next) - { - if (ob->pc_begin == 0) - frame_init (ob); - if (pc >= ob->pc_begin && pc < ob->pc_end) - break; - } - - __gthread_mutex_unlock (&object_mutex); - - if (ob == 0) - return 0; - - /* Standard binary search algorithm. */ - for (lo = 0, hi = ob->count; lo < hi; ) - { - size_t i = (lo + hi) / 2; - fde *f = ob->fde_array[i]; - - if (pc < f->pc_begin) - hi = i; - else if (pc >= f->pc_begin + f->pc_range) - lo = i + 1; - else - return f; - } - - return 0; -} - -static inline struct dwarf_cie * -get_cie (fde *f) -{ - return ((void *)&f->CIE_delta) - f->CIE_delta; -} - -/* Extract any interesting information from the CIE for the translation - unit F belongs to. */ - -static void * -extract_cie_info (fde *f, struct cie_info *c) -{ - void *p; - int i; - - c->augmentation = get_cie (f)->augmentation; - - if (strcmp (c->augmentation, "") != 0 - && strcmp (c->augmentation, "eh") != 0 - && c->augmentation[0] != 'z') - return 0; - - p = c->augmentation + strlen (c->augmentation) + 1; - - if (strcmp (c->augmentation, "eh") == 0) - { - c->eh_ptr = read_pointer (p); - p += sizeof (void *); - } - else - c->eh_ptr = 0; - - p = decode_uleb128 (p, &c->code_align); - p = decode_sleb128 (p, &c->data_align); - c->ra_regno = *(unsigned char *)p++; - - /* If the augmentation starts with 'z', we now see the length of the - augmentation fields. */ - if (c->augmentation[0] == 'z') - { - p = decode_uleb128 (p, &i); - p += i; - } - - return p; -} - -/* Decode one instruction's worth of DWARF 2 call frame information. - Used by __frame_state_for. Takes pointers P to the instruction to - decode, STATE to the current register unwind information, INFO to the - current CIE information, and PC to the current PC value. Returns a - pointer to the next instruction. */ - -static void * -execute_cfa_insn (void *p, struct frame_state_internal *state, - struct cie_info *info, void **pc) -{ - unsigned insn = *(unsigned char *)p++; - unsigned reg; - int offset; - - if (insn & DW_CFA_advance_loc) - *pc += ((insn & 0x3f) * info->code_align); - else if (insn & DW_CFA_offset) - { - reg = (insn & 0x3f); - p = decode_uleb128 (p, &offset); - offset *= info->data_align; - state->s.saved[reg] = REG_SAVED_OFFSET; - state->s.reg_or_offset[reg] = offset; - } - else if (insn & DW_CFA_restore) - { - reg = (insn & 0x3f); - state->s.saved[reg] = REG_UNSAVED; - } - else switch (insn) - { - case DW_CFA_set_loc: - *pc = read_pointer (p); - p += sizeof (void *); - break; - case DW_CFA_advance_loc1: - *pc += read_1byte (p); - p += 1; - break; - case DW_CFA_advance_loc2: - *pc += read_2byte (p); - p += 2; - break; - case DW_CFA_advance_loc4: - *pc += read_4byte (p); - p += 4; - break; - - case DW_CFA_offset_extended: - p = decode_uleb128 (p, ®); - p = decode_uleb128 (p, &offset); - offset *= info->data_align; - state->s.saved[reg] = REG_SAVED_OFFSET; - state->s.reg_or_offset[reg] = offset; - break; - case DW_CFA_restore_extended: - p = decode_uleb128 (p, ®); - state->s.saved[reg] = REG_UNSAVED; - break; - - case DW_CFA_undefined: - case DW_CFA_same_value: - case DW_CFA_nop: - break; - - case DW_CFA_register: - { - unsigned reg2; - p = decode_uleb128 (p, ®); - p = decode_uleb128 (p, ®2); - state->s.saved[reg] = REG_SAVED_REG; - state->s.reg_or_offset[reg] = reg2; - } - break; - - case DW_CFA_def_cfa: - p = decode_uleb128 (p, ®); - p = decode_uleb128 (p, &offset); - state->s.cfa_reg = reg; - state->s.cfa_offset = offset; - break; - case DW_CFA_def_cfa_register: - p = decode_uleb128 (p, ®); - state->s.cfa_reg = reg; - break; - case DW_CFA_def_cfa_offset: - p = decode_uleb128 (p, &offset); - state->s.cfa_offset = offset; - break; - - case DW_CFA_remember_state: - { - struct frame_state_internal *save = - (struct frame_state_internal *) - malloc (sizeof (struct frame_state_internal)); - memcpy (save, state, sizeof (struct frame_state_internal)); - state->saved_state = save; - } - break; - case DW_CFA_restore_state: - { - struct frame_state_internal *save = state->saved_state; - memcpy (state, save, sizeof (struct frame_state_internal)); - free (save); - } - break; - - /* FIXME: Hardcoded for SPARC register window configuration. */ - case DW_CFA_GNU_window_save: - for (reg = 16; reg < 32; ++reg) - { - state->s.saved[reg] = REG_SAVED_OFFSET; - state->s.reg_or_offset[reg] = (reg - 16) * sizeof (void *); - } - break; - - case DW_CFA_GNU_args_size: - p = decode_uleb128 (p, &offset); - state->s.args_size = offset; - break; - - case DW_CFA_GNU_negative_offset_extended: - p = decode_uleb128 (p, ®); - p = decode_uleb128 (p, &offset); - offset *= info->data_align; - state->s.saved[reg] = REG_SAVED_OFFSET; - state->s.reg_or_offset[reg] = -offset; - break; - - default: - abort (); - } - return p; -} - -/* Called from crtbegin.o to register the unwind info for an object. */ - -void -__register_frame_info (void *begin, struct object *ob) -{ - ob->fde_begin = begin; - - ob->pc_begin = ob->pc_end = 0; - ob->fde_array = 0; - ob->count = 0; - - init_object_mutex_once (); - __gthread_mutex_lock (&object_mutex); - - ob->next = objects; - objects = ob; - - __gthread_mutex_unlock (&object_mutex); -} - -void -__register_frame (void *begin) -{ - struct object *ob = (struct object *) malloc (sizeof (struct object)); - __register_frame_info (begin, ob); -} - -/* Similar, but BEGIN is actually a pointer to a table of unwind entries - for different translation units. Called from the file generated by - collect2. */ - -void -__register_frame_info_table (void *begin, struct object *ob) -{ - ob->fde_begin = begin; - ob->fde_array = begin; - - ob->pc_begin = ob->pc_end = 0; - ob->count = 0; - - init_object_mutex_once (); - __gthread_mutex_lock (&object_mutex); - - ob->next = objects; - objects = ob; - - __gthread_mutex_unlock (&object_mutex); -} - -void -__register_frame_table (void *begin) -{ - struct object *ob = (struct object *) malloc (sizeof (struct object)); - __register_frame_info_table (begin, ob); -} - -/* Called from crtbegin.o to deregister the unwind info for an object. */ - -void * -__deregister_frame_info (void *begin) -{ - struct object **p; - - init_object_mutex_once (); - __gthread_mutex_lock (&object_mutex); - - p = &objects; - while (*p) - { - if ((*p)->fde_begin == begin) - { - struct object *ob = *p; - *p = (*p)->next; - - /* If we've run init_frame for this object, free the FDE array. */ - if (ob->pc_begin) - free (ob->fde_array); - - __gthread_mutex_unlock (&object_mutex); - return (void *) ob; - } - p = &((*p)->next); - } - - __gthread_mutex_unlock (&object_mutex); - abort (); -} - -void -__deregister_frame (void *begin) -{ - free (__deregister_frame_info (begin)); -} - -/* Called from __throw to find the registers to restore for a given - PC_TARGET. The caller should allocate a local variable of `struct - frame_state' (declared in frame.h) and pass its address to STATE_IN. */ - -struct frame_state * -__frame_state_for (void *pc_target, struct frame_state *state_in) -{ - fde *f; - void *insn, *end, *pc; - struct cie_info info; - struct frame_state_internal state; - - f = find_fde (pc_target); - if (f == 0) - return 0; - - insn = extract_cie_info (f, &info); - if (insn == 0) - return 0; - - memset (&state, 0, sizeof (state)); - state.s.retaddr_column = info.ra_regno; - state.s.eh_ptr = info.eh_ptr; - - /* First decode all the insns in the CIE. */ - end = next_fde ((fde*) get_cie (f)); - while (insn < end) - insn = execute_cfa_insn (insn, &state, &info, 0); - - insn = ((fde *)f) + 1; - - if (info.augmentation[0] == 'z') - { - int i; - insn = decode_uleb128 (insn, &i); - insn += i; - } - - /* Then the insns in the FDE up to our target PC. */ - end = next_fde (f); - pc = f->pc_begin; - while (insn < end && pc <= pc_target) - insn = execute_cfa_insn (insn, &state, &info, &pc); - - memcpy (state_in, &state.s, sizeof (state.s)); - return state_in; -} -#endif /* DWARF2_UNWIND_INFO */ diff --git a/contrib/gcc/frame.h b/contrib/gcc/frame.h deleted file mode 100644 index 985416cd1807..000000000000 --- a/contrib/gcc/frame.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Header file for unwinding stack frames for exception handling. */ -/* Compile this one with gcc. */ -/* Copyright (C) 1997, 1998 Free Software Foundation, Inc. - Contributed by Jason Merrill <jason@cygnus.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. */ - - -typedef struct frame_state -{ - void *cfa; - void *eh_ptr; - long cfa_offset; - long args_size; - long reg_or_offset[FIRST_PSEUDO_REGISTER+1]; - unsigned short cfa_reg; - unsigned short retaddr_column; - char saved[FIRST_PSEUDO_REGISTER+1]; -} frame_state; - -/* Values for 'saved' above. */ -#define REG_UNSAVED 0 -#define REG_SAVED_OFFSET 1 -#define REG_SAVED_REG 2 - -/* The representation for an "object" to be searched for frame unwind info. - For targets with named sections, one object is an executable or shared - library; for other targets, one object is one translation unit. - - A copy of this structure declaration is printed by collect2.c; - keep the copies synchronized! */ - -struct object { - void *pc_begin; - void *pc_end; - struct dwarf_fde *fde_begin; - struct dwarf_fde **fde_array; - size_t count; - struct object *next; -}; - -/* Note the following routines are exported interfaces from libgcc; do not - change these interfaces. Instead create new interfaces. Also note - references to these functions may be made weak in files where they - are referenced. */ - -extern void __register_frame (void * ); -extern void __register_frame_table (void *); -extern void __deregister_frame (void *); - -/* Called either from crtbegin.o or a static constructor to register the - unwind info for an object or translation unit, respectively. */ - -extern void __register_frame_info (void *, struct object *); - -/* Similar, but BEGIN is actually a pointer to a table of unwind entries - for different translation units. Called from the file generated by - collect2. */ -extern void __register_frame_info_table (void *, struct object *); - -/* Called from crtend.o to deregister the unwind info for an object. */ - -extern void *__deregister_frame_info (void *); - -/* Called from __throw to find the registers to restore for a given - PC_TARGET. The caller should allocate a local variable of `struct - frame_state' (declared in frame.h) and pass its address to STATE_IN. - Returns NULL on failure, otherwise returns STATE_IN. */ - -extern struct frame_state *__frame_state_for (void *, struct frame_state *); diff --git a/contrib/gcc/gansidecl.h b/contrib/gcc/gansidecl.h deleted file mode 100644 index cf7762fad6ac..000000000000 --- a/contrib/gcc/gansidecl.h +++ /dev/null @@ -1,85 +0,0 @@ -/* ANSI and traditional C compatibility macros. - Copyright (C) 1996, 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. */ - -/* This file mimics some of the support provided by include/ansidecl.h - in binutils and gdb releases. - ??? Over time the two should be merged into one. */ - -#ifndef __GANSIDECL_H__ -#define __GANSIDECL_H__ - -#include "ansidecl.h" - -/* Undef ansidecl.h's "obsolete" version. */ -#undef PROTO -/* These macros are deprecated, use ansidecl.h's PARAMS style instead. */ -#define PROTO(ARGS) PARAMS(ARGS) -#define VPROTO(ARGS) VPARAMS(ARGS) -#define PVPROTO(ARGS) PARAMS(ARGS) - -/* Autoconf will possibly define the `inline' or `const' keywords as - macros, however this is only valid for the stage1 compiler. If we - detect a modern version of gcc, unconditionally reset the values. - This makes sure the right thing happens in stage2 and later. We - need to do this very early; i.e. before any systems header files or - gcc header files in case they use these keywords. Otherwise - conflicts might occur. */ -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) -# undef const -# undef inline -# define inline __inline__ /* Modern gcc can use `__inline__' freely. */ -#endif /* GCC >= 2.7 */ - -#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) -# define __attribute__(x) -#endif - -#ifndef ATTRIBUTE_UNUSED_LABEL -# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 93) -# define ATTRIBUTE_UNUSED_LABEL -# else -# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED -# endif /* GNUC < 2.93 */ -#endif /* ATTRIBUTE_UNUSED_LABEL */ - -#ifndef ATTRIBUTE_UNUSED -#define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) -#endif /* ATTRIBUTE_UNUSED */ - -#ifndef ATTRIBUTE_NORETURN -#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) -#endif /* ATTRIBUTE_NORETURN */ - -#ifndef ATTRIBUTE_PRINTF -#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((format (__printf__, m, n))) -#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2) -#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3) -#define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4) -#define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5) -#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6) -#endif /* ATTRIBUTE_PRINTF */ - -#define GENERIC_PTR PTR - -#ifndef NULL_PTR -#define NULL_PTR ((PTR) 0) -#endif - -#endif /* __GANSIDECL_H__ */ diff --git a/contrib/gcc/gcc.texi b/contrib/gcc/gcc.texi deleted file mode 100644 index 9c1f4505b051..000000000000 --- a/contrib/gcc/gcc.texi +++ /dev/null @@ -1,4776 +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 (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 the GNU Compiler Collection (GCC) -@end ifset -@end ifset -@c seems reasonable to assume at least one of INTERNALS or USING is set... -@ifclear INTERNALS -@settitle Using the GNU Compiler Collection -@end ifclear -@ifclear USING -@settitle Porting the GNU Compiler Collection -@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 Compiler Collection. -@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, 1999, 2000 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 the GNU Compiler Collection} - -@end ifset -@end ifset -@ifclear INTERNALS -@title Using the GNU Compiler Collection -@end ifclear -@ifclear USING -@title Porting the GNU Compiler Collection -@end ifclear -@sp 2 -@center Richard M. Stallman -@sp 3 -@center Last updated 28 July 1999 -@sp 1 -@c The version number appears five times more in this file. - -@center for gcc-2.95 -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1998, 1999 Free Software Foundation, Inc. -@sp 2 -For GCC Version 2.95@* -@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 GCC version 2.95. -@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 GCC version 2.95. -@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 GCC version 2.95. -@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 GCC. -* C Extensions:: GNU extensions to the C language family. -* C++ Extensions:: GNU extensions to the C++ language. -* Gcov:: gcov: a GCC test coverage program. -* Trouble:: If you have trouble installing GCC. -* Bugs:: How, why and where to report bugs. -* Service:: How to find suppliers of support for GCC. -* Contributing:: How to contribute to testing and developing GCC. -* VMS:: Using GCC on VMS. -@end ifset -@ifset INTERNALS -* Portability:: Goals of GCC's portability features. -* Interface:: Function-call interface of GCC 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 GCC. -* Contributors:: People who have contributed to GCC. - -* Index:: Index of concepts and symbol names. -@end menu - -@ifset USING -@node G++ and GCC -@chapter Compile C, C++, Objective C, or Fortran - -@cindex Objective C -The C, C++, and Objective C, and Fortran versions of the compiler are -integrated; this is why we use the name ``GNU Compiler Collection''. -GCC can compile programs written in C, C++, Objective C, or Fortran. -The Fortran compiler is described in a separate manual. - -@cindex GCC -``GCC'' is a common shorthand term for the GNU Compiler Collection. This is both -the most general name for the compiler, and the name used when the -emphasis is on compiling C programs (as the abbreviation formerly -stood for ``GNU C Compiler''). - -@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 ``GCC'' 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 ``GCC'' 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 GCC 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 GCC 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 GCC -@cindex bugs, known -@cindex installation trouble -@cindex known causes of trouble - -This section describes known problems that affect users of GCC. Most -of these are not GCC 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 GCC. -* Cross-Compiler Problems:: Common problems of cross compiling with GCC. -* Interoperation:: Problems using GCC with other compilers, - and with certain linkers, assemblers and debuggers. -* External Bugs:: Problems compiling certain programs. -* Incompatibilities:: GCC 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, GCC 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 GCC 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 GCC. - -@item -In previous versions of GCC, 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-}. GCC 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 -GCC. The fix is to get rid of the file @code{real-ld} which purify -installs---so that GCC 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, GCC 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 GCC 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, GCC 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 GCC with the system's compiler, -do not use @samp{-O}. Some versions of the system's compiler miscompile -GCC 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 GCC. 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 GCC version 2.0.2 are commonly -available, but they have a bug that shows up when compiling current -versions of GCC: undefined symbol errors occur during assembly if you -use @samp{-g}. - -The solution is to compile the current version of GCC 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 GCC fully. If you did not install all -optional packages when installing Solaris, you will need to verify that -the packages that GCC 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, GCC needs six packages: @samp{SUNWarc}, -@samp{SUNWbtool}, @samp{SUNWesu}, @samp{SUNWhea}, @samp{SUNWlibm}, and -@samp{SUNWtoo}. - -For Solaris 2.2, GCC 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 GCC 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 GCC. Once GCC 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, GCC 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 GCC 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. GCC 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 GCC 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 GCC. You must use an older version of GCC for -bootstrapping. One indication of this problem is if you get a crash -when GCC compiles the function @code{muldi3} in file @file{libgcc2.c}. - -You may be able to succeed by getting GCC version 1, installing it, -and using it to compile GCC version 2. The bug in the Pyramid C -compiler does not seem to affect GCC 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 GCC. - -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 GCC 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 GCC version -2. If you have trouble, get GDB version 4.4 or later. - -@item -@cindex DBX -DBX rejects some files produced by GCC, 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 GCC unless -corrected by @code{fixincludes}. The corrected header files go in a new -directory; GCC searches this directory before @file{/usr/include}. -If you use @samp{-I/usr/include}, this tells GCC 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, GCC 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 GCC 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 GCC. -You must specify all three options explicitly. - -@item -On a Sparc, GCC 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 GCC, 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 GCC 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 GCC -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 GCC correctly. We do not yet know why. However, GCC -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 GCC. Specifically, it fails to work on functions that use -@code{alloca} or variable-size arrays. This is because GCC 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 GCC, but is now exceptionally rare. If you should run -into it, you can work around by making your function smaller. - -@item -GCC 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. GCC 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 GCC 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 GCC 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. - -GCC 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 GCC 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. - -GCC 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 GCC 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 GCC 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 GCC: - -@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 -GCC: - -@example -MALLOC=gmalloc.o -@end example -@end itemize - -@node Incompatibilities -@section Incompatibilities of GCC -@cindex incompatibilities of GCC - -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 -GCC normally makes string constants read-only. If several -identical-looking string constants are used, GCC 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 GCC -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 -GCC does not substitute macro arguments when they appear inside of -string constants. For example, the following macro in GCC - -@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 GCC 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 GCC 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 GCC. 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{+=}. GCC, following the ANSI standard, does not -allow this. The difficulty described immediately above applies here -too. - -@cindex apostrophes -@cindex ' -@item -GCC 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, GCC 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. GCC 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, GCC -output code normally uses a method different from that used on most -versions of Unix. As a result, code compiled with GCC cannot call -a structure-returning function compiled with PCC, and vice versa. - -The method used by GCC 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 GCC 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. GCC 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. GCC 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 GCC 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 - -GCC 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 GCC unless they are changed. Some have bugs, some are -incompatible with ANSI C, and some depend on special features of other -compilers. - -Installing GCC 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 GCC are not automatically -updated. The easiest way to update them is to reinstall GCC. (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, GCC 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 GCC's fault, but it -does mean that there's nothing for us to do about them. -@end itemize - -@node Standard Libraries -@section Standard Libraries - -GCC 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 -GCC 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 GCC 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 GCC 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 GCC 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 -GCC 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 GCC 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 GCC -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 ISO C++ standard) was only recently completed. 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 -* Copy Assignment:: Copy Assignment operators copy virtual bases twice -@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 string classes, -especially ones that define a conversion function to type @code{char *} -or @code{const char *} -- which is one reason why the standard -@code{string} class requires you to call the @code{c_str} member -function. 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 *); - -void -f () -@{ - const char *p = strfunc().c_str(); - ... - charfunc (p); - ... - charfunc (p); -@} -@end example - -@noindent -In this situation, it may seem reasonable to save a pointer to the C -string returned by the @code{c_str} member function and use that rather -than call @code{c_str} repeatedly. However, the temporary string -created by the call to @code{strfunc} is destroyed after @code{p} is -initialized, at which point @code{p} is left pointing to freed memory. - -Code like this may run successfully under some other compilers, -particularly obsolete cfront-based compilers that delete temporaries -along with normal local variables. However, the GNU C++ behavior is -standard-conforming, so if your program depends on late destruction of -temporaries it is not portable. - -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.c_str ()); -@end example - -@node Copy Assignment -@subsection Implicit Copy-Assignment for Virtual Bases - -When a base class is virtual, only one subobject of the base class -belongs to each full object. Also, the constructors and destructors are -invoked only once, and called from the most-derived class. However, such -objects behave unspecified when being assigned. For example: - -@example -struct Base@{ - char *name; - Base(char *n) : name(strdup(n))@{@} - Base& operator= (const Base& other)@{ - free (name); - name = strdup (other.name); - @} -@}; - -struct A:virtual Base@{ - int val; - A():Base("A")@{@} -@}; - -struct B:virtual Base@{ - int bval; - B():Base("B")@{@} -@}; - -struct Derived:public A, public B@{ - Derived():Base("Derived")@{@} -@}; - -void func(Derived &d1, Derived &d2) -@{ - d1 = d2; -@} -@end example - -The C++ standard specifies that @samp{Base::Base} is only called once -when constructing or copy-constructing a Derived object. It is -unspecified whether @samp{Base::operator=} is called more than once when -the implicit copy-assignment for Derived objects is invoked (as it is -inside @samp{func} in the example). - -g++ implements the "intuitive" algorithm for copy-assignment: assign all -direct bases, then assign all members. In that algorithm, the virtual -base subobject can be encountered many times. In the example, copying -proceeds in the following order: @samp{val}, @samp{name} (via -@code{strdup}), @samp{bval}, and @samp{name} again. - -If application code relies on copy-assignment, a user-defined -copy-assignment operator removes any uncertainties. With such an -operator, the application can define whether and how the virtual base -subobject is assigned. - -@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 GCC 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 GCC 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 GCC 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, GCC 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. - -GCC 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. GCC 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. - -Historically, GCC 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. GCC 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). - -GCC 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 GCC 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 GCC 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 GCC work -better. Bug reports are your contribution to the maintenance of GCC. - -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 GCC. -* 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 GCC 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; GCC 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++ (or Fortran or Objective-C) -compilers, your suggestions -for improvement of GCC are welcome in any case. -@end itemize - -@node Bug Lists -@section Where to Report Bugs -@cindex bug report mailing lists -@kindex gcc-bugs@@gcc.gnu.org or bug-gcc@@gnu.org -Send bug reports for the GNU Compiler Collection to -@samp{gcc-bugs@@gcc.gnu.org}. In accordance with the GNU-wide -convention, in which bug reports for tool ``foo'' are sent -to @samp{bug-foo@@gnu.org}, the address @samp{bug-gcc@@gnu.org} -may also be used; it will forward to the address given above. - -Please read @samp{<URL:http://www.gnu.org/software/gcc/bugs.html>} for -bug reporting instructions before you post a bug report. - -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 - -You may find additional and/or more up-to-date instructions at -@samp{<URL:http://www.gnu.org/software/gcc/bugs.html>}. - -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. - -To enable someone to investigate the bug, you should include all these -things: - -@itemize @bullet -@item -The version of GCC. 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 GCC. - -@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 GCC 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 GCC 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 GCC 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 -GCC. - -@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 GCC 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 GCC, -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 GCC 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 GCC 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 GCC 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 GCC 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 GCC - -If you would like to write bug fixes or improvements for the GNU C -compiler, that is very helpful. Send suggested fixes to the patches -mailing list, @code{gcc-patches@@gcc.gnu.org}. - -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 GCC 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 GCC - -If you need help installing, using or changing GCC, there are two -ways to find it: - -@itemize @bullet -@item -Send a message to a suitable network mailing list. First try -@code{gcc-bugs@@gcc.gnu.org} or @code{bug-gcc@@gnu.org}, and if that -brings no response, try @code{gcc@@gcc.gnu.org}. - -@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 -GCC distribution. -@end itemize - -@node Contributing -@chapter Contributing to GCC Development - -If you would like to help pretest GCC releases to assure they work -well, or if you would like to work on improving GCC, please contact -the maintainers at @code{gcc@@gcc.gnu.org}. 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{gcc@@gcc.gnu.org} before you start; the -maintainers may be able to suggest ways to make your extension fit in -better with the rest of GCC and with other development plans. - -@node VMS -@chapter Using GCC on VMS - -@c prevent bad page break with this line -Here is how to use GCC 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 - GCC. -* 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, GCC -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. GCC 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 GCC. VAX-C -treats this much like a standard @code{#include <foobar.h>} directive. -That is incompatible with the ANSI C behavior implemented by GCC: 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}. GCC 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. - -GCC for VMS is distributed with a set of include files that is -sufficient to compile most general purpose programs. Even though the -GCC 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 GCC 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 -GCC 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 -GCC 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 GCC did not provide this default. - -GCC 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 GCC, 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, GCC (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, GCC (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 GCC and Portability -@cindex portability -@cindex GCC and portability - -The main goal of GCC 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. - -GCC 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 -GCC 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 GCC Output -@cindex interfacing to GCC output -@cindex run-time conventions -@cindex function call conventions -@cindex conventions, run-time - -GCC 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 GCC, -and vice versa. This does not cause trouble often because few Unix -library routines return structures or unions. - -GCC 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. (GCC 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 GCC 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 GCC, 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, GCC 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 -GCC 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 GCC 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 GCC. - -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 GCC promises to do, -because it is very difficult to restore register variables correctly, and -one of GCC'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 GCC 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 GCC 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 GCC, 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 GCC. 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 register movement -@item -Register movement (@file{regmove.c}). This pass looks for cases where -matching constraints would force an instruction to need a reload, and -this reload would be a register to register move. It them attempts -to change the registers used by the instruction to avoid the move -instruction. - -The option @samp{-dN} causes a debugging dump of the RTL code after -this pass. This dump file's name is made by appending @samp{.regmove} -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 GCC 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. (GCC 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 GCC 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 GCC. 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 -GCC. 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 -GCC. 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 GCC displays file -names, the character you specify will be used. GCC 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, GCC 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, GCC 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 GCC, in order to take advantage of the -benefit of GCC's built-in @code{alloca}. - -@node Fragments -@chapter Makefile Fragments -@cindex makefile fragment - -When you configure GCC 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 GCC in different ways produces objects -that can not be linked together. For example, for some targets GCC -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 GCC 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}, GCC 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 Compiler Collection 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) @var{yyyy} @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) @var{yyyy} @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 GCC -@cindex contributors - -In addition to Richard Stallman, several people have written parts -of GCC. - -@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 GCC to VMS. - -@item -Alex Crain provided changes for the 3b1. - -@item -Greg Satz and Chris Hanson assisted in making GCC 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 GCC to the Mips cpu. - -@item -Devon Bowen, Dale Wiles and Kevin Zachmann ported GCC to the Tahoe. - -@item -Jonathan Stone wrote the machine description for the Pyramid computer. - -@item -Gary Miller ported GCC 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/contrib/gcc/gcov.texi b/contrib/gcc/gcov.texi deleted file mode 100644 index 9c6d77da7d4c..000000000000 --- a/contrib/gcc/gcov.texi +++ /dev/null @@ -1,344 +0,0 @@ -@c Copyright (C) 1996, 1997 Free Software Foundation, Inc. -@c This is part of the GCC manual. -@c For copying conditions, see the file gcc.texi. - -@node Gcov -@chapter @code{gcov}: a Test Coverage Program - -@code{gcov} is a tool you can use in conjunction with @sc{gnu} CC to -test code coverage in your programs. - -This chapter describes version 1.5 of @code{gcov}. - -@menu -* Gcov Intro:: Introduction to gcov. -* Invoking Gcov:: How to use gcov. -* Gcov and Optimization:: Using gcov with GCC optimization. -* Gcov Data Files:: The files used by gcov. -@end menu - -@node Gcov Intro -@section Introduction to @code{gcov} - -@code{gcov} is a test coverage program. Use it in concert with @sc{gnu} -CC to analyze your programs to help create more efficient, faster -running code. You can use @code{gcov} as a profiling tool to help -discover where your optimization efforts will best affect your code. You -can also use @code{gcov} along with the other profiling tool, -@code{gprof}, to assess which parts of your code use the greatest amount -of computing time. - -Profiling tools help you analyze your code's performance. Using a -profiler such as @code{gcov} or @code{gprof}, you can find out some -basic performance statistics, such as: - -@itemize @bullet -@item -how often each line of code executes - -@item -what lines of code are actually executed - -@item -how much computing time each section of code uses -@end itemize - -Once you know these things about how your code works when compiled, you -can look at each module to see which modules should be optimized. -@code{gcov} helps you determine where to work on optimization. - -Software developers also use coverage testing in concert with -testsuites, to make sure software is actually good enough for a release. -Testsuites can verify that a program works as expected; a coverage -program tests to see how much of the program is exercised by the -testsuite. Developers can then determine what kinds of test cases need -to be added to the testsuites to create both better testing and a better -final product. - -You should compile your code without optimization if you plan to use -@code{gcov} because the optimization, by combining some lines of code -into one function, may not give you as much information as you need to -look for `hot spots' where the code is using a great deal of computer -time. Likewise, because @code{gcov} accumulates statistics by line (at -the lowest resolution), it works best with a programming style that -places only one statement on each line. If you use complicated macros -that expand to loops or to other control structures, the statistics are -less helpful---they only report on the line where the macro call -appears. If your complex macros behave like functions, you can replace -them with inline functions to solve this problem. - -@code{gcov} creates a logfile called @file{@var{sourcefile}.gcov} which -indicates how many times each line of a source file @file{@var{sourcefile}.c} -has executed. You can use these logfiles along with @code{gprof} to aid -in fine-tuning the performance of your programs. @code{gprof} gives -timing information you can use along with the information you get from -@code{gcov}. - -@code{gcov} works only on code compiled with @sc{gnu} CC. It is not -compatible with any other profiling or test coverage mechanism. - -@node Invoking Gcov -@section Invoking gcov - -@smallexample -gcov [-b] [-v] [-n] [-l] [-f] [-o directory] @var{sourcefile} -@end smallexample - -@table @code -@item -b -Write branch frequencies to the output file, and write branch summary -info to the standard output. This option allows you to see how often -each branch in your program was taken. - -@item -v -Display the @code{gcov} version number (on the standard error stream). - -@item -n -Do not create the @code{gcov} output file. - -@item -l -Create long file names for included source files. For example, if the -header file @samp{x.h} contains code, and was included in the file -@samp{a.c}, then running @code{gcov} on the file @samp{a.c} will produce -an output file called @samp{a.c.x.h.gcov} instead of @samp{x.h.gcov}. -This can be useful if @samp{x.h} is included in multiple source files. - -@item -f -Output summaries for each function in addition to the file level summary. - -@item -o -The directory where the object files live. Gcov will search for @code{.bb}, -@code{.bbg}, and @code{.da} files in this directory. -@end table - -@need 3000 -When using @code{gcov}, you must first compile your program with two -special @sc{gnu} CC options: @samp{-fprofile-arcs -ftest-coverage}. -This tells the compiler to generate additional information needed by -gcov (basically a flow graph of the program) and also includes -additional code in the object files for generating the extra profiling -information needed by gcov. These additional files are placed in the -directory where the source code is located. - -Running the program will cause profile output to be generated. For each -source file compiled with -fprofile-arcs, an accompanying @code{.da} -file will be placed in the source directory. - -Running @code{gcov} with your program's source file names as arguments -will now produce a listing of the code along with frequency of execution -for each line. For example, if your program is called @samp{tmp.c}, this -is what you see when you use the basic @code{gcov} facility: - -@smallexample -$ gcc -fprofile-arcs -ftest-coverage tmp.c -$ a.out -$ gcov tmp.c - 87.50% of 8 source lines executed in file tmp.c -Creating tmp.c.gcov. -@end smallexample - -The file @file{tmp.c.gcov} contains output from @code{gcov}. -Here is a sample: - -@smallexample - main() - @{ - 1 int i, total; - - 1 total = 0; - - 11 for (i = 0; i < 10; i++) - 10 total += i; - - 1 if (total != 45) - ###### printf ("Failure\n"); - else - 1 printf ("Success\n"); - 1 @} -@end smallexample - -@need 450 -When you use the @samp{-b} option, your output looks like this: - -@smallexample -$ gcov -b tmp.c - 87.50% of 8 source lines executed in file tmp.c - 80.00% of 5 branches executed in file tmp.c - 80.00% of 5 branches taken at least once in file tmp.c - 50.00% of 2 calls executed in file tmp.c -Creating tmp.c.gcov. -@end smallexample - -Here is a sample of a resulting @file{tmp.c.gcov} file: - -@smallexample - main() - @{ - 1 int i, total; - - 1 total = 0; - - 11 for (i = 0; i < 10; i++) -branch 0 taken = 91% -branch 1 taken = 100% -branch 2 taken = 100% - 10 total += i; - - 1 if (total != 45) -branch 0 taken = 100% - ###### printf ("Failure\n"); -call 0 never executed -branch 1 never executed - else - 1 printf ("Success\n"); -call 0 returns = 100% - 1 @} -@end smallexample - -For each basic block, a line is printed after the last line of the basic -block describing the branch or call that ends the basic block. There can -be multiple branches and calls listed for a single source line if there -are multiple basic blocks that end on that line. In this case, the -branches and calls are each given a number. There is no simple way to map -these branches and calls back to source constructs. In general, though, -the lowest numbered branch or call will correspond to the leftmost construct -on the source line. - -For a branch, if it was executed at least once, then a percentage -indicating the number of times the branch was taken divided by the -number of times the branch was executed will be printed. Otherwise, the -message ``never executed'' is printed. - -For a call, if it was executed at least once, then a percentage -indicating the number of times the call returned divided by the number -of times the call was executed will be printed. This will usually be -100%, but may be less for functions call @code{exit} or @code{longjmp}, -and thus may not return everytime they are called. - -The execution counts are cumulative. If the example program were -executed again without removing the @code{.da} file, the count for the -number of times each line in the source was executed would be added to -the results of the previous run(s). This is potentially useful in -several ways. For example, it could be used to accumulate data over a -number of program runs as part of a test verification suite, or to -provide more accurate long-term information over a large number of -program runs. - -The data in the @code{.da} files is saved immediately before the program -exits. For each source file compiled with -fprofile-arcs, the profiling -code first attempts to read in an existing @code{.da} file; if the file -doesn't match the executable (differing number of basic block counts) it -will ignore the contents of the file. It then adds in the new execution -counts and finally writes the data to the file. - -@node Gcov and Optimization -@section Using @code{gcov} with GCC Optimization - -If you plan to use @code{gcov} to help optimize your code, you must -first compile your program with two special @sc{gnu} CC options: -@samp{-fprofile-arcs -ftest-coverage}. Aside from that, you can use any -other @sc{gnu} CC options; but if you want to prove that every single line -in your program was executed, you should not compile with optimization -at the same time. On some machines the optimizer can eliminate some -simple code lines by combining them with other lines. For example, code -like this: - -@smallexample -if (a != b) - c = 1; -else - c = 0; -@end smallexample - -@noindent -can be compiled into one instruction on some machines. In this case, -there is no way for @code{gcov} to calculate separate execution counts -for each line because there isn't separate code for each line. Hence -the @code{gcov} output looks like this if you compiled the program with -optimization: - -@smallexample - 100 if (a != b) - 100 c = 1; - 100 else - 100 c = 0; -@end smallexample - -The output shows that this block of code, combined by optimization, -executed 100 times. In one sense this result is correct, because there -was only one instruction representing all four of these lines. However, -the output does not indicate how many times the result was 0 and how -many times the result was 1. - -@node Gcov Data Files -@section Brief description of @code{gcov} data files - -@code{gcov} uses three files for doing profiling. The names of these -files are derived from the original @emph{source} file by substituting -the file suffix with either @code{.bb}, @code{.bbg}, or @code{.da}. All -of these files are placed in the same directory as the source file, and -contain data stored in a platform-independent method. - -The @code{.bb} and @code{.bbg} files are generated when the source file -is compiled with the @sc{gnu} CC @samp{-ftest-coverage} option. The -@code{.bb} file contains a list of source files (including headers), -functions within those files, and line numbers corresponding to each -basic block in the source file. - -The @code{.bb} file format consists of several lists of 4-byte integers -which correspond to the line numbers of each basic block in the -file. Each list is terminated by a line number of 0. A line number of -1 -is used to designate that the source file name (padded to a 4-byte -boundary and followed by another -1) follows. In addition, a line number -of -2 is used to designate that the name of a function (also padded to a -4-byte boundary and followed by a -2) follows. - -The @code{.bbg} file is used to reconstruct the program flow graph for -the source file. It contains a list of the program flow arcs (possible -branches taken from one basic block to another) for each function which, -in combination with the @code{.bb} file, enables gcov to reconstruct the -program flow. - -In the @code{.bbg} file, the format is: -@smallexample - number of basic blocks for function #0 (4-byte number) - total number of arcs for function #0 (4-byte number) - count of arcs in basic block #0 (4-byte number) - destination basic block of arc #0 (4-byte number) - flag bits (4-byte number) - destination basic block of arc #1 (4-byte number) - flag bits (4-byte number) - ... - destination basic block of arc #N (4-byte number) - flag bits (4-byte number) - count of arcs in basic block #1 (4-byte number) - destination basic block of arc #0 (4-byte number) - flag bits (4-byte number) - ... -@end smallexample - -A -1 (stored as a 4-byte number) is used to separate each function's -list of basic blocks, and to verify that the file has been read -correctly. - -The @code{.da} file is generated when a program containing object files -built with the @sc{gnu} CC @samp{-fprofile-arcs} option is executed. A -separate @code{.da} file is created for each source file compiled with -this option, and the name of the @code{.da} file is stored as an -absolute pathname in the resulting object file. This path name is -derived from the source file name by substituting a @code{.da} suffix. - -The format of the @code{.da} file is fairly simple. The first 8-byte -number is the number of counts in the file, followed by the counts -(stored as 8-byte numbers). Each count corresponds to the number of -times each arc in the program is executed. The counts are cumulative; -each time the program is executed, it attemps to combine the existing -@code{.da} files with the new counts for this invocation of the -program. It ignores the contents of any @code{.da} files whose number of -arcs doesn't correspond to the current program, and merely overwrites -them instead. - -All three of these files use the functions in @code{gcov-io.h} to store -integers; the functions in this header provide a machine-independent -mechanism for storing and retrieving data from a stream. - diff --git a/contrib/gcc/ginclude/math-3300.h b/contrib/gcc/ginclude/math-3300.h deleted file mode 100644 index 5d7ba28f67f6..000000000000 --- a/contrib/gcc/ginclude/math-3300.h +++ /dev/null @@ -1,461 +0,0 @@ -/******************************************************************\ -* * -* <math-68881.h> last modified: 18 May 1989. * -* * -* Copyright (C) 1989 by Matthew Self. * -* You may freely distribute verbatim copies of this software * -* provided that this copyright notice is retained in all copies. * -* You may distribute modifications to this software under the * -* conditions above if you also clearly note such modifications * -* with their author and date. * -* * -* Note: errno is not set to EDOM when domain errors occur for * -* most of these functions. Rather, it is assumed that the * -* 68881's OPERR exception will be enabled and handled * -* appropriately by the operating system. Similarly, overflow * -* and underflow do not set errno to ERANGE. * -* * -* Send bugs to Matthew Self (self@bayes.arc.nasa.gov). * -* * -\******************************************************************/ - -#include <errno.h> - -#undef HUGE_VAL -#define HUGE_VAL \ -({ \ - double huge_val; \ - \ - __asm ("fmove%.d %#0x7ff0000000000000,%0" /* Infinity */ \ - : "=f" (huge_val) \ - : /* no inputs */); \ - huge_val; \ -}) - -__inline static const double sin (double x) -{ - double value; - - __asm ("fsin%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double cos (double x) -{ - double value; - - __asm ("fcos%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double tan (double x) -{ - double value; - - __asm ("ftan%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double asin (double x) -{ - double value; - - __asm ("fasin%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double acos (double x) -{ - double value; - - __asm ("facos%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double atan (double x) -{ - double value; - - __asm ("fatan%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double atan2 (double y, double x) -{ - double pi, pi_over_2; - - __asm ("fmovecr%.x %#0,%0" /* extended precision pi */ - : "=f" (pi) - : /* no inputs */ ); - __asm ("fscale%.b %#-1,%0" /* no loss of accuracy */ - : "=f" (pi_over_2) - : "0" (pi)); - if (x > 0) - { - if (y > 0) - { - if (x > y) - return atan (y / x); - else - return pi_over_2 - atan (x / y); - } - else - { - if (x > -y) - return atan (y / x); - else - return - pi_over_2 - atan (x / y); - } - } - else - { - if (y > 0) - { - if (-x > y) - return pi + atan (y / x); - else - return pi_over_2 - atan (x / y); - } - else - { - if (-x > -y) - return - pi + atan (y / x); - else if (y < 0) - return - pi_over_2 - atan (x / y); - else - { - double value; - - errno = EDOM; - __asm ("fmove%.d %#0x7fffffffffffffff,%0" /* quiet NaN */ - : "=f" (value) - : /* no inputs */); - return value; - } - } - } -} - -__inline static const double sinh (double x) -{ - double value; - - __asm ("fsinh%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double cosh (double x) -{ - double value; - - __asm ("fcosh%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double tanh (double x) -{ - double value; - - __asm ("ftanh%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double atanh (double x) -{ - double value; - - __asm ("fatanh%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double exp (double x) -{ - double value; - - __asm ("fetox%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double expm1 (double x) -{ - double value; - - __asm ("fetoxm1%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double log (double x) -{ - double value; - - __asm ("flogn%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double log1p (double x) -{ - double value; - - __asm ("flognp1%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double log10 (double x) -{ - double value; - - __asm ("flog10%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double sqrt (double x) -{ - double value; - - __asm ("fsqrt%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double pow (const double x, const double y) -{ - if (x > 0) - return exp (y * log (x)); - else if (x == 0) - { - if (y > 0) - return 0.0; - else - { - double value; - - errno = EDOM; - __asm ("fmove%.d %#0x7fffffffffffffff,%0" /* quiet NaN */ - : "=f" (value) - : /* no inputs */); - return value; - } - } - else - { - double temp; - - __asm ("fintrz%.x %1,%0" - : "=f" (temp) /* integer-valued float */ - : "f" (y)); - if (y == temp) - { - int i = (int) y; - - if ((i & 1) == 0) /* even */ - return exp (y * log (x)); - else - return - exp (y * log (x)); - } - else - { - double value; - - errno = EDOM; - __asm ("fmove%.d %#0x7fffffffffffffff,%0" /* quiet NaN */ - : "=f" (value) - : /* no inputs */); - return value; - } - } -} - -__inline static const double fabs (double x) -{ - double value; - - __asm ("fabs%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline static const double ceil (double x) -{ - int rounding_mode, round_up; - double value; - - __asm volatile ("fmove%.l %%fpcr,%0" - : "=dm" (rounding_mode) - : /* no inputs */ ); - round_up = rounding_mode | 0x30; - __asm volatile ("fmove%.l %0,%%fpcr" - : /* no outputs */ - : "dmi" (round_up)); - __asm volatile ("fint%.x %1,%0" - : "=f" (value) - : "f" (x)); - __asm volatile ("fmove%.l %0,%%fpcr" - : /* no outputs */ - : "dmi" (rounding_mode)); - return value; -} - -__inline static const double floor (double x) -{ - int rounding_mode, round_down; - double value; - - __asm volatile ("fmove%.l %%fpcr,%0" - : "=dm" (rounding_mode) - : /* no inputs */ ); - round_down = (rounding_mode & ~0x10) - | 0x20; - __asm volatile ("fmove%.l %0,%%fpcr" - : /* no outputs */ - : "dmi" (round_down)); - __asm volatile ("fint%.x %1,%0" - : "=f" (value) - : "f" (x)); - __asm volatile ("fmove%.l %0,%%fpcr" - : /* no outputs */ - : "dmi" (rounding_mode)); - return value; -} - -__inline static const double rint (double x) -{ - int rounding_mode, round_nearest; - double value; - - __asm volatile ("fmove%.l %%fpcr,%0" - : "=dm" (rounding_mode) - : /* no inputs */ ); - round_nearest = rounding_mode & ~0x30; - __asm volatile ("fmove%.l %0,%%fpcr" - : /* no outputs */ - : "dmi" (round_nearest)); - __asm volatile ("fint%.x %1,%0" - : "=f" (value) - : "f" (x)); - __asm volatile ("fmove%.l %0,%%fpcr" - : /* no outputs */ - : "dmi" (rounding_mode)); - return value; -} - -__inline static const double fmod (double x, double y) -{ - double value; - - __asm ("fmod%.x %2,%0" - : "=f" (value) - : "0" (x), - "f" (y)); - return value; -} - -__inline static const double drem (double x, double y) -{ - double value; - - __asm ("frem%.x %2,%0" - : "=f" (value) - : "0" (x), - "f" (y)); - return value; -} - -__inline static const double scalb (double x, int n) -{ - double value; - - __asm ("fscale%.l %2,%0" - : "=f" (value) - : "0" (x), - "dmi" (n)); - return value; -} - -__inline static double logb (double x) -{ - double exponent; - - __asm ("fgetexp%.x %1,%0" - : "=f" (exponent) - : "f" (x)); - return exponent; -} - -__inline static const double ldexp (double x, int n) -{ - double value; - - __asm ("fscale%.l %2,%0" - : "=f" (value) - : "0" (x), - "dmi" (n)); - return value; -} - -__inline static double frexp (double x, int *exp) -{ - double float_exponent; - int int_exponent; - double mantissa; - - __asm ("fgetexp%.x %1,%0" - : "=f" (float_exponent) /* integer-valued float */ - : "f" (x)); - int_exponent = (int) float_exponent; - __asm ("fgetman%.x %1,%0" - : "=f" (mantissa) /* 1.0 <= mantissa < 2.0 */ - : "f" (x)); - if (mantissa != 0) - { - __asm ("fscale%.b %#-1,%0" - : "=f" (mantissa) /* mantissa /= 2.0 */ - : "0" (mantissa)); - int_exponent += 1; - } - *exp = int_exponent; - return mantissa; -} - -__inline static double modf (double x, double *ip) -{ - double temp; - - __asm ("fintrz%.x %1,%0" - : "=f" (temp) /* integer-valued float */ - : "f" (x)); - *ip = temp; - return x - temp; -} - diff --git a/contrib/gcc/ginclude/math-68881.h b/contrib/gcc/ginclude/math-68881.h deleted file mode 100644 index 7b91bc56a5db..000000000000 --- a/contrib/gcc/ginclude/math-68881.h +++ /dev/null @@ -1,529 +0,0 @@ -/******************************************************************\ -* * -* <math-68881.h> last modified: 23 May 1992. * -* * -* Copyright (C) 1989 by Matthew Self. * -* You may freely distribute verbatim copies of this software * -* provided that this copyright notice is retained in all copies. * -* You may distribute modifications to this software under the * -* conditions above if you also clearly note such modifications * -* with their author and date. * -* * -* Note: errno is not set to EDOM when domain errors occur for * -* most of these functions. Rather, it is assumed that the * -* 68881's OPERR exception will be enabled and handled * -* appropriately by the operating system. Similarly, overflow * -* and underflow do not set errno to ERANGE. * -* * -* Send bugs to Matthew Self (self@bayes.arc.nasa.gov). * -* * -\******************************************************************/ - -/* This file is NOT a part of GCC, just distributed with it. */ - -/* If you find this in GCC, - please send bug reports to bug-gcc@prep.ai.mit.edu. */ - -/* Changed by Richard Stallman: - May 1993, add conditional to prevent multiple inclusion. - % inserted before a #. - New function `hypot' added. - Nans written in hex to avoid 0rnan. - May 1992, use %! for fpcr register. Break lines before function names. - December 1989, add parens around `&' in pow. - November 1990, added alternate definition of HUGE_VAL for Sun. */ - -/* Changed by Jim Wilson: - September 1993, Use #undef before HUGE_VAL instead of #ifdef/#endif. */ - -/* Changed by Ian Lance Taylor: - September 1994, use extern inline instead of static inline. */ - -#ifndef __math_68881 -#define __math_68881 - -#include <errno.h> - -#undef HUGE_VAL -#ifdef __sun__ -/* The Sun assembler fails to handle the hex constant in the usual defn. */ -#define HUGE_VAL \ -({ \ - static union { int i[2]; double d; } u = { {0x7ff00000, 0} }; \ - u.d; \ -}) -#else -#define HUGE_VAL \ -({ \ - double huge_val; \ - \ - __asm ("fmove%.d %#0x7ff0000000000000,%0" /* Infinity */ \ - : "=f" (huge_val) \ - : /* no inputs */); \ - huge_val; \ -}) -#endif - -__inline extern double -sin (double x) -{ - double value; - - __asm ("fsin%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -cos (double x) -{ - double value; - - __asm ("fcos%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -tan (double x) -{ - double value; - - __asm ("ftan%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -asin (double x) -{ - double value; - - __asm ("fasin%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -acos (double x) -{ - double value; - - __asm ("facos%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -atan (double x) -{ - double value; - - __asm ("fatan%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -atan2 (double y, double x) -{ - double pi, pi_over_2; - - __asm ("fmovecr%.x %#0,%0" /* extended precision pi */ - : "=f" (pi) - : /* no inputs */ ); - __asm ("fscale%.b %#-1,%0" /* no loss of accuracy */ - : "=f" (pi_over_2) - : "0" (pi)); - if (x > 0) - { - if (y > 0) - { - if (x > y) - return atan (y / x); - else - return pi_over_2 - atan (x / y); - } - else - { - if (x > -y) - return atan (y / x); - else - return - pi_over_2 - atan (x / y); - } - } - else - { - if (y < 0) - { - if (-x > -y) - return - pi + atan (y / x); - else - return - pi_over_2 - atan (x / y); - } - else - { - if (-x > y) - return pi + atan (y / x); - else if (y > 0) - return pi_over_2 - atan (x / y); - else - { - double value; - - errno = EDOM; - __asm ("fmove%.d %#0x7fffffffffffffff,%0" /* quiet NaN */ - : "=f" (value) - : /* no inputs */); - return value; - } - } - } -} - -__inline extern double -sinh (double x) -{ - double value; - - __asm ("fsinh%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -cosh (double x) -{ - double value; - - __asm ("fcosh%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -tanh (double x) -{ - double value; - - __asm ("ftanh%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -atanh (double x) -{ - double value; - - __asm ("fatanh%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -exp (double x) -{ - double value; - - __asm ("fetox%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -expm1 (double x) -{ - double value; - - __asm ("fetoxm1%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -log (double x) -{ - double value; - - __asm ("flogn%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -log1p (double x) -{ - double value; - - __asm ("flognp1%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -log10 (double x) -{ - double value; - - __asm ("flog10%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -sqrt (double x) -{ - double value; - - __asm ("fsqrt%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -hypot (double x, double y) -{ - return sqrt (x*x + y*y); -} - -__inline extern double -pow (double x, double y) -{ - if (x > 0) - return exp (y * log (x)); - else if (x == 0) - { - if (y > 0) - return 0.0; - else - { - double value; - - errno = EDOM; - __asm ("fmove%.d %#0x7fffffffffffffff,%0" /* quiet NaN */ - : "=f" (value) - : /* no inputs */); - return value; - } - } - else - { - double temp; - - __asm ("fintrz%.x %1,%0" - : "=f" (temp) /* integer-valued float */ - : "f" (y)); - if (y == temp) - { - int i = (int) y; - - if ((i & 1) == 0) /* even */ - return exp (y * log (-x)); - else - return - exp (y * log (-x)); - } - else - { - double value; - - errno = EDOM; - __asm ("fmove%.d %#0x7fffffffffffffff,%0" /* quiet NaN */ - : "=f" (value) - : /* no inputs */); - return value; - } - } -} - -__inline extern double -fabs (double x) -{ - double value; - - __asm ("fabs%.x %1,%0" - : "=f" (value) - : "f" (x)); - return value; -} - -__inline extern double -ceil (double x) -{ - int rounding_mode, round_up; - double value; - - __asm volatile ("fmove%.l %!,%0" - : "=dm" (rounding_mode) - : /* no inputs */ ); - round_up = rounding_mode | 0x30; - __asm volatile ("fmove%.l %0,%!" - : /* no outputs */ - : "dmi" (round_up)); - __asm volatile ("fint%.x %1,%0" - : "=f" (value) - : "f" (x)); - __asm volatile ("fmove%.l %0,%!" - : /* no outputs */ - : "dmi" (rounding_mode)); - return value; -} - -__inline extern double -floor (double x) -{ - int rounding_mode, round_down; - double value; - - __asm volatile ("fmove%.l %!,%0" - : "=dm" (rounding_mode) - : /* no inputs */ ); - round_down = (rounding_mode & ~0x10) - | 0x20; - __asm volatile ("fmove%.l %0,%!" - : /* no outputs */ - : "dmi" (round_down)); - __asm volatile ("fint%.x %1,%0" - : "=f" (value) - : "f" (x)); - __asm volatile ("fmove%.l %0,%!" - : /* no outputs */ - : "dmi" (rounding_mode)); - return value; -} - -__inline extern double -rint (double x) -{ - int rounding_mode, round_nearest; - double value; - - __asm volatile ("fmove%.l %!,%0" - : "=dm" (rounding_mode) - : /* no inputs */ ); - round_nearest = rounding_mode & ~0x30; - __asm volatile ("fmove%.l %0,%!" - : /* no outputs */ - : "dmi" (round_nearest)); - __asm volatile ("fint%.x %1,%0" - : "=f" (value) - : "f" (x)); - __asm volatile ("fmove%.l %0,%!" - : /* no outputs */ - : "dmi" (rounding_mode)); - return value; -} - -__inline extern double -fmod (double x, double y) -{ - double value; - - __asm ("fmod%.x %2,%0" - : "=f" (value) - : "0" (x), - "f" (y)); - return value; -} - -__inline extern double -drem (double x, double y) -{ - double value; - - __asm ("frem%.x %2,%0" - : "=f" (value) - : "0" (x), - "f" (y)); - return value; -} - -__inline extern double -scalb (double x, int n) -{ - double value; - - __asm ("fscale%.l %2,%0" - : "=f" (value) - : "0" (x), - "dmi" (n)); - return value; -} - -__inline extern double -logb (double x) -{ - double exponent; - - __asm ("fgetexp%.x %1,%0" - : "=f" (exponent) - : "f" (x)); - return exponent; -} - -__inline extern double -ldexp (double x, int n) -{ - double value; - - __asm ("fscale%.l %2,%0" - : "=f" (value) - : "0" (x), - "dmi" (n)); - return value; -} - -__inline extern double -frexp (double x, int *exp) -{ - double float_exponent; - int int_exponent; - double mantissa; - - __asm ("fgetexp%.x %1,%0" - : "=f" (float_exponent) /* integer-valued float */ - : "f" (x)); - int_exponent = (int) float_exponent; - __asm ("fgetman%.x %1,%0" - : "=f" (mantissa) /* 1.0 <= mantissa < 2.0 */ - : "f" (x)); - if (mantissa != 0) - { - __asm ("fscale%.b %#-1,%0" - : "=f" (mantissa) /* mantissa /= 2.0 */ - : "0" (mantissa)); - int_exponent += 1; - } - *exp = int_exponent; - return mantissa; -} - -__inline extern double -modf (double x, double *ip) -{ - double temp; - - __asm ("fintrz%.x %1,%0" - : "=f" (temp) /* integer-valued float */ - : "f" (x)); - *ip = temp; - return x - temp; -} - -#endif /* not __math_68881 */ diff --git a/contrib/gcc/ginclude/ppc-asm.h b/contrib/gcc/ginclude/ppc-asm.h deleted file mode 100644 index 4512d94352a3..000000000000 --- a/contrib/gcc/ginclude/ppc-asm.h +++ /dev/null @@ -1,170 +0,0 @@ -/* PowerPC asm definitions for GNU C. */ -/* Under winnt, 1) gas supports the following as names and 2) in particular - defining "toc" breaks the FUNC_START macro as ".toc" becomes ".2" */ - -#if !defined(__WINNT__) -#define r0 0 -#define sp 1 -#define toc 2 -#define r3 3 -#define r4 4 -#define r5 5 -#define r6 6 -#define r7 7 -#define r8 8 -#define r9 9 -#define r10 10 -#define r11 11 -#define r12 12 -#define r13 13 -#define r14 14 -#define r15 15 -#define r16 16 -#define r17 17 -#define r18 18 -#define r19 19 -#define r20 20 -#define r21 21 -#define r22 22 -#define r23 23 -#define r24 24 -#define r25 25 -#define r26 26 -#define r27 27 -#define r28 28 -#define r29 29 -#define r30 30 -#define r31 31 - -#define cr0 0 -#define cr1 1 -#define cr2 2 -#define cr3 3 -#define cr4 4 -#define cr5 5 -#define cr6 6 -#define cr7 7 - -#define f0 0 -#define f1 1 -#define f2 2 -#define f3 3 -#define f4 4 -#define f5 5 -#define f6 6 -#define f7 7 -#define f8 8 -#define f9 9 -#define f10 10 -#define f11 11 -#define f12 12 -#define f13 13 -#define f14 14 -#define f15 15 -#define f16 16 -#define f17 17 -#define f18 18 -#define f19 19 -#define f20 20 -#define f21 21 -#define f22 22 -#define f23 23 -#define f24 24 -#define f25 25 -#define f26 26 -#define f27 27 -#define f28 28 -#define f29 29 -#define f30 30 -#define f31 31 -#endif - -/* - * Macros to glue together two tokens. - */ - -#ifdef __STDC__ -#define XGLUE(a,b) a##b -#else -#define XGLUE(a,b) a/**/b -#endif - -#define GLUE(a,b) XGLUE(a,b) - -/* - * Macros to begin and end a function written in assembler. If -mcall-aixdesc - * or -mcall-nt, create a function descriptor with the given name, and create - * the real function with one or two leading periods respectively. - */ - -#ifdef _RELOCATABLE -#define DESC_SECTION ".got2" -#else -#define DESC_SECTION ".got1" -#endif - -#if defined(_CALL_AIXDESC) -#define FUNC_NAME(name) GLUE(.,name) -#define FUNC_START(name) \ - .section DESC_SECTION,"aw"; \ -name: \ - .long GLUE(.,name); \ - .long _GLOBAL_OFFSET_TABLE_; \ - .long 0; \ - .previous; \ - .type GLUE(.,name),@function; \ - .globl name; \ - .globl GLUE(.,name); \ -GLUE(.,name): - -#define FUNC_END(name) \ -GLUE(.L,name): \ - .size GLUE(.,name),GLUE(.L,name)-GLUE(.,name) - -#elif defined(__WINNT__) -#define FUNC_NAME(name) GLUE(..,name) -#define FUNC_START(name) \ - .pdata; \ - .align 2; \ - .ualong GLUE(..,name),GLUE(name,.e),0,0,GLUE(..,name); \ - .reldata; \ -name: \ - .ualong GLUE(..,name),.toc; \ - .section .text; \ - .globl name; \ - .globl GLUE(..,name); \ -GLUE(..,name): - -#define FUNC_END(name) \ -GLUE(name,.e): ; \ -GLUE(FE_MOT_RESVD..,name): - -#elif defined(_CALL_NT) -#define FUNC_NAME(name) GLUE(..,name) -#define FUNC_START(name) \ - .section DESC_SECTION,"aw"; \ -name: \ - .long GLUE(..,name); \ - .long _GLOBAL_OFFSET_TABLE_; \ - .previous; \ - .type GLUE(..,name),@function; \ - .globl name; \ - .globl GLUE(..,name); \ -GLUE(..,name): - -#define FUNC_END(name) \ -GLUE(.L,name): \ - .size GLUE(..,name),GLUE(.L,name)-GLUE(..,name) - -#else -#define FUNC_NAME(name) name -#define FUNC_START(name) \ - .type name,@function; \ - .globl name; \ -name: - -#define FUNC_END(name) \ -GLUE(.L,name): \ - .size name,GLUE(.L,name)-name -#endif - diff --git a/contrib/gcc/ginclude/proto.h b/contrib/gcc/ginclude/proto.h deleted file mode 100644 index cc48915d8421..000000000000 --- a/contrib/gcc/ginclude/proto.h +++ /dev/null @@ -1,4 +0,0 @@ -/* This header file is to avoid trouble with semi-ANSI header files - on the Convex in system version 8.0. */ - -#define _PROTO(list) () diff --git a/contrib/gcc/ginclude/va-alpha.h b/contrib/gcc/ginclude/va-alpha.h deleted file mode 100644 index 2528a712ada2..000000000000 --- a/contrib/gcc/ginclude/va-alpha.h +++ /dev/null @@ -1,128 +0,0 @@ -/* GNU C varargs and stdargs support for the DEC Alpha. */ - -/* Note: We must use the name __builtin_savregs. GCC attaches special - significance to that name. In particular, regardless of where in a - function __builtin_saveregs is called, GCC moves the call up to the - very start of the function. */ - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST - -/* In VMS, __gnuc_va_list is simply char *; on OSF, it's a structure. */ - -#ifdef __VMS__ -typedef char *__gnuc_va_list; -#else - -typedef struct { - char *__base; /* Pointer to first integer register. */ - int __offset; /* Byte offset of args so far. */ -} __gnuc_va_list; -#endif - -#endif /* __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ - -#if !defined(__GNUC_VA_LIST_1) && (defined (_STDARG_H) || defined (_VARARGS_H)) -#define __GNUC_VA_LIST_1 - -#define _VA_LIST -#define _VA_LIST_ - -typedef __gnuc_va_list va_list; - -#if !defined(_STDARG_H) - -/* varargs support */ -#define va_alist __builtin_va_alist -#define va_dcl int __builtin_va_alist;... -#ifdef __VMS__ -#define va_start(pvar) ((pvar) = __builtin_saveregs ()) -#else -#define va_start(pvar) ((pvar) = * (__gnuc_va_list *) __builtin_saveregs ()) -#endif - -#else /* STDARG.H */ - -/* ANSI alternative. */ - -/* Call __builtin_next_arg even though we aren't using its value, so that - we can verify that firstarg is correct. */ - -#ifdef __VMS__ -#define va_start(pvar, firstarg) \ - (__builtin_next_arg (firstarg), \ - (pvar) = __builtin_saveregs ()) -#else -#define va_start(pvar, firstarg) \ - (__builtin_next_arg (firstarg), \ - (pvar) = *(__gnuc_va_list *) __builtin_saveregs ()) -#endif - -#endif /* _STDARG_H */ - -#define va_end(__va) ((void) 0) - -/* Values returned by __builtin_classify_type. */ - -enum { - __no_type_class = -1, - __void_type_class, - __integer_type_class, - __char_type_class, - __enumeral_type_class, - __boolean_type_class, - __pointer_type_class, - __reference_type_class, - __offset_type_class, - __real_type_class, - __complex_type_class, - __function_type_class, - __method_type_class, - __record_type_class, - __union_type_class, - __array_type_class, - __string_type_class, - __set_type_class, - __file_type_class, - __lang_type_class -}; - -/* Note that parameters are always aligned at least to a word boundary - (when passed) regardless of what GCC's __alignof__ operator says. */ - -/* Avoid errors if compiling GCC v2 with GCC v1. */ -#if __GNUC__ == 1 -#define __extension__ -#endif - -/* Get the size of a type in bytes, rounded up to an integral number - of words. */ - -#define __va_tsize(__type) \ - (((sizeof (__type) + __extension__ sizeof (long long) - 1) \ - / __extension__ sizeof (long long)) * __extension__ sizeof (long long)) - -#ifdef __VMS__ -#define va_arg(__va, __type) \ -(*(((__va) += __va_tsize (__type)), \ - (__type *)(void *)((__va) - __va_tsize (__type)))) - -#else - -#define va_arg(__va, __type) \ -(*(((__va).__offset += __va_tsize (__type)), \ - (__type *)(void *)((__va).__base + (__va).__offset \ - - (((__builtin_classify_type (* (__type *) 0) \ - == __real_type_class) && (__va).__offset <= (6 * 8)) \ - ? (6 * 8) + 8 : __va_tsize (__type))))) -#endif - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) - -#endif /* __GNUC_VA_LIST_1 */ diff --git a/contrib/gcc/ginclude/va-arc.h b/contrib/gcc/ginclude/va-arc.h deleted file mode 100644 index a718ad6245d6..000000000000 --- a/contrib/gcc/ginclude/va-arc.h +++ /dev/null @@ -1,111 +0,0 @@ -/* stdarg/varargs support for the ARC */ - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -typedef void * __gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -/* In GCC version 2, we want an ellipsis at the end of the declaration - of the argument list. GCC version 1 can't parse it. */ - -#if __GNUC__ > 1 -#define __va_ellipsis ... -#else -#define __va_ellipsis -#endif - -/* See arc_setup_incoming_varargs for reasons for the oddity in va_start. */ -#ifdef _STDARG_H -#define va_start(AP, LASTARG) \ -(AP = (__gnuc_va_list) ((int *) __builtin_next_arg (LASTARG) \ - + (__builtin_args_info (0) < 8 \ - ? (__builtin_args_info (0) & 1) \ - : 0))) -#else -#define va_alist __builtin_va_alist -#define va_dcl int __builtin_va_alist; __va_ellipsis -#define va_start(AP) \ -(AP = (__gnuc_va_list) ((int *) &__builtin_va_alist \ - + (__builtin_args_info (0) < 8 \ - ? (__builtin_args_info (0) & 1) \ - : 0))) -#endif - -#ifndef va_end -void va_end (__gnuc_va_list); /* Defined in libgcc.a */ - -/* Values returned by __builtin_classify_type. */ - -enum __va_type_classes { - __no_type_class = -1, - __void_type_class, - __integer_type_class, - __char_type_class, - __enumeral_type_class, - __boolean_type_class, - __pointer_type_class, - __reference_type_class, - __offset_type_class, - __real_type_class, - __complex_type_class, - __function_type_class, - __method_type_class, - __record_type_class, - __union_type_class, - __array_type_class, - __string_type_class, - __set_type_class, - __file_type_class, - __lang_type_class -}; - -#endif -#define va_end(AP) ((void)0) - -/* Avoid errors if compiling GCC v2 with GCC v1. */ -#if __GNUC__ == 1 -#define __extension__ -#endif - -/* All aggregates are passed by reference. All scalar types larger than 8 - bytes are passed by reference. */ -/* We cast to void * and then to TYPE * because this avoids - a warning about increasing the alignment requirement. - The casts to char * avoid warnings about invalid pointer arithmetic. */ - -#define __va_rounded_size(TYPE) \ - (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) - -#ifdef __big_endian__ -#define va_arg(AP,TYPE) \ -__extension__ \ -(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \ - || __va_rounded_size (TYPE) > 8) \ - ? ((AP) = (char *)(AP) + __va_rounded_size (TYPE *), \ - *(TYPE **) (void *) ((char *)(AP) - __va_rounded_size (TYPE *))) \ - : ((TYPE *) (void *) \ - (AP = (void *) ((__alignof__ (TYPE) > 4 \ - ? ((int) AP + 8 - 1) & -8 \ - : (int) AP) \ - + __va_rounded_size (TYPE))) - 1));})) -#else -#define va_arg(AP,TYPE) \ -__extension__ \ -(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \ - || __va_rounded_size (TYPE) > 8) \ - ? ((AP) = (char *)(AP) + __va_rounded_size (TYPE *), \ - *(TYPE **) (void *) ((char *)(AP) - __va_rounded_size (TYPE *))) \ - : ((AP = (void *) ((__alignof__ (TYPE) > 4 \ - ? ((int) AP + 8 - 1) & -8 \ - : (int) AP) \ - + __va_rounded_size (TYPE))), \ - (TYPE *) (void *) (AP - __va_rounded_size (TYPE))));})) -#endif - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-c4x.h b/contrib/gcc/ginclude/va-c4x.h deleted file mode 100644 index c73c6d592bdc..000000000000 --- a/contrib/gcc/ginclude/va-c4x.h +++ /dev/null @@ -1,34 +0,0 @@ -/* GNU C varargs support for the TMS320C[34]x */ - -/* C[34]x arguments grow in weird ways (downwards) that the standard - varargs stuff can't handle. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST - -typedef void *__gnuc_va_list; - -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -#ifdef _STDARG_H /* stdarg.h support */ - -#define va_start(AP,LASTARG) AP=(__gnuc_va_list) __builtin_next_arg (LASTARG) - -#else /* varargs.h support */ - -#define __va_ellipsis ... -#define va_alist __builtin_va_alist -#define va_dcl int __builtin_va_alist; __va_ellipsis -#define va_start(AP) AP=(__gnuc_va_list) ((int *)&__builtin_va_alist + 1) - -#endif /* _STDARG_H */ - -#define va_end(AP) ((void) 0) -#define va_arg(AP,TYPE) (AP = (__gnuc_va_list) ((char *) (AP) - sizeof(TYPE)), \ - *((TYPE *) ((char *) (AP)))) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-clipper.h b/contrib/gcc/ginclude/va-clipper.h deleted file mode 100644 index 213afca93f02..000000000000 --- a/contrib/gcc/ginclude/va-clipper.h +++ /dev/null @@ -1,60 +0,0 @@ -/* GNU C varargs and stdargs support for Clipper. */ - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST - -typedef struct -{ - int __va_ap; /* pointer to stack args */ - void *__va_reg[4]; /* pointer to r0,f0,r1,f1 */ - int __va_num; /* number of args processed */ -} __gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ - - -#if defined (_STDARG_H) || defined (_VARARGS_H) -typedef __gnuc_va_list va_list; -#define __va_list __gnuc_va_list /* acc compatibility */ - -#define _VA_LIST -#define _VA_LIST_ -#define _SYS_INT_STDARG_H /* acc compatibility */ - -/* Call __builtin_next_arg even though we aren't using its value, so that - we can verify that LASTARG is correct. */ -#ifdef _STDARG_H -#define va_start(AP,LASTARG) \ - (__builtin_next_arg (LASTARG), \ - (AP) = *(va_list *)__builtin_saveregs(), \ - (AP).__va_num = __builtin_args_info (0), \ - (AP).__va_ap += __builtin_args_info (1)) -#else -#define va_alist __builtin_va_alist -/* The ... causes current_function_varargs to be set in cc1. */ -#define va_dcl va_list __builtin_va_alist; ... -#define va_start(AP) \ - ((AP) = *(va_list *)__builtin_saveregs(), \ - (AP).__va_num = __builtin_args_info (0)) -#endif /* _STDARG_H */ - -/* round to alignment of `type' but keep a least integer alignment */ -#define __va_round(AP,TYPE) \ - ((AP).__va_ap = ((AP).__va_ap + __alignof__ (TYPE) - 1 ) & \ - ~(__alignof__ (TYPE) - 1), \ - ((AP).__va_ap = ((AP).__va_ap + sizeof (int) - 1) & ~(sizeof (int) - 1))) - -#define va_arg(AP, TYPE) \ - (*((AP).__va_num < 2 && __builtin_classify_type (* (TYPE *)0) < 12 \ - ? (__builtin_classify_type (* (TYPE *)0) == 8 \ - ? ((TYPE *)(AP).__va_reg[2 * (AP).__va_num++ + 1]) \ - : ((TYPE *)(AP).__va_reg[2 * (AP).__va_num++ ])) \ - : ((AP).__va_num++, __va_round (AP,TYPE), ((TYPE *)((AP).__va_ap))++))) - -#define va_end(AP) ((void) 0) - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-h8300.h b/contrib/gcc/ginclude/va-h8300.h deleted file mode 100644 index 9565696e9ad6..000000000000 --- a/contrib/gcc/ginclude/va-h8300.h +++ /dev/null @@ -1,56 +0,0 @@ -/* stdarg/vararg support for the Hitachi h8/300 and h8/300h */ - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -typedef void *__gnuc_va_list; -#endif - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -/* In GCC version 2, we want an ellipsis at the end of the declaration - of the argument list. GCC version 1 can't parse it. */ - -#if __GNUC__ > 1 -#define __va_ellipsis ... -#else -#define __va_ellipsis -#endif - -#ifdef __H8300__ -#define __va_rounded_size(TYPE) \ - (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) -#else -#define __va_rounded_size(TYPE) \ - (((sizeof (TYPE) + sizeof (long) - 1) / sizeof (long)) * sizeof (long)) -#endif - -#ifdef _STDARG_H - -#define va_start(AP,LASTARG) \ - (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) - -#else /* _VARARGS_H */ - -#define va_alist __builtin_va_alist -/* The ... causes current_function_varargs to be set in cc1. */ -#define va_dcl int __builtin_va_alist; __va_ellipsis -#define va_start(AP) AP = (void *) &__builtin_va_alist - -#endif /* _VARARGS_H */ - -#define va_arg(AP, TYPE) \ - (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ - *((TYPE *) (void *) ((char *) (AP) \ - - ((sizeof (TYPE) < __va_rounded_size (int) \ - ? sizeof (TYPE) : __va_rounded_size (TYPE)))))) - -#define va_end(AP) ((void) 0) - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-i860.h b/contrib/gcc/ginclude/va-i860.h deleted file mode 100644 index 56d2c7fe1d3b..000000000000 --- a/contrib/gcc/ginclude/va-i860.h +++ /dev/null @@ -1,214 +0,0 @@ -/* Note: We must use the name __builtin_savregs. GCC attaches special - significance to that name. In particular, regardless of where in a - function __builtin_saveregs is called, GCC moves the call up to the - very start of the function. */ - - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST - -typedef union { - float __freg[8]; - double __dreg[4]; -} __f_regs; - -typedef struct { -#if defined (__SVR4__) || defined (__svr4__) || defined (__alliant__) || defined (__PARAGON__) - __f_regs __float_regs; long __ireg[12]; -#else /* pre-SVR4 */ - long __ireg[12]; __f_regs __float_regs; -#endif -} __va_saved_regs; - -typedef struct { -#if defined(__SVR4__) || defined(__svr4__) || defined(__alliant__) || defined (__PARAGON__) - unsigned __ireg_used; /* How many int regs consumed 'til now? */ - unsigned __freg_used; /* How many flt regs consumed 'til now? */ - long *__reg_base; /* Address of where we stored the regs. */ - long * __mem_ptr; /* Address of memory overflow args area. */ -#else /* pre-SVR4 */ - long *__reg_base; /* Address of where we stored the regs. */ - long * __mem_ptr; /* Address of memory overflow args area. */ - unsigned __ireg_used; /* How many int regs consumed 'til now? */ - unsigned __freg_used; /* How many flt regs consumed 'til now? */ -#endif -} __gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -#if !defined(_STDARG_H) - -/* varargs support */ -#define va_alist __builtin_va_alist -#if defined (__PARAGON__) -#define va_dcl int va_alist; -#else /* __PARAGON__ */ -#define va_dcl -#endif /* __PARAGON__ */ -#define va_start(pvar) ((pvar) = * (__gnuc_va_list *) __builtin_saveregs ()) - -#else /* STDARG.H */ - -/* ANSI alternative. */ -/* Note that CUMULATIVE_ARGS elements are measured in bytes on the i860, - so we divide by 4 to get # of registers. */ -#define va_start(pvar, firstarg) \ - ((pvar) = *(__gnuc_va_list *) __builtin_saveregs (), \ - (pvar).__ireg_used = __builtin_args_info (0) / 4, \ - (pvar).__freg_used = __builtin_args_info (1) / 4, \ - (pvar).__mem_ptr = __builtin_next_arg (firstarg)) - -#endif /* _STDARG_H */ - -/* Values returned by __builtin_classify_type. */ - -#ifndef va_end -enum { - __no_type_class = -1, - __void_type_class, - __integer_type_class, - __char_type_class, - __enumeral_type_class, - __boolean_type_class, - __pointer_type_class, - __reference_type_class, - __offset_type_class, - __real_type_class, - __complex_type_class, - __function_type_class, - __method_type_class, - __record_type_class, - __union_type_class, - __array_type_class, - __string_type_class, - __set_type_class, - __file_type_class, - __lang_type_class -}; - -void va_end (__gnuc_va_list); /* Defined in libgcc.a */ -#endif -#define va_end(__va) ((void) 0) - -#define __NUM_PARM_FREGS 8 -#define __NUM_PARM_IREGS 12 - -#define __savereg(__va) ((__va_saved_regs *) ((__va).__reg_base)) - -/* This macro works both for SVR4 and pre-SVR4 environments. */ - -/* Note that parameters are always aligned at least to a word boundary - (when passed) regardless of what GCC's __alignof__ operator says. */ - -/* Make allowances here for adding 128-bit (long double) floats someday. */ - -#if 0 /* What was this for? */ -#ifndef __GNU_VA_LIST -#define __ireg_used ireg_used -#define __freg_used freg_used -#define __mem_ptr mem_ptr -#define __reg_base reg_base -#endif -#endif /* 0 */ - -/* Avoid errors if compiling GCC v2 with GCC v1. */ -#if __GNUC__ == 1 -#define __extension__ -#endif - -#define va_arg(__va, __type) \ -__extension__ \ -(* (__type *) \ -({ \ - register void *__rv; /* result value */ \ - register unsigned __align; \ - switch (__builtin_classify_type (* (__type *) 0)) \ - { \ - case __real_type_class: \ - switch (sizeof (__type)) \ - { \ - case sizeof (float): \ - case sizeof (double): \ - if ((__va).__freg_used < __NUM_PARM_FREGS - 1) \ - { \ - if (((__va).__freg_used & 1) != 0) \ - (__va).__freg_used++; /* skip odd */ \ - __rv = &__savereg((__va))->__float_regs.__freg[(__va).__freg_used];\ - (__va).__freg_used += 2; \ - } \ - else \ - { \ - if ((((unsigned) (__va).__mem_ptr) & (sizeof(double)-1)) != 0) \ - (__va).__mem_ptr++; /* skip odd */ \ - __rv = (__va).__mem_ptr; \ - (__va).__mem_ptr += 2; \ - } \ - if (sizeof (__type) == sizeof (float)) \ - { \ - *((float *) __rv) = *((double *) __rv); \ - *(((long *) __rv) + 1) = 0xfff00001; \ - } \ - break; \ - default: \ - abort (); \ - } \ - break; \ - case __void_type_class: \ - case __integer_type_class: \ - case __char_type_class: \ - case __enumeral_type_class: \ - case __boolean_type_class: \ - case __pointer_type_class: \ - case __reference_type_class: \ - case __offset_type_class: \ - if (sizeof (__type) <= 4) \ - { \ - __rv = ((__va).__ireg_used < __NUM_PARM_IREGS \ - ? (&__savereg((__va))->__ireg[(__va).__ireg_used++]) \ - : (__va).__mem_ptr++); \ - break; \ - } \ - else if ((__va).__ireg_used + sizeof (__type) / 4 <= __NUM_PARM_IREGS) \ - { \ - __rv = &__savereg((__va))->__ireg[(__va).__ireg_used]; \ - (__va).__ireg_used += sizeof (__type) / 4; \ - break; \ - } \ - /* Fall through to fetch from memory. */ \ - case __record_type_class: \ - case __union_type_class: \ - __align = (__alignof__ (__type) < sizeof (long) \ - ? sizeof (long) \ - : __alignof__ (__type)); \ - (__va).__mem_ptr \ - = (long *) \ - ((((unsigned) (__va).__mem_ptr) + (__align-1)) & ~(__align-1)); \ - __rv = (__va).__mem_ptr; \ - (__va).__mem_ptr \ - += ((sizeof (__type) + sizeof (long) - 1) / sizeof (long)); \ - break; \ - case __complex_type_class: \ - case __function_type_class: \ - case __method_type_class: \ - case __array_type_class: \ - case __string_type_class: \ - case __set_type_class: \ - case __file_type_class: \ - case __lang_type_class: \ - case __no_type_class: \ - default: \ - abort (); \ - } \ - __rv; \ -})) - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ - diff --git a/contrib/gcc/ginclude/va-i960.h b/contrib/gcc/ginclude/va-i960.h deleted file mode 100644 index 5588d4112917..000000000000 --- a/contrib/gcc/ginclude/va-i960.h +++ /dev/null @@ -1,79 +0,0 @@ -/* GNU C varargs support for the Intel 80960. */ - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -/* The first element is the address of the first argument. - The second element is the number of bytes skipped past so far. */ -typedef unsigned __gnuc_va_list[2]; -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -/* In GCC version 2, we want an ellipsis at the end of the declaration - of the argument list. GCC version 1 can't parse it. */ - -#if __GNUC__ > 1 -#define __va_ellipsis ... -#else -#define __va_ellipsis -#endif - -/* The stack size of the type t. */ -#define __vsiz(T) (((sizeof (T) + 3) / 4) * 4) -/* The stack alignment of the type t. */ -#define __vali(T) (__alignof__ (T) >= 4 ? __alignof__ (T) : 4) -/* The offset of the next stack argument after one of type t at offset i. */ -#define __vpad(I, T) ((((I) + __vali (T) - 1) / __vali (T)) \ - * __vali (T) + __vsiz (T)) - -/* Avoid errors if compiling GCC v2 with GCC v1. */ -#if __GNUC__ == 1 -#define __extension__ -#endif - -#ifdef _STDARG_H -/* Call __builtin_next_arg even though we aren't using its value, so that - we can verify that firstarg is correct. */ -#define va_start(AP, LASTARG) \ -__extension__ \ -({ __builtin_next_arg (LASTARG); \ - __asm__ ("st g14,%0" : "=m" (*(AP))); \ - (AP)[1] = (__builtin_args_info (0) + __builtin_args_info (1)) * 4; }) - -#else - -#define va_alist __builtin_va_alist -#define va_dcl char *__builtin_va_alist; __va_ellipsis -#define va_start(AP) \ -__extension__ \ -({ __asm__ ("st g14,%0" : "=m" (*(AP))); \ - (AP)[1] = (__builtin_args_info (0) + __builtin_args_info (1)) * 4; }) -#endif - -/* We cast to void * and then to TYPE * because this avoids - a warning about increasing the alignment requirement. */ -#define va_arg(AP, T) \ -( \ - ( \ - ((AP)[1] <= 48 && (__vpad ((AP)[1], T) > 48 || __vsiz (T) > 16)) \ - ? ((AP)[1] = 48 + __vsiz (T)) \ - : ((AP)[1] = __vpad ((AP)[1], T)) \ - ), \ - \ - *((T *) (void *) ((char *) *(AP) + (AP)[1] - __vsiz (T))) \ -) - -#ifndef va_end -void va_end (__gnuc_va_list); /* Defined in libgcc.a */ -#endif -#define va_end(AP) ((void) 0) - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ - diff --git a/contrib/gcc/ginclude/va-m32r.h b/contrib/gcc/ginclude/va-m32r.h deleted file mode 100644 index 4ef0ad8267a8..000000000000 --- a/contrib/gcc/ginclude/va-m32r.h +++ /dev/null @@ -1,86 +0,0 @@ -/* GNU C stdarg/varargs support for the M32R */ - -/* Define __gnuc_va_list. */ -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -typedef void *__gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -/* Common code for va_start for both varargs and stdarg. */ - -#define __va_rounded_size(TYPE) \ - (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) - -#ifdef _STDARG_H /* stdarg.h support */ - -/* Calling __builtin_next_arg gives the proper error message if LASTARG is - not indeed the last argument. */ -#define va_start(AP, LASTARG) \ - (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) - -#else /* varargs.h support */ - -#define va_alist __builtin_va_alist -/* The ... causes current_function_varargs to be set in cc1. */ -#define va_dcl int __builtin_va_alist; ... -#define va_start(AP) AP=(char *) &__builtin_va_alist - -#endif /* _STDARG_H */ - -/* Nothing needs to be done to end varargs/stdarg processing */ -#define va_end(AP) ((void) 0) - -/* Values returned by __builtin_classify_type. */ -enum __type_class -{ - __no_type_class = -1, - __void_type_class, - __integer_type_class, - __char_type_class, - __enumeral_type_class, - __boolean_type_class, - __pointer_type_class, - __reference_type_class, - __offset_type_class, - __real_type_class, - __complex_type_class, - __function_type_class, - __method_type_class, - __record_type_class, - __union_type_class, - __array_type_class, - __string_type_class, - __set_type_class, - __file_type_class, - __lang_type_class -}; - -/* Return whether a type is passed by reference. */ -#define __va_by_reference_p(TYPE) (sizeof (TYPE) > 8) - -#define va_arg(AP,TYPE) \ -__extension__ (*({ \ - register TYPE *__ptr; \ - \ - if (__va_by_reference_p (TYPE)) \ - { \ - __ptr = *(TYPE **)(void *) (AP); \ - (AP) = (__gnuc_va_list) ((char *) (AP) + sizeof (void *)); \ - } \ - else \ - { \ - __ptr = (TYPE *)(void *) \ - ((char *) (AP) + (sizeof (TYPE) < __va_rounded_size (char) \ - ? __va_rounded_size (TYPE) - sizeof (TYPE) \ - : 0)); \ - (AP) = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)); \ - } \ - \ - __ptr; \ -})) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-m88k.h b/contrib/gcc/ginclude/va-m88k.h deleted file mode 100644 index 0a20d84501ce..000000000000 --- a/contrib/gcc/ginclude/va-m88k.h +++ /dev/null @@ -1,87 +0,0 @@ -/* GNU C varargs support for the Motorola 88100 */ - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST - -typedef struct -{ - int __va_arg; /* argument number */ - int *__va_stk; /* start of args passed on stack */ - int *__va_reg; /* start of args passed in regs */ -} __gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -#ifdef _STDARG_H /* stdarg.h support */ - -/* Call __builtin_next_arg even though we aren't using its value, so that - we can verify that LASTARG is correct. */ -#if __GNUC__ > 1 /* GCC 2.0 and beyond */ -#define va_start(AP,LASTARG) \ - (__builtin_next_arg (LASTARG), \ - (AP) = *(__gnuc_va_list *)__builtin_saveregs()) -#else -#define va_start(AP,LASTARG) \ - ( (AP).__va_reg = (int *) __builtin_saveregs2(0), \ - (AP).__va_stk = (int *) __builtin_argptr(), \ - (AP).__va_arg = (int) (__builtin_argsize() + 3) / 4 ) -#endif - -#else /* varargs.h support */ - -#if __GNUC__ > 1 /* GCC 2.0 and beyond */ -#define va_start(AP) ((AP) = *(__gnuc_va_list *)__builtin_saveregs()) -#else -#define va_start(AP) \ - ( (AP).__va_reg = (int *) __builtin_saveregs2(1), \ - (AP).__va_stk = (int *) __builtin_argptr(), \ - (AP).__va_arg = (int) (__builtin_argsize() - 4 + 3) / 4 ) -#endif -#define va_alist __va_1st_arg -#define va_dcl register int va_alist;... - -#endif /* _STDARG_H */ - -/* Avoid trouble between this file and _int_varargs.h under DG/UX. This file - can be included by <stdio.h> and others and provides definitions of - __va_size and __va_reg_p and a va_list typedef. Avoid defining va_list - again with _VA_LIST. */ -#ifdef __INT_VARARGS_H -#undef __va_size -#undef __va_reg_p -#define __gnuc_va_list va_list -#define _VA_LIST -#define _VA_LIST_ -#else -/* Similarly, if this gets included first, do nothing in _int_varargs.h. */ -#define __INT_VARARGS_H -#endif - -#define __va_reg_p(TYPE) \ - (__builtin_classify_type(*(TYPE *)0) < 12 \ - ? sizeof(TYPE) <= 8 : sizeof(TYPE) == 4 && __alignof__(TYPE) == 4) - -#define __va_size(TYPE) ((sizeof(TYPE) + 3) >> 2) - -/* We cast to void * and then to TYPE * because this avoids - a warning about increasing the alignment requirement. */ -#define va_arg(AP,TYPE) \ - ( (AP).__va_arg = (((AP).__va_arg + (1 << (__alignof__(TYPE) >> 3)) - 1) \ - & ~((1 << (__alignof__(TYPE) >> 3)) - 1)) \ - + __va_size(TYPE), \ - *((TYPE *) (void *) ((__va_reg_p(TYPE) \ - && (AP).__va_arg < 8 + __va_size(TYPE) \ - ? (AP).__va_reg : (AP).__va_stk) \ - + ((AP).__va_arg - __va_size(TYPE))))) - -#define va_end(AP) ((void)0) - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-mips.h b/contrib/gcc/ginclude/va-mips.h deleted file mode 100644 index 96db5b466cc3..000000000000 --- a/contrib/gcc/ginclude/va-mips.h +++ /dev/null @@ -1,277 +0,0 @@ -/* ---------------------------------------- */ -/* VARARGS for MIPS/GNU CC */ -/* */ -/* */ -/* */ -/* */ -/* ---------------------------------------- */ - - -/* These macros implement varargs for GNU C--either traditional or ANSI. */ - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -#if defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float) - -typedef struct { - /* Pointer to FP regs. */ - char *__fp_regs; - /* Number of FP regs remaining. */ - int __fp_left; - /* Pointer to GP regs followed by stack parameters. */ - char *__gp_regs; -} __gnuc_va_list; - -#else /* ! (defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ - -typedef char * __gnuc_va_list; - -#endif /* ! (defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -#ifndef _VA_MIPS_H_ENUM -#define _VA_MIPS_H_ENUM -enum { - __no_type_class = -1, - __void_type_class, - __integer_type_class, - __char_type_class, - __enumeral_type_class, - __boolean_type_class, - __pointer_type_class, - __reference_type_class, - __offset_type_class, - __real_type_class, - __complex_type_class, - __function_type_class, - __method_type_class, - __record_type_class, - __union_type_class, - __array_type_class, - __string_type_class, - __set_type_class, - __file_type_class, - __lang_type_class -}; -#endif - -/* In GCC version 2, we want an ellipsis at the end of the declaration - of the argument list. GCC version 1 can't parse it. */ - -#if __GNUC__ > 1 -#define __va_ellipsis ... -#else -#define __va_ellipsis -#endif - -#ifdef __mips64 -#define __va_rounded_size(__TYPE) \ - (((sizeof (__TYPE) + 8 - 1) / 8) * 8) -#else -#define __va_rounded_size(__TYPE) \ - (((sizeof (__TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) -#endif - -#ifdef __mips64 -#define __va_reg_size 8 -#else -#define __va_reg_size 4 -#endif - -/* Get definitions for _MIPS_SIM_ABI64 etc. */ -#ifdef _MIPS_SIM -#include <sgidefs.h> -#endif - -#ifdef _STDARG_H -#if defined (__mips_eabi) -#if ! defined (__mips_soft_float) && ! defined (__mips_single_float) -#ifdef __mips64 -#define va_start(__AP, __LASTARG) \ - (__AP.__gp_regs = ((char *) __builtin_next_arg (__LASTARG) \ - - (__builtin_args_info (2) < 8 \ - ? (8 - __builtin_args_info (2)) * __va_reg_size \ - : 0)), \ - __AP.__fp_left = 8 - __builtin_args_info (3), \ - __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * __va_reg_size) -#else /* ! defined (__mips64) */ -#define va_start(__AP, __LASTARG) \ - (__AP.__gp_regs = ((char *) __builtin_next_arg (__LASTARG) \ - - (__builtin_args_info (2) < 8 \ - ? (8 - __builtin_args_info (2)) * __va_reg_size \ - : 0)), \ - __AP.__fp_left = (8 - __builtin_args_info (3)) / 2, \ - __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * 8, \ - __AP.__fp_regs = (char *) ((int) __AP.__fp_regs & -8)) -#endif /* ! defined (__mips64) */ -#else /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float) ) */ -#define va_start(__AP, __LASTARG) \ - (__AP = ((__gnuc_va_list) __builtin_next_arg (__LASTARG) \ - - (__builtin_args_info (2) >= 8 ? 0 \ - : (8 - __builtin_args_info (2)) * __va_reg_size))) -#endif /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float) ) */ -#else /* ! defined (__mips_eabi) */ -#define va_start(__AP, __LASTARG) \ - (__AP = (__gnuc_va_list) __builtin_next_arg (__LASTARG)) -#endif /* ! (defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ -#else /* ! _STDARG_H */ -#define va_alist __builtin_va_alist -#ifdef __mips64 -/* This assumes that `long long int' is always a 64 bit type. */ -#define va_dcl long long int __builtin_va_alist; __va_ellipsis -#else -#define va_dcl int __builtin_va_alist; __va_ellipsis -#endif -#if defined (__mips_eabi) -#if ! defined (__mips_soft_float) && ! defined (__mips_single_float) -#ifdef __mips64 -#define va_start(__AP) \ - (__AP.__gp_regs = ((char *) __builtin_next_arg () \ - - (__builtin_args_info (2) < 8 \ - ? (8 - __builtin_args_info (2)) * __va_reg_size \ - : __va_reg_size)), \ - __AP.__fp_left = 8 - __builtin_args_info (3), \ - __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * __va_reg_size) -#else /* ! defined (__mips64) */ -#define va_start(__AP) \ - (__AP.__gp_regs = ((char *) __builtin_next_arg () \ - - (__builtin_args_info (2) < 8 \ - ? (8 - __builtin_args_info (2)) * __va_reg_size \ - : __va_reg_size)), \ - __AP.__fp_left = (8 - __builtin_args_info (3)) / 2, \ - __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * 8, \ - __AP.__fp_regs = (char *) ((int) __AP.__fp_regs & -8)) -#endif /* ! defined (__mips64) */ -#else /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ -#define va_start(__AP) \ - (__AP = ((__gnuc_va_list) __builtin_next_arg () \ - - (__builtin_args_info (2) >= 8 ? __va_reg_size \ - : (8 - __builtin_args_info (2)) * __va_reg_size))) -#endif /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ -/* Need alternate code for _MIPS_SIM_ABI64. */ -#elif defined(_MIPS_SIM) && (_MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32) -#define va_start(__AP) \ - (__AP = (__gnuc_va_list) __builtin_next_arg () \ - + (__builtin_args_info (2) >= 8 ? -8 : 0)) -#else -#define va_start(__AP) __AP = (char *) &__builtin_va_alist -#endif -#endif /* ! _STDARG_H */ - -#ifndef va_end -void va_end (__gnuc_va_list); /* Defined in libgcc.a */ -#endif -#define va_end(__AP) ((void)0) - -#if defined (__mips_eabi) - -#if ! defined (__mips_soft_float) && ! defined (__mips_single_float) -#ifdef __mips64 -#define __va_next_addr(__AP, __type) \ - ((__builtin_classify_type (*(__type *) 0) == __real_type_class \ - && __AP.__fp_left > 0) \ - ? (--__AP.__fp_left, (__AP.__fp_regs += 8) - 8) \ - : (__AP.__gp_regs += __va_reg_size) - __va_reg_size) -#else -#define __va_next_addr(__AP, __type) \ - ((__builtin_classify_type (*(__type *) 0) == __real_type_class \ - && __AP.__fp_left > 0) \ - ? (--__AP.__fp_left, (__AP.__fp_regs += 8) - 8) \ - : (((__builtin_classify_type (* (__type *) 0) < __record_type_class \ - && __alignof__ (__type) > 4) \ - ? __AP.__gp_regs = (char *) (((int) __AP.__gp_regs + 8 - 1) & -8) \ - : (char *) 0), \ - (__builtin_classify_type (* (__type *) 0) >= __record_type_class \ - ? (__AP.__gp_regs += __va_reg_size) - __va_reg_size \ - : ((__AP.__gp_regs += __va_rounded_size (__type)) \ - - __va_rounded_size (__type))))) -#endif -#else /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ -#ifdef __mips64 -#define __va_next_addr(__AP, __type) \ - ((__AP += __va_reg_size) - __va_reg_size) -#else -#define __va_next_addr(__AP, __type) \ - (((__builtin_classify_type (* (__type *) 0) < __record_type_class \ - && __alignof__ (__type) > 4) \ - ? __AP = (char *) (((__PTRDIFF_TYPE__) __AP + 8 - 1) & -8) \ - : (char *) 0), \ - (__builtin_classify_type (* (__type *) 0) >= __record_type_class \ - ? (__AP += __va_reg_size) - __va_reg_size \ - : ((__AP += __va_rounded_size (__type)) \ - - __va_rounded_size (__type)))) -#endif -#endif /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ - -#ifdef __MIPSEB__ -#define va_arg(__AP, __type) \ - ((__va_rounded_size (__type) <= __va_reg_size) \ - ? *(__type *) (void *) (__va_next_addr (__AP, __type) \ - + __va_reg_size \ - - sizeof (__type)) \ - : (__builtin_classify_type (*(__type *) 0) >= __record_type_class \ - ? **(__type **) (void *) (__va_next_addr (__AP, __type) \ - + __va_reg_size \ - - sizeof (char *)) \ - : *(__type *) (void *) __va_next_addr (__AP, __type))) -#else -#define va_arg(__AP, __type) \ - ((__va_rounded_size (__type) <= __va_reg_size) \ - ? *(__type *) (void *) __va_next_addr (__AP, __type) \ - : (__builtin_classify_type (* (__type *) 0) >= __record_type_class \ - ? **(__type **) (void *) __va_next_addr (__AP, __type) \ - : *(__type *) (void *) __va_next_addr (__AP, __type))) -#endif - -#else /* ! defined (__mips_eabi) */ - -/* We cast to void * and then to TYPE * because this avoids - a warning about increasing the alignment requirement. */ -/* The __mips64 cases are reversed from the 32 bit cases, because the standard - 32 bit calling convention left-aligns all parameters smaller than a word, - whereas the __mips64 calling convention does not (and hence they are - right aligned). */ -#ifdef __mips64 -#ifdef __MIPSEB__ -#define va_arg(__AP, __type) \ - ((__type *) (void *) (__AP = (char *) \ - ((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) \ - + __va_rounded_size (__type))))[-1] -#else -#define va_arg(__AP, __type) \ - ((__AP = (char *) ((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) \ - + __va_rounded_size (__type))), \ - *(__type *) (void *) (__AP - __va_rounded_size (__type))) -#endif - -#else /* not __mips64 */ - -#ifdef __MIPSEB__ -/* For big-endian machines. */ -#define va_arg(__AP, __type) \ - ((__AP = (char *) ((__alignof__ (__type) > 4 \ - ? ((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8 \ - : ((__PTRDIFF_TYPE__)__AP + 4 - 1) & -4) \ - + __va_rounded_size (__type))), \ - *(__type *) (void *) (__AP - __va_rounded_size (__type))) -#else -/* For little-endian machines. */ -#define va_arg(__AP, __type) \ - ((__type *) (void *) (__AP = (char *) ((__alignof__(__type) > 4 \ - ? ((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8 \ - : ((__PTRDIFF_TYPE__)__AP + 4 - 1) & -4) \ - + __va_rounded_size(__type))))[-1] -#endif -#endif -#endif /* ! defined (__mips_eabi) */ - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-mn10200.h b/contrib/gcc/ginclude/va-mn10200.h deleted file mode 100644 index b458b56e0beb..000000000000 --- a/contrib/gcc/ginclude/va-mn10200.h +++ /dev/null @@ -1,37 +0,0 @@ -/* CYGNUS LOCAL entire file/law */ -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -typedef void *__gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) -#define __gnuc_va_start(AP) (AP = (__gnuc_va_list)__builtin_saveregs()) -#define __va_ellipsis ... - -#ifdef _STDARG_H -#define va_start(AP, LASTARG) \ - (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) -#else -#define va_alist __builtin_va_alist -#define va_dcl int __builtin_va_alist; __va_ellipsis -#define va_start(AP) AP=(char *) &__builtin_va_alist -#endif - -/* Now stuff common to both varargs & stdarg implementations. */ -#define __va_rounded_size(TYPE) \ - (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) -#undef va_end -void va_end (__gnuc_va_list); -#define va_end(AP) ((void)0) -#define va_arg(AP, TYPE) \ - (sizeof (TYPE) > 8 \ - ? (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (char *)),\ - **((TYPE **) (void *) ((char *) (AP) - __va_rounded_size (char *))))\ - : (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ - *((TYPE *) (void *) ((char *) (AP) - __va_rounded_size (TYPE))))) -#endif -/* END CYGNUS LOCAL */ diff --git a/contrib/gcc/ginclude/va-mn10300.h b/contrib/gcc/ginclude/va-mn10300.h deleted file mode 100644 index e156ccf5939b..000000000000 --- a/contrib/gcc/ginclude/va-mn10300.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -typedef void *__gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) -#define __gnuc_va_start(AP) (AP = (__gnuc_va_list)__builtin_saveregs()) -#define __va_ellipsis ... - -#ifdef _STDARG_H -#define va_start(AP, LASTARG) \ - (__builtin_next_arg (LASTARG), __gnuc_va_start (AP)) -#else -#define va_alist __builtin_va_alist -#define va_dcl int __builtin_va_alist; __va_ellipsis -#define va_start(AP) AP=(char *) &__builtin_va_alist -#endif - -/* Now stuff common to both varargs & stdarg implementations. */ -#define __va_rounded_size(TYPE) \ - (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) -#undef va_end -void va_end (__gnuc_va_list); -#define va_end(AP) ((void)0) -#define va_arg(AP, TYPE) \ - (sizeof (TYPE) > 8 \ - ? (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (char *)),\ - **((TYPE **) (void *) ((char *) (AP) - __va_rounded_size (char *))))\ - : (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ - *((TYPE *) (void *) ((char *) (AP) - __va_rounded_size (TYPE))))) -#endif diff --git a/contrib/gcc/ginclude/va-pa.h b/contrib/gcc/ginclude/va-pa.h deleted file mode 100644 index 4865f6bfac08..000000000000 --- a/contrib/gcc/ginclude/va-pa.h +++ /dev/null @@ -1,52 +0,0 @@ - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST - -typedef void *__gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) -#if __GNUC__ > 1 -#define __va_ellipsis ... -#define __gnuc_va_start(AP) ((AP) = (va_list)__builtin_saveregs()) -#else -#define va_alist __va_a__, __va_b__, __va_c__, __va_d__ -#define __va_ellipsis -#define __gnuc_va_start(AP)\ - (AP) = (double *) &__va_a__, &__va_b__, &__va_c__, &__va_d__, \ - (AP) = (double *)((char *)(AP) + 4) -#endif /* __GNUC__ > 1 */ - -/* Call __builtin_next_arg even though we aren't using its value, so that - we can verify that LASTARG is correct. */ -#ifdef _STDARG_H -#define va_start(AP,LASTARG) \ - (__builtin_next_arg (LASTARG), __gnuc_va_start (AP)) -#else -/* The ... causes current_function_varargs to be set in cc1. */ -#define va_dcl long va_alist; __va_ellipsis -#define va_start(AP) __gnuc_va_start (AP) -#endif - -#define va_arg(AP,TYPE) \ - (*(sizeof(TYPE) > 8 ? \ - ((AP = (__gnuc_va_list) ((char *)AP - sizeof (int))), \ - (((TYPE *) (void *) (*((int *) (AP)))))) \ - :((AP = \ - (__gnuc_va_list) ((long)((char *)AP - sizeof (TYPE)) \ - & (sizeof(TYPE) > 4 ? ~0x7 : ~0x3))), \ - (((TYPE *) (void *) ((char *)AP + ((8 - sizeof(TYPE)) % 4))))))) - -#ifndef va_end -void va_end (__gnuc_va_list); /* Defined in libgcc.a */ -#endif -#define va_end(AP) ((void)0) - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-ppc.h b/contrib/gcc/ginclude/va-ppc.h deleted file mode 100644 index de299b59cf9f..000000000000 --- a/contrib/gcc/ginclude/va-ppc.h +++ /dev/null @@ -1,255 +0,0 @@ -/* GNU C varargs support for the PowerPC with either the V.4 or Windows NT calling sequences */ - -#ifndef _WIN32 -/* System V.4 support */ -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST - -#ifndef _SYS_VA_LIST_H -#define _SYS_VA_LIST_H /* Solaris sys/va_list.h */ - -/* Solaris decided to rename overflow_arg_area to input_arg_area, - so handle it via a macro. */ -#define __va_overflow(AP) (AP)->overflow_arg_area - -/* Note that the names in this structure are in the user's namespace, but - that the V.4 abi explicitly states that these names should be used. */ -typedef struct __va_list_tag { - unsigned char gpr; /* index into the array of 8 GPRs stored in the - register save area gpr=0 corresponds to r3, - gpr=1 to r4, etc. */ - unsigned char fpr; /* index into the array of 8 FPRs stored in the - register save area fpr=0 corresponds to f1, - fpr=1 to f2, etc. */ - char *overflow_arg_area; /* location on stack that holds the next - overflow argument */ - char *reg_save_area; /* where r3:r10 and f1:f8, if saved are stored */ -} __va_list[1], __gnuc_va_list[1]; - -#else /* _SYS_VA_LIST */ - -typedef __va_list __gnuc_va_list; -#define __va_overflow(AP) (AP)->input_arg_area - -#endif /* not _SYS_VA_LIST */ -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -/* Register save area located below the frame pointer */ -#ifndef __VA_PPC_H__ -#define __VA_PPC_H__ -typedef struct { - long __gp_save[8]; /* save area for GP registers */ - double __fp_save[8]; /* save area for FP registers */ -} __va_regsave_t; - -/* Macros to access the register save area */ -/* We cast to void * and then to TYPE * because this avoids - a warning about increasing the alignment requirement. */ -#define __VA_FP_REGSAVE(AP,OFS,TYPE) \ - ((TYPE *) (void *) (&(((__va_regsave_t *) \ - (AP)->reg_save_area)->__fp_save[OFS]))) - -#define __VA_GP_REGSAVE(AP,OFS,TYPE) \ - ((TYPE *) (void *) (&(((__va_regsave_t *) \ - (AP)->reg_save_area)->__gp_save[OFS]))) - -/* Common code for va_start for both varargs and stdarg. We allow all - the work to be done by __builtin_saveregs. It returns a pointer to - a va_list that was constructed on the stack; we must simply copy it - to the user's variable. */ - -#define __va_start_common(AP, FAKE) \ - __builtin_memcpy ((AP), __builtin_saveregs (), sizeof(__gnuc_va_list)) - -#ifdef _STDARG_H /* stdarg.h support */ - -/* Calling __builtin_next_arg gives the proper error message if LASTARG is - not indeed the last argument. */ -#define va_start(AP,LASTARG) \ - (__builtin_next_arg (LASTARG), __va_start_common (AP, 0)) - -#else /* varargs.h support */ - -#define va_start(AP) __va_start_common (AP, 1) -#define va_alist __va_1st_arg -#define va_dcl register int va_alist; ... - -#endif /* _STDARG_H */ - -#ifdef _SOFT_FLOAT -#define __va_float_p(TYPE) 0 -#else -#define __va_float_p(TYPE) (__builtin_classify_type(*(TYPE *)0) == 8) -#endif - -#define __va_aggregate_p(TYPE) (__builtin_classify_type(*(TYPE *)0) >= 12) -#define __va_size(TYPE) ((sizeof(TYPE) + sizeof (long) - 1) / sizeof (long)) - -/* This symbol isn't defined. It is used to flag type promotion violations - at link time. We can only do this when optimizing. Use __builtin_trap - instead of abort so that we don't require a prototype for abort. - - __builtin_trap stuff is not available on the gcc-2.95 branch, so we just - avoid calling it for now. */ - -#ifdef __OPTIMIZE__ -extern void __va_arg_type_violation(void) __attribute__((__noreturn__)); -#else -#define __va_arg_type_violation() -#endif - -#define va_arg(AP,TYPE) \ -__extension__ (*({ \ - register TYPE *__ptr; \ - \ - if (__va_float_p (TYPE) && sizeof (TYPE) < 16) \ - { \ - unsigned char __fpr = (AP)->fpr; \ - if (__fpr < 8) \ - { \ - __ptr = __VA_FP_REGSAVE (AP, __fpr, TYPE); \ - (AP)->fpr = __fpr + 1; \ - } \ - else if (sizeof (TYPE) == 8) \ - { \ - unsigned long __addr = (unsigned long) (__va_overflow (AP)); \ - __ptr = (TYPE *)((__addr + 7) & -8); \ - __va_overflow (AP) = (char *)(__ptr + 1); \ - } \ - else \ - { \ - /* float is promoted to double. */ \ - __va_arg_type_violation (); \ - } \ - } \ - \ - /* Aggregates and long doubles are passed by reference. */ \ - else if (__va_aggregate_p (TYPE) || __va_float_p (TYPE)) \ - { \ - unsigned char __gpr = (AP)->gpr; \ - if (__gpr < 8) \ - { \ - __ptr = * __VA_GP_REGSAVE (AP, __gpr, TYPE *); \ - (AP)->gpr = __gpr + 1; \ - } \ - else \ - { \ - TYPE **__pptr = (TYPE **) (__va_overflow (AP)); \ - __ptr = * __pptr; \ - __va_overflow (AP) = (char *) (__pptr + 1); \ - } \ - } \ - \ - /* Only integrals remaining. */ \ - else \ - { \ - /* longlong is aligned. */ \ - if (sizeof (TYPE) == 8) \ - { \ - unsigned char __gpr = (AP)->gpr; \ - if (__gpr < 7) \ - { \ - __gpr += __gpr & 1; \ - __ptr = __VA_GP_REGSAVE (AP, __gpr, TYPE); \ - (AP)->gpr = __gpr + 2; \ - } \ - else \ - { \ - unsigned long __addr = (unsigned long) (__va_overflow (AP)); \ - __ptr = (TYPE *)((__addr + 7) & -8); \ - (AP)->gpr = 8; \ - __va_overflow (AP) = (char *)(__ptr + 1); \ - } \ - } \ - else if (sizeof (TYPE) == 4) \ - { \ - unsigned char __gpr = (AP)->gpr; \ - if (__gpr < 8) \ - { \ - __ptr = __VA_GP_REGSAVE (AP, __gpr, TYPE); \ - (AP)->gpr = __gpr + 1; \ - } \ - else \ - { \ - __ptr = (TYPE *) __va_overflow (AP); \ - __va_overflow (AP) = (char *)(__ptr + 1); \ - } \ - } \ - else \ - { \ - /* Everything else was promoted to int. */ \ - __va_arg_type_violation (); \ - } \ - } \ - __ptr; \ -})) - -#define va_end(AP) ((void)0) - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) *(dest) = *(src) - -#endif /* __VA_PPC_H__ */ -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ - - -#else -/* Windows NT */ -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -typedef char *__gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -#define __va_start_common(AP, LASTARG, FAKE) \ - ((__builtin_saveregs ()), ((AP) = ((char *) &LASTARG) + __va_rounded_size (AP)), 0) - -#ifdef _STDARG_H /* stdarg.h support */ - -/* Calling __builtin_next_arg gives the proper error message if LASTARG is - not indeed the last argument. */ -#define va_start(AP,LASTARG) \ - (__builtin_saveregs (), \ - (AP) = __builtin_next_arg (LASTARG), \ - 0) - -#else /* varargs.h support */ - -#define va_start(AP) \ - (__builtin_saveregs (), \ - (AP) = __builtin_next_arg (__va_1st_arg) - sizeof (int), \ - 0) - -#define va_alist __va_1st_arg -#define va_dcl register int __va_1st_arg; ... - -#endif /* _STDARG_H */ - -#define __va_rounded_size(TYPE) ((sizeof (TYPE) + 3) & ~3) -#define __va_align(AP, TYPE) \ - ((((unsigned long)(AP)) + ((sizeof (TYPE) >= 8) ? 7 : 3)) \ - & ~((sizeof (TYPE) >= 8) ? 7 : 3)) - -#define va_arg(AP,TYPE) \ -( *(TYPE *)((AP = (char *) (__va_align(AP, TYPE) \ - + __va_rounded_size(TYPE))) \ - - __va_rounded_size(TYPE))) - -#define va_end(AP) ((void)0) - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ -#endif /* Windows NT */ diff --git a/contrib/gcc/ginclude/va-pyr.h b/contrib/gcc/ginclude/va-pyr.h deleted file mode 100644 index 5ad4ba9d763e..000000000000 --- a/contrib/gcc/ginclude/va-pyr.h +++ /dev/null @@ -1,130 +0,0 @@ -/** - * - * Varargs for PYR/GNU CC - * - * WARNING -- WARNING -- DANGER - * - * The code in this file implements varargs for gcc on a pyr in - * a way that is compatible with code compiled by the Pyramid Technology - * C compiler. - * As such, it depends strongly on the Pyramid conventions for - * parameter passing.ct and independent implementation. - * These (somewhat bizarre) parameter-passing conventions are described - * in the ``OSx Operating System Porting Guide''. - * - * A quick summary is useful: - * 12 of the 48 register-windowed regs available for - * parameter passing. Parameters of a function call that are eligible - * to be passed in registers are assigned registers from TR0/PR0 onwards; - * all other arguments are passed on the stack. - * Structure and union parameters are *never* passed in registers, - * even if they are small enough to fit. They are always passed on - * the stack. - * - * Double-sized parameters cannot be passed in TR11, because - * TR12 is not used for passing parameters. If, in the absence of this - * rule, a double-sized param would have been passed in TR11, - * that parameter is passed on the stack and no parameters are - * passed in TR11. - * - * It is only known to work for passing 32-bit integer quantities - * (ie chars, shorts, ints/enums, longs), doubles, or pointers. - * Passing structures on a Pyramid via varargs is a loser. - * Passing an object larger than 8 bytes on a pyramid via varargs may - * also be a loser. - * - */ - - -/* - * pointer to next stack parameter in __va_buf[0] - * pointer to next parameter register in __va_buf[1] - * Count of registers seen at __va_buf[2] - * saved pr0..pr11 in __va_buf[3..14] - * # of calls to va_arg (debugging) at __va_buf[15] - */ - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST - -typedef void *__voidptr; -#if 1 - -typedef struct __va_regs { - __voidptr __stackp,__regp,__count; - __voidptr __pr0,__pr1,__pr2,__pr3,__pr4,__pr5,__pr6,__pr7,__pr8,__pr9,__pr10,__pr11; - } __va_regs; - -typedef __va_regs __va_buf; -#else - -/* __va_buf[0] = address of next arg passed on the stack - __va_buf[1] = address of next arg passed in a register - __va_buf[2] = register-# of next arg passed in a register - */ -typedef __voidptr(*__va_buf); - -#endif - -typedef __va_buf __gnuc_va_list; - -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -/* In GCC version 2, we want an ellipsis at the end of the declaration - of the argument list. GCC version 1 can't parse it. */ - -#if __GNUC__ > 1 -#define __va_ellipsis ... -#else -#define __va_ellipsis -#endif - -#define va_alist \ - __va0,__va1,__va2,__va3,__va4,__va5,__va6,__va7,__va8,__va9,__va10,__va11, \ - __builtin_va_alist - -/* The ... causes current_function_varargs to be set in cc1. */ -#define va_dcl __voidptr va_alist; __va_ellipsis - - -/* __asm ("rcsp %0" : "=r" ( _AP [0]));*/ - -#define va_start(_AP) \ - _AP = ((struct __va_regs) { \ - &(_AP.__pr0), (void*)&__builtin_va_alist, (void*)0, \ - __va0,__va1,__va2,__va3,__va4,__va5, \ - __va6,__va7,__va8,__va9,__va10,__va11}) - - -/* Avoid errors if compiling GCC v2 with GCC v1. */ -#if __GNUC__ == 1 -#define __extension__ -#endif - -/* We cast to void * and then to TYPE * because this avoids - a warning about increasing the alignment requirement. */ -#define va_arg(_AP, _MODE) \ -__extension__ \ -(*({__voidptr *__ap = (__voidptr*)&_AP; \ - register int __size = sizeof (_MODE); \ - register int __onstack = \ - (__size > 8 || ( (int)(__ap[2]) > 11) || \ - (__size==8 && (int)(__ap[2])==11)); \ - register int* __param_addr = ((int*)((__ap) [__onstack])); \ - \ - ((void *)__ap[__onstack])+=__size; \ - if (__onstack==0 || (int)(__ap[2])==11) \ - __ap[2]+= (__size >> 2); \ - (( _MODE *) (void *) __param_addr); \ -})) - -void va_end (__gnuc_va_list); /* Defined in libgcc.a */ -#define va_end(_X) ((void)0) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-sh.h b/contrib/gcc/ginclude/va-sh.h deleted file mode 100644 index dc4e3ae8079f..000000000000 --- a/contrib/gcc/ginclude/va-sh.h +++ /dev/null @@ -1,229 +0,0 @@ -/* The ! __SH3E_VARG case is similar to the default gvarargs.h . */ - -#if (defined (__SH3E__) || defined (__SH4_SINGLE__) || defined (__SH4__) || defined (__SH4_SINGLE_ONLY__)) && ! defined (__HITACHI__) -#define __SH3E_VARG -#endif - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST - -#ifdef __SH3E_VARG - -typedef long __va_greg; -typedef float __va_freg; - -typedef struct { - __va_greg * __va_next_o; /* next available register */ - __va_greg * __va_next_o_limit; /* past last available register */ - __va_freg * __va_next_fp; /* next available fp register */ - __va_freg * __va_next_fp_limit; /* last available fp register */ - __va_greg * __va_next_stack; /* next extended word on stack */ -} __gnuc_va_list; - -#else /* ! SH3E */ - -typedef void *__gnuc_va_list; - -#endif /* ! SH3E */ - -#endif /* __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -#ifdef _STDARG_H - -#ifdef __SH3E_VARG - -#define va_start(AP, LASTARG) \ -__extension__ \ - ({ \ - (AP).__va_next_fp = (__va_freg *) __builtin_saveregs (); \ - (AP).__va_next_fp_limit = ((AP).__va_next_fp + \ - (__builtin_args_info (1) < 8 ? 8 - __builtin_args_info (1) : 0)); \ - (AP).__va_next_o = (__va_greg *) (AP).__va_next_fp_limit; \ - (AP).__va_next_o_limit = ((AP).__va_next_o + \ - (__builtin_args_info (0) < 4 ? 4 - __builtin_args_info (0) : 0)); \ - (AP).__va_next_stack = (__va_greg *) __builtin_next_arg (LASTARG); \ - }) - -#else /* ! SH3E */ - -#define va_start(AP, LASTARG) \ - ((AP) = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) - -#endif /* ! SH3E */ - -#else /* _VARARGS_H */ - -#define va_alist __builtin_va_alist -#define va_dcl int __builtin_va_alist;... - -#ifdef __SH3E_VARG - -#define va_start(AP) \ -__extension__ \ - ({ \ - (AP).__va_next_fp = (__va_freg *) __builtin_saveregs (); \ - (AP).__va_next_fp_limit = ((AP).__va_next_fp + \ - (__builtin_args_info (1) < 8 ? 8 - __builtin_args_info (1) : 0)); \ - (AP).__va_next_o = (__va_greg *) (AP).__va_next_fp_limit; \ - (AP).__va_next_o_limit = ((AP).__va_next_o + \ - (__builtin_args_info (0) < 4 ? 4 - __builtin_args_info (0) : 0)); \ - (AP).__va_next_stack \ - = ((__va_greg *) __builtin_next_arg (__builtin_va_alist) \ - - (__builtin_args_info (0) >= 4 || __builtin_args_info (1) >= 8 \ - ? 1 : 0)); \ - }) - -#else /* ! SH3E */ - -#define va_start(AP) ((AP) = (char *) &__builtin_va_alist) - -#endif /* ! SH3E */ - -#endif /* _STDARG */ - -#ifndef va_end -void va_end (__gnuc_va_list); /* Defined in libgcc.a */ - -/* Values returned by __builtin_classify_type. */ - -enum __va_type_classes { - __no_type_class = -1, - __void_type_class, - __integer_type_class, - __char_type_class, - __enumeral_type_class, - __boolean_type_class, - __pointer_type_class, - __reference_type_class, - __offset_type_class, - __real_type_class, - __complex_type_class, - __function_type_class, - __method_type_class, - __record_type_class, - __union_type_class, - __array_type_class, - __string_type_class, - __set_type_class, - __file_type_class, - __lang_type_class -}; - -#endif -#define va_end(pvar) ((void)0) - -#ifdef __LITTLE_ENDIAN__ -#define __LITTLE_ENDIAN_P 1 -#else -#define __LITTLE_ENDIAN_P 0 -#endif - -#define __SCALAR_TYPE(TYPE) \ - ((TYPE) == __integer_type_class \ - || (TYPE) == __char_type_class \ - || (TYPE) == __enumeral_type_class) - -/* RECORD_TYPE args passed using the C calling convention are - passed by invisible reference. ??? RECORD_TYPE args passed - in the stack are made to be word-aligned; for an aggregate that is - not word-aligned, we advance the pointer to the first non-reg slot. */ - - /* When this is a smaller-than-int integer, using - auto-increment in the promoted (SImode) is fastest; - however, there is no way to express that is C. Therefore, - we use an asm. - We want the MEM_IN_STRUCT_P bit set in the emitted RTL, therefore we - use unions even when it would otherwise be unnecessary. */ - -/* gcc has an extension that allows to use a casted lvalue as an lvalue, - But it doesn't work in C++ with -pedantic - even in the presence of - __extension__ . We work around this problem by using a reference type. */ -#ifdef __cplusplus -#define __VA_REF & -#else -#define __VA_REF -#endif - -#define __va_arg_sh1(AP, TYPE) __extension__ \ -({(sizeof (TYPE) == 1 \ - ? ({union {TYPE t; char c;} __t; \ - __asm("" \ - : "=r" (__t.c) \ - : "0" ((((union { int i, j; } *__VA_REF) (AP))++)->i)); \ - __t.t;}) \ - : sizeof (TYPE) == 2 \ - ? ({union {TYPE t; short s;} __t; \ - __asm("" \ - : "=r" (__t.s) \ - : "0" ((((union { int i, j; } *__VA_REF) (AP))++)->i)); \ - __t.t;}) \ - : sizeof (TYPE) >= 4 || __LITTLE_ENDIAN_P \ - ? (((union { TYPE t; int i;} *__VA_REF) (AP))++)->t \ - : ((union {TYPE t;TYPE u;}*) ((char *)++(int *__VA_REF)(AP) - sizeof (TYPE)))->t);}) - -#ifdef __SH3E_VARG - -#define __PASS_AS_FLOAT(TYPE_CLASS,SIZE) \ - (TYPE_CLASS == __real_type_class && SIZE == 4) - -#define __TARGET_SH4_P 0 - -#if defined(__SH4__) || defined(__SH4_SINGLE__) -#undef __PASS_AS_FLOAT -#define __PASS_AS_FLOAT(TYPE_CLASS,SIZE) \ - (TYPE_CLASS == __real_type_class && SIZE <= 8 \ - || TYPE_CLASS == __complex_type_class && SIZE <= 16) -#undef __TARGET_SH4_P -#define __TARGET_SH4_P 1 -#endif - -#define va_arg(pvar,TYPE) \ -__extension__ \ -({int __type = __builtin_classify_type (* (TYPE *) 0); \ - void * __result_p; \ - if (__PASS_AS_FLOAT (__type, sizeof(TYPE))) \ - { \ - if ((pvar).__va_next_fp < (pvar).__va_next_fp_limit) \ - { \ - if (((__type == __real_type_class && sizeof (TYPE) > 4)\ - || sizeof (TYPE) > 8) \ - && (((int) (pvar).__va_next_fp ^ (int) (pvar).__va_next_fp_limit)\ - & 4)) \ - (pvar).__va_next_fp++; \ - __result_p = &(pvar).__va_next_fp; \ - } \ - else \ - __result_p = &(pvar).__va_next_stack; \ - } \ - else \ - { \ - if ((pvar).__va_next_o + ((sizeof (TYPE) + 3) / 4) \ - <= (pvar).__va_next_o_limit) \ - __result_p = &(pvar).__va_next_o; \ - else \ - { \ - if (sizeof (TYPE) > 4) \ - if (! __TARGET_SH4_P) \ - (pvar).__va_next_o = (pvar).__va_next_o_limit; \ - \ - __result_p = &(pvar).__va_next_stack; \ - } \ - } \ - __va_arg_sh1(*(void **)__result_p, TYPE);}) - -#else /* ! SH3E */ - -#define va_arg(AP, TYPE) __va_arg_sh1((AP), TYPE) - -#endif /* SH3E */ - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) ((dest) = (src)) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-sparc.h b/contrib/gcc/ginclude/va-sparc.h deleted file mode 100644 index 73c9de1cd9a0..000000000000 --- a/contrib/gcc/ginclude/va-sparc.h +++ /dev/null @@ -1,165 +0,0 @@ -/* This is just like the default gvarargs.h - except for differences described below. */ - -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -#if ! defined (__svr4__) && ! defined (__linux__) && ! defined (__arch64__) -/* This has to be a char * to be compatible with Sun. - i.e., we have to pass a `va_list' to vsprintf. */ -typedef char * __gnuc_va_list; -#else -/* This has to be a void * to be compatible with Sun svr4. - i.e., we have to pass a `va_list' to vsprintf. */ -typedef void * __gnuc_va_list; -#endif -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -#ifdef _STDARG_H - -/* Call __builtin_next_arg even though we aren't using its value, so that - we can verify that LASTARG is correct. */ -#if defined (__GCC_NEW_VARARGS__) || defined (__arch64__) -#define va_start(AP, LASTARG) \ - (__builtin_next_arg (LASTARG), AP = (char *) __builtin_saveregs ()) -#else -#define va_start(AP, LASTARG) \ - (__builtin_saveregs (), AP = ((char *) __builtin_next_arg (LASTARG))) -#endif - -#else - -#define va_alist __builtin_va_alist -#define va_dcl int __builtin_va_alist;... - -#if defined (__GCC_NEW_VARARGS__) || defined (__arch64__) -#define va_start(AP) ((AP) = (char *) __builtin_saveregs ()) -#else -#define va_start(AP) \ - (__builtin_saveregs (), (AP) = ((char *) &__builtin_va_alist)) -#endif - -#endif - -#ifndef va_end -void va_end (__gnuc_va_list); /* Defined in libgcc.a */ - -/* Values returned by __builtin_classify_type. */ - -enum __va_type_classes { - __no_type_class = -1, - __void_type_class, - __integer_type_class, - __char_type_class, - __enumeral_type_class, - __boolean_type_class, - __pointer_type_class, - __reference_type_class, - __offset_type_class, - __real_type_class, - __complex_type_class, - __function_type_class, - __method_type_class, - __record_type_class, - __union_type_class, - __array_type_class, - __string_type_class, - __set_type_class, - __file_type_class, - __lang_type_class -}; - -#endif -#define va_end(pvar) ((void)0) - -/* Avoid errors if compiling GCC v2 with GCC v1. */ -#if __GNUC__ == 1 -#define __extension__ -#endif - -/* RECORD_TYPE args passed using the C calling convention are - passed by invisible reference. ??? RECORD_TYPE args passed - in the stack are made to be word-aligned; for an aggregate that is - not word-aligned, we advance the pointer to the first non-reg slot. */ - -#ifdef __arch64__ - -typedef unsigned int __ptrint __attribute__ ((__mode__ (__DI__))); - -/* ??? TODO: little endian support */ - -#define va_arg(pvar, TYPE) \ -__extension__ \ -(*({int __type = __builtin_classify_type (* (TYPE *) 0); \ - char * __result; \ - if (__type == __real_type_class) /* float? */ \ - { \ - if (__alignof__ (TYPE) == 16) \ - (pvar) = (void *) (((__ptrint) (pvar) + 15) & -16); \ - __result = (pvar); \ - (pvar) = (char *) (pvar) + sizeof (TYPE); \ - } \ - else if (__type < __record_type_class) /* integer? */ \ - { \ - (pvar) = (char *) (pvar) + 8; \ - __result = (char *) (pvar) - sizeof (TYPE); \ - } \ - else /* aggregate object */ \ - { \ - if (sizeof (TYPE) <= 8) \ - { \ - __result = (pvar); \ - (pvar) = (char *) (pvar) + 8; \ - } \ - else if (sizeof (TYPE) <= 16) \ - { \ - if (__alignof__ (TYPE) == 16) \ - (pvar) = (void *) (((__ptrint) (pvar) + 15) & -16); \ - __result = (pvar); \ - (pvar) = (char *) (pvar) + 16; \ - } \ - else \ - { \ - __result = * (void **) (pvar); \ - (pvar) = (char *) (pvar) + 8; \ - } \ - } \ - (TYPE *) __result;})) - -#else /* not __arch64__ */ - -#define __va_rounded_size(TYPE) \ - (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) - -/* We don't declare the union member `d' to have type TYPE - because that would lose in C++ if TYPE has a constructor. */ -/* We cast to void * and then to TYPE * because this avoids - a warning about increasing the alignment requirement. - The casts to char * avoid warnings about invalid pointer arithmetic. */ -#define va_arg(pvar,TYPE) \ -__extension__ \ -(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \ - || (__builtin_classify_type (*(TYPE*) 0) == __real_type_class \ - && sizeof (TYPE) == 16)) \ - ? ((pvar) = (char *)(pvar) + __va_rounded_size (TYPE *), \ - *(TYPE **) (void *) ((char *)(pvar) - __va_rounded_size (TYPE *))) \ - : __va_rounded_size (TYPE) == 8 \ - ? ({ union {char __d[sizeof (TYPE)]; int __i[2];} __u; \ - __u.__i[0] = ((int *) (void *) (pvar))[0]; \ - __u.__i[1] = ((int *) (void *) (pvar))[1]; \ - (pvar) = (char *)(pvar) + 8; \ - (TYPE *) (void *) __u.__d; }) \ - : ((pvar) = (char *)(pvar) + __va_rounded_size (TYPE), \ - ((TYPE *) (void *) ((char *)(pvar) - __va_rounded_size (TYPE)))));})) - -#endif /* not __arch64__ */ - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) - -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/contrib/gcc/ginclude/va-spur.h b/contrib/gcc/ginclude/va-spur.h deleted file mode 100644 index 7457ceb9fcdb..000000000000 --- a/contrib/gcc/ginclude/va-spur.h +++ /dev/null @@ -1,64 +0,0 @@ -/* varargs.h for SPUR */ - -/* NB. This is NOT the definition needed for the new ANSI proposed - standard */ - - -struct __va_struct { char __regs[20]; }; - -#define va_alist __va_regs, __va_stack - -/* In GCC version 2, we want an ellipsis at the end of the declaration - of the argument list. GCC version 1 can't parse it. */ - -#if __GNUC__ > 1 -#define __va_ellipsis ... -#else -#define __va_ellipsis -#endif - -/* The ... causes current_function_varargs to be set in cc1. */ -#define va_dcl struct __va_struct __va_regs; int __va_stack; - -typedef struct { - int __pnt; - char *__regs; - char *__stack; -} va_list; - -#define va_start(pvar) \ - ((pvar).__pnt = 0, (pvar).__regs = __va_regs.__regs, \ - (pvar).__stack = (char *) &__va_stack) -#define va_end(pvar) ((void)0) - -/* Avoid errors if compiling GCC v2 with GCC v1. */ -#if __GNUC__ == 1 -#define __extension__ -#endif - -#define va_arg(pvar,type) \ -__extension__ \ - (*({ type *__va_result; \ - if ((pvar).__pnt >= 20) { \ - __va_result = ( (type *) ((pvar).__stack + (pvar).__pnt - 20)); \ - (pvar).__pnt += (sizeof(type) + 7) & ~7; \ - } \ - else if ((pvar).__pnt + sizeof(type) > 20) { \ - __va_result = (type *) (pvar).__stack; \ - (pvar).__pnt = 20 + ( (sizeof(type) + 7) & ~7); \ - } \ - else if (sizeof(type) == 8) { \ - union {double d; int i[2];} __u; \ - __u.i[0] = *(int *) ((pvar).__regs + (pvar).__pnt); \ - __u.i[1] = *(int *) ((pvar).__regs + (pvar).__pnt + 4); \ - __va_result = (type *) &__u; \ - (pvar).__pnt += 8; \ - } \ - else { \ - __va_result = (type *) ((pvar).__regs + (pvar).__pnt); \ - (pvar).__pnt += (sizeof(type) + 3) & ~3; \ - } \ - __va_result; })) - -/* Copy __gnuc_va_list into another variable of this type. */ -#define __va_copy(dest, src) (dest) = (src) diff --git a/contrib/gcc/ginclude/va-v850.h b/contrib/gcc/ginclude/va-v850.h deleted file mode 100644 index 96da6d5a3dea..000000000000 --- a/contrib/gcc/ginclude/va-v850.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Define __gnuc_va_list. */ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -typedef void *__gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ - -/* If this is for internal libc use, don't define anything but - __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) - -#ifdef _STDARG_H -#define va_start(AP, LASTARG) \ - (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) -#else -#define __va_ellipsis ... -#define va_alist __builtin_va_alist -#define va_dcl int __builtin_va_alist; __va_ellipsis -#define va_start(AP) AP=(char *) &__builtin_va_alist -#endif - -/* Now stuff common to both varargs & stdarg implementations. */ -#define __va_rounded_size(TYPE) \ - (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) -#undef va_end -void va_end (__gnuc_va_list); -#define va_end(AP) ((void)0) -#define va_arg(AP, TYPE) \ - (sizeof (TYPE) > 8 \ - ? (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (char *)),\ - **((TYPE **) (void *) ((char *) (AP) - __va_rounded_size (char *))))\ - : (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ - *((TYPE *) (void *) ((char *) (AP) - __va_rounded_size (TYPE))))) -#endif diff --git a/contrib/gcc/install.texi b/contrib/gcc/install.texi deleted file mode 100644 index 5e3da8e58c1a..000000000000 --- a/contrib/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 @uref{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/contrib/gcc/invoke.texi b/contrib/gcc/invoke.texi deleted file mode 100644 index e97495e1b6c4..000000000000 --- a/contrib/gcc/invoke.texi +++ /dev/null @@ -1,6785 +0,0 @@ -@c Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -@c 2000, 2001 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 GCC Command Options -@cindex GCC command options -@cindex command options -@cindex options, GCC command - -When you invoke GCC, 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 GCC 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. - -@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 GCC. -* 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. -* Environment Variables:: Env vars that affect GCC. -* 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 -fstd -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 -fpermissive -frepo -fstrict-prototype --fsquangle -ftemplate-depth-@var{n} -fthis-is-variable -fvtable-thunks --nostdinc++ -Wctor-dtor-privacy -Wno-deprecated -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 --finline-functions -finline-limit-@var{n} -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 --mno-sched-prolog - -@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= - -@emph{MN10200 Options} --mrelax - -@emph{MN10300 Options} --mmult-bug --mno-mult-bug --mrelax - -@emph{M32R/D Options} --mcode-model=@var{model type} -msdata=@var{sdata type} --G @var{num} - -@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 --msim -mmvme -mads -myellowknife -memb -msdata --msdata=@var{opt} -G @var{num} - -@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 -mlong32 -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 - -@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} -mpreferred-stack-boundary=@var{num} - -@emph{HPPA Options} --march=@var{architecture type} --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 -mpa-risc-2-0 -mportable-runtime --mschedule=@var{cpu type} -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} - -@emph{ARC Options} --EB -EL --mmangle-cpu -mcpu=@var{cpu} -mtext=@var{text section} --mdata=@var{data section} -mrodata=@var{readonly data section} - -@emph{TMS320C3x/C4x Options} --mcpu=@var{cpu} -mbig -msmall -mregparm -mmemparm --mfast-fix -mmpyi -mbk -mti -mdp-isr-reload --mrpts=@var{count} -mrptb -mdb -mloop-unsigned --mparallel-insns -mparallel-mpy -mpreserve-float - -@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 - -@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 -fvolatile-static --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 GCC. -@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}. GCC 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 GCC 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 -In C mode, support all ANSI standard C programs. In C++ mode, -remove GNU extensions that conflict with ANSI C++. -@c shouldn't we be saying "ISO"? - -This turns off certain features of GCC that are incompatible with ANSI -C (when compiling C code), or of ANSI standard C++ (when compiling C++ code), -such as the @code{asm} 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. For the C compiler, -it disables recognition of C++ style @samp{//} comments as well as -the @code{inline} keyword. For the C++ compiler, -@samp{-foperator-names} is enabled as well. - - -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 -fstd= -Determine the language standard. A value for this option must be provided; -possible values are - -@itemize @minus -@item iso9899:1990 -Same as -ansi - -@item iso9899:199409 -ISO C as modified in amend. 1 - -@item iso9899:199x -ISO C 9x - -@item c89 -same as -std=iso9899:1990 - -@item c9x -same as -std=iso9899:199x - -@item gnu89 -default, iso9899:1990 + gnu extensions - -@item gnu9x -iso9899:199x + gnu extensions -@end itemize - -Even when this option is not specified, you can still use some of the -features of newer standards in so far as they do not conflict with -previous C standards. For example, you may use @code{__restrict__} even -when -fstd=c9x 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 @samp{__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 GCC. - -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. - -@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 -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 -fpermissive -Downgrade messages about nonconformant code from errors to warnings. By -default, g++ effectively sets @samp{-pedantic-errors} without -@samp{-pedantic}; this option reverses that. This behavior and this -option are superceded by @samp{-pedantic}, which works as it does for GNU C. - -@item -frepo -Enable automatic template instantiation. This option also implies -@samp{-fno-implicit-templates}. @xref{Template Instantiation}, for more -information. - -@item -fno-rtti -Disable generation of the information used by C++ runtime type -identification features (@samp{dynamic_cast} and @samp{typeid}). If you -don't use those parts of the language (or exception handling, which uses -@samp{dynamic_cast} internally), you can save some space by using this -flag. - -@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=@var{thunks-version} -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. - -The original implementation of thunks (version 1) had a bug regarding -virtual base classes; this bug is fixed with version 2 of the thunks -implementation. With setting the version to 2, compatibility to the -version 1 thunks is provided, at the cost of extra machine code. Version -3 does not include this compatibility. - -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. Since -version 1 and version 2 are also incompatible (for classes with virtual -bases defining virtual functions), all code must also be compiled with -the same version. - -In this version of gcc, there are no targets for which version 2 thunks -are the default. On all targets, not giving the option will use the -traditional implementation, and -fvtable-thunks will produce version 2 -thunks. - -@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-deprecated (C++ only) -Do not warn about usage of deprecated features. @xref{Deprecated Features}. - -@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 GCC: - -@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 GCC 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 GCC 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 GCC 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}. - -@item -A non-@code{static} function declaration follows a @code{static} one. -This construct is not accepted by some traditional C compilers. -@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 help you 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 GCC -@cindex options, debugging -@cindex debugging information options - -GCC 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, GCC 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 GCC 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, GCC 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 GCC 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 r -Dump after RTL generation, to @file{@var{file}.rtl}. -@item j -Dump after first jump optimization, to @file{@var{file}.jump}. -@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 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. The length of each instruction is -also printed. -@item x -Just generate RTL for a function instead of compiling it. Usually used -with @samp{r}. -@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 GCC 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, GCC 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. GCC 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, -function inlining, and strict aliasing optimizations. 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 -finline-limit-@var{n} -By default, gcc limits the size of functions that can be inlined. This flag -allows the control of this limit for functions that are explicitly marked as -inline (ie marked with the inline keyword or defined within the class -definition in c++). @var{n} is the size of functions that can be inlined in -number of pseudo instructions (not counting parameter handling). The default -value of n is 10000. Increasing this value can result in more inlined code at -the cost of compilation time and memory consumption. Decreasing usually makes -the compilation faster and less code will be inlined (which presumably -means slower programs). This option is particularly useful for programs that -use inlining heavily such as those based on recursive templates with c++. - -@emph{Note:} pseudo instruction represents, in this particular context, an -abstract measurement of function's size. In no way, it represents a count -of assembly instructions and as such its exact meaning might change from one -release to an another. - -@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. - -GCC 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} -@samp{-funroll-all-loops}, and @samp{-fstrict-aliasing}. 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. - -@item -fexpensive-optimizations -Perform a number of minor optimizations that are relatively expensive. - -@item -foptimize-register-moves -@itemx -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. GCC 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 -@itemx -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-loops} 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-movables} 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{gcc@@gcc.gnu.org} 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 -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 GCC uses to overcome shortcomings of particular machines, or special -needs for some languages. -@ifset INTERNALS -(@xref{Interface,,Interfacing to GCC Output}, for more discussion of -@file{libgcc.a}.) -@end ifset -@ifclear INTERNALS -(@xref{Interface,,Interfacing to GCC Output,gcc.info,Porting GCC}, -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 GCC -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 GCC 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, GCC 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 GCC, 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 GCC 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 GCC as a cross-compiler. - -The value to use for @var{machine} is the same as was specified as the -machine type when configuring GCC 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 GCC to run. -This is useful when multiple versions are installed. For example, -@var{version} might be @samp{2.0}, meaning to run GCC version 2.0. - -The default version, when you do not specify @samp{-V}, is the last -version of GCC 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 GCC, 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 - -@menu -* M680x0 Options:: -* VAX Options:: -* SPARC Options:: -* Convex Options:: -* AMD29K Options:: -* ARM Options:: -* Thumb Options:: -* MN10200 Options:: -* MN10300 Options:: -* M32R/D 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:: -* TMS320C3x/C4x Options:: -* V850 Options:: -* ARC Options:: -* NS32K Options:: -@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 GCC 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, GCC 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 GCC, 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}, GCC 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 a future GCC release. -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 a future GCC release. -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}, GCC 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 GCC. -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 -mno-multm -@kindex -mno-multm -Do not generate multm or multmu instructions. This is useful for some embedded -systems which do not have trap handlers for these instructions. -@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 GCC, 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> -@itemx -mtune=<name> -@kindex -mcpu= -@kindex -mtune= -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, strongarm1100, arm8, arm810, -arm9, arm9tdmi. @samp{-mtune=} is a synonym for @samp{-mcpue=} to -support older versions of GCC. - -@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> -@itemx -mfp=<number> -@kindex -mfpe= -@kindex -mfp= -This specifes the version of the floating point emulation available on -the target. Permissable values are 2 and 3. @samp{-mfp=} is a synonym -for @samp{-mfpe=} to support older versions of GCC. - -@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. - -@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. - -@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 Options -@subsection M32R/D Options -@cindex M32R/D options - -These @samp{-m} options are defined for Mitsubishi M32R/D 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. - -@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 -GCC 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 GCC 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 GCC -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, -GCC 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 -GCC 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 GCC. 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 GCC 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 GCC -to generate instructions that are present in the POWER2 architecture but -not the original POWER architecture. - -The @samp{-mpowerpc} option allows GCC 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 -GCC 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 GCC to -use the optional PowerPC architecture instructions in the Graphics -group, including floating-point select. - -The @samp{-mpowerpc64} option allows GCC to generate the additional -64-bit instructions that are found in the full PowerPC64 architecture -and to treat GPRs as 64-bit, doubleword quantities. GCC defaults to -@samp{-mno-powerpc64}. - -If you specify both @samp{-mno-power} and @samp{-mno-powerpc}, GCC -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 GCC 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; -GCC uses that mnemonic irrespective of which of these options is -specified. - -GCC 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}, -@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, GCC 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. GCC 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, GCC will allocate at least one TOC entry for -each unique non-automatic variable reference in your program. GCC -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 GCC from putting floating-point -constants in the TOC and @samp{-mno-sum-in-toc} forces GCC 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 GCC 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 -GCC to make only one TOC entry for every file. When you specify this -option, GCC 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}. GCC 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 GCC 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. - -@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. - -@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. - -@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. - -@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{r3900}, @samp{r4000}, @samp{r4100}, @samp{r4300}, @samp{r4400}, -@samp{r4600}, @samp{r4650}, @samp{r5000}, @samp{r6000}, @samp{r8000}, -and @samp{orion}. Additionally, the @samp{r2000}, @samp{r3000}, -@samp{r4000}, @samp{r5000}, and @samp{r6000} can be abbreviated as -@samp{r2k} (or @samp{r2K}), @samp{r3k}, etc. 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 a @samp{-mipsX} -or @samp{-mabi} switch 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. - -@item -mips4 -Issue instructions from level 4 of the MIPS ISA (conditional move, -prefetch, enhanced FPU instructions). @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 -Force int and long types to be 64 bits wide. See @samp{-mlong32} for an -explanation of the default, and the width of pointers. - -@item -mlong64 -Force long types to be 64 bits wide. See @samp{-mlong32} for an -explanation of the default, and the width of pointers. - -@item -mlong32 -Force long, int, and pointer types to be 32 bits wide. - -If none of @samp{-mlong32}, @samp{-mlong64}, or @samp{-mint64} are set, -the size of ints, longs, and pointers depends on the ABI and ISA choosen. -For @samp{-mabi=32}, and @samp{-mabi=n32}, ints and longs are 32 bits -wide. For @samp{-mabi=64}, ints are 32 bits, and longs are 64 bits wide. -For @samp{-mabi=eabi} and either @samp{-mips1} or @samp{-mips2}, ints -and longs are 32 bits wide. For @samp{-mabi=eabi} and higher ISAs, ints -are 32 bits, and longs are 64 bits wide. The width of pointer types is -the smaller of the width of longs or the width of general purpose -registers (which in turn depends on the ISA). - -@item -mabi=32 -@itemx -mabi=o64 -@itemx -mabi=n32 -@itemx -mabi=64 -@itemx -mabi=eabi -Generate code for the indicated ABI. The default instruction level is -@samp{-mips1} for @samp{32}, @samp{-mips3} for @samp{n32}, and -@samp{-mips4} otherwise. Conversely, with @samp{-mips1} or -@samp{-mips2}, the default ABI is @samp{32}; otherwise, the default ABI -is @samp{64}. - -@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 GCC. -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 -mips16 -@itemx -mno-mips16 -Enable 16-bit instructions. - -@item -mentry -Use the entry and exit pseudo ops. This option can only be used with -@samp{-mips16}. - -@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. -@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: - -@multitable @columnfractions .20 .20 .20 .20 -@item @samp{i386} @tab @samp{i486} @tab @samp{i586} @tab @samp{i686} -@item @samp{pentium} @tab @samp{pentiumpro} @tab @samp{k6} -@end multitable - -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. @samp{i586} is equivalent to @samp{pentium} and @samp{i686} -is equivalent to @samp{pentiumpro}. @samp{k6} is the AMD chip as -opposed to the Intel ones. - -@item -march=@var{cpu type} -Generate instructions for the machine type @var{cpu type}. The choices -for @var{cpu type} are the same as for @samp{-mcpu}. Moreover, -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. These synonyms are deprecated. - -@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 GCC. -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 GCC 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 GCC 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 GCC 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. - -@item -mpreferred-stack-boundary=@var{num} -Attempt to keep the stack boundary aligned to a 2 raised to @var{num} -byte boundary. If @samp{-mpreferred-stack-boundary} is not specified, -the default is 4 (16 bytes or 128 bits). - -The stack is required to be aligned on a 4 byte boundary. On Pentium -and PentiumPro, @code{double} and @code{long double} values should be -aligned to an 8 byte boundary (see @samp{-malign-double}) or suffer -significant run time performance penalties. On Pentium III, the -Streaming SIMD Extention (SSE) data type @code{__m128} suffers similar -penalties if it is not 16 byte aligned. - -To ensure proper alignment of this values on the stack, the stack boundary -must be as aligned as that required by any value stored on the stack. -Further, every function must be generated such that it keeps the stack -aligned. Thus calling a function compiled with a higher preferred -stack boundary from a function compiled with a lower preferred stack -boundary will most likely misalign the stack. It is recommended that -libraries that use callbacks always use the default setting. - -This extra alignment does consume extra stack space. Code that is sensitive -to stack space usage, such as embedded systems and operating system kernels, -may want to reduce the preferred alignment to -@samp{-mpreferred-stack-boundary=2}. -@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 -march=@var{architecture type} -Generate code for the specified architecture. The choices for -@var{architecture type} are @samp{1.0} for PA 1.0, @samp{1.1} for PA -1.1, and @samp{2.0} for PA 2.0 processors. Refer to -@file{/usr/lib/sched.models} on an HP-UX system to determine the proper -architecture option for your machine. Code compiled for lower numbered -architectures will run on higher numbered architectures, but not the -other way around. - -PA 2.0 support currently requires gas snapshot 19990413 or later. The -next release of binutils (current is 2.9.1) will probably contain PA 2.0 -support. - -@item -mpa-risc-1-0 -@itemx -mpa-risc-1-1 -@itemx -mpa-risc-2-0 -Synonyms for -march=1.0, -march=1.1, and -march=2.0 respectively. - -@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} -@samp{7100}, @samp{7100LC}, @samp{7200}, and @samp{8000}. Refer to -@file{/usr/lib/sched.models} on an HP-UX system to determine the -proper scheduling option for your machine. - -@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 GCC, 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. - -@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. -GCC 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 GCC 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 GCC 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 GCC 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 GCC 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. GCC -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, -GCC 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. - -@item -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 - -@node TMS320C3x/C4x Options -@subsection TMS320C3x/C4x Options -@cindex TMS320C3x/C4x Options - -These @samp{-m} options are defined for TMS320C3x/C4x implementations: - -@table @code - -@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{c30}, @samp{c31}, @samp{c32}, @samp{c40}, and -@samp{c44}. The default is @samp{c40} to generate code for the -TMS320C40. - -@item -mbig-memory -@item -mbig -@itemx -msmall-memory -@itemx -msmall -Generates code for the big or small memory model. The small memory -model assumed that all data fits into one 64K word page. At run-time -the data page (DP) register must be set to point to the 64K page -containing the .bss and .data program sections. The big memory model is -the default and requires reloading of the DP register for every direct -memory access. - -@item -mbk -@itemx -mno-bk -Allow (disallow) allocation of general integer operands into the block -count register BK. - -@item -mdb -@itemx -mno-db -Enable (disable) generation of code using decrement and branch, -DBcond(D), instructions. This is enabled by default for the C4x. To be -on the safe side, this is disabled for the C3x, since the maximum -iteration count on the C3x is 2^23 + 1 (but who iterates loops more than -2^23 times on the C3x?). Note that GCC will try to reverse a loop so -that it can utilise the decrement and branch instruction, but will give -up if there is more than one memory reference in the loop. Thus a loop -where the loop counter is decremented can generate slightly more -efficient code, in cases where the RPTB instruction cannot be utilised. - -@item -mdp-isr-reload -@itemx -mparanoid -Force the DP register to be saved on entry to an interrupt service -routine (ISR), reloaded to point to the data section, and restored on -exit from the ISR. This should not be required unless someone has -violated the small memory model by modifying the DP register, say within -an object library. - -@item -mmpyi -@itemx -mno-mpyi -For the C3x use the 24-bit MPYI instruction for integer multiplies -instead of a library call to guarantee 32-bit results. Note that if one -of the operands is a constant, then the multiplication will be performed -using shifts and adds. If the -mmpyi option is not specified for the C3x, -then squaring operations are performed inline instead of a library call. - -@item -mfast-fix -@itemx -mno-fast-fix -The C3x/C4x FIX instruction to convert a floating point value to an -integer value chooses the nearest integer less than or equal to the -floating point value rather than to the nearest integer. Thus if the -floating point number is negative, the result will be incorrectly -truncated an additional code is necessary to detect and correct this -case. This option can be used to disable generation of the additional -code required to correct the result. - -@item -mrptb -@itemx -mno-rptb -Enable (disable) generation of repeat block sequences using the RPTB -instruction for zero overhead looping. The RPTB construct is only used -for innermost loops that do not call functions or jump across the loop -boundaries. There is no advantage having nested RPTB loops due to the -overhead required to save and restore the RC, RS, and RE registers. -This is enabled by default with -O2. - -@item -mrpts=@var{count} -@itemx -mno-rpts -Enable (disable) the use of the single instruction repeat instruction -RPTS. If a repeat block contains a single instruction, and the loop -count can be guaranteed to be less than the value @var{count}, GCC will -emit a RPTS instruction instead of a RPTB. If no value is specified, -then a RPTS will be emitted even if the loop count cannot be determined -at compile time. Note that the repeated instruction following RPTS does -not have to be reloaded from memory each iteration, thus freeing up the -CPU buses for oeprands. However, since interrupts are blocked by this -instruction, it is disabled by default. - -@item -mloop-unsigned -@itemx -mno-loop-unsigned -The maximum iteration count when using RPTS and RPTB (and DB on the C40) -is 2^31 + 1 since these instructions test if the iteration count is -negative to terminate the loop. If the iteration count is unsigned -there is a possibility than the 2^31 + 1 maximum iteration count may be -exceeded. This switch allows an unsigned iteration count. - -@item -mti -Try to emit an assembler syntax that the TI assembler (asm30) is happy -with. This also enforces compatibility with the API employed by the TI -C3x C compiler. For example, long doubles are passed as structures -rather than in floating point registers. - -@item -mregparm -@itemx -mmemparm -Generate code that uses registers (stack) for passing arguments to functions. -By default, arguments are passed in registers where possible rather -than by pushing arguments on to the stack. - -@item -mparallel-insns -@itemx -mno-parallel-insns -Allow the generation of parallel instructions. This is enabled by -default with -O2. - -@item -mparallel-mpy -@itemx -mno-parallel-mpy -Allow the generation of MPY||ADD and MPY||SUB parallel instructions, -provided -mparallel-insns is also specified. These instructions have -tight register constraints which can pessimize the code generation -of large functions. - -@end table - -@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. -@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} -@itemx -mdata=@var{data section} -@itemx -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 - -@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 -GCC-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}, GCC defaults to whichever convention is -standard for the target. If there is no standard convention, GCC -defaults to @samp{-fpcc-struct-return}, except on targets where GCC -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 GCC -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. GCC does not consider static data items to be volatile -because of this switch. - -@item -fvolatile-static -Consider all memory references to static data 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 GCC; 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, GCC 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. GCC will generate -code that is suitable for a detector of bad memory accesses such as -@file{Checker}. - -Normally, you should compile all, or none, of your code with this option. - -If you do mix code compiled with and without this option, -you must ensure that all code that has side effects -and that is called by code compiled with this option -is, itself, compiled with this option. -If you do not, you might get erroneous messages from the detector. - -If you use functions from a library that have side-effects (such as -@code{read}), you might 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 GCC 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 might 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 GCC to add a prefix to the symbols generated for function names. -GCC 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 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 -GCC 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. - -@cindex aliasing of parameters -@cindex parameters, aliased -@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 GCC -@cindex environment variables - -This section describes several environment variables that affect how GCC -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 GCC. - -@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 GCC. -@xref{Driver}. -@end ifset - -@table @code -@item LANG -@itemx LC_CTYPE -@c @itemx LC_COLLATE -@itemx LC_MESSAGES -@c @itemx LC_MONETARY -@c @itemx LC_NUMERIC -@c @itemx LC_TIME -@itemx LC_ALL -@findex LANG -@findex LC_CTYPE -@c @findex LC_COLLATE -@findex LC_MESSAGES -@c @findex LC_MONETARY -@c @findex LC_NUMERIC -@c @findex LC_TIME -@findex LC_ALL -@cindex locale -These environment variables control the way that GCC uses -localization information that allow GCC to work with different -national conventions. GCC inspects the locale categories -@code{LC_CTYPE} and @code{LC_MESSAGES} if it has been configured to do -so. These locale categories can be set to any value supported by your -installation. A typical value is @samp{en_UK} for English in the United -Kingdom. - -The @code{LC_CTYPE} environment variable specifies character -classification. GCC uses it to determine the character boundaries in -a string; this is needed for some multibyte encodings that contain quote -and escape characters that would otherwise be interpreted as a string -end or escape. - -The @code{LC_MESSAGES} environment variable specifies the language to -use in diagnostic messages. - -If the @code{LC_ALL} environment variable is set, it overrides the value -of @code{LC_CTYPE} and @code{LC_MESSAGES}; otherwise, @code{LC_CTYPE} -and @code{LC_MESSAGES} default to the value of the @code{LANG} -environment variable. If none of these variables are set, GCC -defaults to traditional C English behavior. - -@item TMPDIR -@findex TMPDIR -If @code{TMPDIR} is set, it specifies the directory to use for temporary -files. GCC 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. - -If GCC 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}), GCC tries -replacing that beginning with the specified prefix to produce an -alternate directory name. Thus, with @samp{-Bfoo/}, GCC 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}. GCC 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, -GCC tries the directories thus specified when searching for special -linker files, if it can't find them using @code{GCC_EXEC_PREFIX}. Linking -using GCC 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 GCC 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 GCC itself to -scan the program and collect information about the functions it uses. -So neither of these programs will work until GCC 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/contrib/gcc/just-fixinc b/contrib/gcc/just-fixinc deleted file mode 100755 index a7d1968ae5a3..000000000000 --- a/contrib/gcc/just-fixinc +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/sh -# $Id: just-fixinc,v 1.2 1998/04/03 16:35:58 law Exp $ -# This script exists for use after installing -# the GCC binaries from a distribution tape/CD-ROM. -# Use it *after* copying the directory of binaries -# to the proper installed location. -# It runs fixincludes (or fixinc.svr4, if appropriate) to correct bugs in -# the system header files. -# This script needs to be customized for each type of installation so that -# others may run it after the installation-sans-fixincludes is completed. - -# The corrected header files go in the GCC installation directory -# so that only GCC sees them. -# This script does not modify the original header files in /usr/include. -# It only modifies copies in the GCC installation directory. - -installed=/opt/gnu/lib/gcc-lib/sparc-sun-solaris2/2.6.0 -cd $installed/include - -rmdir tmpfoo > /dev/null 2>&1 -mkdir tmpfoo -mv va-sparc.h varargs.h stdarg.h stddef.h limits.h float.h proto.h tmpfoo - -$installed/fixinc.svr4 $installed/include /usr/include $installed - -# Make sure fixed native limits.h gets renamed to syslimits.h before gcc's -# limits.h from tmpfoo is moved back. -rm -f syslimits.h -if test -f limits.h ; then - mv limits.h syslimits.h -else - cp $installed/gsyslimits.h syslimits.h -fi -chmod a+r syslimits.h - -mv tmpfoo/* . -rmdir tmpfoo - -# eof diff --git a/contrib/gcc/libgcc1-test.c b/contrib/gcc/libgcc1-test.c deleted file mode 100644 index d9c250e99d00..000000000000 --- a/contrib/gcc/libgcc1-test.c +++ /dev/null @@ -1,106 +0,0 @@ -/* This small function uses all the arithmetic operators that - libgcc1.c can handle. If you can link it, then - you have provided replacements for all the libgcc1.c functions that - your target machine needs. */ - -int foo (); -double dfoo (); - -/* We don't want __main here because that can drag in atexit (among other - things) which won't necessarily exist yet. */ - -main_without__main () -{ - int a = foo (), b = foo (); - unsigned int au = foo (), bu = foo (); - float af = dfoo (), bf = dfoo (); - double ad = dfoo (), bd = dfoo (); - - discard (a * b); - discard (a / b); - discard (a % b); - - discard (au / bu); - discard (au % bu); - - discard (a >> b); - discard (a << b); - - discard (au >> bu); - discard (au << bu); - - ddiscard (ad + bd); - ddiscard (ad - bd); - ddiscard (ad * bd); - ddiscard (ad / bd); - ddiscard (-ad); - - ddiscard (af + bf); - ddiscard (af - bf); - ddiscard (af * bf); - ddiscard (af / bf); - ddiscard (-af); - - discard ((int) ad); - discard ((int) af); - - ddiscard ((double) a); - ddiscard ((float) a); - ddiscard ((float) ad); - - discard (ad == bd); - discard (ad < bd); - discard (ad > bd); - discard (ad != bd); - discard (ad <= bd); - discard (ad >= bd); - - discard (af == bf); - discard (af < bf); - discard (af > bf); - discard (af != bf); - discard (af <= bf); - discard (af >= bf); - - return 0; -} - -discard (x) - int x; -{} - -ddiscard (x) - double x; -{} - -foo () -{ - static int table[] = {20, 69, 4, 12}; - static int idx; - - return table[idx++]; -} - -double -dfoo () -{ - static double table[] = {20.4, 69.96, 4.4, 202.202}; - static int idx; - - return table[idx++]; -} - -/* Provide functions that some versions of the linker use to default - the start address if -e symbol is not used, to avoid the warning - message saying the start address is defaulted. */ -extern void start() __asm__("start"); -extern void _start() __asm__("_start"); -extern void __start() __asm__("__start"); - -/* Provide functions that might be needed by soft-float emulation routines. */ -void memcpy() {} - -void start() {} -void _start() {} -void __start() {} -void mainCRTStartup() {} diff --git a/contrib/gcc/libgcc1.c b/contrib/gcc/libgcc1.c deleted file mode 100644 index bece50034222..000000000000 --- a/contrib/gcc/libgcc1.c +++ /dev/null @@ -1,596 +0,0 @@ -/* Subroutines needed by GCC output code on some machines. */ -/* Compile this file with the Unix C compiler! */ -/* Copyright (C) 1987, 1988, 1992, 1994, 1995 Free Software Foundation, Inc. - -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, or (at your option) any -later version. - -In addition to the permissions in the GNU General Public License, the -Free Software Foundation gives you unlimited permission to link the -compiled version of this file with other programs, and to distribute -those programs without any restriction coming from the use of this -file. (The General Public License restrictions do apply in other -respects; for example, they cover modification of the file, and -distribution when not linked into another program.) - -This 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 program; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* As a special exception, if you link this library with other files, - some of which are compiled with GCC, to produce an executable, - this library does not by itself cause the resulting executable - to be covered by the GNU General Public License. - This exception does not however invalidate any other reasons why - the executable file might be covered by the GNU General Public License. */ - -#include "config.h" - -/* Don't use `fancy_abort' here even if config.h says to use it. */ -#ifdef abort -#undef abort -#endif - -/* On some machines, cc is really GCC. For these machines, we can't - expect these functions to be properly compiled unless GCC open codes - the operation (which is precisely when the function won't be used). - So allow tm.h to specify ways of accomplishing the operations - by defining the macros perform_*. - - On a machine where cc is some other compiler, there is usually no - reason to define perform_*. The other compiler normally has other ways - of implementing all of these operations. - - In some cases a certain machine may come with GCC installed as cc - or may have some other compiler. Then it may make sense for tm.h - to define perform_* only if __GNUC__ is defined. */ - -#ifndef perform_mulsi3 -#define perform_mulsi3(a, b) return a * b -#endif - -#ifndef perform_divsi3 -#define perform_divsi3(a, b) return a / b -#endif - -#ifndef perform_udivsi3 -#define perform_udivsi3(a, b) return a / b -#endif - -#ifndef perform_modsi3 -#define perform_modsi3(a, b) return a % b -#endif - -#ifndef perform_umodsi3 -#define perform_umodsi3(a, b) return a % b -#endif - -#ifndef perform_lshrsi3 -#define perform_lshrsi3(a, b) return a >> b -#endif - -#ifndef perform_ashrsi3 -#define perform_ashrsi3(a, b) return a >> b -#endif - -#ifndef perform_ashlsi3 -#define perform_ashlsi3(a, b) return a << b -#endif - -#ifndef perform_adddf3 -#define perform_adddf3(a, b) return a + b -#endif - -#ifndef perform_subdf3 -#define perform_subdf3(a, b) return a - b -#endif - -#ifndef perform_muldf3 -#define perform_muldf3(a, b) return a * b -#endif - -#ifndef perform_divdf3 -#define perform_divdf3(a, b) return a / b -#endif - -#ifndef perform_addsf3 -#define perform_addsf3(a, b) return INTIFY (a + b) -#endif - -#ifndef perform_subsf3 -#define perform_subsf3(a, b) return INTIFY (a - b) -#endif - -#ifndef perform_mulsf3 -#define perform_mulsf3(a, b) return INTIFY (a * b) -#endif - -#ifndef perform_divsf3 -#define perform_divsf3(a, b) return INTIFY (a / b) -#endif - -#ifndef perform_negdf2 -#define perform_negdf2(a) return -a -#endif - -#ifndef perform_negsf2 -#define perform_negsf2(a) return INTIFY (-a) -#endif - -#ifndef perform_fixdfsi -#define perform_fixdfsi(a) return (nongcc_SI_type) a; -#endif - -#ifndef perform_fixsfsi -#define perform_fixsfsi(a) return (nongcc_SI_type) a -#endif - -#ifndef perform_floatsidf -#define perform_floatsidf(a) return (double) a -#endif - -#ifndef perform_floatsisf -#define perform_floatsisf(a) return INTIFY ((float) a) -#endif - -#ifndef perform_extendsfdf2 -#define perform_extendsfdf2(a) return a -#endif - -#ifndef perform_truncdfsf2 -#define perform_truncdfsf2(a) return INTIFY (a) -#endif - -/* Note that eqdf2 returns a value for "true" that is == 0, - nedf2 returns a value for "true" that is != 0, - gtdf2 returns a value for "true" that is > 0, - and so on. */ - -#ifndef perform_eqdf2 -#define perform_eqdf2(a, b) return !(a == b) -#endif - -#ifndef perform_nedf2 -#define perform_nedf2(a, b) return a != b -#endif - -#ifndef perform_gtdf2 -#define perform_gtdf2(a, b) return a > b -#endif - -#ifndef perform_gedf2 -#define perform_gedf2(a, b) return (a >= b) - 1 -#endif - -#ifndef perform_ltdf2 -#define perform_ltdf2(a, b) return -(a < b) -#endif - -#ifndef perform_ledf2 -#define perform_ledf2(a, b) return 1 - (a <= b) -#endif - -#ifndef perform_eqsf2 -#define perform_eqsf2(a, b) return !(a == b) -#endif - -#ifndef perform_nesf2 -#define perform_nesf2(a, b) return a != b -#endif - -#ifndef perform_gtsf2 -#define perform_gtsf2(a, b) return a > b -#endif - -#ifndef perform_gesf2 -#define perform_gesf2(a, b) return (a >= b) - 1 -#endif - -#ifndef perform_ltsf2 -#define perform_ltsf2(a, b) return -(a < b) -#endif - -#ifndef perform_lesf2 -#define perform_lesf2(a, b) return 1 - (a <= b); -#endif - -/* Define the C data type to use for an SImode value. */ - -#ifndef nongcc_SI_type -#define nongcc_SI_type long int -#endif - -/* Define the C data type to use for a value of word size */ -#ifndef nongcc_word_type -#define nongcc_word_type nongcc_SI_type -#endif - -/* Define the type to be used for returning an SF mode value - and the method for turning a float into that type. - These definitions work for machines where an SF value is - returned in the same register as an int. */ - -#ifndef FLOAT_VALUE_TYPE -#define FLOAT_VALUE_TYPE int -#endif - -#ifndef INTIFY -#define INTIFY(FLOATVAL) (intify.f = (FLOATVAL), intify.i) -#endif - -#ifndef FLOATIFY -#define FLOATIFY(INTVAL) ((INTVAL).f) -#endif - -#ifndef FLOAT_ARG_TYPE -#define FLOAT_ARG_TYPE union flt_or_int -#endif - -union flt_or_value { FLOAT_VALUE_TYPE i; float f; }; - -union flt_or_int { int i; float f; }; - - -#ifdef L_mulsi3 -nongcc_SI_type -__mulsi3 (a, b) - nongcc_SI_type a, b; -{ - perform_mulsi3 (a, b); -} -#endif - -#ifdef L_udivsi3 -nongcc_SI_type -__udivsi3 (a, b) - unsigned nongcc_SI_type a, b; -{ - perform_udivsi3 (a, b); -} -#endif - -#ifdef L_divsi3 -nongcc_SI_type -__divsi3 (a, b) - nongcc_SI_type a, b; -{ - perform_divsi3 (a, b); -} -#endif - -#ifdef L_umodsi3 -nongcc_SI_type -__umodsi3 (a, b) - unsigned nongcc_SI_type a, b; -{ - perform_umodsi3 (a, b); -} -#endif - -#ifdef L_modsi3 -nongcc_SI_type -__modsi3 (a, b) - nongcc_SI_type a, b; -{ - perform_modsi3 (a, b); -} -#endif - -#ifdef L_lshrsi3 -nongcc_SI_type -__lshrsi3 (a, b) - unsigned nongcc_SI_type a, b; -{ - perform_lshrsi3 (a, b); -} -#endif - -#ifdef L_ashrsi3 -nongcc_SI_type -__ashrsi3 (a, b) - nongcc_SI_type a, b; -{ - perform_ashrsi3 (a, b); -} -#endif - -#ifdef L_ashlsi3 -nongcc_SI_type -__ashlsi3 (a, b) - nongcc_SI_type a, b; -{ - perform_ashlsi3 (a, b); -} -#endif - -#ifdef L_divdf3 -double -__divdf3 (a, b) - double a, b; -{ - perform_divdf3 (a, b); -} -#endif - -#ifdef L_muldf3 -double -__muldf3 (a, b) - double a, b; -{ - perform_muldf3 (a, b); -} -#endif - -#ifdef L_negdf2 -double -__negdf2 (a) - double a; -{ - perform_negdf2 (a); -} -#endif - -#ifdef L_adddf3 -double -__adddf3 (a, b) - double a, b; -{ - perform_adddf3 (a, b); -} -#endif - -#ifdef L_subdf3 -double -__subdf3 (a, b) - double a, b; -{ - perform_subdf3 (a, b); -} -#endif - -/* Note that eqdf2 returns a value for "true" that is == 0, - nedf2 returns a value for "true" that is != 0, - gtdf2 returns a value for "true" that is > 0, - and so on. */ - -#ifdef L_eqdf2 -nongcc_word_type -__eqdf2 (a, b) - double a, b; -{ - /* Value == 0 iff a == b. */ - perform_eqdf2 (a, b); -} -#endif - -#ifdef L_nedf2 -nongcc_word_type -__nedf2 (a, b) - double a, b; -{ - /* Value != 0 iff a != b. */ - perform_nedf2 (a, b); -} -#endif - -#ifdef L_gtdf2 -nongcc_word_type -__gtdf2 (a, b) - double a, b; -{ - /* Value > 0 iff a > b. */ - perform_gtdf2 (a, b); -} -#endif - -#ifdef L_gedf2 -nongcc_word_type -__gedf2 (a, b) - double a, b; -{ - /* Value >= 0 iff a >= b. */ - perform_gedf2 (a, b); -} -#endif - -#ifdef L_ltdf2 -nongcc_word_type -__ltdf2 (a, b) - double a, b; -{ - /* Value < 0 iff a < b. */ - perform_ltdf2 (a, b); -} -#endif - -#ifdef L_ledf2 -nongcc_word_type -__ledf2 (a, b) - double a, b; -{ - /* Value <= 0 iff a <= b. */ - perform_ledf2 (a, b); -} -#endif - -#ifdef L_fixdfsi -nongcc_SI_type -__fixdfsi (a) - double a; -{ - perform_fixdfsi (a); -} -#endif - -#ifdef L_fixsfsi -nongcc_SI_type -__fixsfsi (a) - FLOAT_ARG_TYPE a; -{ - union flt_or_value intify; - perform_fixsfsi (FLOATIFY (a)); -} -#endif - -#ifdef L_floatsidf -double -__floatsidf (a) - nongcc_SI_type a; -{ - perform_floatsidf (a); -} -#endif - -#ifdef L_floatsisf -FLOAT_VALUE_TYPE -__floatsisf (a) - nongcc_SI_type a; -{ - union flt_or_value intify; - perform_floatsisf (a); -} -#endif - -#ifdef L_addsf3 -FLOAT_VALUE_TYPE -__addsf3 (a, b) - FLOAT_ARG_TYPE a, b; -{ - union flt_or_value intify; - perform_addsf3 (FLOATIFY (a), FLOATIFY (b)); -} -#endif - -#ifdef L_negsf2 -FLOAT_VALUE_TYPE -__negsf2 (a) - FLOAT_ARG_TYPE a; -{ - union flt_or_value intify; - perform_negsf2 (FLOATIFY (a)); -} -#endif - -#ifdef L_subsf3 -FLOAT_VALUE_TYPE -__subsf3 (a, b) - FLOAT_ARG_TYPE a, b; -{ - union flt_or_value intify; - perform_subsf3 (FLOATIFY (a), FLOATIFY (b)); -} -#endif - -#ifdef L_eqsf2 -nongcc_word_type -__eqsf2 (a, b) - FLOAT_ARG_TYPE a, b; -{ - union flt_or_int intify; - /* Value == 0 iff a == b. */ - perform_eqsf2 (FLOATIFY (a), FLOATIFY (b)); -} -#endif - -#ifdef L_nesf2 -nongcc_word_type -__nesf2 (a, b) - FLOAT_ARG_TYPE a, b; -{ - union flt_or_int intify; - /* Value != 0 iff a != b. */ - perform_nesf2 (FLOATIFY (a), FLOATIFY (b)); -} -#endif - -#ifdef L_gtsf2 -nongcc_word_type -__gtsf2 (a, b) - FLOAT_ARG_TYPE a, b; -{ - union flt_or_int intify; - /* Value > 0 iff a > b. */ - perform_gtsf2 (FLOATIFY (a), FLOATIFY (b)); -} -#endif - -#ifdef L_gesf2 -nongcc_word_type -__gesf2 (a, b) - FLOAT_ARG_TYPE a, b; -{ - union flt_or_int intify; - /* Value >= 0 iff a >= b. */ - perform_gesf2 (FLOATIFY (a), FLOATIFY (b)); -} -#endif - -#ifdef L_ltsf2 -nongcc_word_type -__ltsf2 (a, b) - FLOAT_ARG_TYPE a, b; -{ - union flt_or_int intify; - /* Value < 0 iff a < b. */ - perform_ltsf2 (FLOATIFY (a), FLOATIFY (b)); -} -#endif - -#ifdef L_lesf2 -nongcc_word_type -__lesf2 (a, b) - FLOAT_ARG_TYPE a, b; -{ - union flt_or_int intify; - /* Value <= 0 iff a <= b. */ - perform_lesf2 (FLOATIFY (a), FLOATIFY (b)); -} -#endif - -#ifdef L_mulsf3 -FLOAT_VALUE_TYPE -__mulsf3 (a, b) - FLOAT_ARG_TYPE a, b; -{ - union flt_or_value intify; - perform_mulsf3 (FLOATIFY (a), FLOATIFY (b)); -} -#endif - -#ifdef L_divsf3 -FLOAT_VALUE_TYPE -__divsf3 (a, b) - FLOAT_ARG_TYPE a, b; -{ - union flt_or_value intify; - perform_divsf3 (FLOATIFY (a), FLOATIFY (b)); -} -#endif - -#ifdef L_truncdfsf2 -FLOAT_VALUE_TYPE -__truncdfsf2 (a) - double a; -{ - union flt_or_value intify; - perform_truncdfsf2 (a); -} -#endif - -#ifdef L_extendsfdf2 -double -__extendsfdf2 (a) - FLOAT_ARG_TYPE a; -{ - union flt_or_value intify; - perform_extendsfdf2 (FLOATIFY (a)); -} -#endif diff --git a/contrib/gcc/listing b/contrib/gcc/listing deleted file mode 100755 index dc989f6eaef2..000000000000 --- a/contrib/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/contrib/gcc/makefile.vms b/contrib/gcc/makefile.vms deleted file mode 100644 index 7f0b7ae309ff..000000000000 --- a/contrib/gcc/makefile.vms +++ /dev/null @@ -1,413 +0,0 @@ -# -# makefile for egcs -# -# Created by Klaus K"ampf, kkaempf@progis.de -# - -# choose egcs or dec c -#CC = gcc -CC = cc - -# With or withou haifa scheduler ? -#HAIFA=,"HAIFA" -HAIFA= - -PWD=sys$$disk:[] -RM=delete/nolog - -ifeq ($(CC),gcc) -ifeq ($(ARCH),ALPHA) -CFLAGS=/define=("HAVE_CONFIG_H=1","USE_COLLECT2" $(HAIFA)) -LIBS=,gnu_cc_library:libgcc.olb/lib,sys$$library:vaxcrtl.olb/lib,gnu_cc_library:crt0.obj -else -CFLAGS=/define=("HAVE_CONFIG_H=1","USE_COLLECT2" $(HAIFA)) -LIBS=,gnu_cc_library:libgcc.olb/lib,sys$$library:vaxcrtl.olb/lib -endif -LFLAGS=/map/full -#LFLAGS= -else -ifeq ($(ARCH),ALPHA) -CFLAGS=/names=as_is/float=ieee/noopt/debug/define=("HAVE_CONFIG_H=1","USE_COLLECT2" $(HAIFA))\ -/warning=disable=(missingreturn,implicitfunc,ptrmismatch,undefescap,longextern,duptypespec) -else -CFLAGS=/noopt/debug/define=("HAVE_CONFIG_H=1","USE_COLLECT2" $(HAIFA)) -endif -LFLAGS=/nomap -LIBS=,sys$$library:vaxcrtl.olb/lib -endif - -BISON = bison -BISON_FLAGS= /Yacc/Define/Verbose -RENAME= rename/New_Version -LINK = link #/noshare/nosysshr -EDIT = edit -SEARCH= search -ABORT = exit %x002C -echo = write sys$$output - -CINCL1 = /Incl=([],[.config]) -CINCL2 = /Incl=([],[.ginclude],[.config]) -CINCL_SUB = /Incl=([],[-],[-.ginclude],[-.config]) -CINCL_CP= /Incl=([],[.config],[.cp],[.cp.inc]) - -MDFILE = [.config.$(ARCH)]$(ARCH).md - -ifeq ($(HAIFA),) -SCHED=sched -else -SCHED=haifa-sched -endif - -GENOBJS=[]rtl.obj,obstack.obj - -INDEPOBJS= []toplev.obj,version.obj,tree.obj,print-tree.obj,stor-layout.obj,\ -fold-const.obj,function.obj,stmt.obj,except.obj,expr.obj,calls.obj,expmed.obj,\ -explow.obj,optabs.obj,varasm.obj,rtl.obj,print-rtl.obj,rtlanal.obj,\ -emit-rtl.obj,genrtl.obj,real.obj,regmove.obj,dbxout.obj,sdbout.obj,dwarfout.obj,\ -dwarf2out.obj,xcoffout.obj,bitmap.obj,alias.obj,\ -integrate.obj,jump.obj,cse.obj,loop.obj,unroll.obj,flow.obj,stupid.obj,\ -combine.obj,regclass.obj,local-alloc.obj,global.obj,reload.obj,\ -reload1.obj,caller-save.obj,insn-peep.obj,reorg.obj,$(SCHED).obj,\ -final.obj,recog.obj,reg-stack.obj,insn-opinit.obj,insn-recog.obj,\ -insn-extract.obj,insn-output.obj,insn-emit.obj,\ -profile.obj,insn-attrtab.obj,\ -aux-output.obj,getpwd.obj,convert.obj - -CC1OBJS=[]c-parse.obj,c-lang.obj,c-lex.obj,c-pragma.obj,c-decl.obj,\ -c-typeck.obj,c-convert.obj,c-aux-info.obj,c-common.obj,c-iterate.obj,\ -obstack.obj - -OBJCOBJS= - -# list copied from cc1plus-objs.opt - -CC1PLUSOBJS=[.cp]call.obj,[.cp]decl2.obj,\ -[.cp]except.obj,[.cp]pt.obj,\ -[.cp]spew.obj,[.cp]xref.obj,[.cp]class.obj,\ -[.cp]expr.obj,[.cp]lex.obj,\ -[.cp]ptree.obj,[.cp]tree.obj,[.cp]cvt.obj,\ -[.cp]errfn.obj,[.cp]rtti.obj,[.cp]method.obj,\ -[.cp]search.obj,[.cp]typeck.obj,[.cp]decl.obj,\ -[.cp]error.obj,[.cp]friend.obj,[.cp]init.obj,[.cp]parse.obj,\ -[.cp]sig.obj,[.cp]typeck2.obj,[.cp]repo.obj,\ -[.cp]input.obj,\ -[]obstack.obj,\ -[]c-common.obj,[]c-pragma.obj - -CCCPOBJS=[]cccp.obj,cexp.obj,version.obj,prefix.obj - -ALLOCA=,[]alloca.obj - -LIBIBERTY = [-.libiberty]libiberty.olb - -CXX_LIB2FUNCS = [.cp]tinfo.obj,[.cp]tinfo2.obj,\ -[.cp]new.obj,[.cp]new1.obj,[.cp]new2.obj,[.cp]exception.obj - -.c.obj: - $(CC) $(CFLAGS) $(CINCL1) $</obj=$@ - -.cc.obj: - $(CC)/plus/CPP="-nostdinc++" $(CFLAGS) $(CINCL_CP) $</obj=$@ - -INSN_INCLUDES=insn-attr.h insn-codes.h insn-config.h insn-flags.h - -# -# -# - -all: cpp.exe cc1.exe float.h limits.h libgcc2.olb - -allplus: cc1plus.exe libgccplus.olb - -libplus: libgccplus.olb - -cc1.exe: $(CC1OBJS) $(ALLOCA) $(INDEPOBJS) - $(LINK)$(LFLAGS)/exe=$@ version.opt/opt,cc1-objs.opt/Opt,independent.opt/Opt$(ALLOCA)$(LIBS) - -cpp.exe: $(CCCPOBJS) $(ALLOCA) - $(LINK)$(LFLAGS)/exe=$@ $(CCCPOBJS),version.opt/opt$(ALLOCA)$(LIBS) - -cc1plus.exe: $(CC1PLUSOBJS) $(ALLOCA) $(INDEPOBJS) - $(LINK)$(LFLAGS)/exe=$@ version.opt/opt,cc1plus-objs.opt/Opt,independent.opt/Opt$(ALLOCA)$(LIBS) - -gcc.exe: gcc.obj version.obj choose-temp.obj pexecute.obj prefix.obj obstack.obj - $(LINK)$(LFLAGS)/exe=$@ $^$(ALLOCA)$(LIBS) - -install: cpp.exe cc1.exe gcc.exe libgcc2.olb - $(CP) $^ GNU_CC_LIBRARY - -installplus: cc1plus.exe libgccplus.olb - $(CP) $^ GNU_CC_LIBRARY - -float.h: enquire.exe - mcr $(PWD)enquire.exe -f > $@ - -limits.h: enquire.exe - mcr $(PWD)enquire.exe -l > $@ - -enquire.exe: enquire.obj - $(LINK)$(LFLAGS)/exe=$@ enquire.obj$(ALLOCA)$(LIBS) - -libgcc2.olb: - $$ @make-l2 - -libgccplus.olb: $(CXX_LIB2FUNCS) - lib/create libgccplus $(CXX_LIB2FUNCS) - -genattr.exe: genattr.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-attr.h: genattr.exe $(MDFILE) - mcr $(PWD)genattr.exe $(MDFILE) > $@ - -genflags.exe: genflags.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-flags.h: genflags.exe $(MDFILE) - mcr $(PWD)genflags.exe $(MDFILE) > $@ - -gencodes.exe: gencodes.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-codes.h: gencodes.exe $(MDFILE) - mcr $(PWD)gencodes.exe $(MDFILE) > $@ - -genconfig.exe: genconfig.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-config.h: genconfig.exe $(MDFILE) - mcr $(PWD)genconfig.exe $(MDFILE) > $@ - -genpeep.exe: genpeep.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-peep.c: genpeep.exe $(MDFILE) - mcr $(PWD)genpeep.exe $(MDFILE) > $@ - -genopinit.exe: genopinit.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-opinit.c: genopinit.exe $(MDFILE) - mcr $(PWD)genopinit.exe $(MDFILE) > $@ - -genrecog.exe: genrecog.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-recog.c: genrecog.exe $(MDFILE) - mcr $(PWD)genrecog.exe $(MDFILE) > $@ - -genextract.exe: genextract.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-extract.c: genextract.exe $(MDFILE) - mcr $(PWD)genextract.exe $(MDFILE) > $@ - -genoutput.exe: genoutput.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-output.c: genoutput.exe $(MDFILE) - mcr $(PWD)genoutput.exe $(MDFILE) > $@ - -genemit.exe: genemit.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-emit.c: genemit.exe $(MDFILE) - mcr $(PWD)genemit.exe $(MDFILE) > $@ - -genattrtab.exe: genattrtab.obj,rtlanal.obj,$(GENOBJS)$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -insn-attrtab.c: genattrtab.exe $(MDFILE) - mcr $(PWD)genattrtab.exe $(MDFILE) > $@ - -gengenrtl.exe: gengenrtl.obj,obstack.obj,$(ALLOCA) - $(LINK) $(LFLAGS)/exe=$@ $^$(LIBS) - -genrtl.h genrtl.c: gengenrtl.exe - mcr $(PWD)gengenrtl.exe genrtl.h genrtl.c - -cccp.obj: cccp.c config.h -aux-output.obj: aux-output.c insn-attr.h insn-flags.h insn-config.h -caller-save.obj: caller-save.c insn-config.h -calls.obj: calls.c insn-flags.h -combine.obj: combine.c insn-attr.h insn-flags.h insn-codes.h insn-config.h -cse.obj: cse.c insn-config.h -c-decl.obj: c-decl.c expr.h integrate.h insn-codes.h insn-config.h -c-lex.obj: c-lex.c genrtl.h -c-typeck.obj: c-typeck.c -dbxout.obj: dbxout.c insn-config.h -dwarfout.obj: dwarfout.c insn-config.h -dwarf2out.obj: dwarf2out.c insn-config.h -emit-rtl.obj: emit-rtl.c insn-config.h -except.obj: except.c insn-flags.h insn-codes.h insn-config.h -explow.obj: explow.c insn-flags.h insn-codes.h insn-config.h -expmed.obj: expmed.c insn-flags.h insn-codes.h insn-config.h -expr.obj: expr.c insn-flags.h insn-config.h -final.obj: final.c tm.h insn-attr.h insn-flags.h insn-codes.h insn-config.h -flow.obj: flow.c insn-config.h -function.obj: function.c insn-flags.h insn-codes.h insn-config.h insn-codes.h insn-config.h -genattrtab.obj: genattrtab.c insn-config.h -genextract.obj: genextract.c insn-config.h -global.obj: global.c insn-config.h -integrate.obj: integrate.c integrate.h insn-flags.h insn-config.h -jump.obj: jump.c insn-flags.h insn-config.h -local-alloc.obj: local-alloc.c insn-config.h -loop.obj: loop.c insn-flags.h insn-config.h -optabs.obj: optabs.c insn-flags.h insn-codes.h insn-config.h -print-rtl.obj: print-rtl.c -profile.obj: profile.c insn-flags.h insn-config.h -recog.obj: recog.c insn-attr.h insn-flags.h insn-codes.h insn-config.h -regclass.obj: regclass.c insn-config.h -reg-stack.obj: reg-stack.c insn-config.h -reload.obj: reload.c insn-codes.h insn-config.h -reload1.obj: reload1.c insn-flags.h insn-codes.h insn-config.h -reorg.obj: reorg.c insn-attr.h insn-flags.h insn-config.h -sched.obj: sched.c insn-attr.h insn-config.h -haifa-sched.obj: haifa-sched.c insn-attr.h insn-config.h -stmt.obj: stmt.c insn-flags.h insn-codes.h insn-config.h -stor-layout.obj: stor-layout.c -stupid.obj: stupid.c -toplev.obj: toplev.c insn-attr.h insn-config.h -unroll.obj: unroll.c insn-config.h - -insn-attrtab.obj: insn-attrtab.c insn-attr.h insn-config.h -insn-output.obj: insn-output.c insn-attr.h insn-flags.h insn-codes.h -insn-emit.obj: insn-emit.c insn-flags.h insn-codes.h insn-config.h -insn-opinit.obj: insn-opinit.c insn-flags.h insn-codes.h insn-config.h -insn-output.obj: insn-config.h -insn-recog.obj: insn-config.h - -varasm.obj: varasm.c tm.h -toplev.obj: toplev.c tm.h - -cexp.c: cexp.y - $(BISON) $(BISON_FLAGS)/output=$@ $< -c-parse.c: c-parse.y - $(BISON) $(BISON_FLAGS)/output=$@ $< -[.cp]parse.c: [.cp]parse.y - $(BISON) $(BISON_FLAGS)/output=$@ $< -[.cp]parse.h: [.cp]parse.c - @$(ECHO) "Must copy YYEMPTY from [.cp]parse.c to [.cp]parse.h" - $$ stop -aux-output.c: [.config.$(ARCH)]$(ARCH).c - copy $< $@ - -expr.h: insn-codes.h -reload.h: insn-config.h -integrate.h: insn-config.h - -config.h: - $$ @vmsconfig - -cleancccp: - $$ purge - $(RM) cccp.obj;,cexp.obj; - $(RM) cpp.exe; - -cleanlib: - $$ purge - $(RM) libgcc2.olb; - -cleanlibplus: - $$ purge - $(RM) [.cp]tinfo.obj; - $(RM) [.cp]tinfo2.obj; - $(RM) [.cp]new.obj; - $(RM) [.cp]new1.obj; - $(RM) [.cp]new2.obj; - $(RM) [.cp]exception.obj; - $(RM) libgccplus.olb; - -clean: - $$ purge - $$ purge [.cp] - $(RM) *.obj;* - $(RM) [.cp]*.obj;* - $(RM) [.cp]parse.output;* - $(RM) *.cpp;* - $(RM) *.s;* - $(RM) *.rtl;* - $(RM) a.out; - $(RM) *.combine; - $(RM) *.cpp; - $(RM) *.cse; - $(RM) *.cse2; - $(RM) *.dbr; - $(RM) *.flow; - $(RM) *.greg; - $(RM) *.jump; - $(RM) *.jump2; - $(RM) *.loop; - $(RM) *.lreg; - $(RM) *.rtl; - $(RM) *.sched; - $(RM) *.sched2; - $(RM) *.map; - $(RM) genattr.exe;,insn-attr.h; - $(RM) genflags.exe;,insn-flags.h; - $(RM) gencodes.exe;,insn-codes.h; - $(RM) genconfig.exe;,insn-config.h; - $(RM) genpeep.exe;,insn-peep.c; - $(RM) genopinit.exe;,insn-opinit.c; - $(RM) genrecog.exe;,insn-recog.c; - $(RM) genextract.exe;,insn-extract.c; - $(RM) genoutput.exe;,insn-output.c; - $(RM) genemit.exe;,insn-emit.c; - $(RM) genattrtab.exe;,insn-attrtab.c; - $(RM) gengenrtl.exe;,genrtl.c;,genrtl.h; - $(RM) cc1.exe; - $(RM) cpp.exe; - $(RM) cc1plus.exe; - $(RM) libgcc2.olb; - $(RM) libgccplus.olb; - $(RM) enquire.exe;,float.h;,limits.h; -# -# clean everything axpconfig.com creates -# -distclean: clean cleancccp - purge [...] - $(RM) config.h; - $(RM) tconfig.h; - $(RM) hconfig.h; - $(RM) tm.h; - $(RM) options.h; - $(RM) specs.h; - $(RM) aux-output.c; - -[.cp]call.obj: [.cp]call.c -[.cp]decl2.obj: [.cp]decl2.c -[.cp]except.obj: [.cp]except.c insn-codes.h insn-flags.h -[.cp]pt.obj: [.cp]pt.c -[.cp]spew.obj: [.cp]spew.c -[.cp]xref.obj: [.cp]xref.c -[.cp]class.obj: [.cp]class.c -[.cp]expr.obj: [.cp]expr.c insn-codes.h -[.cp]lex.obj: [.cp]lex.c [.cp]parse.h -[.cp]ptree.obj: [.cp]ptree.c -[.cp]tree.obj: [.cp]tree.c -[.cp]cvt.obj: [.cp]cvt.c -[.cp]errfn.obj: [.cp]errfn.c -[.cp]rtti.obj: [.cp]rtti.c -[.cp]method.obj: [.cp]method.c insn-codes.h -[.cp]search.obj: [.cp]search.c -[.cp]typeck.obj: [.cp]typeck.c -[.cp]decl.obj: [.cp]decl.c -[.cp]error.obj: [.cp]error.c -[.cp]friend.obj: [.cp]friend.c -[.cp]init.obj: [.cp]init.c -[.cp]parse.obj: [.cp]parse.c - $(CC) $(CFLAGS) $(CINCL_CP) $^/obj=$@ -[.cp]sig.obj: [.cp]sig.c -[.cp]typeck2.obj: [.cp]typeck2.c -[.cp]repo.obj: [.cp]repo.c -[.cp]input.obj: [.cp]input.c - $(TOUCH) $@ -# g++ library -[.cp]tinfo.obj: [.cp]tinfo.cc -[.cp]tinfo2.obj: [.cp]tinfo2.cc -[.cp]new.obj: [.cp]new.cc -[.cp]new1.obj: [.cp]new1.cc -[.cp]new2.obj: [.cp]new2.cc -[.cp]exception.obj: [.cp]exception.cc - -#EOF diff --git a/contrib/gcc/md.texi b/contrib/gcc/md.texi deleted file mode 100644 index 907df37080e8..000000000000 --- a/contrib/gcc/md.texi +++ /dev/null @@ -1,4258 +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. - -@cindex @code{prologue} instruction pattern -@item @samp{prologue} -This pattern, if defined, emits RTL for entry to a function. The function -entry is resposible for setting up the stack frame, initializing the frame -pointer register, saving callee saved registers, etc. - -Using a prologue pattern is generally preferred over defining -@code{FUNCTION_PROLOGUE} to emit assembly code for the prologue. - -The @code{prologue} pattern is particularly useful for targets which perform -instruction scheduling. - -@cindex @code{epilogue} instruction pattern -@item @samp{epilogue} -This pattern, if defined, emits RTL for exit from a function. The function -exit is resposible for deallocating the stack frame, restoring callee saved -registers and emitting the return instruction. - -Using an epilogue pattern is generally preferred over defining -@code{FUNCTION_EPILOGUE} to emit assembly code for the prologue. - -The @code{epilogue} pattern is particularly useful for targets which perform -instruction scheduling or which have delay slots for their return instruction. - -@cindex @code{sibcall_epilogue} instruction pattern -@item @samp{sibcall_epilogue} -This pattern, if defined, emits RTL for exit from a function without the final -branch back to the calling function. This pattern will be emitted before any -sibling call (aka tail call) sites. - -The @code{sibcall_epilogue} pattern must not clobber any arguments used for -parameter passing or any stack slots for arguments passed to the current -function. -@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), @code{attr}, -@code{symbol_ref}, simple arithmetic expressions, and @code{set_attr} -overrides on specific instructions (@pxref{Tagging Insns}). - -@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. - -@findex attr -@item (attr @var{name}) -The value of another attribute is returned. This is most useful -for numeric attributes, as @code{eq_attr} and @code{attr_flag} -produce more efficient code for non-numeric attributes. -@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/contrib/gcc/objc/Makefile.in b/contrib/gcc/objc/Makefile.in deleted file mode 100644 index 71c564c6c59c..000000000000 --- a/contrib/gcc/objc/Makefile.in +++ /dev/null @@ -1,73 +0,0 @@ -# GNU Objective C frontend Makefile -# Copyright (C) 1993, 1995, 1996, 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. - -# The Makefile built from this file lives in the objc language subdirectory. -# Its purpose is to provide support for: -# -# 1. recursion where necessary, and only then (building .o's), and -# 2. building and debugging cc1objc from the language subdirectory. -# -# The parent Makefile handles all other chores, with help from the language -# Makefile fragment. -# -# The targets for external use are `all' and `mostlyclean'. - -SHELL=/bin/sh - -OPTIMIZE= -O - -srcdir = . -VPATH = $(srcdir) - -AR = ar -AR_FLAGS = rc - -# 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 = - -# Definition of `all' is here so that new rules inserted by sed -# do not specify the default target. -all: all.indirect - -# sed inserts variable overrides after the following line. -####target overrides -####host overrides -####cross overrides -####build overrides -# - -# Now figure out from those variables how to compile and link. -all.indirect: Makefile frontend - -frontend: - cd ..; $(MAKE) cc1obj$(exeext) - -Makefile: $(srcdir)/Makefile.in $(srcdir)/../configure - cd ..; $(SHELL) config.status - -mostlyclean: - -rm -f *.o xforward fflags -clean: mostlyclean -distclean: mostlyclean -extraclean: mostlyclean - -# For Sun VPATH. - diff --git a/contrib/gcc/objc/objc.gperf b/contrib/gcc/objc/objc.gperf deleted file mode 100644 index 407459f15898..000000000000 --- a/contrib/gcc/objc/objc.gperf +++ /dev/null @@ -1,64 +0,0 @@ -%{ -/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ objc.gperf */ -%} -struct resword { char *name; short token; enum rid rid; }; -%% -@defs, DEFS, NORID -@encode, ENCODE, NORID -@end, END, NORID -@implementation, IMPLEMENTATION, NORID -@interface, INTERFACE, NORID -@public, PUBLIC, NORID -@selector, SELECTOR, NORID -__alignof, ALIGNOF, NORID -__alignof__, ALIGNOF, NORID -__asm, ASM, NORID -__asm__, ASM, NORID -__attribute, ATTRIBUTE, NORID -__attribute__, ATTRIBUTE, NORID -__const, TYPE_QUAL, RID_CONST -__const__, TYPE_QUAL, RID_CONST -__extension__, EXTENSION, NORID -__inline, SCSPEC, RID_INLINE -__inline__, SCSPEC, RID_INLINE -__signed, TYPESPEC, RID_SIGNED -__signed__, TYPESPEC, RID_SIGNED -__typeof, TYPEOF, NORID -__typeof__, TYPEOF, NORID -__volatile, TYPE_QUAL, RID_VOLATILE -__volatile__, TYPE_QUAL, RID_VOLATILE -asm, ASM, NORID -auto, SCSPEC, RID_AUTO -break, BREAK, NORID -case, CASE, NORID -char, TYPESPEC, RID_CHAR -const, TYPE_QUAL, RID_CONST -continue, CONTINUE, NORID -default, DEFAULT, NORID -do, DO, NORID -double, TYPESPEC, RID_DOUBLE -else, ELSE, NORID -enum, ENUM, NORID -extern, SCSPEC, RID_EXTERN -float, TYPESPEC, RID_FLOAT -for, FOR, NORID -goto, GOTO, NORID -if, IF, NORID -inline, SCSPEC, RID_INLINE -int, TYPESPEC, RID_INT -long, TYPESPEC, RID_LONG -register, SCSPEC, RID_REGISTER -return, RETURN, NORID -short, TYPESPEC, RID_SHORT -signed, TYPESPEC, RID_SIGNED -sizeof, SIZEOF, NORID -static, SCSPEC, RID_STATIC -struct, STRUCT, NORID -switch, SWITCH, NORID -typedef, SCSPEC, RID_TYPEDEF -typeof, TYPEOF, NORID -union, UNION, NORID -unsigned, TYPESPEC, RID_UNSIGNED -void, TYPESPEC, RID_VOID -volatile, TYPE_QUAL, RID_VOLATILE -while, WHILE, NORID diff --git a/contrib/gcc/patch-apollo-includes b/contrib/gcc/patch-apollo-includes deleted file mode 100755 index 8daf88cb54e8..000000000000 --- a/contrib/gcc/patch-apollo-includes +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh -# patch-apollo-includes -- fix some (but not all!) Apollo brain damage. - -FILES_TO_PATCH='sys/types.h setjmp.h' - -mkdir sys - -for i in $FILES_TO_PATCH; -do - cp /bsd4.3/usr/include/$i ./$i -done - -patch -b -apollo <<'EOP' -*** /bsd4.3/usr/include/sys/types.h Fri Apr 8 20:29:06 1988 ---- sys/types.h Wed Feb 26 21:17:57 1992 -*************** -*** 38,44 **** ---- 38,47 ---- - typedef char * caddr_t; - typedef u_long ino_t; - typedef long swblk_t; -+ #ifndef _SIZE_T -+ #define _SIZE_T - typedef long size_t; -+ #endif - typedef long time_t; - typedef long dev_t; - typedef long off_t; -*** /bsd4.3/usr/include/setjmp.h Fri Feb 3 21:40:21 1989 ---- setjmp.h Sun Feb 23 19:06:55 1992 -*************** -*** 24,30 **** ---- 24,39 ---- - #endif - - -+ #ifdef __GNUC__ - #ifdef _PROTOTYPES -+ extern int sigsetjmp (sigjmp_buf env, int savemask); -+ extern void siglongjmp (sigjmp_buf env, int val); -+ #else -+ extern int sigsetjmp(); -+ extern void siglongjmp(); -+ #endif /* _PROTOTYPES */ -+ #else /* not __GNUC__ */ -+ #ifdef _PROTOTYPES - extern int sigsetjmp( - sigjmp_buf env, - int savemask -*************** -*** 37,43 **** - extern int sigsetjmp() #options(abnormal); - extern void siglongjmp() #options(noreturn); - #endif /* _PROTOTYPES */ -! - #undef _PROTOTYPES - - #ifdef __cplusplus ---- 46,52 ---- - extern int sigsetjmp() #options(abnormal); - extern void siglongjmp() #options(noreturn); - #endif /* _PROTOTYPES */ -! #endif /* not __GNUC__ */ - #undef _PROTOTYPES - - #ifdef __cplusplus -EOP - -exit 0 diff --git a/contrib/gcc/pcp.h b/contrib/gcc/pcp.h deleted file mode 100644 index 280a65ec35da..000000000000 --- a/contrib/gcc/pcp.h +++ /dev/null @@ -1,101 +0,0 @@ -/* pcp.h -- Describes the format of a precompiled file - Copyright (C) 1990 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. */ - - - -/* Structure allocated for every string in a precompiled file */ -typedef struct stringdef STRINGDEF; -struct stringdef -{ - U_CHAR *contents; /* String to include */ - int len; /* Its length */ - int writeflag; /* Whether we write this */ - int lineno; /* Linenumber of source file */ - U_CHAR *filename; /* Name of source file */ - STRINGDEF *chain; /* Global list of strings in natural order */ - int output_mark; /* Where in the output this goes */ -}; - -typedef struct keydef KEYDEF; -struct keydef -{ - STRINGDEF *str; - KEYDEF *chain; -}; - -/* Format: */ -/* A precompiled file starts with a series of #define and #undef - statements: - #define MAC DEF --- Indicates MAC must be defined with defn DEF - #define MAC --- Indicates MAC must be defined with any defn - #undef MAC --- Indicates MAC cannot be defined - -These preconditions must be true for a precompiled file to be used. -The preconditions section is null terminated. */ - -/* Then, there is a four byte number (in network byte order) which */ - /* indicates the number of strings the file contains. */ - -/* Each string contains a STRINGDEF structure. The only component of */ - /* the STRINGDEF structure which is used is the lineno field, which */ - /* should hold the line number in the original header file. */ - /* Then follows the string, followed by a null. Then comes a four */ - /* byte number (again, in network byte order) indicating the number */ - /* of keys for this string. Each key is a KEYDEF structure, with */ - /* irrelevant contents, followed by the null-terminated string. */ - -/* If the number of keys is 0, then there are no keys for the string, */ - /* in other words, the string will never be included. If the number */ - /* of keys is -1, this is a special flag indicating there are no keys */ - /* in the file, and the string is mandatory (that is, it must be */ - /* included regardless in the included output). */ - -/* A file, then, looks like this: - - Precondition 1 - Precondition 2 - . - . - . - <NUL> - Number of strings - STRINGDEF - String . . . <NUL> - Number of keys - KEYDEF - Key . . . <NUL> - KEYDEF - Key . . . <NUL> - . - . - . - STRINGDEF - String . . . <NUL> - Number of keys - KEYDEF - Key . . . <NUL> - . - . - . - . - . - . - -*/ diff --git a/contrib/gcc/pself.c b/contrib/gcc/pself.c deleted file mode 100644 index d8471daafeae..000000000000 --- a/contrib/gcc/pself.c +++ /dev/null @@ -1 +0,0 @@ -main(){char*p="main(){char*p=%c%s%c;(void)printf(p,34,p,34,10);}%c";(void)printf(p,34,p,34,10);} diff --git a/contrib/gcc/pself1.c b/contrib/gcc/pself1.c deleted file mode 100644 index acdfc650583d..000000000000 --- a/contrib/gcc/pself1.c +++ /dev/null @@ -1 +0,0 @@ -main(a){a="main(a){a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}
\ No newline at end of file diff --git a/contrib/gcc/pself2.c b/contrib/gcc/pself2.c deleted file mode 100644 index c88a8c1046d8..000000000000 --- a/contrib/gcc/pself2.c +++ /dev/null @@ -1 +0,0 @@ -main(){char*a="main(){char*a=%c%s%c;int b='%c';printf(a,b,a,b,b);}";int b='"';printf(a,b,a,b,b);} diff --git a/contrib/gcc/pself3.c b/contrib/gcc/pself3.c deleted file mode 100644 index dbdeac6e4104..000000000000 --- a/contrib/gcc/pself3.c +++ /dev/null @@ -1 +0,0 @@ -main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);} diff --git a/contrib/gcc/pself4.c b/contrib/gcc/pself4.c deleted file mode 100644 index 02a6f7cded63..000000000000 --- a/contrib/gcc/pself4.c +++ /dev/null @@ -1,2 +0,0 @@ -#include <stdio.h> -int main(void){char*p="#include <stdio.h>%cint main(void){char*p=%c%s%c;(void)printf(p,10,34,p,34,10);return 0;}%c";(void)printf(p,10,34,p,34,10);return 0;} diff --git a/contrib/gcc/pself5.c b/contrib/gcc/pself5.c deleted file mode 100644 index 8f6f8e3b26f2..000000000000 --- a/contrib/gcc/pself5.c +++ /dev/null @@ -1,5 +0,0 @@ -#include <stdio.h> -#define N '\n' -#define Q '\"' -#define B '\\' -int main(void){char*p="#include <stdio.h>%c#define N '%cn'%c#define Q '%c%c'%c#define B '%c%c'%cint main(void){char*p=%c%s%c;(void)printf(p,N,B,N,B,Q,N,B,B,N,Q,p,Q,N);return 0;}%c";(void)printf(p,N,B,N,B,Q,N,B,B,N,Q,p,Q,N);return 0;} diff --git a/contrib/gcc/rtl.texi b/contrib/gcc/rtl.texi deleted file mode 100644 index ebb07acabb27..000000000000 --- a/contrib/gcc/rtl.texi +++ /dev/null @@ -1,2998 +0,0 @@ -@c Copyright (C) 1988, 89, 92, 94, 97, 1998, 1999 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. -* RTL Classes:: Categories of RTL expresion objects, and their structure. -* 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, RTL Classes, 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 RTL Classes, Accessors, RTL Objects, RTL -@section RTL Classes and Formats -@cindex RTL classes -@cindex classes of RTX codes -@cindex RTX codes, classes of -@findex GET_RTX_CLASS - -The various expression codes are divided into several @dfn{classes}, -which are represented by single characters. You can determine the class -of an RTX code with the macro @code{GET_RTX_CLASS (@var{code})}. -Currently, @file{rtx.def} defines these classes: - -@table @code -@item o -An RTX code that represents an actual object, such as a register -(@code{REG}) or a memory location (@code{MEM}, @code{SYMBOL_REF}). -Constants and basic transforms on objects (@code{ADDRESSOF}, -@code{HIGH}, @code{LO_SUM}) are also included. Note that @code{SUBREG} -and @code{STRICT_LOW_PART} are not in this class, but in class @code{x}. - -@item < -An RTX code for a comparison, such as @code{NE} or @code{LT}. - -@item 1 -An RTX code for a unary arithmetic operation, such as @code{NEG}, -@code{NOT}, or @code{ABS}. This category also includes value extension -(sign or zero) and conversions between integer and floating point. - -@item c -An RTX code for a commutative binary operation, such as @code{PLUS} or -@code{AND}. @code{NE} and @code{EQ} are comparisons, so they have class -@code{<}. - -@item 2 -An RTX code for a non-commutative binary operation, such as @code{MINUS}, -@code{DIV}, or @code{ASHIFTRT}. - -@item b -An RTX code for a bitfield operation. Currently only -@code{ZERO_EXTRACT} and @code{SIGN_EXTRACT}. These have three inputs -and are lvalues (so they can be used for insertion as well). @xref{Bit -Fields}. - -@item 3 -An RTX code for other three input operations. Currently only -@code{IF_THEN_ELSE}. - -@item i -An RTX code for an entire instruction: @code{INSN}, @code{JUMP_INSN}, and -@code{CALL_INSN}. @xref{Insns}. - -@item m -An RTX code for something that matches in insns, such as -@code{MATCH_DUP}. These only occur in machine descriptions. - -@item x -All other RTX codes. This category includes the remaining codes used -only in machine descriptions (@code{DEFINE_*}, etc.). It also includes -all the codes describing side effects (@code{SET}, @code{USE}, -@code{CLOBBER}, etc.) and the non-insns that may appear on an insn -chain, such as @code{NOTE}, @code{BARRIER}, and @code{CODE_LABEL}. -@end table - -@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}. For example, 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 and the format -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. -@end table - -Some classes of RTX codes always have the same format. For example, it -is safe to assume that all comparison operations have format @code{ee}. - -@table @code -@item 1 -All codes of this class have format @code{e}. - -@item < -@itemx c -@itemx 2 -All codes of these classes have format @code{ee}. - -@item b -@itemx 3 -All codes of these classes have format @code{eee}. - -@item i -All codes of this class have formats that begin with @code{iuueiee}. -@xref{Insns}. Note that not all RTL objects linked onto an insn chain -are of class @code{i}. - -@item o -@itemx m -@itemx x -You can make no assumptions about the format of these codes. -@end table - -@node Accessors, Flags, RTL Classes, RTL -@section Access to Operands -@cindex accessors -@cindex access to operands -@cindex operand access - -@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 RTX_FRAME_RELATED_P -@item RTX_FRAME_RELATED_P (@var{x}) -Nonzero in an insn or expression which is part of a function -prologue and sets the stack pointer, sets the frame pointer, or saves a -register. This flag is required for exception handling support -on targets with RTL prologues. - -@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/contrib/gcc/sched.c b/contrib/gcc/sched.c deleted file mode 100644 index f09a68ae3694..000000000000 --- a/contrib/gcc/sched.c +++ /dev/null @@ -1,4470 +0,0 @@ -/* Instruction scheduling pass. - Copyright (C) 1992, 93-98, 1999 Free Software Foundation, Inc. - Contributed by Michael Tiemann (tiemann@cygnus.com) - Enhanced by, and currently maintained by, Jim Wilson (wilson@cygnus.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. */ - -/* Instruction scheduling pass. - - This pass implements list scheduling within basic blocks. It is - run after flow analysis, but before register allocation. The - scheduler works as follows: - - We compute insn priorities based on data dependencies. Flow - analysis only creates a fraction of the data-dependencies we must - observe: namely, only those dependencies which the combiner can be - expected to use. For this pass, we must therefore create the - remaining dependencies we need to observe: register dependencies, - memory dependencies, dependencies to keep function calls in order, - and the dependence between a conditional branch and the setting of - condition codes are all dealt with here. - - The scheduler first traverses the data flow graph, starting with - the last instruction, and proceeding to the first, assigning - values to insn_priority as it goes. This sorts the instructions - topologically by data dependence. - - Once priorities have been established, we order the insns using - list scheduling. This works as follows: starting with a list of - all the ready insns, and sorted according to priority number, we - schedule the insn from the end of the list by placing its - predecessors in the list according to their priority order. We - consider this insn scheduled by setting the pointer to the "end" of - the list to point to the previous insn. When an insn has no - predecessors, we either queue it until sufficient time has elapsed - or add it to the ready list. As the instructions are scheduled or - when stalls are introduced, the queue advances and dumps insns into - the ready list. When all insns down to the lowest priority have - been scheduled, the critical path of the basic block has been made - as short as possible. The remaining insns are then scheduled in - remaining slots. - - Function unit conflicts are resolved during reverse list scheduling - by tracking the time when each insn is committed to the schedule - and from that, the time the function units it uses must be free. - As insns on the ready list are considered for scheduling, those - that would result in a blockage of the already committed insns are - queued until no blockage will result. Among the remaining insns on - the ready list to be considered, the first one with the largest - potential for causing a subsequent blockage is chosen. - - The following list shows the order in which we want to break ties - among insns in the ready list: - - 1. choose insn with lowest conflict cost, ties broken by - 2. choose insn with the longest path to end of bb, ties broken by - 3. choose insn that kills the most registers, ties broken by - 4. choose insn that conflicts with the most ready insns, or finally - 5. choose insn with lowest UID. - - Memory references complicate matters. Only if we can be certain - that memory references are not part of the data dependency graph - (via true, anti, or output dependence), can we move operations past - memory references. To first approximation, reads can be done - independently, while writes introduce dependencies. Better - approximations will yield fewer dependencies. - - Dependencies set up by memory references are treated in exactly the - same way as other dependencies, by using LOG_LINKS. - - Having optimized the critical path, we may have also unduly - extended the lifetimes of some registers. If an operation requires - that constants be loaded into registers, it is certainly desirable - to load those constants as early as necessary, but no earlier. - I.e., it will not do to load up a bunch of registers at the - beginning of a basic block only to use them at the end, if they - could be loaded later, since this may result in excessive register - utilization. - - Note that since branches are never in basic blocks, but only end - basic blocks, this pass will not do any branch scheduling. But - that is ok, since we can use GNU's delayed branch scheduling - pass to take care of this case. - - Also note that no further optimizations based on algebraic identities - are performed, so this pass would be a good one to perform instruction - splitting, such as breaking up a multiply instruction into shifts - and adds where that is profitable. - - Given the memory aliasing analysis that this pass should perform, - it should be possible to remove redundant stores to memory, and to - load values from registers instead of hitting memory. - - This pass must update information that subsequent passes expect to be - correct. Namely: reg_n_refs, reg_n_sets, reg_n_deaths, - reg_n_calls_crossed, and reg_live_length. Also, BLOCK_HEAD, - BLOCK_END. - - The information in the line number notes is carefully retained by - this pass. Notes that refer to the starting and ending of - exception regions are also carefully retained by this pass. All - other NOTE insns are grouped in their same relative order at the - beginning of basic blocks that have been scheduled. */ - -#include "config.h" -#include "system.h" -#include "toplev.h" -#include "rtl.h" -#include "basic-block.h" -#include "regs.h" -#include "hard-reg-set.h" -#include "flags.h" -#include "insn-config.h" -#include "insn-attr.h" -#include "recog.h" - -#ifndef INSN_SCHEDULING -void -schedule_insns (dump_file) - FILE *dump_file ATTRIBUTE_UNUSED; -{ -} -#else /* INSN_SCHEDULING -- rest of file */ - -extern char *reg_known_equiv_p; -extern rtx *reg_known_value; - -/* Arrays set up by scheduling for the same respective purposes as - similar-named arrays set up by flow analysis. We work with these - arrays during the scheduling pass so we can compare values against - unscheduled code. - - Values of these arrays are copied at the end of this pass into the - arrays set up by flow analysis. */ -static int *sched_reg_n_calls_crossed; -static int *sched_reg_live_length; - -/* Element N is the next insn that sets (hard or pseudo) register - N within the current basic block; or zero, if there is no - such insn. Needed for new registers which may be introduced - by splitting insns. */ -static rtx *reg_last_uses; -static rtx *reg_last_sets; -static regset reg_pending_sets; -static int reg_pending_sets_all; - -/* Vector indexed by INSN_UID giving the original ordering of the insns. */ -static int *insn_luid; -#define INSN_LUID(INSN) (insn_luid[INSN_UID (INSN)]) - -/* Vector indexed by INSN_UID giving each instruction a priority. */ -static int *insn_priority; -#define INSN_PRIORITY(INSN) (insn_priority[INSN_UID (INSN)]) - -static short *insn_costs; -#define INSN_COST(INSN) insn_costs[INSN_UID (INSN)] - -/* Vector indexed by INSN_UID giving an encoding of the function units - used. */ -static short *insn_units; -#define INSN_UNIT(INSN) insn_units[INSN_UID (INSN)] - -/* Vector indexed by INSN_UID giving an encoding of the blockage range - function. The unit and the range are encoded. */ -static unsigned int *insn_blockage; -#define INSN_BLOCKAGE(INSN) insn_blockage[INSN_UID (INSN)] -#define UNIT_BITS 5 -#define BLOCKAGE_MASK ((1 << BLOCKAGE_BITS) - 1) -#define ENCODE_BLOCKAGE(U,R) \ - ((((U) << UNIT_BITS) << BLOCKAGE_BITS \ - | MIN_BLOCKAGE_COST (R)) << BLOCKAGE_BITS \ - | MAX_BLOCKAGE_COST (R)) -#define UNIT_BLOCKED(B) ((B) >> (2 * BLOCKAGE_BITS)) -#define BLOCKAGE_RANGE(B) \ - (((((B) >> BLOCKAGE_BITS) & BLOCKAGE_MASK) << (HOST_BITS_PER_INT / 2)) \ - | ((B) & BLOCKAGE_MASK)) - -/* Encodings of the `<name>_unit_blockage_range' function. */ -#define MIN_BLOCKAGE_COST(R) ((R) >> (HOST_BITS_PER_INT / 2)) -#define MAX_BLOCKAGE_COST(R) ((R) & ((1 << (HOST_BITS_PER_INT / 2)) - 1)) - -#define DONE_PRIORITY -1 -#define MAX_PRIORITY 0x7fffffff -#define TAIL_PRIORITY 0x7ffffffe -#define LAUNCH_PRIORITY 0x7f000001 -#define DONE_PRIORITY_P(INSN) (INSN_PRIORITY (INSN) < 0) -#define LOW_PRIORITY_P(INSN) ((INSN_PRIORITY (INSN) & 0x7f000000) == 0) - -/* Vector indexed by INSN_UID giving number of insns referring to this insn. */ -static int *insn_ref_count; -#define INSN_REF_COUNT(INSN) (insn_ref_count[INSN_UID (INSN)]) - -/* Vector indexed by INSN_UID giving line-number note in effect for each - insn. For line-number notes, this indicates whether the note may be - reused. */ -static rtx *line_note; -#define LINE_NOTE(INSN) (line_note[INSN_UID (INSN)]) - -/* Vector indexed by basic block number giving the starting line-number - for each basic block. */ -static rtx *line_note_head; - -/* List of important notes we must keep around. This is a pointer to the - last element in the list. */ -static rtx note_list; - -/* Regsets telling whether a given register is live or dead before the last - scheduled insn. Must scan the instructions once before scheduling to - determine what registers are live or dead at the end of the block. */ -static regset bb_dead_regs; -static regset bb_live_regs; - -/* Regset telling whether a given register is live after the insn currently - being scheduled. Before processing an insn, this is equal to bb_live_regs - above. This is used so that we can find registers that are newly born/dead - after processing an insn. */ -static regset old_live_regs; - -/* The chain of REG_DEAD notes. REG_DEAD notes are removed from all insns - during the initial scan and reused later. If there are not exactly as - many REG_DEAD notes in the post scheduled code as there were in the - prescheduled code then we trigger an abort because this indicates a bug. */ -static rtx dead_notes; - -/* Queues, etc. */ - -/* An instruction is ready to be scheduled when all insns following it - have already been scheduled. It is important to ensure that all - insns which use its result will not be executed until its result - has been computed. An insn is maintained in one of four structures: - - (P) the "Pending" set of insns which cannot be scheduled until - their dependencies have been satisfied. - (Q) the "Queued" set of insns that can be scheduled when sufficient - time has passed. - (R) the "Ready" list of unscheduled, uncommitted insns. - (S) the "Scheduled" list of insns. - - Initially, all insns are either "Pending" or "Ready" depending on - whether their dependencies are satisfied. - - Insns move from the "Ready" list to the "Scheduled" list as they - are committed to the schedule. As this occurs, the insns in the - "Pending" list have their dependencies satisfied and move to either - the "Ready" list or the "Queued" set depending on whether - sufficient time has passed to make them ready. As time passes, - insns move from the "Queued" set to the "Ready" list. Insns may - move from the "Ready" list to the "Queued" set if they are blocked - due to a function unit conflict. - - The "Pending" list (P) are the insns in the LOG_LINKS of the unscheduled - insns, i.e., those that are ready, queued, and pending. - The "Queued" set (Q) is implemented by the variable `insn_queue'. - The "Ready" list (R) is implemented by the variables `ready' and - `n_ready'. - The "Scheduled" list (S) is the new insn chain built by this pass. - - The transition (R->S) is implemented in the scheduling loop in - `schedule_block' when the best insn to schedule is chosen. - The transition (R->Q) is implemented in `schedule_select' when an - insn is found to have a function unit conflict with the already - committed insns. - The transitions (P->R and P->Q) are implemented in `schedule_insn' as - insns move from the ready list to the scheduled list. - The transition (Q->R) is implemented at the top of the scheduling - loop in `schedule_block' as time passes or stalls are introduced. */ - -/* Implement a circular buffer to delay instructions until sufficient - time has passed. INSN_QUEUE_SIZE is a power of two larger than - MAX_BLOCKAGE and MAX_READY_COST computed by genattr.c. This is the - longest time an isnsn may be queued. */ -static rtx insn_queue[INSN_QUEUE_SIZE]; -static int q_ptr = 0; -static int q_size = 0; -#define NEXT_Q(X) (((X)+1) & (INSN_QUEUE_SIZE-1)) -#define NEXT_Q_AFTER(X,C) (((X)+C) & (INSN_QUEUE_SIZE-1)) - -/* Vector indexed by INSN_UID giving the minimum clock tick at which - the insn becomes ready. This is used to note timing constraints for - insns in the pending list. */ -static int *insn_tick; -#define INSN_TICK(INSN) (insn_tick[INSN_UID (INSN)]) - -/* Data structure for keeping track of register information - during that register's life. */ - -struct sometimes -{ - int regno; - int live_length; - int calls_crossed; -}; - -/* Forward declarations. */ -static void add_dependence PROTO((rtx, rtx, enum reg_note)); -static void remove_dependence PROTO((rtx, rtx)); -static rtx find_insn_list PROTO((rtx, rtx)); -static int insn_unit PROTO((rtx)); -static unsigned int blockage_range PROTO((int, rtx)); -static void clear_units PROTO((void)); -static void prepare_unit PROTO((int)); -static int actual_hazard_this_instance PROTO((int, int, rtx, int, int)); -static void schedule_unit PROTO((int, rtx, int)); -static int actual_hazard PROTO((int, rtx, int, int)); -static int potential_hazard PROTO((int, rtx, int)); -static int insn_cost PROTO((rtx, rtx, rtx)); -static int priority PROTO((rtx)); -static void free_pending_lists PROTO((void)); -static void add_insn_mem_dependence PROTO((rtx *, rtx *, rtx, rtx)); -static void flush_pending_lists PROTO((rtx, int)); -static void sched_analyze_1 PROTO((rtx, rtx)); -static void sched_analyze_2 PROTO((rtx, rtx)); -static void sched_analyze_insn PROTO((rtx, rtx, rtx)); -static int sched_analyze PROTO((rtx, rtx)); -static void sched_note_set PROTO((rtx, int)); -static int rank_for_schedule PROTO((const GENERIC_PTR, const GENERIC_PTR)); -static void swap_sort PROTO((rtx *, int)); -static void queue_insn PROTO((rtx, int)); -static int birthing_insn_p PROTO((rtx)); -static void adjust_priority PROTO((rtx)); -static int schedule_insn PROTO((rtx, rtx *, int, int)); -static int schedule_select PROTO((rtx *, int, int, FILE *)); -static void create_reg_dead_note PROTO((rtx, rtx)); -static void attach_deaths PROTO((rtx, rtx, int)); -static void attach_deaths_insn PROTO((rtx)); -static rtx unlink_notes PROTO((rtx, rtx)); -static int new_sometimes_live PROTO((struct sometimes *, int, int)); -static void finish_sometimes_live PROTO((struct sometimes *, int)); -static rtx reemit_notes PROTO((rtx, rtx)); -static void schedule_block PROTO((int, FILE *)); -static void split_hard_reg_notes PROTO((rtx, rtx, rtx)); -static void new_insn_dead_notes PROTO((rtx, rtx, rtx, rtx)); -static void update_n_sets PROTO((rtx, int)); - -/* Main entry point of this file. */ -void schedule_insns PROTO((FILE *)); - -#define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X))) - -/* Helper functions for instruction scheduling. */ - -/* Add ELEM wrapped in an INSN_LIST with reg note kind DEP_TYPE to the - LOG_LINKS of INSN, if not already there. DEP_TYPE indicates the type - of dependence that this link represents. */ - -static void -add_dependence (insn, elem, dep_type) - rtx insn; - rtx elem; - enum reg_note dep_type; -{ - rtx link, next; - - /* Don't depend an insn on itself. */ - if (insn == elem) - return; - - /* If elem is part of a sequence that must be scheduled together, then - make the dependence point to the last insn of the sequence. - When HAVE_cc0, it is possible for NOTEs to exist between users and - setters of the condition codes, so we must skip past notes here. - Otherwise, NOTEs are impossible here. */ - - next = NEXT_INSN (elem); - -#ifdef HAVE_cc0 - while (next && GET_CODE (next) == NOTE) - next = NEXT_INSN (next); -#endif - - if (next && SCHED_GROUP_P (next) - && GET_CODE (next) != CODE_LABEL) - { - /* Notes will never intervene here though, so don't bother checking - for them. */ - /* We must reject CODE_LABELs, so that we don't get confused by one - that has LABEL_PRESERVE_P set, which is represented by the same - bit in the rtl as SCHED_GROUP_P. A CODE_LABEL can never be - SCHED_GROUP_P. */ - while (NEXT_INSN (next) && SCHED_GROUP_P (NEXT_INSN (next)) - && GET_CODE (NEXT_INSN (next)) != CODE_LABEL) - next = NEXT_INSN (next); - - /* Again, don't depend an insn on itself. */ - if (insn == next) - return; - - /* Make the dependence to NEXT, the last insn of the group, instead - of the original ELEM. */ - elem = next; - } - - /* Check that we don't already have this dependence. */ - for (link = LOG_LINKS (insn); link; link = XEXP (link, 1)) - if (XEXP (link, 0) == elem) - { - /* If this is a more restrictive type of dependence than the existing - one, then change the existing dependence to this type. */ - if ((int) dep_type < (int) REG_NOTE_KIND (link)) - PUT_REG_NOTE_KIND (link, dep_type); - return; - } - /* Might want to check one level of transitivity to save conses. */ - - link = rtx_alloc (INSN_LIST); - /* Insn dependency, not data dependency. */ - PUT_REG_NOTE_KIND (link, dep_type); - XEXP (link, 0) = elem; - XEXP (link, 1) = LOG_LINKS (insn); - LOG_LINKS (insn) = link; -} - -/* Remove ELEM wrapped in an INSN_LIST from the LOG_LINKS - of INSN. Abort if not found. */ - -static void -remove_dependence (insn, elem) - rtx insn; - rtx elem; -{ - rtx prev, link; - int found = 0; - - for (prev = 0, link = LOG_LINKS (insn); link; link = XEXP (link, 1)) - { - if (XEXP (link, 0) == elem) - { - RTX_INTEGRATED_P (link) = 1; - if (prev) - XEXP (prev, 1) = XEXP (link, 1); - else - LOG_LINKS (insn) = XEXP (link, 1); - found = 1; - } - else - prev = link; - } - - if (! found) - abort (); - return; -} - -#ifndef __GNUC__ -#define __inline -#endif - -/* Computation of memory dependencies. */ - -/* The *_insns and *_mems are paired lists. Each pending memory operation - will have a pointer to the MEM rtx on one list and a pointer to the - containing insn on the other list in the same place in the list. */ - -/* We can't use add_dependence like the old code did, because a single insn - may have multiple memory accesses, and hence needs to be on the list - once for each memory access. Add_dependence won't let you add an insn - to a list more than once. */ - -/* An INSN_LIST containing all insns with pending read operations. */ -static rtx pending_read_insns; - -/* An EXPR_LIST containing all MEM rtx's which are pending reads. */ -static rtx pending_read_mems; - -/* An INSN_LIST containing all insns with pending write operations. */ -static rtx pending_write_insns; - -/* An EXPR_LIST containing all MEM rtx's which are pending writes. */ -static rtx pending_write_mems; - -/* Indicates the combined length of the two pending lists. We must prevent - these lists from ever growing too large since the number of dependencies - produced is at least O(N*N), and execution time is at least O(4*N*N), as - a function of the length of these pending lists. */ - -static int pending_lists_length; - -/* An INSN_LIST containing all INSN_LISTs allocated but currently unused. */ - -static rtx unused_insn_list; - -/* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused. */ - -static rtx unused_expr_list; - -/* The last insn upon which all memory references must depend. - This is an insn which flushed the pending lists, creating a dependency - between it and all previously pending memory references. This creates - a barrier (or a checkpoint) which no memory reference is allowed to cross. - - This includes all non constant CALL_INSNs. When we do interprocedural - alias analysis, this restriction can be relaxed. - This may also be an INSN that writes memory if the pending lists grow - too large. */ - -static rtx last_pending_memory_flush; - -/* The last function call we have seen. All hard regs, and, of course, - the last function call, must depend on this. */ - -static rtx last_function_call; - -/* The LOG_LINKS field of this is a list of insns which use a pseudo register - that does not already cross a call. We create dependencies between each - of those insn and the next call insn, to ensure that they won't cross a call - after scheduling is done. */ - -static rtx sched_before_next_call; - -/* Pointer to the last instruction scheduled. Used by rank_for_schedule, - so that insns independent of the last scheduled insn will be preferred - over dependent instructions. */ - -static rtx last_scheduled_insn; - -/* Process an insn's memory dependencies. There are four kinds of - dependencies: - - (0) read dependence: read follows read - (1) true dependence: read follows write - (2) anti dependence: write follows read - (3) output dependence: write follows write - - We are careful to build only dependencies which actually exist, and - use transitivity to avoid building too many links. */ - -/* Return the INSN_LIST containing INSN in LIST, or NULL - if LIST does not contain INSN. */ - -__inline static rtx -find_insn_list (insn, list) - rtx insn; - rtx list; -{ - while (list) - { - if (XEXP (list, 0) == insn) - return list; - list = XEXP (list, 1); - } - return 0; -} - -/* Compute the function units used by INSN. This caches the value - returned by function_units_used. A function unit is encoded as the - unit number if the value is non-negative and the compliment of a - mask if the value is negative. A function unit index is the - non-negative encoding. */ - -__inline static int -insn_unit (insn) - rtx insn; -{ - register int unit = INSN_UNIT (insn); - - if (unit == 0) - { - recog_memoized (insn); - - /* A USE insn, or something else we don't need to understand. - We can't pass these directly to function_units_used because it will - trigger a fatal error for unrecognizable insns. */ - if (INSN_CODE (insn) < 0) - unit = -1; - else - { - unit = function_units_used (insn); - /* Increment non-negative values so we can cache zero. */ - if (unit >= 0) unit++; - } - /* We only cache 16 bits of the result, so if the value is out of - range, don't cache it. */ - if (FUNCTION_UNITS_SIZE < HOST_BITS_PER_SHORT - || unit >= 0 - || (unit & ~((1 << (HOST_BITS_PER_SHORT - 1)) - 1)) == 0) - INSN_UNIT (insn) = unit; - } - return (unit > 0 ? unit - 1 : unit); -} - -/* Compute the blockage range for executing INSN on UNIT. This caches - the value returned by the blockage_range_function for the unit. - These values are encoded in an int where the upper half gives the - minimum value and the lower half gives the maximum value. */ - -__inline static unsigned int -blockage_range (unit, insn) - int unit; - rtx insn; -{ - unsigned int blockage = INSN_BLOCKAGE (insn); - unsigned int range; - - if ((int) UNIT_BLOCKED (blockage) != unit + 1) - { - range = function_units[unit].blockage_range_function (insn); - /* We only cache the blockage range for one unit and then only if - the values fit. */ - if (HOST_BITS_PER_INT >= UNIT_BITS + 2 * BLOCKAGE_BITS) - INSN_BLOCKAGE (insn) = ENCODE_BLOCKAGE (unit + 1, range); - } - else - range = BLOCKAGE_RANGE (blockage); - - return range; -} - -/* A vector indexed by function unit instance giving the last insn to use - the unit. The value of the function unit instance index for unit U - instance I is (U + I * FUNCTION_UNITS_SIZE). */ -static rtx unit_last_insn[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY]; - -/* A vector indexed by function unit instance giving the minimum time when - the unit will unblock based on the maximum blockage cost. */ -static int unit_tick[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY]; - -/* A vector indexed by function unit number giving the number of insns - that remain to use the unit. */ -static int unit_n_insns[FUNCTION_UNITS_SIZE]; - -/* Reset the function unit state to the null state. */ - -static void -clear_units () -{ - bzero ((char *) unit_last_insn, sizeof (unit_last_insn)); - bzero ((char *) unit_tick, sizeof (unit_tick)); - bzero ((char *) unit_n_insns, sizeof (unit_n_insns)); -} - -/* Record an insn as one that will use the units encoded by UNIT. */ - -__inline static void -prepare_unit (unit) - int unit; -{ - int i; - - if (unit >= 0) - unit_n_insns[unit]++; - else - for (i = 0, unit = ~unit; unit; i++, unit >>= 1) - if ((unit & 1) != 0) - prepare_unit (i); -} - -/* Return the actual hazard cost of executing INSN on the unit UNIT, - instance INSTANCE at time CLOCK if the previous actual hazard cost - was COST. */ - -__inline static int -actual_hazard_this_instance (unit, instance, insn, clock, cost) - int unit, instance, clock, cost; - rtx insn; -{ - int tick = unit_tick[instance]; - - if (tick - clock > cost) - { - /* The scheduler is operating in reverse, so INSN is the executing - insn and the unit's last insn is the candidate insn. We want a - more exact measure of the blockage if we execute INSN at CLOCK - given when we committed the execution of the unit's last insn. - - The blockage value is given by either the unit's max blockage - constant, blockage range function, or blockage function. Use - the most exact form for the given unit. */ - - if (function_units[unit].blockage_range_function) - { - if (function_units[unit].blockage_function) - tick += (function_units[unit].blockage_function - (insn, unit_last_insn[instance]) - - function_units[unit].max_blockage); - else - tick += ((int) MAX_BLOCKAGE_COST (blockage_range (unit, insn)) - - function_units[unit].max_blockage); - } - if (tick - clock > cost) - cost = tick - clock; - } - return cost; -} - -/* Record INSN as having begun execution on the units encoded by UNIT at - time CLOCK. */ - -__inline static void -schedule_unit (unit, insn, clock) - int unit, clock; - rtx insn; -{ - int i; - - if (unit >= 0) - { - int instance = unit; -#if MAX_MULTIPLICITY > 1 - /* Find the first free instance of the function unit and use that - one. We assume that one is free. */ - for (i = function_units[unit].multiplicity - 1; i > 0; i--) - { - if (! actual_hazard_this_instance (unit, instance, insn, clock, 0)) - break; - instance += FUNCTION_UNITS_SIZE; - } -#endif - unit_last_insn[instance] = insn; - unit_tick[instance] = (clock + function_units[unit].max_blockage); - } - else - for (i = 0, unit = ~unit; unit; i++, unit >>= 1) - if ((unit & 1) != 0) - schedule_unit (i, insn, clock); -} - -/* Return the actual hazard cost of executing INSN on the units encoded by - UNIT at time CLOCK if the previous actual hazard cost was COST. */ - -__inline static int -actual_hazard (unit, insn, clock, cost) - int unit, clock, cost; - rtx insn; -{ - int i; - - if (unit >= 0) - { - /* Find the instance of the function unit with the minimum hazard. */ - int instance = unit; - int best_cost = actual_hazard_this_instance (unit, instance, insn, - clock, cost); -#if MAX_MULTIPLICITY > 1 - int this_cost; - - if (best_cost > cost) - { - for (i = function_units[unit].multiplicity - 1; i > 0; i--) - { - instance += FUNCTION_UNITS_SIZE; - this_cost = actual_hazard_this_instance (unit, instance, insn, - clock, cost); - if (this_cost < best_cost) - { - best_cost = this_cost; - if (this_cost <= cost) - break; - } - } - } -#endif - cost = MAX (cost, best_cost); - } - else - for (i = 0, unit = ~unit; unit; i++, unit >>= 1) - if ((unit & 1) != 0) - cost = actual_hazard (i, insn, clock, cost); - - return cost; -} - -/* Return the potential hazard cost of executing an instruction on the - units encoded by UNIT if the previous potential hazard cost was COST. - An insn with a large blockage time is chosen in preference to one - with a smaller time; an insn that uses a unit that is more likely - to be used is chosen in preference to one with a unit that is less - used. We are trying to minimize a subsequent actual hazard. */ - -__inline static int -potential_hazard (unit, insn, cost) - int unit, cost; - rtx insn; -{ - int i, ncost; - unsigned int minb, maxb; - - if (unit >= 0) - { - minb = maxb = function_units[unit].max_blockage; - if (maxb > 1) - { - if (function_units[unit].blockage_range_function) - { - maxb = minb = blockage_range (unit, insn); - maxb = MAX_BLOCKAGE_COST (maxb); - minb = MIN_BLOCKAGE_COST (minb); - } - - if (maxb > 1) - { - /* Make the number of instructions left dominate. Make the - minimum delay dominate the maximum delay. If all these - are the same, use the unit number to add an arbitrary - ordering. Other terms can be added. */ - ncost = minb * 0x40 + maxb; - ncost *= (unit_n_insns[unit] - 1) * 0x1000 + unit; - if (ncost > cost) - cost = ncost; - } - } - } - else - for (i = 0, unit = ~unit; unit; i++, unit >>= 1) - if ((unit & 1) != 0) - cost = potential_hazard (i, insn, cost); - - return cost; -} - -/* Compute cost of executing INSN given the dependence LINK on the insn USED. - This is the number of virtual cycles taken between instruction issue and - instruction results. */ - -__inline static int -insn_cost (insn, link, used) - rtx insn, link, used; -{ - register int cost = INSN_COST (insn); - - if (cost == 0) - { - recog_memoized (insn); - - /* A USE insn, or something else we don't need to understand. - We can't pass these directly to result_ready_cost because it will - trigger a fatal error for unrecognizable insns. */ - if (INSN_CODE (insn) < 0) - { - INSN_COST (insn) = 1; - return 1; - } - else - { - cost = result_ready_cost (insn); - - if (cost < 1) - cost = 1; - - INSN_COST (insn) = cost; - } - } - - /* A USE insn should never require the value used to be computed. This - allows the computation of a function's result and parameter values to - overlap the return and call. */ - recog_memoized (used); - if (INSN_CODE (used) < 0) - LINK_COST_FREE (link) = 1; - - /* If some dependencies vary the cost, compute the adjustment. Most - commonly, the adjustment is complete: either the cost is ignored - (in the case of an output- or anti-dependence), or the cost is - unchanged. These values are cached in the link as LINK_COST_FREE - and LINK_COST_ZERO. */ - - if (LINK_COST_FREE (link)) - cost = 1; -#ifdef ADJUST_COST - else if (! LINK_COST_ZERO (link)) - { - int ncost = cost; - - ADJUST_COST (used, link, insn, ncost); - if (ncost <= 1) - LINK_COST_FREE (link) = ncost = 1; - if (cost == ncost) - LINK_COST_ZERO (link) = 1; - cost = ncost; - } -#endif - return cost; -} - -/* Compute the priority number for INSN. */ - -static int -priority (insn) - rtx insn; -{ - if (insn && GET_RTX_CLASS (GET_CODE (insn)) == 'i') - { - int prev_priority; - int max_priority; - int this_priority = INSN_PRIORITY (insn); - rtx prev; - - if (this_priority > 0) - return this_priority; - - max_priority = 1; - - /* Nonzero if these insns must be scheduled together. */ - if (SCHED_GROUP_P (insn)) - { - prev = insn; - while (SCHED_GROUP_P (prev)) - { - prev = PREV_INSN (prev); - INSN_REF_COUNT (prev) += 1; - } - } - - for (prev = LOG_LINKS (insn); prev; prev = XEXP (prev, 1)) - { - rtx x = XEXP (prev, 0); - - /* If this was a duplicate of a dependence we already deleted, - ignore it. */ - if (RTX_INTEGRATED_P (prev)) - continue; - - /* A dependence pointing to a note or deleted insn is always - obsolete, because sched_analyze_insn will have created any - necessary new dependences which replace it. Notes and deleted - insns can be created when instructions are deleted by insn - splitting, or by register allocation. */ - if (GET_CODE (x) == NOTE || INSN_DELETED_P (x)) - { - remove_dependence (insn, x); - continue; - } - - /* Clear the link cost adjustment bits. */ - LINK_COST_FREE (prev) = 0; -#ifdef ADJUST_COST - LINK_COST_ZERO (prev) = 0; -#endif - - /* This priority calculation was chosen because it results in the - least instruction movement, and does not hurt the performance - of the resulting code compared to the old algorithm. - This makes the sched algorithm more stable, which results - in better code, because there is less register pressure, - cross jumping is more likely to work, and debugging is easier. - - When all instructions have a latency of 1, there is no need to - move any instructions. Subtracting one here ensures that in such - cases all instructions will end up with a priority of one, and - hence no scheduling will be done. - - The original code did not subtract the one, and added the - insn_cost of the current instruction to its priority (e.g. - move the insn_cost call down to the end). */ - - prev_priority = priority (x) + insn_cost (x, prev, insn) - 1; - - if (prev_priority > max_priority) - max_priority = prev_priority; - INSN_REF_COUNT (x) += 1; - } - - prepare_unit (insn_unit (insn)); - INSN_PRIORITY (insn) = max_priority; - return INSN_PRIORITY (insn); - } - return 0; -} - -/* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add - them to the unused_*_list variables, so that they can be reused. */ - -static void -free_pending_lists () -{ - register rtx link, prev_link; - - if (pending_read_insns) - { - prev_link = pending_read_insns; - link = XEXP (prev_link, 1); - - while (link) - { - prev_link = link; - link = XEXP (link, 1); - } - - XEXP (prev_link, 1) = unused_insn_list; - unused_insn_list = pending_read_insns; - pending_read_insns = 0; - } - - if (pending_write_insns) - { - prev_link = pending_write_insns; - link = XEXP (prev_link, 1); - - while (link) - { - prev_link = link; - link = XEXP (link, 1); - } - - XEXP (prev_link, 1) = unused_insn_list; - unused_insn_list = pending_write_insns; - pending_write_insns = 0; - } - - if (pending_read_mems) - { - prev_link = pending_read_mems; - link = XEXP (prev_link, 1); - - while (link) - { - prev_link = link; - link = XEXP (link, 1); - } - - XEXP (prev_link, 1) = unused_expr_list; - unused_expr_list = pending_read_mems; - pending_read_mems = 0; - } - - if (pending_write_mems) - { - prev_link = pending_write_mems; - link = XEXP (prev_link, 1); - - while (link) - { - prev_link = link; - link = XEXP (link, 1); - } - - XEXP (prev_link, 1) = unused_expr_list; - unused_expr_list = pending_write_mems; - pending_write_mems = 0; - } -} - -/* Add an INSN and MEM reference pair to a pending INSN_LIST and MEM_LIST. - The MEM is a memory reference contained within INSN, which we are saving - so that we can do memory aliasing on it. */ - -static void -add_insn_mem_dependence (insn_list, mem_list, insn, mem) - rtx *insn_list, *mem_list, insn, mem; -{ - register rtx link; - - if (unused_insn_list) - { - link = unused_insn_list; - unused_insn_list = XEXP (link, 1); - } - else - link = rtx_alloc (INSN_LIST); - XEXP (link, 0) = insn; - XEXP (link, 1) = *insn_list; - *insn_list = link; - - if (unused_expr_list) - { - link = unused_expr_list; - unused_expr_list = XEXP (link, 1); - } - else - link = rtx_alloc (EXPR_LIST); - XEXP (link, 0) = mem; - XEXP (link, 1) = *mem_list; - *mem_list = link; - - pending_lists_length++; -} - -/* Make a dependency between every memory reference on the pending lists - and INSN, thus flushing the pending lists. If ONLY_WRITE, don't flush - the read list. */ - -static void -flush_pending_lists (insn, only_write) - rtx insn; - int only_write; -{ - rtx link; - - while (pending_read_insns && ! only_write) - { - add_dependence (insn, XEXP (pending_read_insns, 0), REG_DEP_ANTI); - - link = pending_read_insns; - pending_read_insns = XEXP (pending_read_insns, 1); - XEXP (link, 1) = unused_insn_list; - unused_insn_list = link; - - link = pending_read_mems; - pending_read_mems = XEXP (pending_read_mems, 1); - XEXP (link, 1) = unused_expr_list; - unused_expr_list = link; - } - while (pending_write_insns) - { - add_dependence (insn, XEXP (pending_write_insns, 0), REG_DEP_ANTI); - - link = pending_write_insns; - pending_write_insns = XEXP (pending_write_insns, 1); - XEXP (link, 1) = unused_insn_list; - unused_insn_list = link; - - link = pending_write_mems; - pending_write_mems = XEXP (pending_write_mems, 1); - XEXP (link, 1) = unused_expr_list; - unused_expr_list = link; - } - pending_lists_length = 0; - - if (last_pending_memory_flush) - add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI); - - last_pending_memory_flush = insn; -} - -/* Analyze a single SET or CLOBBER rtx, X, creating all dependencies generated - by the write to the destination of X, and reads of everything mentioned. */ - -static void -sched_analyze_1 (x, insn) - rtx x; - rtx insn; -{ - register int regno; - register rtx dest = SET_DEST (x); - - if (dest == 0) - return; - - while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG - || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT) - { - if (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT) - { - /* The second and third arguments are values read by this insn. */ - sched_analyze_2 (XEXP (dest, 1), insn); - sched_analyze_2 (XEXP (dest, 2), insn); - } - dest = SUBREG_REG (dest); - } - - if (GET_CODE (dest) == REG) - { - register int i; - - regno = REGNO (dest); - - /* A hard reg in a wide mode may really be multiple registers. - If so, mark all of them just like the first. */ - if (regno < FIRST_PSEUDO_REGISTER) - { - i = HARD_REGNO_NREGS (regno, GET_MODE (dest)); - while (--i >= 0) - { - rtx u; - - for (u = reg_last_uses[regno+i]; u; u = XEXP (u, 1)) - add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); - reg_last_uses[regno + i] = 0; - if (reg_last_sets[regno + i]) - add_dependence (insn, reg_last_sets[regno + i], - REG_DEP_OUTPUT); - SET_REGNO_REG_SET (reg_pending_sets, regno + i); - if ((call_used_regs[i] || global_regs[i]) - && last_function_call) - /* Function calls clobber all call_used regs. */ - add_dependence (insn, last_function_call, REG_DEP_ANTI); - } - } - else - { - rtx u; - - for (u = reg_last_uses[regno]; u; u = XEXP (u, 1)) - add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); - reg_last_uses[regno] = 0; - if (reg_last_sets[regno]) - add_dependence (insn, reg_last_sets[regno], REG_DEP_OUTPUT); - SET_REGNO_REG_SET (reg_pending_sets, regno); - - /* Pseudos that are REG_EQUIV to something may be replaced - by that during reloading. We need only add dependencies for - the address in the REG_EQUIV note. */ - if (! reload_completed - && reg_known_equiv_p[regno] - && GET_CODE (reg_known_value[regno]) == MEM) - sched_analyze_2 (XEXP (reg_known_value[regno], 0), insn); - - /* Don't let it cross a call after scheduling if it doesn't - already cross one. */ - if (REG_N_CALLS_CROSSED (regno) == 0 && last_function_call) - add_dependence (insn, last_function_call, REG_DEP_ANTI); - } - } - else if (GET_CODE (dest) == MEM) - { - /* Writing memory. */ - - if (pending_lists_length > 32) - { - /* Flush all pending reads and writes to prevent the pending lists - from getting any larger. Insn scheduling runs too slowly when - these lists get long. The number 32 was chosen because it - seems like a reasonable number. When compiling GCC with itself, - this flush occurs 8 times for sparc, and 10 times for m88k using - the number 32. */ - flush_pending_lists (insn, 0); - } - else - { - rtx pending, pending_mem; - - pending = pending_read_insns; - pending_mem = pending_read_mems; - while (pending) - { - /* If a dependency already exists, don't create a new one. */ - if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) - if (anti_dependence (XEXP (pending_mem, 0), dest)) - add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI); - - pending = XEXP (pending, 1); - pending_mem = XEXP (pending_mem, 1); - } - - pending = pending_write_insns; - pending_mem = pending_write_mems; - while (pending) - { - /* If a dependency already exists, don't create a new one. */ - if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) - if (output_dependence (XEXP (pending_mem, 0), dest)) - add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT); - - pending = XEXP (pending, 1); - pending_mem = XEXP (pending_mem, 1); - } - - if (last_pending_memory_flush) - add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI); - - add_insn_mem_dependence (&pending_write_insns, &pending_write_mems, - insn, dest); - } - sched_analyze_2 (XEXP (dest, 0), insn); - } - - /* Analyze reads. */ - if (GET_CODE (x) == SET) - sched_analyze_2 (SET_SRC (x), insn); -} - -/* Analyze the uses of memory and registers in rtx X in INSN. */ - -static void -sched_analyze_2 (x, insn) - rtx x; - rtx insn; -{ - register int i; - register int j; - register enum rtx_code code; - register char *fmt; - - if (x == 0) - return; - - code = GET_CODE (x); - - switch (code) - { - case CONST_INT: - case CONST_DOUBLE: - case SYMBOL_REF: - case CONST: - case LABEL_REF: - /* Ignore constants. Note that we must handle CONST_DOUBLE here - because it may have a cc0_rtx in its CONST_DOUBLE_CHAIN field, but - this does not mean that this insn is using cc0. */ - return; - -#ifdef HAVE_cc0 - case CC0: - { - rtx link, prev; - - /* User of CC0 depends on immediately preceding insn. */ - SCHED_GROUP_P (insn) = 1; - - /* There may be a note before this insn now, but all notes will - be removed before we actually try to schedule the insns, so - it won't cause a problem later. We must avoid it here though. */ - prev = prev_nonnote_insn (insn); - - /* Make a copy of all dependencies on the immediately previous insn, - and add to this insn. This is so that all the dependencies will - apply to the group. Remove an explicit dependence on this insn - as SCHED_GROUP_P now represents it. */ - - if (find_insn_list (prev, LOG_LINKS (insn))) - remove_dependence (insn, prev); - - for (link = LOG_LINKS (prev); link; link = XEXP (link, 1)) - add_dependence (insn, XEXP (link, 0), REG_NOTE_KIND (link)); - - return; - } -#endif - - case REG: - { - int regno = REGNO (x); - if (regno < FIRST_PSEUDO_REGISTER) - { - int i; - - i = HARD_REGNO_NREGS (regno, GET_MODE (x)); - while (--i >= 0) - { - reg_last_uses[regno + i] - = gen_rtx_INSN_LIST (VOIDmode, - insn, reg_last_uses[regno + i]); - if (reg_last_sets[regno + i]) - add_dependence (insn, reg_last_sets[regno + i], 0); - if ((call_used_regs[regno + i] || global_regs[regno + i]) - && last_function_call) - /* Function calls clobber all call_used regs. */ - add_dependence (insn, last_function_call, REG_DEP_ANTI); - } - } - else - { - reg_last_uses[regno] - = gen_rtx_INSN_LIST (VOIDmode, insn, reg_last_uses[regno]); - if (reg_last_sets[regno]) - add_dependence (insn, reg_last_sets[regno], 0); - - /* Pseudos that are REG_EQUIV to something may be replaced - by that during reloading. We need only add dependencies for - the address in the REG_EQUIV note. */ - if (! reload_completed - && reg_known_equiv_p[regno] - && GET_CODE (reg_known_value[regno]) == MEM) - sched_analyze_2 (XEXP (reg_known_value[regno], 0), insn); - - /* If the register does not already cross any calls, then add this - insn to the sched_before_next_call list so that it will still - not cross calls after scheduling. */ - if (REG_N_CALLS_CROSSED (regno) == 0) - add_dependence (sched_before_next_call, insn, REG_DEP_ANTI); - } - return; - } - - case MEM: - { - /* Reading memory. */ - - rtx pending, pending_mem; - - pending = pending_read_insns; - pending_mem = pending_read_mems; - while (pending) - { - /* If a dependency already exists, don't create a new one. */ - if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) - if (read_dependence (XEXP (pending_mem, 0), x)) - add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI); - - pending = XEXP (pending, 1); - pending_mem = XEXP (pending_mem, 1); - } - - pending = pending_write_insns; - pending_mem = pending_write_mems; - while (pending) - { - /* If a dependency already exists, don't create a new one. */ - if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) - if (true_dependence (XEXP (pending_mem, 0), VOIDmode, - x, rtx_varies_p)) - add_dependence (insn, XEXP (pending, 0), 0); - - pending = XEXP (pending, 1); - pending_mem = XEXP (pending_mem, 1); - } - if (last_pending_memory_flush) - add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI); - - /* Always add these dependencies to pending_reads, since - this insn may be followed by a write. */ - add_insn_mem_dependence (&pending_read_insns, &pending_read_mems, - insn, x); - - /* Take advantage of tail recursion here. */ - sched_analyze_2 (XEXP (x, 0), insn); - return; - } - - case ASM_OPERANDS: - case ASM_INPUT: - case UNSPEC_VOLATILE: - case TRAP_IF: - { - rtx u; - - /* Traditional and volatile asm instructions must be considered to use - and clobber all hard registers, all pseudo-registers and all of - memory. So must TRAP_IF and UNSPEC_VOLATILE operations. - - Consider for instance a volatile asm that changes the fpu rounding - mode. An insn should not be moved across this even if it only uses - pseudo-regs because it might give an incorrectly rounded result. */ - if (code != ASM_OPERANDS || MEM_VOLATILE_P (x)) - { - int max_reg = max_reg_num (); - for (i = 0; i < max_reg; i++) - { - for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) - add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); - reg_last_uses[i] = 0; - if (reg_last_sets[i]) - add_dependence (insn, reg_last_sets[i], 0); - } - reg_pending_sets_all = 1; - - flush_pending_lists (insn, 0); - } - - /* For all ASM_OPERANDS, we must traverse the vector of input operands. - We can not just fall through here since then we would be confused - by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate - traditional asms unlike their normal usage. */ - - if (code == ASM_OPERANDS) - { - for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++) - sched_analyze_2 (ASM_OPERANDS_INPUT (x, j), insn); - return; - } - break; - } - - case PRE_DEC: - case POST_DEC: - case PRE_INC: - case POST_INC: - /* These both read and modify the result. We must handle them as writes - to get proper dependencies for following instructions. We must handle - them as reads to get proper dependencies from this to previous - instructions. Thus we need to pass them to both sched_analyze_1 - and sched_analyze_2. We must call sched_analyze_2 first in order - to get the proper antecedent for the read. */ - sched_analyze_2 (XEXP (x, 0), insn); - sched_analyze_1 (x, insn); - return; - - default: - break; - } - - /* Other cases: walk the insn. */ - fmt = GET_RTX_FORMAT (code); - for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) - { - if (fmt[i] == 'e') - sched_analyze_2 (XEXP (x, i), insn); - else if (fmt[i] == 'E') - for (j = 0; j < XVECLEN (x, i); j++) - sched_analyze_2 (XVECEXP (x, i, j), insn); - } -} - -/* Analyze an INSN with pattern X to find all dependencies. */ - -static void -sched_analyze_insn (x, insn, loop_notes) - rtx x, insn; - rtx loop_notes; -{ - register RTX_CODE code = GET_CODE (x); - rtx link; - int maxreg = max_reg_num (); - int i; - - if (code == SET || code == CLOBBER) - sched_analyze_1 (x, insn); - else if (code == PARALLEL) - { - register int i; - for (i = XVECLEN (x, 0) - 1; i >= 0; i--) - { - code = GET_CODE (XVECEXP (x, 0, i)); - if (code == SET || code == CLOBBER) - sched_analyze_1 (XVECEXP (x, 0, i), insn); - else - sched_analyze_2 (XVECEXP (x, 0, i), insn); - } - } - else - sched_analyze_2 (x, insn); - - /* Mark registers CLOBBERED or used by called function. */ - if (GET_CODE (insn) == CALL_INSN) - for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1)) - { - if (GET_CODE (XEXP (link, 0)) == CLOBBER) - sched_analyze_1 (XEXP (link, 0), insn); - else - sched_analyze_2 (XEXP (link, 0), insn); - } - - /* If there is a {LOOP,EHREGION}_{BEG,END} note in the middle of a basic block, then - we must be sure that no instructions are scheduled across it. - Otherwise, the reg_n_refs info (which depends on loop_depth) would - become incorrect. */ - - if (loop_notes) - { - int max_reg = max_reg_num (); - rtx link; - - for (i = 0; i < max_reg; i++) - { - rtx u; - for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) - add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); - reg_last_uses[i] = 0; - if (reg_last_sets[i]) - add_dependence (insn, reg_last_sets[i], 0); - } - reg_pending_sets_all = 1; - - flush_pending_lists (insn, 0); - - link = loop_notes; - while (XEXP (link, 1)) - link = XEXP (link, 1); - XEXP (link, 1) = REG_NOTES (insn); - REG_NOTES (insn) = loop_notes; - } - - EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i, - { - reg_last_sets[i] = insn; - }); - CLEAR_REG_SET (reg_pending_sets); - - if (reg_pending_sets_all) - { - for (i = 0; i < maxreg; i++) - reg_last_sets[i] = insn; - reg_pending_sets_all = 0; - } - - /* Handle function calls and function returns created by the epilogue - threading code. */ - if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN) - { - rtx dep_insn; - rtx prev_dep_insn; - - /* When scheduling instructions, we make sure calls don't lose their - accompanying USE insns by depending them one on another in order. - - Also, we must do the same thing for returns created by the epilogue - threading code. Note this code works only in this special case, - because other passes make no guarantee that they will never emit - an instruction between a USE and a RETURN. There is such a guarantee - for USE instructions immediately before a call. */ - - prev_dep_insn = insn; - dep_insn = PREV_INSN (insn); - while (GET_CODE (dep_insn) == INSN - && GET_CODE (PATTERN (dep_insn)) == USE - && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == REG) - { - SCHED_GROUP_P (prev_dep_insn) = 1; - - /* Make a copy of all dependencies on dep_insn, and add to insn. - This is so that all of the dependencies will apply to the - group. */ - - for (link = LOG_LINKS (dep_insn); link; link = XEXP (link, 1)) - add_dependence (insn, XEXP (link, 0), REG_NOTE_KIND (link)); - - prev_dep_insn = dep_insn; - dep_insn = PREV_INSN (dep_insn); - } - } -} - -/* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS - for every dependency. */ - -static int -sched_analyze (head, tail) - rtx head, tail; -{ - register rtx insn; - register int n_insns = 0; - register rtx u; - register int luid = 0; - rtx loop_notes = 0; - - for (insn = head; ; insn = NEXT_INSN (insn)) - { - INSN_LUID (insn) = luid++; - - if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN) - { - sched_analyze_insn (PATTERN (insn), insn, loop_notes); - loop_notes = 0; - n_insns += 1; - } - else if (GET_CODE (insn) == CALL_INSN) - { - rtx x; - register int i; - - /* Any instruction using a hard register which may get clobbered - by a call needs to be marked as dependent on this call. - This prevents a use of a hard return reg from being moved - past a void call (i.e. it does not explicitly set the hard - return reg). */ - - /* If this call is followed by a NOTE_INSN_SETJMP, then assume that - all registers, not just hard registers, may be clobbered by this - call. */ - - /* Insn, being a CALL_INSN, magically depends on - `last_function_call' already. */ - - if (NEXT_INSN (insn) && GET_CODE (NEXT_INSN (insn)) == NOTE - && NOTE_LINE_NUMBER (NEXT_INSN (insn)) == NOTE_INSN_SETJMP) - { - int max_reg = max_reg_num (); - for (i = 0; i < max_reg; i++) - { - for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) - add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); - reg_last_uses[i] = 0; - if (reg_last_sets[i]) - add_dependence (insn, reg_last_sets[i], 0); - } - reg_pending_sets_all = 1; - - /* Add a pair of fake REG_NOTEs which we will later - convert back into a NOTE_INSN_SETJMP note. See - reemit_notes for why we use a pair of NOTEs. */ - - REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD, - GEN_INT (0), - REG_NOTES (insn)); - REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD, - GEN_INT (NOTE_INSN_SETJMP), - REG_NOTES (insn)); - } - else - { - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - if (call_used_regs[i] || global_regs[i]) - { - for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) - add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); - reg_last_uses[i] = 0; - if (reg_last_sets[i]) - add_dependence (insn, reg_last_sets[i], REG_DEP_ANTI); - SET_REGNO_REG_SET (reg_pending_sets, i); - } - } - - /* For each insn which shouldn't cross a call, add a dependence - between that insn and this call insn. */ - x = LOG_LINKS (sched_before_next_call); - while (x) - { - add_dependence (insn, XEXP (x, 0), REG_DEP_ANTI); - x = XEXP (x, 1); - } - LOG_LINKS (sched_before_next_call) = 0; - - sched_analyze_insn (PATTERN (insn), insn, loop_notes); - loop_notes = 0; - - /* In the absence of interprocedural alias analysis, we must flush - all pending reads and writes, and start new dependencies starting - from here. But only flush writes for constant calls (which may - be passed a pointer to something we haven't written yet). */ - flush_pending_lists (insn, CONST_CALL_P (insn)); - - /* Depend this function call (actually, the user of this - function call) on all hard register clobberage. */ - last_function_call = insn; - n_insns += 1; - } - - /* See comments on reemit_notes as to why we do this. */ - else if (GET_CODE (insn) == NOTE - && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG - || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END - || NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_BEG - || NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_END - || NOTE_LINE_NUMBER (insn) == NOTE_INSN_RANGE_START - || NOTE_LINE_NUMBER (insn) == NOTE_INSN_RANGE_END - || (NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP - && GET_CODE (PREV_INSN (insn)) != CALL_INSN))) - { - loop_notes = gen_rtx_EXPR_LIST (REG_DEAD, - GEN_INT (NOTE_BLOCK_NUMBER (insn)), - loop_notes); - loop_notes = gen_rtx_EXPR_LIST (REG_DEAD, - GEN_INT (NOTE_LINE_NUMBER (insn)), - loop_notes); - CONST_CALL_P (loop_notes) = CONST_CALL_P (insn); - } - - if (insn == tail) - return n_insns; - } - - abort (); -} - -/* Called when we see a set of a register. If death is true, then we are - scanning backwards. Mark that register as unborn. If nobody says - otherwise, that is how things will remain. If death is false, then we - are scanning forwards. Mark that register as being born. */ - -static void -sched_note_set (x, death) - rtx x; - int death; -{ - register int regno; - register rtx reg = SET_DEST (x); - int subreg_p = 0; - - if (reg == 0) - return; - - while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == STRICT_LOW_PART - || GET_CODE (reg) == SIGN_EXTRACT || GET_CODE (reg) == ZERO_EXTRACT) - { - /* Must treat modification of just one hardware register of a multi-reg - value or just a byte field of a register exactly the same way that - mark_set_1 in flow.c does, i.e. anything except a paradoxical subreg - does not kill the entire register. */ - if (GET_CODE (reg) != SUBREG - || REG_SIZE (SUBREG_REG (reg)) > REG_SIZE (reg)) - subreg_p = 1; - - reg = SUBREG_REG (reg); - } - - if (GET_CODE (reg) != REG) - return; - - /* Global registers are always live, so the code below does not apply - to them. */ - - regno = REGNO (reg); - if (regno >= FIRST_PSEUDO_REGISTER || ! global_regs[regno]) - { - if (death) - { - /* If we only set part of the register, then this set does not - kill it. */ - if (subreg_p) - return; - - /* Try killing this register. */ - if (regno < FIRST_PSEUDO_REGISTER) - { - int j = HARD_REGNO_NREGS (regno, GET_MODE (reg)); - while (--j >= 0) - { - CLEAR_REGNO_REG_SET (bb_live_regs, regno + j); - SET_REGNO_REG_SET (bb_dead_regs, regno + j); - } - } - else - { - CLEAR_REGNO_REG_SET (bb_live_regs, regno); - SET_REGNO_REG_SET (bb_dead_regs, regno); - } - } - else - { - /* Make the register live again. */ - if (regno < FIRST_PSEUDO_REGISTER) - { - int j = HARD_REGNO_NREGS (regno, GET_MODE (reg)); - while (--j >= 0) - { - SET_REGNO_REG_SET (bb_live_regs, regno + j); - CLEAR_REGNO_REG_SET (bb_dead_regs, regno + j); - } - } - else - { - SET_REGNO_REG_SET (bb_live_regs, regno); - CLEAR_REGNO_REG_SET (bb_dead_regs, regno); - } - } - } -} - -/* Macros and functions for keeping the priority queue sorted, and - dealing with queueing and dequeueing of instructions. */ - -#define SCHED_SORT(READY, NEW_READY, OLD_READY) \ - do { if ((NEW_READY) - (OLD_READY) == 1) \ - swap_sort (READY, NEW_READY); \ - else if ((NEW_READY) - (OLD_READY) > 1) \ - qsort (READY, NEW_READY, sizeof (rtx), rank_for_schedule); } \ - while (0) - -/* Returns a positive value if y is preferred; returns a negative value if - x is preferred. Should never return 0, since that will make the sort - unstable. */ - -static int -rank_for_schedule (x, y) - const GENERIC_PTR x; - const GENERIC_PTR y; -{ - rtx tmp = *(rtx *)y; - rtx tmp2 = *(rtx *)x; - rtx link; - int tmp_class, tmp2_class; - int value; - - /* Choose the instruction with the highest priority, if different. */ - if ((value = INSN_PRIORITY (tmp) - INSN_PRIORITY (tmp2))) - return value; - - if (last_scheduled_insn) - { - /* Classify the instructions into three classes: - 1) Data dependent on last schedule insn. - 2) Anti/Output dependent on last scheduled insn. - 3) Independent of last scheduled insn, or has latency of one. - Choose the insn from the highest numbered class if different. */ - link = find_insn_list (tmp, LOG_LINKS (last_scheduled_insn)); - if (link == 0 || insn_cost (tmp, link, last_scheduled_insn) == 1) - tmp_class = 3; - else if (REG_NOTE_KIND (link) == 0) /* Data dependence. */ - tmp_class = 1; - else - tmp_class = 2; - - link = find_insn_list (tmp2, LOG_LINKS (last_scheduled_insn)); - if (link == 0 || insn_cost (tmp2, link, last_scheduled_insn) == 1) - tmp2_class = 3; - else if (REG_NOTE_KIND (link) == 0) /* Data dependence. */ - tmp2_class = 1; - else - tmp2_class = 2; - - if ((value = tmp_class - tmp2_class)) - return value; - } - - /* If insns are equally good, sort by INSN_LUID (original insn order), - so that we make the sort stable. This minimizes instruction movement, - thus minimizing sched's effect on debugging and cross-jumping. */ - return INSN_LUID (tmp) - INSN_LUID (tmp2); -} - -/* Resort the array A in which only element at index N may be out of order. */ - -__inline static void -swap_sort (a, n) - rtx *a; - int n; -{ - rtx insn = a[n-1]; - int i = n-2; - - while (i >= 0 && rank_for_schedule (a+i, &insn) >= 0) - { - a[i+1] = a[i]; - i -= 1; - } - a[i+1] = insn; -} - -static int max_priority; - -/* Add INSN to the insn queue so that it fires at least N_CYCLES - before the currently executing insn. */ - -__inline static void -queue_insn (insn, n_cycles) - rtx insn; - int n_cycles; -{ - int next_q = NEXT_Q_AFTER (q_ptr, n_cycles); - NEXT_INSN (insn) = insn_queue[next_q]; - insn_queue[next_q] = insn; - q_size += 1; -} - -/* Return nonzero if PAT is the pattern of an insn which makes a - register live. */ - -__inline static int -birthing_insn_p (pat) - rtx pat; -{ - int j; - - if (reload_completed == 1) - return 0; - - if (GET_CODE (pat) == SET - && GET_CODE (SET_DEST (pat)) == REG) - { - rtx dest = SET_DEST (pat); - int i = REGNO (dest); - - /* It would be more accurate to use refers_to_regno_p or - reg_mentioned_p to determine when the dest is not live before this - insn. */ - - if (REGNO_REG_SET_P (bb_live_regs, i)) - return (REG_N_SETS (i) == 1); - - return 0; - } - if (GET_CODE (pat) == PARALLEL) - { - for (j = 0; j < XVECLEN (pat, 0); j++) - if (birthing_insn_p (XVECEXP (pat, 0, j))) - return 1; - } - return 0; -} - -/* PREV is an insn that is ready to execute. Adjust its priority if that - will help shorten register lifetimes. */ - -__inline static void -adjust_priority (prev) - rtx prev; -{ - /* Trying to shorten register lives after reload has completed - is useless and wrong. It gives inaccurate schedules. */ - if (reload_completed == 0) - { - rtx note; - int n_deaths = 0; - - /* ??? This code has no effect, because REG_DEAD notes are removed - before we ever get here. */ - for (note = REG_NOTES (prev); note; note = XEXP (note, 1)) - if (REG_NOTE_KIND (note) == REG_DEAD) - n_deaths += 1; - - /* Defer scheduling insns which kill registers, since that - shortens register lives. Prefer scheduling insns which - make registers live for the same reason. */ - switch (n_deaths) - { - default: - INSN_PRIORITY (prev) >>= 3; - break; - case 3: - INSN_PRIORITY (prev) >>= 2; - break; - case 2: - case 1: - INSN_PRIORITY (prev) >>= 1; - break; - case 0: - if (birthing_insn_p (PATTERN (prev))) - { - int max = max_priority; - - if (max > INSN_PRIORITY (prev)) - INSN_PRIORITY (prev) = max; - } - break; - } -#ifdef ADJUST_PRIORITY - ADJUST_PRIORITY (prev); -#endif - } -} - -/* INSN is the "currently executing insn". Launch each insn which was - waiting on INSN (in the backwards dataflow sense). READY is a - vector of insns which are ready to fire. N_READY is the number of - elements in READY. CLOCK is the current virtual cycle. */ - -static int -schedule_insn (insn, ready, n_ready, clock) - rtx insn; - rtx *ready; - int n_ready; - int clock; -{ - rtx link; - int new_ready = n_ready; - - if (MAX_BLOCKAGE > 1) - schedule_unit (insn_unit (insn), insn, clock); - - if (LOG_LINKS (insn) == 0) - return n_ready; - - /* This is used by the function adjust_priority above. */ - if (n_ready > 0) - max_priority = MAX (INSN_PRIORITY (ready[0]), INSN_PRIORITY (insn)); - else - max_priority = INSN_PRIORITY (insn); - - for (link = LOG_LINKS (insn); link != 0; link = XEXP (link, 1)) - { - rtx prev = XEXP (link, 0); - int cost = insn_cost (prev, link, insn); - - if ((INSN_REF_COUNT (prev) -= 1) != 0) - { - /* We satisfied one requirement to fire PREV. Record the earliest - time when PREV can fire. No need to do this if the cost is 1, - because PREV can fire no sooner than the next cycle. */ - if (cost > 1) - INSN_TICK (prev) = MAX (INSN_TICK (prev), clock + cost); - } - else - { - /* We satisfied the last requirement to fire PREV. Ensure that all - timing requirements are satisfied. */ - if (INSN_TICK (prev) - clock > cost) - cost = INSN_TICK (prev) - clock; - - /* Adjust the priority of PREV and either put it on the ready - list or queue it. */ - adjust_priority (prev); - if (cost <= 1) - ready[new_ready++] = prev; - else - queue_insn (prev, cost); - } - } - - return new_ready; -} - -/* Given N_READY insns in the ready list READY at time CLOCK, queue - those that are blocked due to function unit hazards and rearrange - the remaining ones to minimize subsequent function unit hazards. */ - -static int -schedule_select (ready, n_ready, clock, file) - rtx *ready; - int n_ready, clock; - FILE *file; -{ - int pri = INSN_PRIORITY (ready[0]); - int i, j, k, q, cost, best_cost, best_insn = 0, new_ready = n_ready; - rtx insn; - - /* Work down the ready list in groups of instructions with the same - priority value. Queue insns in the group that are blocked and - select among those that remain for the one with the largest - potential hazard. */ - for (i = 0; i < n_ready; i = j) - { - int opri = pri; - for (j = i + 1; j < n_ready; j++) - if ((pri = INSN_PRIORITY (ready[j])) != opri) - break; - - /* Queue insns in the group that are blocked. */ - for (k = i, q = 0; k < j; k++) - { - insn = ready[k]; - if ((cost = actual_hazard (insn_unit (insn), insn, clock, 0)) != 0) - { - q++; - ready[k] = 0; - queue_insn (insn, cost); - if (file) - fprintf (file, "\n;; blocking insn %d for %d cycles", - INSN_UID (insn), cost); - } - } - new_ready -= q; - - /* Check the next group if all insns were queued. */ - if (j - i - q == 0) - continue; - - /* If more than one remains, select the first one with the largest - potential hazard. */ - else if (j - i - q > 1) - { - best_cost = -1; - for (k = i; k < j; k++) - { - if ((insn = ready[k]) == 0) - continue; - if ((cost = potential_hazard (insn_unit (insn), insn, 0)) - > best_cost) - { - best_cost = cost; - best_insn = k; - } - } - } - /* We have found a suitable insn to schedule. */ - break; - } - - /* Move the best insn to be front of the ready list. */ - if (best_insn != 0) - { - if (file) - { - fprintf (file, ", now"); - for (i = 0; i < n_ready; i++) - if (ready[i]) - fprintf (file, " %d", INSN_UID (ready[i])); - fprintf (file, "\n;; insn %d has a greater potential hazard", - INSN_UID (ready[best_insn])); - } - for (i = best_insn; i > 0; i--) - { - insn = ready[i-1]; - ready[i-1] = ready[i]; - ready[i] = insn; - } - } - - /* Compact the ready list. */ - if (new_ready < n_ready) - for (i = j = 0; i < n_ready; i++) - if (ready[i]) - ready[j++] = ready[i]; - - return new_ready; -} - -/* Add a REG_DEAD note for REG to INSN, reusing a REG_DEAD note from the - dead_notes list. */ - -static void -create_reg_dead_note (reg, insn) - rtx reg, insn; -{ - rtx link; - - /* The number of registers killed after scheduling must be the same as the - number of registers killed before scheduling. The number of REG_DEAD - notes may not be conserved, i.e. two SImode hard register REG_DEAD notes - might become one DImode hard register REG_DEAD note, but the number of - registers killed will be conserved. - - We carefully remove REG_DEAD notes from the dead_notes list, so that - there will be none left at the end. If we run out early, then there - is a bug somewhere in flow, combine and/or sched. */ - - if (dead_notes == 0) - { -#if 1 - abort (); -#else - link = rtx_alloc (EXPR_LIST); - PUT_REG_NOTE_KIND (link, REG_DEAD); -#endif - } - else - { - /* Number of regs killed by REG. */ - int regs_killed = (REGNO (reg) >= FIRST_PSEUDO_REGISTER ? 1 - : HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg))); - /* Number of regs killed by REG_DEAD notes taken off the list. */ - int reg_note_regs; - - link = dead_notes; - reg_note_regs = (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1 - : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)), - GET_MODE (XEXP (link, 0)))); - while (reg_note_regs < regs_killed) - { - /* LINK might be zero if we killed more registers after scheduling - than before, and the last hard register we kill is actually - multiple hard regs. */ - if (link == NULL_RTX) - abort (); - - link = XEXP (link, 1); - reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1 - : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)), - GET_MODE (XEXP (link, 0)))); - } - dead_notes = XEXP (link, 1); - - /* If we took too many regs kills off, put the extra ones back. */ - while (reg_note_regs > regs_killed) - { - rtx temp_reg, temp_link; - - temp_reg = gen_rtx_REG (word_mode, 0); - temp_link = rtx_alloc (EXPR_LIST); - PUT_REG_NOTE_KIND (temp_link, REG_DEAD); - XEXP (temp_link, 0) = temp_reg; - XEXP (temp_link, 1) = dead_notes; - dead_notes = temp_link; - reg_note_regs--; - } - } - - XEXP (link, 0) = reg; - XEXP (link, 1) = REG_NOTES (insn); - REG_NOTES (insn) = link; -} - -/* Subroutine on attach_deaths_insn--handles the recursive search - through INSN. If SET_P is true, then x is being modified by the insn. */ - -static void -attach_deaths (x, insn, set_p) - rtx x; - rtx insn; - int set_p; -{ - register int i; - register int j; - register enum rtx_code code; - register char *fmt; - - if (x == 0) - return; - - code = GET_CODE (x); - - switch (code) - { - case CONST_INT: - case CONST_DOUBLE: - case LABEL_REF: - case SYMBOL_REF: - case CONST: - case CODE_LABEL: - case PC: - case CC0: - /* Get rid of the easy cases first. */ - return; - - case REG: - { - /* If the register dies in this insn, queue that note, and mark - this register as needing to die. */ - /* This code is very similar to mark_used_1 (if set_p is false) - and mark_set_1 (if set_p is true) in flow.c. */ - - register int regno; - int some_needed; - int all_needed; - - if (set_p) - return; - - regno = REGNO (x); - all_needed = some_needed = REGNO_REG_SET_P (old_live_regs, regno); - if (regno < FIRST_PSEUDO_REGISTER) - { - int n; - - n = HARD_REGNO_NREGS (regno, GET_MODE (x)); - while (--n > 0) - { - int needed = (REGNO_REG_SET_P (old_live_regs, regno + n)); - some_needed |= needed; - all_needed &= needed; - } - } - - /* If it wasn't live before we started, then add a REG_DEAD note. - We must check the previous lifetime info not the current info, - because we may have to execute this code several times, e.g. - once for a clobber (which doesn't add a note) and later - for a use (which does add a note). - - Always make the register live. We must do this even if it was - live before, because this may be an insn which sets and uses - the same register, in which case the register has already been - killed, so we must make it live again. - - Global registers are always live, and should never have a REG_DEAD - note added for them, so none of the code below applies to them. */ - - if (regno >= FIRST_PSEUDO_REGISTER || ! global_regs[regno]) - { - /* Never add REG_DEAD notes for STACK_POINTER_REGNUM - since it's always considered to be live. Similarly - for FRAME_POINTER_REGNUM if a frame pointer is needed - and for ARG_POINTER_REGNUM if it is fixed. */ - if (! (regno == FRAME_POINTER_REGNUM - && (! reload_completed || frame_pointer_needed)) -#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM - && ! (regno == HARD_FRAME_POINTER_REGNUM - && (! reload_completed || frame_pointer_needed)) -#endif -#if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM - && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno]) -#endif - && regno != STACK_POINTER_REGNUM) - { - if (! all_needed && ! dead_or_set_p (insn, x)) - { - /* Check for the case where the register dying partially - overlaps the register set by this insn. */ - if (regno < FIRST_PSEUDO_REGISTER - && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1) - { - int n = HARD_REGNO_NREGS (regno, GET_MODE (x)); - while (--n >= 0) - some_needed |= dead_or_set_regno_p (insn, regno + n); - } - - /* If none of the words in X is needed, make a REG_DEAD - note. Otherwise, we must make partial REG_DEAD - notes. */ - if (! some_needed) - create_reg_dead_note (x, insn); - else - { - int i; - - /* Don't make a REG_DEAD note for a part of a - register that is set in the insn. */ - for (i = HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1; - i >= 0; i--) - if (! REGNO_REG_SET_P (old_live_regs, regno + i) - && ! dead_or_set_regno_p (insn, regno + i)) - create_reg_dead_note (gen_rtx_REG (reg_raw_mode[regno + i], - regno + i), - insn); - } - } - } - - if (regno < FIRST_PSEUDO_REGISTER) - { - int j = HARD_REGNO_NREGS (regno, GET_MODE (x)); - while (--j >= 0) - { - CLEAR_REGNO_REG_SET (bb_dead_regs, regno + j); - SET_REGNO_REG_SET (bb_live_regs, regno + j); - } - } - else - { - CLEAR_REGNO_REG_SET (bb_dead_regs, regno); - SET_REGNO_REG_SET (bb_live_regs, regno); - } - } - return; - } - - case MEM: - /* Handle tail-recursive case. */ - attach_deaths (XEXP (x, 0), insn, 0); - return; - - case SUBREG: - attach_deaths (SUBREG_REG (x), insn, - set_p && ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) - <= UNITS_PER_WORD) - || (GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) - == GET_MODE_SIZE (GET_MODE ((x)))))); - return; - - case STRICT_LOW_PART: - attach_deaths (XEXP (x, 0), insn, 0); - return; - - case ZERO_EXTRACT: - case SIGN_EXTRACT: - attach_deaths (XEXP (x, 0), insn, 0); - attach_deaths (XEXP (x, 1), insn, 0); - attach_deaths (XEXP (x, 2), insn, 0); - return; - - default: - /* Other cases: walk the insn. */ - fmt = GET_RTX_FORMAT (code); - for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) - { - if (fmt[i] == 'e') - attach_deaths (XEXP (x, i), insn, 0); - else if (fmt[i] == 'E') - for (j = 0; j < XVECLEN (x, i); j++) - attach_deaths (XVECEXP (x, i, j), insn, 0); - } - } -} - -/* After INSN has executed, add register death notes for each register - that is dead after INSN. */ - -static void -attach_deaths_insn (insn) - rtx insn; -{ - rtx x = PATTERN (insn); - register RTX_CODE code = GET_CODE (x); - rtx link; - - if (code == SET) - { - attach_deaths (SET_SRC (x), insn, 0); - - /* A register might die here even if it is the destination, e.g. - it is the target of a volatile read and is otherwise unused. - Hence we must always call attach_deaths for the SET_DEST. */ - attach_deaths (SET_DEST (x), insn, 1); - } - else if (code == PARALLEL) - { - register int i; - for (i = XVECLEN (x, 0) - 1; i >= 0; i--) - { - code = GET_CODE (XVECEXP (x, 0, i)); - if (code == SET) - { - attach_deaths (SET_SRC (XVECEXP (x, 0, i)), insn, 0); - - attach_deaths (SET_DEST (XVECEXP (x, 0, i)), insn, 1); - } - /* Flow does not add REG_DEAD notes to registers that die in - clobbers, so we can't either. */ - else if (code != CLOBBER) - attach_deaths (XVECEXP (x, 0, i), insn, 0); - } - } - /* If this is a CLOBBER, only add REG_DEAD notes to registers inside a - MEM being clobbered, just like flow. */ - else if (code == CLOBBER && GET_CODE (XEXP (x, 0)) == MEM) - attach_deaths (XEXP (XEXP (x, 0), 0), insn, 0); - /* Otherwise don't add a death note to things being clobbered. */ - else if (code != CLOBBER) - attach_deaths (x, insn, 0); - - /* Make death notes for things used in the called function. */ - if (GET_CODE (insn) == CALL_INSN) - for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1)) - attach_deaths (XEXP (XEXP (link, 0), 0), insn, - GET_CODE (XEXP (link, 0)) == CLOBBER); -} - -/* Delete notes beginning with INSN and maybe put them in the chain - of notes ended by NOTE_LIST. - Returns the insn following the notes. */ - -static rtx -unlink_notes (insn, tail) - rtx insn, tail; -{ - rtx prev = PREV_INSN (insn); - - while (insn != tail && GET_CODE (insn) == NOTE) - { - rtx next = NEXT_INSN (insn); - /* Delete the note from its current position. */ - if (prev) - NEXT_INSN (prev) = next; - if (next) - PREV_INSN (next) = prev; - - if (write_symbols != NO_DEBUG && NOTE_LINE_NUMBER (insn) > 0) - /* Record line-number notes so they can be reused. */ - LINE_NOTE (insn) = insn; - - /* Don't save away NOTE_INSN_SETJMPs, because they must remain - immediately after the call they follow. We use a fake - (REG_DEAD (const_int -1)) note to remember them. - Likewise with NOTE_INSN_{LOOP,EHREGION}_{BEG, END}. */ - else if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_SETJMP - && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG - && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_END - && NOTE_LINE_NUMBER (insn) != NOTE_INSN_RANGE_START - && NOTE_LINE_NUMBER (insn) != NOTE_INSN_RANGE_END - && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_BEG - && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_END) - { - /* Insert the note at the end of the notes list. */ - PREV_INSN (insn) = note_list; - if (note_list) - NEXT_INSN (note_list) = insn; - note_list = insn; - } - - insn = next; - } - return insn; -} - -/* Constructor for `sometimes' data structure. */ - -static int -new_sometimes_live (regs_sometimes_live, regno, sometimes_max) - struct sometimes *regs_sometimes_live; - int regno; - int sometimes_max; -{ - register struct sometimes *p; - - /* There should never be a register greater than max_regno here. If there - is, it means that a define_split has created a new pseudo reg. This - is not allowed, since there will not be flow info available for any - new register, so catch the error here. */ - if (regno >= max_regno) - abort (); - - p = ®s_sometimes_live[sometimes_max]; - p->regno = regno; - p->live_length = 0; - p->calls_crossed = 0; - sometimes_max++; - return sometimes_max; -} - -/* Count lengths of all regs we are currently tracking, - and find new registers no longer live. */ - -static void -finish_sometimes_live (regs_sometimes_live, sometimes_max) - struct sometimes *regs_sometimes_live; - int sometimes_max; -{ - int i; - - for (i = 0; i < sometimes_max; i++) - { - register struct sometimes *p = ®s_sometimes_live[i]; - int regno = p->regno; - - sched_reg_live_length[regno] += p->live_length; - sched_reg_n_calls_crossed[regno] += p->calls_crossed; - } -} - -/* Search INSN for fake REG_DEAD note pairs for NOTE_INSN_SETJMP, - NOTE_INSN_{LOOP,EHREGION}_{BEG,END}; and convert them back into - NOTEs. The REG_DEAD note following first one is contains the saved - value for NOTE_BLOCK_NUMBER which is useful for - NOTE_INSN_EH_REGION_{BEG,END} NOTEs. LAST is the last instruction - output by the instruction scheduler. Return the new value of LAST. */ - -static rtx -reemit_notes (insn, last) - rtx insn; - rtx last; -{ - rtx note; - - for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) - { - if (REG_NOTE_KIND (note) == REG_DEAD - && GET_CODE (XEXP (note, 0)) == CONST_INT) - { - if (INTVAL (XEXP (note, 0)) == NOTE_INSN_SETJMP) - { - CONST_CALL_P (emit_note_after (INTVAL (XEXP (note, 0)), insn)) - = CONST_CALL_P (note); - remove_note (insn, note); - note = XEXP (note, 1); - } - else - { - last = emit_note_before (INTVAL (XEXP (note, 0)), last); - remove_note (insn, note); - note = XEXP (note, 1); - NOTE_BLOCK_NUMBER (last) = INTVAL (XEXP (note, 0)); - } - remove_note (insn, note); - } - } - return last; -} - -/* Use modified list scheduling to rearrange insns in basic block - B. FILE, if nonzero, is where we dump interesting output about - this pass. */ - -static void -schedule_block (b, file) - int b; - FILE *file; -{ - rtx insn, last; - rtx *ready, link; - int i, j, n_ready = 0, new_ready, n_insns; - int sched_n_insns = 0; - int clock; -#define NEED_NOTHING 0 -#define NEED_HEAD 1 -#define NEED_TAIL 2 - int new_needs; - - /* HEAD and TAIL delimit the region being scheduled. */ - rtx head = BLOCK_HEAD (b); - rtx tail = BLOCK_END (b); - /* PREV_HEAD and NEXT_TAIL are the boundaries of the insns - being scheduled. When the insns have been ordered, - these insns delimit where the new insns are to be - spliced back into the insn chain. */ - rtx next_tail; - rtx prev_head; - - /* Keep life information accurate. */ - register struct sometimes *regs_sometimes_live; - int sometimes_max; - - if (file) - fprintf (file, ";;\t -- basic block number %d from %d to %d --\n", - b, INSN_UID (BLOCK_HEAD (b)), INSN_UID (BLOCK_END (b))); - - i = max_reg_num (); - reg_last_uses = (rtx *) alloca (i * sizeof (rtx)); - bzero ((char *) reg_last_uses, i * sizeof (rtx)); - reg_last_sets = (rtx *) alloca (i * sizeof (rtx)); - bzero ((char *) reg_last_sets, i * sizeof (rtx)); - reg_pending_sets = ALLOCA_REG_SET (); - CLEAR_REG_SET (reg_pending_sets); - reg_pending_sets_all = 0; - clear_units (); - -#if 0 - /* We used to have code to avoid getting parameters moved from hard - argument registers into pseudos. - - However, it was removed when it proved to be of marginal benefit and - caused problems because of different notions of what the "head" insn - was. */ - - /* Remove certain insns at the beginning from scheduling, - by advancing HEAD. */ - - /* At the start of a function, before reload has run, don't delay getting - parameters from hard registers into pseudo registers. */ - if (reload_completed == 0 && b == 0) - { - while (head != tail - && GET_CODE (head) == NOTE - && NOTE_LINE_NUMBER (head) != NOTE_INSN_FUNCTION_BEG) - head = NEXT_INSN (head); - while (head != tail - && GET_CODE (head) == INSN - && GET_CODE (PATTERN (head)) == SET) - { - rtx src = SET_SRC (PATTERN (head)); - while (GET_CODE (src) == SUBREG - || GET_CODE (src) == SIGN_EXTEND - || GET_CODE (src) == ZERO_EXTEND - || GET_CODE (src) == SIGN_EXTRACT - || GET_CODE (src) == ZERO_EXTRACT) - src = XEXP (src, 0); - if (GET_CODE (src) != REG - || REGNO (src) >= FIRST_PSEUDO_REGISTER) - break; - /* Keep this insn from ever being scheduled. */ - INSN_REF_COUNT (head) = 1; - head = NEXT_INSN (head); - } - } -#endif - - /* Don't include any notes or labels at the beginning of the - basic block, or notes at the ends of basic blocks. */ - while (head != tail) - { - if (GET_CODE (head) == NOTE) - head = NEXT_INSN (head); - else if (GET_CODE (tail) == NOTE) - tail = PREV_INSN (tail); - else if (GET_CODE (head) == CODE_LABEL) - head = NEXT_INSN (head); - else break; - } - /* If the only insn left is a NOTE or a CODE_LABEL, then there is no need - to schedule this block. */ - if (head == tail - && (GET_CODE (head) == NOTE || GET_CODE (head) == CODE_LABEL)) - goto ret; - -#if 0 - /* This short-cut doesn't work. It does not count call insns crossed by - registers in reg_sometimes_live. It does not mark these registers as - dead if they die in this block. It does not mark these registers live - (or create new reg_sometimes_live entries if necessary) if they are born - in this block. - - The easy solution is to just always schedule a block. This block only - has one insn, so this won't slow down this pass by much. */ - - if (head == tail) - goto ret; -#endif - - /* Now HEAD through TAIL are the insns actually to be rearranged; - Let PREV_HEAD and NEXT_TAIL enclose them. */ - prev_head = PREV_INSN (head); - next_tail = NEXT_INSN (tail); - - /* Initialize basic block data structures. */ - dead_notes = 0; - pending_read_insns = 0; - pending_read_mems = 0; - pending_write_insns = 0; - pending_write_mems = 0; - pending_lists_length = 0; - last_pending_memory_flush = 0; - last_function_call = 0; - last_scheduled_insn = 0; - - LOG_LINKS (sched_before_next_call) = 0; - - n_insns = sched_analyze (head, tail); - if (n_insns == 0) - { - free_pending_lists (); - goto ret; - } - - /* Allocate vector to hold insns to be rearranged (except those - insns which are controlled by an insn with SCHED_GROUP_P set). - All these insns are included between ORIG_HEAD and ORIG_TAIL, - as those variables ultimately are set up. */ - ready = (rtx *) alloca ((n_insns+1) * sizeof (rtx)); - - /* TAIL is now the last of the insns to be rearranged. - Put those insns into the READY vector. */ - insn = tail; - - /* For all branches, calls, uses, and cc0 setters, force them to remain - in order at the end of the block by adding dependencies and giving - the last a high priority. There may be notes present, and prev_head - may also be a note. - - Branches must obviously remain at the end. Calls should remain at the - end since moving them results in worse register allocation. Uses remain - at the end to ensure proper register allocation. cc0 setters remaim - at the end because they can't be moved away from their cc0 user. */ - last = 0; - while (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN - || (GET_CODE (insn) == INSN - && (GET_CODE (PATTERN (insn)) == USE -#ifdef HAVE_cc0 - || sets_cc0_p (PATTERN (insn)) -#endif - )) - || GET_CODE (insn) == NOTE) - { - if (GET_CODE (insn) != NOTE) - { - priority (insn); - if (last == 0) - { - ready[n_ready++] = insn; - INSN_PRIORITY (insn) = TAIL_PRIORITY - i; - INSN_REF_COUNT (insn) = 0; - } - else if (! find_insn_list (insn, LOG_LINKS (last))) - { - add_dependence (last, insn, REG_DEP_ANTI); - INSN_REF_COUNT (insn)++; - } - last = insn; - - /* Skip over insns that are part of a group. */ - while (SCHED_GROUP_P (insn)) - { - insn = prev_nonnote_insn (insn); - priority (insn); - } - } - - insn = PREV_INSN (insn); - /* Don't overrun the bounds of the basic block. */ - if (insn == prev_head) - break; - } - - /* Assign priorities to instructions. Also check whether they - are in priority order already. If so then I will be nonnegative. - We use this shortcut only before reloading. */ -#if 0 - i = reload_completed ? DONE_PRIORITY : MAX_PRIORITY; -#endif - - for (; insn != prev_head; insn = PREV_INSN (insn)) - { - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') - { - priority (insn); - if (INSN_REF_COUNT (insn) == 0) - { - if (last == 0) - ready[n_ready++] = insn; - else - { - /* Make this dependent on the last of the instructions - that must remain in order at the end of the block. */ - add_dependence (last, insn, REG_DEP_ANTI); - INSN_REF_COUNT (insn) = 1; - } - } - if (SCHED_GROUP_P (insn)) - { - while (SCHED_GROUP_P (insn)) - { - insn = prev_nonnote_insn (insn); - priority (insn); - } - continue; - } -#if 0 - if (i < 0) - continue; - if (INSN_PRIORITY (insn) < i) - i = INSN_PRIORITY (insn); - else if (INSN_PRIORITY (insn) > i) - i = DONE_PRIORITY; -#endif - } - } - -#if 0 - /* This short-cut doesn't work. It does not count call insns crossed by - registers in reg_sometimes_live. It does not mark these registers as - dead if they die in this block. It does not mark these registers live - (or create new reg_sometimes_live entries if necessary) if they are born - in this block. - - The easy solution is to just always schedule a block. These blocks tend - to be very short, so this doesn't slow down this pass by much. */ - - /* If existing order is good, don't bother to reorder. */ - if (i != DONE_PRIORITY) - { - if (file) - fprintf (file, ";; already scheduled\n"); - - if (reload_completed == 0) - { - for (i = 0; i < sometimes_max; i++) - regs_sometimes_live[i].live_length += n_insns; - - finish_sometimes_live (regs_sometimes_live, sometimes_max); - } - free_pending_lists (); - goto ret; - } -#endif - - /* Scan all the insns to be scheduled, removing NOTE insns - and register death notes. - Line number NOTE insns end up in NOTE_LIST. - Register death notes end up in DEAD_NOTES. - - Recreate the register life information for the end of this basic - block. */ - - if (reload_completed == 0) - { - COPY_REG_SET (bb_live_regs, BASIC_BLOCK (b)->global_live_at_start); - CLEAR_REG_SET (bb_dead_regs); - - if (b == 0) - { - /* This is the first block in the function. There may be insns - before head that we can't schedule. We still need to examine - them though for accurate register lifetime analysis. */ - - /* We don't want to remove any REG_DEAD notes as the code below - does. */ - - for (insn = BLOCK_HEAD (b); insn != head; - insn = NEXT_INSN (insn)) - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') - { - /* See if the register gets born here. */ - /* We must check for registers being born before we check for - registers dying. It is possible for a register to be born - and die in the same insn, e.g. reading from a volatile - memory location into an otherwise unused register. Such - a register must be marked as dead after this insn. */ - if (GET_CODE (PATTERN (insn)) == SET - || GET_CODE (PATTERN (insn)) == CLOBBER) - sched_note_set (PATTERN (insn), 0); - else if (GET_CODE (PATTERN (insn)) == PARALLEL) - { - int j; - for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) - if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET - || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER) - sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0); - - /* ??? This code is obsolete and should be deleted. It - is harmless though, so we will leave it in for now. */ - for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) - if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == USE) - sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0); - } - - /* Each call clobbers (makes live) all call-clobbered regs - that are not global or fixed. Note that the function-value - reg is a call_clobbered reg. */ - - if (GET_CODE (insn) == CALL_INSN) - { - int j; - for (j = 0; j < FIRST_PSEUDO_REGISTER; j++) - if (call_used_regs[j] && ! global_regs[j] - && ! fixed_regs[j]) - { - SET_REGNO_REG_SET (bb_live_regs, j); - CLEAR_REGNO_REG_SET (bb_dead_regs, j); - } - } - - for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) - { - if ((REG_NOTE_KIND (link) == REG_DEAD - || REG_NOTE_KIND (link) == REG_UNUSED) - /* Verify that the REG_NOTE has a valid value. */ - && GET_CODE (XEXP (link, 0)) == REG) - { - register int regno = REGNO (XEXP (link, 0)); - - if (regno < FIRST_PSEUDO_REGISTER) - { - int j = HARD_REGNO_NREGS (regno, - GET_MODE (XEXP (link, 0))); - while (--j >= 0) - { - CLEAR_REGNO_REG_SET (bb_live_regs, regno + j); - SET_REGNO_REG_SET (bb_dead_regs, regno + j); - } - } - else - { - CLEAR_REGNO_REG_SET (bb_live_regs, regno); - SET_REGNO_REG_SET (bb_dead_regs, regno); - } - } - } - } - } - } - - /* If debugging information is being produced, keep track of the line - number notes for each insn. */ - if (write_symbols != NO_DEBUG) - { - /* We must use the true line number for the first insn in the block - that was computed and saved at the start of this pass. We can't - use the current line number, because scheduling of the previous - block may have changed the current line number. */ - rtx line = line_note_head[b]; - - for (insn = BLOCK_HEAD (b); - insn != next_tail; - insn = NEXT_INSN (insn)) - if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0) - line = insn; - else - LINE_NOTE (insn) = line; - } - - for (insn = head; insn != next_tail; insn = NEXT_INSN (insn)) - { - rtx prev, next, link; - - /* Farm out notes. This is needed to keep the debugger from - getting completely deranged. */ - if (GET_CODE (insn) == NOTE) - { - prev = insn; - insn = unlink_notes (insn, next_tail); - if (prev == tail) - abort (); - if (prev == head) - abort (); - if (insn == next_tail) - abort (); - } - - if (reload_completed == 0 - && GET_RTX_CLASS (GET_CODE (insn)) == 'i') - { - /* See if the register gets born here. */ - /* We must check for registers being born before we check for - registers dying. It is possible for a register to be born and - die in the same insn, e.g. reading from a volatile memory - location into an otherwise unused register. Such a register - must be marked as dead after this insn. */ - if (GET_CODE (PATTERN (insn)) == SET - || GET_CODE (PATTERN (insn)) == CLOBBER) - sched_note_set (PATTERN (insn), 0); - else if (GET_CODE (PATTERN (insn)) == PARALLEL) - { - int j; - for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) - if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET - || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER) - sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0); - - /* ??? This code is obsolete and should be deleted. It - is harmless though, so we will leave it in for now. */ - for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) - if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == USE) - sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0); - } - - /* Each call clobbers (makes live) all call-clobbered regs that are - not global or fixed. Note that the function-value reg is a - call_clobbered reg. */ - - if (GET_CODE (insn) == CALL_INSN) - { - int j; - for (j = 0; j < FIRST_PSEUDO_REGISTER; j++) - if (call_used_regs[j] && ! global_regs[j] - && ! fixed_regs[j]) - { - SET_REGNO_REG_SET (bb_live_regs, j); - CLEAR_REGNO_REG_SET (bb_dead_regs, j); - } - } - - /* Need to know what registers this insn kills. */ - for (prev = 0, link = REG_NOTES (insn); link; link = next) - { - next = XEXP (link, 1); - if ((REG_NOTE_KIND (link) == REG_DEAD - || REG_NOTE_KIND (link) == REG_UNUSED) - /* Verify that the REG_NOTE has a valid value. */ - && GET_CODE (XEXP (link, 0)) == REG) - { - register int regno = REGNO (XEXP (link, 0)); - - /* Only unlink REG_DEAD notes; leave REG_UNUSED notes - alone. */ - if (REG_NOTE_KIND (link) == REG_DEAD) - { - if (prev) - XEXP (prev, 1) = next; - else - REG_NOTES (insn) = next; - XEXP (link, 1) = dead_notes; - dead_notes = link; - } - else - prev = link; - - if (regno < FIRST_PSEUDO_REGISTER) - { - int j = HARD_REGNO_NREGS (regno, - GET_MODE (XEXP (link, 0))); - while (--j >= 0) - { - CLEAR_REGNO_REG_SET (bb_live_regs, regno + j); - SET_REGNO_REG_SET (bb_dead_regs, regno + j); - } - } - else - { - CLEAR_REGNO_REG_SET (bb_live_regs, regno); - SET_REGNO_REG_SET (bb_dead_regs, regno); - } - } - else - prev = link; - } - } - } - - if (reload_completed == 0) - { - /* Keep track of register lives. */ - old_live_regs = ALLOCA_REG_SET (); - regs_sometimes_live - = (struct sometimes *) alloca (max_regno * sizeof (struct sometimes)); - sometimes_max = 0; - - /* Start with registers live at end. */ - COPY_REG_SET (old_live_regs, bb_live_regs); - EXECUTE_IF_SET_IN_REG_SET (bb_live_regs, 0, j, - { - sometimes_max - = new_sometimes_live (regs_sometimes_live, - j, sometimes_max); - }); - } - - SCHED_SORT (ready, n_ready, 1); - - if (file) - { - fprintf (file, ";; ready list initially:\n;; "); - for (i = 0; i < n_ready; i++) - fprintf (file, "%d ", INSN_UID (ready[i])); - fprintf (file, "\n\n"); - - for (insn = head; insn != next_tail; insn = NEXT_INSN (insn)) - if (INSN_PRIORITY (insn) > 0) - fprintf (file, ";; insn[%4d]: priority = %4d, ref_count = %4d\n", - INSN_UID (insn), INSN_PRIORITY (insn), - INSN_REF_COUNT (insn)); - } - - /* Now HEAD and TAIL are going to become disconnected - entirely from the insn chain. */ - tail = 0; - - /* Q_SIZE will always be zero here. */ - q_ptr = 0; clock = 0; - bzero ((char *) insn_queue, sizeof (insn_queue)); - - /* Now, perform list scheduling. */ - - /* Where we start inserting insns is after TAIL. */ - last = next_tail; - - new_needs = (NEXT_INSN (prev_head) == BLOCK_HEAD (b) - ? NEED_HEAD : NEED_NOTHING); - if (PREV_INSN (next_tail) == BLOCK_END (b)) - new_needs |= NEED_TAIL; - - new_ready = n_ready; - while (sched_n_insns < n_insns) - { - q_ptr = NEXT_Q (q_ptr); clock++; - - /* Add all pending insns that can be scheduled without stalls to the - ready list. */ - for (insn = insn_queue[q_ptr]; insn; insn = NEXT_INSN (insn)) - { - if (file) - fprintf (file, ";; launching %d before %d with no stalls at T-%d\n", - INSN_UID (insn), INSN_UID (last), clock); - ready[new_ready++] = insn; - q_size -= 1; - } - insn_queue[q_ptr] = 0; - - /* If there are no ready insns, stall until one is ready and add all - of the pending insns at that point to the ready list. */ - if (new_ready == 0) - { - register int stalls; - - for (stalls = 1; stalls < INSN_QUEUE_SIZE; stalls++) - if ((insn = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)])) - { - for (; insn; insn = NEXT_INSN (insn)) - { - if (file) - fprintf (file, ";; launching %d before %d with %d stalls at T-%d\n", - INSN_UID (insn), INSN_UID (last), stalls, clock); - ready[new_ready++] = insn; - q_size -= 1; - } - insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = 0; - break; - } - - q_ptr = NEXT_Q_AFTER (q_ptr, stalls); clock += stalls; - } - - /* There should be some instructions waiting to fire. */ - if (new_ready == 0) - abort (); - - if (file) - { - fprintf (file, ";; ready list at T-%d:", clock); - for (i = 0; i < new_ready; i++) - fprintf (file, " %d (%x)", - INSN_UID (ready[i]), INSN_PRIORITY (ready[i])); - } - - /* Sort the ready list and choose the best insn to schedule. Select - which insn should issue in this cycle and queue those that are - blocked by function unit hazards. - - N_READY holds the number of items that were scheduled the last time, - minus the one instruction scheduled on the last loop iteration; it - is not modified for any other reason in this loop. */ - - SCHED_SORT (ready, new_ready, n_ready); - if (MAX_BLOCKAGE > 1) - { - new_ready = schedule_select (ready, new_ready, clock, file); - if (new_ready == 0) - { - if (file) - fprintf (file, "\n"); - /* We must set n_ready here, to ensure that sorting always - occurs when we come back to the SCHED_SORT line above. */ - n_ready = 0; - continue; - } - } - n_ready = new_ready; - last_scheduled_insn = insn = ready[0]; - - /* The first insn scheduled becomes the new tail. */ - if (tail == 0) - tail = insn; - - if (file) - { - fprintf (file, ", now"); - for (i = 0; i < n_ready; i++) - fprintf (file, " %d", INSN_UID (ready[i])); - fprintf (file, "\n"); - } - - if (DONE_PRIORITY_P (insn)) - abort (); - - if (reload_completed == 0) - { - /* Process this insn, and each insn linked to this one which must - be immediately output after this insn. */ - do - { - /* First we kill registers set by this insn, and then we - make registers used by this insn live. This is the opposite - order used above because we are traversing the instructions - backwards. */ - - /* Strictly speaking, we should scan REG_UNUSED notes and make - every register mentioned there live, however, we will just - kill them again immediately below, so there doesn't seem to - be any reason why we bother to do this. */ - - /* See if this is the last notice we must take of a register. */ - if (GET_CODE (PATTERN (insn)) == SET - || GET_CODE (PATTERN (insn)) == CLOBBER) - sched_note_set (PATTERN (insn), 1); - else if (GET_CODE (PATTERN (insn)) == PARALLEL) - { - int j; - for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) - if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET - || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER) - sched_note_set (XVECEXP (PATTERN (insn), 0, j), 1); - } - - /* This code keeps life analysis information up to date. */ - if (GET_CODE (insn) == CALL_INSN) - { - register struct sometimes *p; - - /* A call kills all call used registers that are not - global or fixed, except for those mentioned in the call - pattern which will be made live again later. */ - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - if (call_used_regs[i] && ! global_regs[i] - && ! fixed_regs[i]) - { - CLEAR_REGNO_REG_SET (bb_live_regs, i); - SET_REGNO_REG_SET (bb_dead_regs, i); - } - - /* Regs live at the time of a call instruction must not - go in a register clobbered by calls. Record this for - all regs now live. Note that insns which are born or - die in a call do not cross a call, so this must be done - after the killings (above) and before the births - (below). */ - p = regs_sometimes_live; - for (i = 0; i < sometimes_max; i++, p++) - if (REGNO_REG_SET_P (bb_live_regs, p->regno)) - p->calls_crossed += 1; - } - - /* Make every register used live, and add REG_DEAD notes for - registers which were not live before we started. */ - attach_deaths_insn (insn); - - /* Find registers now made live by that instruction. */ - EXECUTE_IF_AND_COMPL_IN_REG_SET (bb_live_regs, old_live_regs, 0, i, - { - sometimes_max - = new_sometimes_live (regs_sometimes_live, - i, sometimes_max); - }); - IOR_REG_SET (old_live_regs, bb_live_regs); - - /* Count lengths of all regs we are worrying about now, - and handle registers no longer live. */ - - for (i = 0; i < sometimes_max; i++) - { - register struct sometimes *p = ®s_sometimes_live[i]; - int regno = p->regno; - - p->live_length += 1; - - if (!REGNO_REG_SET_P (bb_live_regs, p->regno)) - { - /* This is the end of one of this register's lifetime - segments. Save the lifetime info collected so far, - and clear its bit in the old_live_regs entry. */ - sched_reg_live_length[regno] += p->live_length; - sched_reg_n_calls_crossed[regno] += p->calls_crossed; - CLEAR_REGNO_REG_SET (old_live_regs, p->regno); - - /* Delete the reg_sometimes_live entry for this reg by - copying the last entry over top of it. */ - *p = regs_sometimes_live[--sometimes_max]; - /* ...and decrement i so that this newly copied entry - will be processed. */ - i--; - } - } - - link = insn; - insn = PREV_INSN (insn); - } - while (SCHED_GROUP_P (link)); - - /* Set INSN back to the insn we are scheduling now. */ - insn = ready[0]; - } - - /* Schedule INSN. Remove it from the ready list. */ - ready += 1; - n_ready -= 1; - - sched_n_insns += 1; - NEXT_INSN (insn) = last; - PREV_INSN (last) = insn; - - /* Everything that precedes INSN now either becomes "ready", if - it can execute immediately before INSN, or "pending", if - there must be a delay. Give INSN high enough priority that - at least one (maybe more) reg-killing insns can be launched - ahead of all others. Mark INSN as scheduled by changing its - priority to -1. */ - INSN_PRIORITY (insn) = LAUNCH_PRIORITY; - new_ready = schedule_insn (insn, ready, n_ready, clock); - INSN_PRIORITY (insn) = DONE_PRIORITY; - - /* Schedule all prior insns that must not be moved. */ - if (SCHED_GROUP_P (insn)) - { - /* Disable these insns from being launched, in case one of the - insns in the group has a dependency on an earlier one. */ - link = insn; - while (SCHED_GROUP_P (link)) - { - /* Disable these insns from being launched by anybody. */ - link = PREV_INSN (link); - INSN_REF_COUNT (link) = 0; - } - - /* Now handle each group insn like the main insn was handled - above. */ - link = insn; - while (SCHED_GROUP_P (link)) - { - link = PREV_INSN (link); - - sched_n_insns += 1; - - /* ??? Why don't we set LAUNCH_PRIORITY here? */ - new_ready = schedule_insn (link, ready, new_ready, clock); - INSN_PRIORITY (link) = DONE_PRIORITY; - } - } - - /* Put back NOTE_INSN_SETJMP, - NOTE_INSN_{LOOP,EHREGION}_{BEGIN,END} notes. */ - - /* To prime the loop. We need to handle INSN and all the insns in the - sched group. */ - last = NEXT_INSN (insn); - do - { - insn = PREV_INSN (last); - - /* Maintain a valid chain so emit_note_before works. - This is necessary because PREV_INSN (insn) isn't valid - (if ! SCHED_GROUP_P) and if it points to an insn already - scheduled, a circularity will result. */ - if (! SCHED_GROUP_P (insn)) - { - NEXT_INSN (prev_head) = insn; - PREV_INSN (insn) = prev_head; - } - - last = reemit_notes (insn, insn); - } - while (SCHED_GROUP_P (insn)); - } - if (q_size != 0) - abort (); - - if (reload_completed == 0) - finish_sometimes_live (regs_sometimes_live, sometimes_max); - - /* HEAD is now the first insn in the chain of insns that - been scheduled by the loop above. - TAIL is the last of those insns. */ - head = last; - - /* NOTE_LIST is the end of a chain of notes previously found - among the insns. Insert them at the beginning of the insns. */ - if (note_list != 0) - { - rtx note_head = note_list; - while (PREV_INSN (note_head)) - note_head = PREV_INSN (note_head); - - PREV_INSN (head) = note_list; - NEXT_INSN (note_list) = head; - head = note_head; - } - - /* There should be no REG_DEAD notes leftover at the end. - In practice, this can occur as the result of bugs in flow, combine.c, - and/or sched.c. The values of the REG_DEAD notes remaining are - meaningless, because dead_notes is just used as a free list. */ -#if 1 - if (dead_notes != 0) - abort (); -#endif - - if (new_needs & NEED_HEAD) - BLOCK_HEAD (b) = head; - PREV_INSN (head) = prev_head; - NEXT_INSN (prev_head) = head; - - if (new_needs & NEED_TAIL) - BLOCK_END (b) = tail; - NEXT_INSN (tail) = next_tail; - PREV_INSN (next_tail) = tail; - - /* Restore the line-number notes of each insn. */ - if (write_symbols != NO_DEBUG) - { - rtx line, note, prev, new; - int notes = 0; - - head = BLOCK_HEAD (b); - next_tail = NEXT_INSN (BLOCK_END (b)); - - /* Determine the current line-number. We want to know the current - line number of the first insn of the block here, in case it is - different from the true line number that was saved earlier. If - different, then we need a line number note before the first insn - of this block. If it happens to be the same, then we don't want to - emit another line number note here. */ - for (line = head; line; line = PREV_INSN (line)) - if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0) - break; - - /* Walk the insns keeping track of the current line-number and inserting - the line-number notes as needed. */ - for (insn = head; insn != next_tail; insn = NEXT_INSN (insn)) - if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0) - line = insn; - /* This used to emit line number notes before every non-deleted note. - However, this confuses a debugger, because line notes not separated - by real instructions all end up at the same address. I can find no - use for line number notes before other notes, so none are emitted. */ - else if (GET_CODE (insn) != NOTE - && (note = LINE_NOTE (insn)) != 0 - && note != line - && (line == 0 - || NOTE_LINE_NUMBER (note) != NOTE_LINE_NUMBER (line) - || NOTE_SOURCE_FILE (note) != NOTE_SOURCE_FILE (line))) - { - line = note; - prev = PREV_INSN (insn); - if (LINE_NOTE (note)) - { - /* Re-use the original line-number note. */ - LINE_NOTE (note) = 0; - PREV_INSN (note) = prev; - NEXT_INSN (prev) = note; - PREV_INSN (insn) = note; - NEXT_INSN (note) = insn; - } - else - { - notes++; - new = emit_note_after (NOTE_LINE_NUMBER (note), prev); - NOTE_SOURCE_FILE (new) = NOTE_SOURCE_FILE (note); - RTX_INTEGRATED_P (new) = RTX_INTEGRATED_P (note); - } - } - if (file && notes) - fprintf (file, ";; added %d line-number notes\n", notes); - } - - if (file) - { - fprintf (file, ";; total time = %d\n;; new basic block head = %d\n;; new basic block end = %d\n\n", - clock, INSN_UID (BLOCK_HEAD (b)), INSN_UID (BLOCK_END (b))); - } - - /* Yow! We're done! */ - free_pending_lists (); - -ret: - FREE_REG_SET (reg_pending_sets); - FREE_REG_SET (old_live_regs); - - return; -} - -/* Subroutine of update_flow_info. Determines whether any new REG_NOTEs are - needed for the hard register mentioned in the note. This can happen - if the reference to the hard register in the original insn was split into - several smaller hard register references in the split insns. */ - -static void -split_hard_reg_notes (note, first, last) - rtx note, first, last; -{ - rtx reg, temp, link; - int n_regs, i, new_reg; - rtx insn; - - /* Assume that this is a REG_DEAD note. */ - if (REG_NOTE_KIND (note) != REG_DEAD) - abort (); - - reg = XEXP (note, 0); - - n_regs = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)); - - for (i = 0; i < n_regs; i++) - { - new_reg = REGNO (reg) + i; - - /* Check for references to new_reg in the split insns. */ - for (insn = last; ; insn = PREV_INSN (insn)) - { - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' - && (temp = regno_use_in (new_reg, PATTERN (insn)))) - { - /* Create a new reg dead note here. */ - link = rtx_alloc (EXPR_LIST); - PUT_REG_NOTE_KIND (link, REG_DEAD); - XEXP (link, 0) = temp; - XEXP (link, 1) = REG_NOTES (insn); - REG_NOTES (insn) = link; - - /* If killed multiple registers here, then add in the excess. */ - i += HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) - 1; - - break; - } - /* It isn't mentioned anywhere, so no new reg note is needed for - this register. */ - if (insn == first) - break; - } - } -} - -/* Subroutine of update_flow_info. Determines whether a SET or CLOBBER in an - insn created by splitting needs a REG_DEAD or REG_UNUSED note added. */ - -static void -new_insn_dead_notes (pat, insn, last, orig_insn) - rtx pat, insn, last, orig_insn; -{ - rtx dest, tem, set; - - /* PAT is either a CLOBBER or a SET here. */ - dest = XEXP (pat, 0); - - while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG - || GET_CODE (dest) == STRICT_LOW_PART - || GET_CODE (dest) == SIGN_EXTRACT) - dest = XEXP (dest, 0); - - if (GET_CODE (dest) == REG) - { - /* If the original insn already used this register, we may not add new - notes for it. One example for a split that needs this test is - when a multi-word memory access with register-indirect addressing - is split into multiple memory accesses with auto-increment and - one adjusting add instruction for the address register. */ - if (reg_referenced_p (dest, PATTERN (orig_insn))) - return; - for (tem = last; tem != insn; tem = PREV_INSN (tem)) - { - if (GET_RTX_CLASS (GET_CODE (tem)) == 'i' - && reg_overlap_mentioned_p (dest, PATTERN (tem)) - && (set = single_set (tem))) - { - rtx tem_dest = SET_DEST (set); - - while (GET_CODE (tem_dest) == ZERO_EXTRACT - || GET_CODE (tem_dest) == SUBREG - || GET_CODE (tem_dest) == STRICT_LOW_PART - || GET_CODE (tem_dest) == SIGN_EXTRACT) - tem_dest = XEXP (tem_dest, 0); - - if (! rtx_equal_p (tem_dest, dest)) - { - /* Use the same scheme as combine.c, don't put both REG_DEAD - and REG_UNUSED notes on the same insn. */ - if (! find_regno_note (tem, REG_UNUSED, REGNO (dest)) - && ! find_regno_note (tem, REG_DEAD, REGNO (dest))) - { - rtx note = rtx_alloc (EXPR_LIST); - PUT_REG_NOTE_KIND (note, REG_DEAD); - XEXP (note, 0) = dest; - XEXP (note, 1) = REG_NOTES (tem); - REG_NOTES (tem) = note; - } - /* The reg only dies in one insn, the last one that uses - it. */ - break; - } - else if (reg_overlap_mentioned_p (dest, SET_SRC (set))) - /* We found an instruction that both uses the register, - and sets it, so no new REG_NOTE is needed for this set. */ - break; - } - } - /* If this is a set, it must die somewhere, unless it is the dest of - the original insn, and hence is live after the original insn. Abort - if it isn't supposed to be live after the original insn. - - If this is a clobber, then just add a REG_UNUSED note. */ - if (tem == insn) - { - int live_after_orig_insn = 0; - rtx pattern = PATTERN (orig_insn); - int i; - - if (GET_CODE (pat) == CLOBBER) - { - rtx note = rtx_alloc (EXPR_LIST); - PUT_REG_NOTE_KIND (note, REG_UNUSED); - XEXP (note, 0) = dest; - XEXP (note, 1) = REG_NOTES (insn); - REG_NOTES (insn) = note; - return; - } - - /* The original insn could have multiple sets, so search the - insn for all sets. */ - if (GET_CODE (pattern) == SET) - { - if (reg_overlap_mentioned_p (dest, SET_DEST (pattern))) - live_after_orig_insn = 1; - } - else if (GET_CODE (pattern) == PARALLEL) - { - for (i = 0; i < XVECLEN (pattern, 0); i++) - if (GET_CODE (XVECEXP (pattern, 0, i)) == SET - && reg_overlap_mentioned_p (dest, - SET_DEST (XVECEXP (pattern, - 0, i)))) - live_after_orig_insn = 1; - } - - if (! live_after_orig_insn) - abort (); - } - } -} - -/* Subroutine of update_flow_info. Update the value of reg_n_sets for all - registers modified by X. INC is -1 if the containing insn is being deleted, - and is 1 if the containing insn is a newly generated insn. */ - -static void -update_n_sets (x, inc) - rtx x; - int inc; -{ - rtx dest = SET_DEST (x); - - while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG - || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT) - dest = SUBREG_REG (dest); - - if (GET_CODE (dest) == REG) - { - int regno = REGNO (dest); - - if (regno < FIRST_PSEUDO_REGISTER) - { - register int i; - int endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)); - - for (i = regno; i < endregno; i++) - REG_N_SETS (i) += inc; - } - else - REG_N_SETS (regno) += inc; - } -} - -/* Updates all flow-analysis related quantities (including REG_NOTES) for - the insns from FIRST to LAST inclusive that were created by splitting - ORIG_INSN. NOTES are the original REG_NOTES. */ - -void -update_flow_info (notes, first, last, orig_insn) - rtx notes; - rtx first, last; - rtx orig_insn; -{ - rtx insn, note; - rtx next; - rtx orig_dest, temp; - rtx set; - - /* Get and save the destination set by the original insn. */ - - orig_dest = single_set (orig_insn); - if (orig_dest) - orig_dest = SET_DEST (orig_dest); - - /* Move REG_NOTES from the original insn to where they now belong. */ - - for (note = notes; note; note = next) - { - next = XEXP (note, 1); - switch (REG_NOTE_KIND (note)) - { - case REG_DEAD: - case REG_UNUSED: - /* Move these notes from the original insn to the last new insn where - the register is now set. */ - - for (insn = last; ; insn = PREV_INSN (insn)) - { - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' - && reg_mentioned_p (XEXP (note, 0), PATTERN (insn))) - { - /* If this note refers to a multiple word hard register, it - may have been split into several smaller hard register - references, so handle it specially. */ - temp = XEXP (note, 0); - if (REG_NOTE_KIND (note) == REG_DEAD - && GET_CODE (temp) == REG - && REGNO (temp) < FIRST_PSEUDO_REGISTER - && HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) > 1) - split_hard_reg_notes (note, first, last); - else - { - XEXP (note, 1) = REG_NOTES (insn); - REG_NOTES (insn) = note; - } - - /* Sometimes need to convert REG_UNUSED notes to REG_DEAD - notes. */ - /* ??? This won't handle multiple word registers correctly, - but should be good enough for now. */ - if (REG_NOTE_KIND (note) == REG_UNUSED - && GET_CODE (XEXP (note, 0)) != SCRATCH - && ! dead_or_set_p (insn, XEXP (note, 0))) - PUT_REG_NOTE_KIND (note, REG_DEAD); - - /* The reg only dies in one insn, the last one that uses - it. */ - break; - } - /* It must die somewhere, fail it we couldn't find where it died. - - If this is a REG_UNUSED note, then it must be a temporary - register that was not needed by this instantiation of the - pattern, so we can safely ignore it. */ - if (insn == first) - { - if (REG_NOTE_KIND (note) != REG_UNUSED) - abort (); - - break; - } - } - break; - - case REG_WAS_0: - /* If the insn that set the register to 0 was deleted, this - note cannot be relied on any longer. The destination might - even have been moved to memory. - This was observed for SH4 with execute/920501-6.c compilation, - -O2 -fomit-frame-pointer -finline-functions . */ - if (GET_CODE (XEXP (note, 0)) == NOTE - || INSN_DELETED_P (XEXP (note, 0))) - break; - /* This note applies to the dest of the original insn. Find the - first new insn that now has the same dest, and move the note - there. */ - - if (! orig_dest) - abort (); - - for (insn = first; ; insn = NEXT_INSN (insn)) - { - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' - && (temp = single_set (insn)) - && rtx_equal_p (SET_DEST (temp), orig_dest)) - { - XEXP (note, 1) = REG_NOTES (insn); - REG_NOTES (insn) = note; - /* The reg is only zero before one insn, the first that - uses it. */ - break; - } - /* If this note refers to a multiple word hard - register, it may have been split into several smaller - hard register references. We could split the notes, - but simply dropping them is good enough. */ - if (GET_CODE (orig_dest) == REG - && REGNO (orig_dest) < FIRST_PSEUDO_REGISTER - && HARD_REGNO_NREGS (REGNO (orig_dest), - GET_MODE (orig_dest)) > 1) - break; - /* It must be set somewhere, fail if we couldn't find where it - was set. */ - if (insn == last) - abort (); - } - break; - - case REG_EQUAL: - case REG_EQUIV: - /* A REG_EQUIV or REG_EQUAL note on an insn with more than one - set is meaningless. Just drop the note. */ - if (! orig_dest) - break; - - case REG_NO_CONFLICT: - /* These notes apply to the dest of the original insn. Find the last - new insn that now has the same dest, and move the note there. */ - - if (! orig_dest) - abort (); - - for (insn = last; ; insn = PREV_INSN (insn)) - { - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' - && (temp = single_set (insn)) - && rtx_equal_p (SET_DEST (temp), orig_dest)) - { - XEXP (note, 1) = REG_NOTES (insn); - REG_NOTES (insn) = note; - /* Only put this note on one of the new insns. */ - break; - } - - /* The original dest must still be set someplace. Abort if we - couldn't find it. */ - if (insn == first) - { - /* However, if this note refers to a multiple word hard - register, it may have been split into several smaller - hard register references. We could split the notes, - but simply dropping them is good enough. */ - if (GET_CODE (orig_dest) == REG - && REGNO (orig_dest) < FIRST_PSEUDO_REGISTER - && HARD_REGNO_NREGS (REGNO (orig_dest), - GET_MODE (orig_dest)) > 1) - break; - /* Likewise for multi-word memory references. */ - if (GET_CODE (orig_dest) == MEM - && SIZE_FOR_MODE (orig_dest) > MOVE_MAX) - break; - abort (); - } - } - break; - - case REG_LIBCALL: - /* Move a REG_LIBCALL note to the first insn created, and update - the corresponding REG_RETVAL note. */ - XEXP (note, 1) = REG_NOTES (first); - REG_NOTES (first) = note; - - insn = XEXP (note, 0); - note = find_reg_note (insn, REG_RETVAL, NULL_RTX); - if (note) - XEXP (note, 0) = first; - break; - - case REG_EXEC_COUNT: - /* Move a REG_EXEC_COUNT note to the first insn created. */ - XEXP (note, 1) = REG_NOTES (first); - REG_NOTES (first) = note; - break; - - case REG_RETVAL: - /* Move a REG_RETVAL note to the last insn created, and update - the corresponding REG_LIBCALL note. */ - XEXP (note, 1) = REG_NOTES (last); - REG_NOTES (last) = note; - - insn = XEXP (note, 0); - note = find_reg_note (insn, REG_LIBCALL, NULL_RTX); - if (note) - XEXP (note, 0) = last; - break; - - case REG_NONNEG: - case REG_BR_PROB: - /* This should be moved to whichever instruction is a JUMP_INSN. */ - - for (insn = last; ; insn = PREV_INSN (insn)) - { - if (GET_CODE (insn) == JUMP_INSN) - { - XEXP (note, 1) = REG_NOTES (insn); - REG_NOTES (insn) = note; - /* Only put this note on one of the new insns. */ - break; - } - /* Fail if we couldn't find a JUMP_INSN. */ - if (insn == first) - abort (); - } - break; - - case REG_INC: - /* reload sometimes leaves obsolete REG_INC notes around. */ - if (reload_completed) - break; - /* This should be moved to whichever instruction now has the - increment operation. */ - abort (); - - case REG_LABEL: - /* Should be moved to the new insn(s) which use the label. */ - for (insn = first; insn != NEXT_INSN (last); insn = NEXT_INSN (insn)) - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' - && reg_mentioned_p (XEXP (note, 0), PATTERN (insn))) - REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_LABEL, - XEXP (note, 0), - REG_NOTES (insn)); - break; - - case REG_CC_SETTER: - case REG_CC_USER: - /* These two notes will never appear until after reorg, so we don't - have to handle them here. */ - default: - abort (); - } - } - - /* Each new insn created, except the last, has a new set. If the destination - is a register, then this reg is now live across several insns, whereas - previously the dest reg was born and died within the same insn. To - reflect this, we now need a REG_DEAD note on the insn where this - dest reg dies. - - Similarly, the new insns may have clobbers that need REG_UNUSED notes. */ - - for (insn = first; insn != last; insn = NEXT_INSN (insn)) - { - rtx pat; - int i; - - pat = PATTERN (insn); - if (GET_CODE (pat) == SET || GET_CODE (pat) == CLOBBER) - new_insn_dead_notes (pat, insn, last, orig_insn); - else if (GET_CODE (pat) == PARALLEL) - { - for (i = 0; i < XVECLEN (pat, 0); i++) - if (GET_CODE (XVECEXP (pat, 0, i)) == SET - || GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER) - new_insn_dead_notes (XVECEXP (pat, 0, i), insn, last, orig_insn); - } - } - - /* If any insn, except the last, uses the register set by the last insn, - then we need a new REG_DEAD note on that insn. In this case, there - would not have been a REG_DEAD note for this register in the original - insn because it was used and set within one insn. */ - - set = single_set (last); - if (set) - { - rtx dest = SET_DEST (set); - - while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG - || GET_CODE (dest) == STRICT_LOW_PART - || GET_CODE (dest) == SIGN_EXTRACT) - dest = XEXP (dest, 0); - - if (GET_CODE (dest) == REG - /* Global registers are always live, so the code below does not - apply to them. */ - && (REGNO (dest) >= FIRST_PSEUDO_REGISTER - || ! global_regs[REGNO (dest)])) - { - rtx stop_insn = PREV_INSN (first); - - /* If the last insn uses the register that it is setting, then - we don't want to put a REG_DEAD note there. Search backwards - to find the first insn that sets but does not use DEST. */ - - insn = last; - if (reg_overlap_mentioned_p (dest, SET_SRC (set))) - { - for (insn = PREV_INSN (insn); insn != first; - insn = PREV_INSN (insn)) - { - if ((set = single_set (insn)) - && reg_mentioned_p (dest, SET_DEST (set)) - && ! reg_overlap_mentioned_p (dest, SET_SRC (set))) - break; - } - } - - /* Now find the first insn that uses but does not set DEST. */ - - for (insn = PREV_INSN (insn); insn != stop_insn; - insn = PREV_INSN (insn)) - { - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' - && reg_mentioned_p (dest, PATTERN (insn)) - && (set = single_set (insn))) - { - rtx insn_dest = SET_DEST (set); - - while (GET_CODE (insn_dest) == ZERO_EXTRACT - || GET_CODE (insn_dest) == SUBREG - || GET_CODE (insn_dest) == STRICT_LOW_PART - || GET_CODE (insn_dest) == SIGN_EXTRACT) - insn_dest = XEXP (insn_dest, 0); - - if (insn_dest != dest) - { - note = rtx_alloc (EXPR_LIST); - PUT_REG_NOTE_KIND (note, REG_DEAD); - XEXP (note, 0) = dest; - XEXP (note, 1) = REG_NOTES (insn); - REG_NOTES (insn) = note; - /* The reg only dies in one insn, the last one - that uses it. */ - break; - } - } - } - } - } - - /* If the original dest is modifying a multiple register target, and the - original instruction was split such that the original dest is now set - by two or more SUBREG sets, then the split insns no longer kill the - destination of the original insn. - - In this case, if there exists an instruction in the same basic block, - before the split insn, which uses the original dest, and this use is - killed by the original insn, then we must remove the REG_DEAD note on - this insn, because it is now superfluous. - - This does not apply when a hard register gets split, because the code - knows how to handle overlapping hard registers properly. */ - if (orig_dest && GET_CODE (orig_dest) == REG) - { - int found_orig_dest = 0; - int found_split_dest = 0; - - for (insn = first; ; insn = NEXT_INSN (insn)) - { - rtx pat = PATTERN (insn); - int i = GET_CODE (pat) == PARALLEL ? XVECLEN (pat, 0) : 0; - set = pat; - for (;;) - { - if (GET_CODE (set) == SET) - { - if (GET_CODE (SET_DEST (set)) == REG - && REGNO (SET_DEST (set)) == REGNO (orig_dest)) - { - found_orig_dest = 1; - break; - } - else if (GET_CODE (SET_DEST (set)) == SUBREG - && SUBREG_REG (SET_DEST (set)) == orig_dest) - { - found_split_dest = 1; - break; - } - } - if (--i < 0) - break; - set = XVECEXP (pat, 0, i); - } - - if (insn == last) - break; - } - - if (found_split_dest) - { - /* Search backwards from FIRST, looking for the first insn that uses - the original dest. Stop if we pass a CODE_LABEL or a JUMP_INSN. - If we find an insn, and it has a REG_DEAD note, then delete the - note. */ - - for (insn = first; insn; insn = PREV_INSN (insn)) - { - if (GET_CODE (insn) == CODE_LABEL - || GET_CODE (insn) == JUMP_INSN) - break; - else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' - && reg_mentioned_p (orig_dest, insn)) - { - note = find_regno_note (insn, REG_DEAD, REGNO (orig_dest)); - if (note) - remove_note (insn, note); - } - } - } - else if (! found_orig_dest) - { - int i, regno; - - /* Should never reach here for a pseudo reg. */ - if (REGNO (orig_dest) >= FIRST_PSEUDO_REGISTER) - abort (); - - /* This can happen for a hard register, if the splitter - does not bother to emit instructions which would be no-ops. - We try to verify that this is the case by checking to see if - the original instruction uses all of the registers that it - set. This case is OK, because deleting a no-op can not affect - REG_DEAD notes on other insns. If this is not the case, then - abort. */ - - regno = REGNO (orig_dest); - for (i = HARD_REGNO_NREGS (regno, GET_MODE (orig_dest)) - 1; - i >= 0; i--) - if (! refers_to_regno_p (regno + i, regno + i + 1, orig_insn, - NULL_PTR)) - break; - if (i >= 0) - abort (); - } - } - - /* Update reg_n_sets. This is necessary to prevent local alloc from - converting REG_EQUAL notes to REG_EQUIV when splitting has modified - a reg from set once to set multiple times. */ - - { - rtx x = PATTERN (orig_insn); - RTX_CODE code = GET_CODE (x); - - if (code == SET || code == CLOBBER) - update_n_sets (x, -1); - else if (code == PARALLEL) - { - int i; - for (i = XVECLEN (x, 0) - 1; i >= 0; i--) - { - code = GET_CODE (XVECEXP (x, 0, i)); - if (code == SET || code == CLOBBER) - update_n_sets (XVECEXP (x, 0, i), -1); - } - } - - for (insn = first; ; insn = NEXT_INSN (insn)) - { - x = PATTERN (insn); - code = GET_CODE (x); - - if (code == SET || code == CLOBBER) - update_n_sets (x, 1); - else if (code == PARALLEL) - { - int i; - for (i = XVECLEN (x, 0) - 1; i >= 0; i--) - { - code = GET_CODE (XVECEXP (x, 0, i)); - if (code == SET || code == CLOBBER) - update_n_sets (XVECEXP (x, 0, i), 1); - } - } - - if (insn == last) - break; - } - } -} - -/* The one entry point in this file. DUMP_FILE is the dump file for - this pass. */ - -void -schedule_insns (dump_file) - FILE *dump_file; -{ - int max_uid = MAX_INSNS_PER_SPLIT * (get_max_uid () + 1); - int b; - rtx insn; - - /* Taking care of this degenerate case makes the rest of - this code simpler. */ - if (n_basic_blocks == 0) - return; - - /* Create an insn here so that we can hang dependencies off of it later. */ - sched_before_next_call - = gen_rtx_INSN (VOIDmode, 0, NULL_RTX, NULL_RTX, - NULL_RTX, 0, NULL_RTX, NULL_RTX); - - /* Initialize the unused_*_lists. We can't use the ones left over from - the previous function, because gcc has freed that memory. We can use - the ones left over from the first sched pass in the second pass however, - so only clear them on the first sched pass. The first pass is before - reload if flag_schedule_insns is set, otherwise it is afterwards. */ - - if (reload_completed == 0 || ! flag_schedule_insns) - { - unused_insn_list = 0; - unused_expr_list = 0; - } - - /* We create no insns here, only reorder them, so we - remember how far we can cut back the stack on exit. */ - - /* Allocate data for this pass. See comments, above, - for what these vectors do. - - We use xmalloc instead of alloca, because max_uid can be very large - when there is a lot of function inlining. If we used alloca, we could - exceed stack limits on some hosts for some inputs. */ - insn_luid = (int *) xmalloc (max_uid * sizeof (int)); - insn_priority = (int *) xmalloc (max_uid * sizeof (int)); - insn_tick = (int *) xmalloc (max_uid * sizeof (int)); - insn_costs = (short *) xmalloc (max_uid * sizeof (short)); - insn_units = (short *) xmalloc (max_uid * sizeof (short)); - insn_blockage = (unsigned int *) xmalloc (max_uid * sizeof (unsigned int)); - insn_ref_count = (int *) xmalloc (max_uid * sizeof (int)); - - if (reload_completed == 0) - { - sched_reg_n_calls_crossed = (int *) alloca (max_regno * sizeof (int)); - sched_reg_live_length = (int *) alloca (max_regno * sizeof (int)); - bb_dead_regs = ALLOCA_REG_SET (); - bb_live_regs = ALLOCA_REG_SET (); - bzero ((char *) sched_reg_n_calls_crossed, max_regno * sizeof (int)); - bzero ((char *) sched_reg_live_length, max_regno * sizeof (int)); - } - else - { - sched_reg_n_calls_crossed = 0; - sched_reg_live_length = 0; - bb_dead_regs = 0; - bb_live_regs = 0; - } - init_alias_analysis (); - - if (write_symbols != NO_DEBUG) - { - rtx line; - - line_note = (rtx *) xmalloc (max_uid * sizeof (rtx)); - bzero ((char *) line_note, max_uid * sizeof (rtx)); - line_note_head = (rtx *) alloca (n_basic_blocks * sizeof (rtx)); - bzero ((char *) line_note_head, n_basic_blocks * sizeof (rtx)); - - /* Determine the line-number at the start of each basic block. - This must be computed and saved now, because after a basic block's - predecessor has been scheduled, it is impossible to accurately - determine the correct line number for the first insn of the block. */ - - for (b = 0; b < n_basic_blocks; b++) - for (line = BLOCK_HEAD (b); line; line = PREV_INSN (line)) - if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0) - { - line_note_head[b] = line; - break; - } - } - - bzero ((char *) insn_luid, max_uid * sizeof (int)); - bzero ((char *) insn_priority, max_uid * sizeof (int)); - bzero ((char *) insn_tick, max_uid * sizeof (int)); - bzero ((char *) insn_costs, max_uid * sizeof (short)); - bzero ((char *) insn_units, max_uid * sizeof (short)); - bzero ((char *) insn_blockage, max_uid * sizeof (unsigned int)); - bzero ((char *) insn_ref_count, max_uid * sizeof (int)); - - /* Schedule each basic block, block by block. */ - - /* ??? Add a NOTE after the last insn of the last basic block. It is not - known why this is done. */ - /* ??? Perhaps it's done to ensure NEXT_TAIL in schedule_block is a - valid insn. */ - - insn = BLOCK_END (n_basic_blocks-1); - if (NEXT_INSN (insn) == 0 - || (GET_CODE (insn) != NOTE - && GET_CODE (insn) != CODE_LABEL - /* Don't emit a NOTE if it would end up between an unconditional - jump and a BARRIER. */ - && ! (GET_CODE (insn) == JUMP_INSN - && GET_CODE (NEXT_INSN (insn)) == BARRIER))) - emit_note_after (NOTE_INSN_DELETED, BLOCK_END (n_basic_blocks-1)); - - for (b = 0; b < n_basic_blocks; b++) - { - note_list = 0; - - split_block_insns (b, reload_completed == 0 || ! flag_schedule_insns); - - schedule_block (b, dump_file); - -#ifdef USE_C_ALLOCA - alloca (0); -#endif - } - - /* Reposition the prologue and epilogue notes in case we moved the - prologue/epilogue insns. */ - if (reload_completed) - reposition_prologue_and_epilogue_notes (get_insns ()); - - if (write_symbols != NO_DEBUG) - { - rtx line = 0; - rtx insn = get_insns (); - int active_insn = 0; - int notes = 0; - - /* Walk the insns deleting redundant line-number notes. Many of these - are already present. The remainder tend to occur at basic - block boundaries. */ - for (insn = get_last_insn (); insn; insn = PREV_INSN (insn)) - if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0) - { - /* If there are no active insns following, INSN is redundant. */ - if (active_insn == 0) - { - notes++; - NOTE_SOURCE_FILE (insn) = 0; - NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; - } - /* If the line number is unchanged, LINE is redundant. */ - else if (line - && NOTE_LINE_NUMBER (line) == NOTE_LINE_NUMBER (insn) - && NOTE_SOURCE_FILE (line) == NOTE_SOURCE_FILE (insn)) - { - notes++; - NOTE_SOURCE_FILE (line) = 0; - NOTE_LINE_NUMBER (line) = NOTE_INSN_DELETED; - line = insn; - } - else - line = insn; - active_insn = 0; - } - else if (! ((GET_CODE (insn) == NOTE - && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED) - || (GET_CODE (insn) == INSN - && (GET_CODE (PATTERN (insn)) == USE - || GET_CODE (PATTERN (insn)) == CLOBBER)))) - active_insn++; - - if (dump_file && notes) - fprintf (dump_file, ";; deleted %d line-number notes\n", notes); - } - - if (reload_completed == 0) - { - int regno; - for (regno = 0; regno < max_regno; regno++) - if (sched_reg_live_length[regno]) - { - if (dump_file) - { - if (REG_LIVE_LENGTH (regno) > sched_reg_live_length[regno]) - fprintf (dump_file, - ";; register %d life shortened from %d to %d\n", - regno, REG_LIVE_LENGTH (regno), - sched_reg_live_length[regno]); - /* Negative values are special; don't overwrite the current - reg_live_length value if it is negative. */ - else if (REG_LIVE_LENGTH (regno) < sched_reg_live_length[regno] - && REG_LIVE_LENGTH (regno) >= 0) - fprintf (dump_file, - ";; register %d life extended from %d to %d\n", - regno, REG_LIVE_LENGTH (regno), - sched_reg_live_length[regno]); - - if (! REG_N_CALLS_CROSSED (regno) - && sched_reg_n_calls_crossed[regno]) - fprintf (dump_file, - ";; register %d now crosses calls\n", regno); - else if (REG_N_CALLS_CROSSED (regno) - && ! sched_reg_n_calls_crossed[regno] - && REG_BASIC_BLOCK (regno) != REG_BLOCK_GLOBAL) - fprintf (dump_file, - ";; register %d no longer crosses calls\n", regno); - - } - /* Negative values are special; don't overwrite the current - reg_live_length value if it is negative. */ - if (REG_LIVE_LENGTH (regno) >= 0) - REG_LIVE_LENGTH (regno) = sched_reg_live_length[regno]; - - /* We can't change the value of reg_n_calls_crossed to zero for - pseudos which are live in more than one block. - - This is because combine might have made an optimization which - invalidated basic_block_live_at_start and reg_n_calls_crossed, - but it does not update them. If we update reg_n_calls_crossed - here, the two variables are now inconsistent, and this might - confuse the caller-save code into saving a register that doesn't - need to be saved. This is only a problem when we zero calls - crossed for a pseudo live in multiple basic blocks. - - Alternatively, we could try to correctly update basic block live - at start here in sched, but that seems complicated. */ - if (sched_reg_n_calls_crossed[regno] - || REG_BASIC_BLOCK (regno) != REG_BLOCK_GLOBAL) - REG_N_CALLS_CROSSED (regno) = sched_reg_n_calls_crossed[regno]; - } - } - - free (insn_luid); - free (insn_priority); - free (insn_tick); - free (insn_costs); - free (insn_units); - free (insn_blockage); - free (insn_ref_count); - - if (write_symbols != NO_DEBUG) - free (line_note); - - if (reload_completed == 0) - { - FREE_REG_SET (bb_dead_regs); - FREE_REG_SET (bb_live_regs); - } - -} -#endif /* INSN_SCHEDULING */ diff --git a/contrib/gcc/stupid.c b/contrib/gcc/stupid.c deleted file mode 100644 index b2cd170c8c34..000000000000 --- a/contrib/gcc/stupid.c +++ /dev/null @@ -1,770 +0,0 @@ -/* Dummy data flow analysis for GNU compiler in nonoptimizing mode. - Copyright (C) 1987, 91, 94-96, 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. */ - - -/* This file performs stupid register allocation, which is used - when cc1 gets the -noreg switch (which is when cc does not get -O). - - Stupid register allocation goes in place of the flow_analysis, - local_alloc and global_alloc passes. combine_instructions cannot - be done with stupid allocation because the data flow info that it needs - is not computed here. - - In stupid allocation, the only user-defined variables that can - go in registers are those declared "register". They are assumed - to have a life span equal to their scope. Other user variables - are given stack slots in the rtl-generation pass and are not - represented as pseudo regs. A compiler-generated temporary - is assumed to live from its first mention to its last mention. - - Since each pseudo-reg's life span is just an interval, it can be - represented as a pair of numbers, each of which identifies an insn by - its position in the function (number of insns before it). The first - thing done for stupid allocation is to compute such a number for each - insn. It is called the suid. Then the life-interval of each - pseudo reg is computed. Then the pseudo regs are ordered by priority - and assigned hard regs in priority order. */ - -#include "config.h" -#include "system.h" - -#include "rtl.h" -#include "hard-reg-set.h" -#include "basic-block.h" -#include "regs.h" -#include "insn-config.h" -#include "reload.h" -#include "flags.h" -#include "toplev.h" - -/* Vector mapping INSN_UIDs to suids. - The suids are like uids but increase monotonically always. - We use them to see whether a subroutine call came - between a variable's birth and its death. */ - -static int *uid_suid; - -/* Get the suid of an insn. */ - -#define INSN_SUID(INSN) (uid_suid[INSN_UID (INSN)]) - -/* Record the suid of the last CALL_INSN - so we can tell whether a pseudo reg crosses any calls. */ - -static int last_call_suid; - -/* Record the suid of the last NOTE_INSN_SETJMP - so we can tell whether a pseudo reg crosses any setjmp. */ - -static int last_setjmp_suid; - -/* Element N is suid of insn where life span of pseudo reg N ends. - Element is 0 if register N has not been seen yet on backward scan. */ - -static int *reg_where_dead; - -/* Likewise, but point to the insn_chain structure of the insn at which - the reg dies. */ -static struct insn_chain **reg_where_dead_chain; - -/* Element N is suid of insn where life span of pseudo reg N begins. */ -static int *reg_where_born_exact; - -/* Element N is 1 if the birth of pseudo reg N is due to a CLOBBER, - 0 otherwise. */ -static int *reg_where_born_clobber; - -/* Return the suid of the insn where the register is born, or the suid - of the insn before if the birth is due to a CLOBBER. */ -#define REG_WHERE_BORN(N) \ - (reg_where_born_exact[(N)] - reg_where_born_clobber[(N)]) - -/* Numbers of pseudo-regs to be allocated, highest priority first. */ - -static int *reg_order; - -/* Indexed by reg number (hard or pseudo), nonzero if register is live - at the current point in the instruction stream. */ - -static char *regs_live; - -/* Indexed by reg number, nonzero if reg was used in a SUBREG that changes - its size. */ - -static char *regs_change_size; - -/* Indexed by reg number, nonzero if reg crosses a setjmp. */ - -static char *regs_crosses_setjmp; - -/* Indexed by insn's suid, the set of hard regs live after that insn. */ - -static HARD_REG_SET *after_insn_hard_regs; - -/* Record that hard reg REGNO is live after insn INSN. */ - -#define MARK_LIVE_AFTER(INSN,REGNO) \ - SET_HARD_REG_BIT (after_insn_hard_regs[INSN_SUID (INSN)], (REGNO)) - -static int stupid_reg_compare PROTO((const GENERIC_PTR,const GENERIC_PTR)); -static int stupid_find_reg PROTO((int, enum reg_class, enum machine_mode, - int, int, int)); -static void stupid_mark_refs PROTO((rtx, struct insn_chain *)); -static void find_clobbered_regs PROTO((rtx, rtx)); - -/* For communication between stupid_life_analysis and find_clobbered_regs. */ -static struct insn_chain *current_chain; - -/* This function, called via note_stores, marks any hard registers that are - clobbered in an insn as being live in the live_after and live_before fields - of the appropriate insn_chain structure. */ - -static void -find_clobbered_regs (reg, setter) - rtx reg, setter; -{ - int regno, nregs; - if (setter == 0 || GET_CODE (setter) != CLOBBER) - return; - - if (GET_CODE (reg) == SUBREG) - reg = SUBREG_REG (reg); - - if (GET_CODE (reg) != REG) - return; - regno = REGNO (reg); - if (regno >= FIRST_PSEUDO_REGISTER) - return; - - if (GET_MODE (reg) == VOIDmode) - abort (); - else - nregs = HARD_REGNO_NREGS (regno, GET_MODE (reg)); - while (nregs-- > 0) - { - SET_REGNO_REG_SET (current_chain->live_after, regno); - SET_REGNO_REG_SET (current_chain->live_before, regno++); - } -} - -/* Stupid life analysis is for the case where only variables declared - `register' go in registers. For this case, we mark all - pseudo-registers that belong to register variables as - dying in the last instruction of the function, and all other - pseudo registers as dying in the last place they are referenced. - Hard registers are marked as dying in the last reference before - the end or before each store into them. */ - -void -stupid_life_analysis (f, nregs, file) - rtx f; - int nregs; - FILE *file; -{ - register int i; - register rtx last, insn; - int max_uid, max_suid; - - current_function_has_computed_jump = 0; - - bzero (regs_ever_live, sizeof regs_ever_live); - - regs_live = (char *) xmalloc (nregs); - - /* First find the last real insn, and count the number of insns, - and assign insns their suids. */ - - for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) - if (INSN_UID (insn) > i) - i = INSN_UID (insn); - - max_uid = i + 1; - uid_suid = (int *) xmalloc ((i + 1) * sizeof (int)); - - /* Compute the mapping from uids to suids. - Suids are numbers assigned to insns, like uids, - except that suids increase monotonically through the code. */ - - last = 0; /* In case of empty function body */ - for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) - { - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') - last = insn; - - INSN_SUID (insn) = ++i; - } - - last_call_suid = i + 1; - last_setjmp_suid = i + 1; - max_suid = i + 1; - - max_regno = nregs; - - /* Allocate tables to record info about regs. */ - - reg_where_dead = (int *) xmalloc (nregs * sizeof (int)); - bzero ((char *) reg_where_dead, nregs * sizeof (int)); - - reg_where_born_exact = (int *) xmalloc (nregs * sizeof (int)); - bzero ((char *) reg_where_born_exact, nregs * sizeof (int)); - - reg_where_born_clobber = (int *) xmalloc (nregs * sizeof (int)); - bzero ((char *) reg_where_born_clobber, nregs * sizeof (int)); - - reg_where_dead_chain = (struct insn_chain **) xmalloc (nregs * sizeof (struct insn_chain *)); - bzero ((char *) reg_where_dead_chain, nregs * sizeof (struct insn_chain *)); - - reg_order = (int *) xmalloc (nregs * sizeof (int)); - bzero ((char *) reg_order, nregs * sizeof (int)); - - regs_change_size = (char *) xmalloc (nregs * sizeof (char)); - bzero ((char *) regs_change_size, nregs * sizeof (char)); - - regs_crosses_setjmp = (char *) xmalloc (nregs * sizeof (char)); - bzero ((char *) regs_crosses_setjmp, nregs * sizeof (char)); - - /* Allocate the reg_renumber array */ - allocate_reg_info (max_regno, FALSE, TRUE); - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - reg_renumber[i] = i; - - after_insn_hard_regs - = (HARD_REG_SET *) xmalloc (max_suid * sizeof (HARD_REG_SET)); - - bzero ((char *) after_insn_hard_regs, max_suid * sizeof (HARD_REG_SET)); - - /* Allocate and zero out many data structures - that will record the data from lifetime analysis. */ - - allocate_reg_life_data (); - allocate_bb_life_data (); - - for (i = 0; i < max_regno; i++) - REG_N_DEATHS (i) = 1; - - bzero (regs_live, nregs); - - /* Find where each pseudo register is born and dies, - by scanning all insns from the end to the start - and noting all mentions of the registers. - - Also find where each hard register is live - and record that info in after_insn_hard_regs. - regs_live[I] is 1 if hard reg I is live - at the current point in the scan. - - Build reload_insn_chain while we're walking the insns. */ - - reload_insn_chain = 0; - for (insn = last; insn; insn = PREV_INSN (insn)) - { - register HARD_REG_SET *p = after_insn_hard_regs + INSN_SUID (insn); - struct insn_chain *chain; - - /* Copy the info in regs_live into the element of after_insn_hard_regs - for the current position in the rtl code. */ - - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - if (regs_live[i]) - SET_HARD_REG_BIT (*p, i); - - if (GET_CODE (insn) != NOTE && GET_CODE (insn) != BARRIER) - { - chain = new_insn_chain (); - if (reload_insn_chain) - reload_insn_chain->prev = chain; - chain->next = reload_insn_chain; - chain->prev = 0; - reload_insn_chain = chain; - chain->block = 0; - chain->insn = insn; - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - if (regs_live[i]) - SET_REGNO_REG_SET (chain->live_before, i); - } - - /* Update which hard regs are currently live - and also the birth and death suids of pseudo regs - based on the pattern of this insn. */ - - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') - stupid_mark_refs (PATTERN (insn), chain); - - if (GET_CODE (insn) == NOTE - && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP) - last_setjmp_suid = INSN_SUID (insn); - - /* Mark all call-clobbered regs as dead after each call insn so that - a pseudo whose life span includes this insn will not go in one of - them. If the function contains a non-local goto, mark all hard - registers dead (except for stack related bits). - - Then mark those regs as all dead for the continuing scan - of the insns before the call. */ - - if (GET_CODE (insn) == CALL_INSN) - { - last_call_suid = INSN_SUID (insn); - - if (current_function_has_nonlocal_label) - { - IOR_COMPL_HARD_REG_SET (after_insn_hard_regs[last_call_suid], - fixed_reg_set); - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - if (! fixed_regs[i]) - regs_live[i] = 0; - } - else - { - IOR_HARD_REG_SET (after_insn_hard_regs[last_call_suid], - call_used_reg_set); - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - if (call_used_regs[i]) - regs_live[i] = 0; - } - - /* It is important that this be done after processing the insn's - pattern because we want the function result register to still - be live if it's also used to pass arguments. */ - stupid_mark_refs (CALL_INSN_FUNCTION_USAGE (insn), chain); - } - - if (GET_CODE (insn) != NOTE && GET_CODE (insn) != BARRIER) - { - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - if (regs_live[i]) - SET_REGNO_REG_SET (chain->live_after, i); - - /* The regs_live array doesn't say anything about hard registers - clobbered by this insn. So we need an extra pass over the - pattern. */ - current_chain = chain; - if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') - note_stores (PATTERN (insn), find_clobbered_regs); - } - - if (GET_CODE (insn) == JUMP_INSN && computed_jump_p (insn)) - current_function_has_computed_jump = 1; - } - - /* Now decide the order in which to allocate the pseudo registers. */ - - for (i = LAST_VIRTUAL_REGISTER + 1; i < max_regno; i++) - reg_order[i] = i; - - qsort (®_order[LAST_VIRTUAL_REGISTER + 1], - max_regno - LAST_VIRTUAL_REGISTER - 1, sizeof (int), - stupid_reg_compare); - - /* Now, in that order, try to find hard registers for those pseudo regs. */ - - for (i = LAST_VIRTUAL_REGISTER + 1; i < max_regno; i++) - { - register int r = reg_order[i]; - - /* Some regnos disappear from the rtl. Ignore them to avoid crash. - Also don't allocate registers that cross a setjmp, or live across - a call if this function receives a nonlocal goto. - Also ignore registers we didn't see during the scan. */ - if (regno_reg_rtx[r] == 0 || regs_crosses_setjmp[r] - || (reg_where_born_exact[r] == 0 && reg_where_dead[r] == 0) - || (REG_N_CALLS_CROSSED (r) > 0 - && current_function_has_nonlocal_label)) - continue; - - /* Now find the best hard-register class for this pseudo register */ - if (N_REG_CLASSES > 1) - reg_renumber[r] = stupid_find_reg (REG_N_CALLS_CROSSED (r), - reg_preferred_class (r), - PSEUDO_REGNO_MODE (r), - REG_WHERE_BORN (r), - reg_where_dead[r], - regs_change_size[r]); - - /* If no reg available in that class, try alternate class. */ - if (reg_renumber[r] == -1 && reg_alternate_class (r) != NO_REGS) - reg_renumber[r] = stupid_find_reg (REG_N_CALLS_CROSSED (r), - reg_alternate_class (r), - PSEUDO_REGNO_MODE (r), - REG_WHERE_BORN (r), - reg_where_dead[r], - regs_change_size[r]); - } - - /* Fill in the pseudo reg life information into the insn chain. */ - for (i = LAST_VIRTUAL_REGISTER + 1; i < max_regno; i++) - { - struct insn_chain *chain; - int regno; - - regno = reg_renumber[i]; - if (regno < 0) - continue; - - chain = reg_where_dead_chain[i]; - if (reg_where_dead[i] > INSN_SUID (chain->insn)) - SET_REGNO_REG_SET (chain->live_after, i); - - while (INSN_SUID (chain->insn) > reg_where_born_exact[i]) - { - SET_REGNO_REG_SET (chain->live_before, i); - chain = chain->prev; - if (!chain) - break; - SET_REGNO_REG_SET (chain->live_after, i); - } - - if (INSN_SUID (chain->insn) == reg_where_born_exact[i] - && reg_where_born_clobber[i]) - SET_REGNO_REG_SET (chain->live_before, i); - } - - if (file) - dump_flow_info (file); - - free (regs_live); - free (uid_suid); - free (reg_where_dead); - free (reg_where_born_exact); - free (reg_where_born_clobber); - free (reg_where_dead_chain); - free (reg_order); - free (regs_change_size); - free (regs_crosses_setjmp); - free (after_insn_hard_regs); -} - -/* Comparison function for qsort. - Returns -1 (1) if register *R1P is higher priority than *R2P. */ - -static int -stupid_reg_compare (r1p, r2p) - const GENERIC_PTR r1p; - const GENERIC_PTR r2p; -{ - register int r1 = *(int *)r1p, r2 = *(int *)r2p; - register int len1 = reg_where_dead[r1] - REG_WHERE_BORN (r1); - register int len2 = reg_where_dead[r2] - REG_WHERE_BORN (r2); - int tem; - - tem = len2 - len1; - if (tem != 0) - return tem; - - tem = REG_N_REFS (r1) - REG_N_REFS (r2); - if (tem != 0) - return tem; - - /* If regs are equally good, sort by regno, - so that the results of qsort leave nothing to chance. */ - return r1 - r2; -} - -/* Find a block of SIZE words of hard registers in reg_class CLASS - that can hold a value of machine-mode MODE - (but actually we test only the first of the block for holding MODE) - currently free from after insn whose suid is BORN_INSN - through the insn whose suid is DEAD_INSN, - and return the number of the first of them. - Return -1 if such a block cannot be found. - - If CALL_PRESERVED is nonzero, insist on registers preserved - over subroutine calls, and return -1 if cannot find such. - - If CHANGES_SIZE is nonzero, it means this register was used as the - operand of a SUBREG that changes its size. */ - -static int -stupid_find_reg (call_preserved, class, mode, - born_insn, dead_insn, changes_size) - int call_preserved; - enum reg_class class; - enum machine_mode mode; - int born_insn, dead_insn; - int changes_size ATTRIBUTE_UNUSED; -{ - register int i, ins; -#ifdef HARD_REG_SET - register /* Declare them register if they are scalars. */ -#endif - HARD_REG_SET used, this_reg; -#ifdef ELIMINABLE_REGS - static struct {int from, to; } eliminables[] = ELIMINABLE_REGS; -#endif - - /* If this register's life is more than 5,000 insns, we probably - can't allocate it, so don't waste the time trying. This avoids - quadratic behavior on programs that have regularly-occurring - SAVE_EXPRs. */ - if (dead_insn > born_insn + 5000) - return -1; - - COPY_HARD_REG_SET (used, - call_preserved ? call_used_reg_set : fixed_reg_set); - -#ifdef ELIMINABLE_REGS - for (i = 0; i < (int)(sizeof eliminables / sizeof eliminables[0]); i++) - SET_HARD_REG_BIT (used, eliminables[i].from); -#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM - SET_HARD_REG_BIT (used, HARD_FRAME_POINTER_REGNUM); -#endif -#else - SET_HARD_REG_BIT (used, FRAME_POINTER_REGNUM); -#endif - - for (ins = born_insn; ins < dead_insn; ins++) - IOR_HARD_REG_SET (used, after_insn_hard_regs[ins]); - -#ifdef STACK_REGS - if (current_function_has_computed_jump) - for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++) - SET_HARD_REG_BIT (used, i); -#endif - - IOR_COMPL_HARD_REG_SET (used, reg_class_contents[(int) class]); - -#ifdef CLASS_CANNOT_CHANGE_SIZE - if (changes_size) - IOR_HARD_REG_SET (used, - reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE]); -#endif - - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - { -#ifdef REG_ALLOC_ORDER - int regno = reg_alloc_order[i]; -#else - int regno = i; -#endif - - /* If a register has screwy overlap problems, - don't use it at all if not optimizing. - Actually this is only for the 387 stack register, - and it's because subsequent code won't work. */ -#ifdef OVERLAPPING_REGNO_P - if (OVERLAPPING_REGNO_P (regno)) - continue; -#endif - - if (! TEST_HARD_REG_BIT (used, regno) - && HARD_REGNO_MODE_OK (regno, mode)) - { - register int j; - register int size1 = HARD_REGNO_NREGS (regno, mode); - for (j = 1; j < size1 && ! TEST_HARD_REG_BIT (used, regno + j); j++); - if (j == size1) - { - CLEAR_HARD_REG_SET (this_reg); - while (--j >= 0) - SET_HARD_REG_BIT (this_reg, regno + j); - for (ins = born_insn; ins < dead_insn; ins++) - { - IOR_HARD_REG_SET (after_insn_hard_regs[ins], this_reg); - } - return regno; - } -#ifndef REG_ALLOC_ORDER - i += j; /* Skip starting points we know will lose */ -#endif - } - } - - return -1; -} - -/* Walk X, noting all assignments and references to registers - and recording what they imply about life spans. - INSN is the current insn, supplied so we can find its suid. */ - -static void -stupid_mark_refs (x, chain) - rtx x; - struct insn_chain *chain; -{ - register RTX_CODE code; - register char *fmt; - register int regno, i; - rtx insn = chain->insn; - - if (x == 0) - return; - - code = GET_CODE (x); - - if (code == SET || code == CLOBBER) - { - if (SET_DEST (x) != 0 - && (GET_CODE (SET_DEST (x)) == REG - || (GET_CODE (SET_DEST (x)) == SUBREG - && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG - && (REGNO (SUBREG_REG (SET_DEST (x))) - >= FIRST_PSEUDO_REGISTER)))) - { - /* Register is being assigned. */ - /* If setting a SUBREG, we treat the entire reg as being set. */ - if (GET_CODE (SET_DEST (x)) == SUBREG) - regno = REGNO (SUBREG_REG (SET_DEST (x))); - else - regno = REGNO (SET_DEST (x)); - - /* For hard regs, update the where-live info. */ - if (regno < FIRST_PSEUDO_REGISTER) - { - register int j - = HARD_REGNO_NREGS (regno, GET_MODE (SET_DEST (x))); - - while (--j >= 0) - { - regs_ever_live[regno+j] = 1; - regs_live[regno+j] = 0; - - /* The following line is for unused outputs; - they do get stored even though never used again. */ - MARK_LIVE_AFTER (insn, regno+j); - - /* When a hard reg is clobbered, mark it in use - just before this insn, so it is live all through. */ - if (code == CLOBBER && INSN_SUID (insn) > 0) - SET_HARD_REG_BIT (after_insn_hard_regs[INSN_SUID (insn) - 1], - regno+j); - } - } - /* For pseudo regs, record where born, where dead, number of - times used, and whether live across a call. */ - else - { - /* Update the life-interval bounds of this pseudo reg. */ - - /* When a pseudo-reg is CLOBBERed, it is born just before - the clobbering insn. When setting, just after. */ - int where_born = INSN_SUID (insn) - (code == CLOBBER); - - reg_where_born_exact[regno] = INSN_SUID (insn); - reg_where_born_clobber[regno] = (code == CLOBBER); - - if (reg_where_dead_chain[regno] == 0) - reg_where_dead_chain[regno] = chain; - - /* The reg must live at least one insn even - in it is never again used--because it has to go - in SOME hard reg. Mark it as dying after the current - insn so that it will conflict with any other outputs of - this insn. */ - if (reg_where_dead[regno] < where_born + 2) - { - reg_where_dead[regno] = where_born + 2; - regs_live[regno] = 1; - } - - /* Count the refs of this reg. */ - REG_N_REFS (regno)++; - - if (last_call_suid < reg_where_dead[regno]) - REG_N_CALLS_CROSSED (regno) += 1; - - if (last_setjmp_suid < reg_where_dead[regno]) - regs_crosses_setjmp[regno] = 1; - - /* If this register is clobbered or it is only used in - this insn and is only set, mark it unused. We have - to do this even when not optimizing so that MD patterns - which count on this behavior (e.g., it not causing an - output reload on an insn setting CC) will operate - correctly. */ - if (GET_CODE (SET_DEST (x)) == REG - && (code == CLOBBER - || (REGNO_FIRST_UID (regno) == INSN_UID (insn) - && REGNO_LAST_UID (regno) == INSN_UID (insn) - && ! reg_mentioned_p (SET_DEST (x), - SET_SRC (x))))) - REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_UNUSED, - SET_DEST (x), - REG_NOTES (insn)); - } - } - - /* Record references from the value being set, - or from addresses in the place being set if that's not a reg. - If setting a SUBREG, we treat the entire reg as *used*. */ - if (code == SET) - { - stupid_mark_refs (SET_SRC (x), chain); - if (GET_CODE (SET_DEST (x)) != REG) - stupid_mark_refs (SET_DEST (x), chain); - } - return; - } - - else if (code == SUBREG - && GET_CODE (SUBREG_REG (x)) == REG - && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER - && (GET_MODE_SIZE (GET_MODE (x)) - != GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) - && (INTEGRAL_MODE_P (GET_MODE (x)) - || INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (x))))) - regs_change_size[REGNO (SUBREG_REG (x))] = 1; - - /* Register value being used, not set. */ - - else if (code == REG) - { - regno = REGNO (x); - if (regno < FIRST_PSEUDO_REGISTER) - { - /* Hard reg: mark it live for continuing scan of previous insns. */ - register int j = HARD_REGNO_NREGS (regno, GET_MODE (x)); - while (--j >= 0) - { - regs_ever_live[regno+j] = 1; - regs_live[regno+j] = 1; - } - } - else - { - /* Pseudo reg: record first use, last use and number of uses. */ - - reg_where_born_exact[regno] = INSN_SUID (insn); - reg_where_born_clobber[regno] = 0; - REG_N_REFS (regno)++; - if (regs_live[regno] == 0) - { - regs_live[regno] = 1; - reg_where_dead[regno] = INSN_SUID (insn); - reg_where_dead_chain[regno] = chain; - } - } - return; - } - - /* Recursive scan of all other rtx's. */ - - fmt = GET_RTX_FORMAT (code); - for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) - { - if (fmt[i] == 'e') - stupid_mark_refs (XEXP (x, i), chain); - if (fmt[i] == 'E') - { - register int j; - for (j = XVECLEN (x, i) - 1; j >= 0; j--) - stupid_mark_refs (XVECEXP (x, i, j), chain); - } - } -} diff --git a/contrib/gcc/tm.texi b/contrib/gcc/tm.texi deleted file mode 100644 index a13c6d97424b..000000000000 --- a/contrib/gcc/tm.texi +++ /dev/null @@ -1,7691 +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. If you define @code{MD_EXEC_PREFIX}, then be sure to add it -to the list of directories used to find the assembler in @file{configure.in}. - -@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. - -@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 LOCAL_ALIGNMENT -@item LOCAL_ALIGNMENT (@var{type}, @var{basic-align}) -If defined, a C expression to compute the alignment for a variables in -the local 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. - -One use of this macro is to increase alignment of medium-size data to -make it all fit in fewer cache lines. - -@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 current_function_is_leaf -@findex current_function_uses_only_leaf_regs -Normally, @code{FUNCTION_PROLOGUE} and @code{FUNCTION_EPILOGUE} must -treat leaf functions specially. They can test the C variable -@code{current_function_is_leaf} which is nonzero for leaf functions. -@code{current_function_is_leaf} is set prior to local register allocation -and is valid for the remaining compiler passes. They can also test the C -variable @code{current_function_uses_only_leaf_regs} which is nonzero for -leaf functions which only use leaf registers. -@code{current_function_uses_only_leaf_regs} is valid after reload and is -only useful 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}, -which can be zero if GNU CC is calling a library function. - -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 must be a @code{reg} RTX for the hard -register in which to pass this part of the argument, and the mode of the -register RTX 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 of where this part starts. -As a special exception the first @code{expr_list} in the @code{parallel} -RTX may have a first operand of zero. This indicates that the bytes -starting from the second operand of that @code{expr_list} are stored on -the stack and not held in a register. - -@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. - -@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{current_function_is_leaf} 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{current_function_is_leaf} -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}. - -@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. - -@findex PRETEND_OUTGOING_VARARGS_NAMED -@item PRETEND_OUTGOING_VARARGS_NAMED -If you need to conditionally change ABIs so that one works with -@code{SETUP_INCOMING_VARARGS}, but the other works like neither -@code{SETUP_INCOMING_VARARGS} nor @code{STRICT_ARGUMENT_NAMING} was -defined, then define this macro to return nonzero if -@code{SETUP_INCOMING_VARARGS} is used, zero otherwise. -Otherwise, you should not define this macro. -@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 to use for a given mode. Defaults to the value of -@code{HAVE_POST_INCREMENT}. - -@findex USE_LOAD_POST_DECREMENT -@item USE_LOAD_POST_DECREMENT (@var{mode}) -A C expression used to determine whether a load postdecrement is a good -thing to use for a given mode. Defaults to the value of -@code{HAVE_POST_DECREMENT}. - -@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 to use for a given mode. Defaults to the value of -@code{HAVE_PRE_INCREMENT}. - -@findex USE_LOAD_PRE_DECREMENT -@item USE_LOAD_PRE_DECREMENT (@var{mode}) -A C expression used to determine whether a load predecrement is a good -thing to use for a given mode. Defaults to the value of -@code{HAVE_PRE_DECREMENT}. - -@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 to use for a given mode. Defaults to the value of -@code{HAVE_POST_INCREMENT}. - -@findex USE_STORE_POST_DECREMENT -@item USE_STORE_POST_DECREMENT (@var{mode}) -A C expression used to determine whether a store postdeccrement is a good -thing to use for a given mode. Defaults to the value of -@code{HAVE_POST_DECREMENT}. - -@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 to use for a given mode. Defaults to the value of -@code{HAVE_PRE_INCREMENT}. - -@findex USE_STORE_PRE_DECREMENT -@item USE_STORE_PRE_DECREMENT (@var{mode}) -This macro is used to determine whether a store predecrement is a good -thing to use for a given mode. Defaults to the value of -@code{HAVE_PRE_DECREMENT}. - -@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. - -@findex ASM_OUTPUT_ALIGNED_DECL_COMMON -@item ASM_OUTPUT_ALIGNED_DECL_COMMON (@var{stream}, @var{decl}, @var{name}, @var{size}, @var{alignment}) -Like @code{ASM_OUTPUT_ALIGNED_COMMON} except that @var{decl} of the -variable to be output, if there is one, or @code{NULL_TREE} if there -is not corresponding variable. If you define this macro, GNU CC wil use it -in place of both @code{ASM_OUTPUT_COMMON} and -@code{ASM_OUTPUT_ALIGNED_COMMON}. Define this macro when you need to see -the variable's decl in order to chose what to output. - -@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} or -@code{ASM_OUTPUT_ALIGNED_DECL_COMMON} 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_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. - -@findex ASM_OUTPUT_ALIGNED_DECL_LOCAL -@item ASM_OUTPUT_ALIGNED_DECL_LOCAL (@var{stream}, @var{decl}, @var{name}, @var{size}, @var{alignment}) -Like @code{ASM_OUTPUT_ALIGNED_DECL} except that @var{decl} of the -variable to be output, if there is one, or @code{NULL_TREE} if there -is not corresponding variable. If you define this macro, GNU CC wil use it -in place of both @code{ASM_OUTPUT_DECL} and -@code{ASM_OUTPUT_ALIGNED_DECL}. Define this macro when you need to see -the variable's decl in order to chose what to output. - - -@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. -@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_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. - -When @code{ASM_OUTPUT_CONSTRUCTOR} and @code{ASM_OUTPUT_DESTRUCTOR} are -defined, the initializaiton routine generated for the generated object -file will have static linkage. -@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 such systems you -must not define @code{ASM_OUTPUT_CONSTRUCTOR} and @code{ASM_OUTPUT_DESTRUCTOR} -as the object file's initialization routine must have global scope. - -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. - -@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). - -@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}. - -@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). - -@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/contrib/gcc/unprotoize.c b/contrib/gcc/unprotoize.c deleted file mode 100644 index bebac0ad1836..000000000000 --- a/contrib/gcc/unprotoize.c +++ /dev/null @@ -1,2 +0,0 @@ -#define UNPROTOIZE -#include "protoize.c" |