--- gcc/internals-1 2018/04/24 16:38:34 1.1.1.2 +++ gcc/internals-1 2018/04/24 16:40:34 1.1.1.4 @@ -1,41 +1,38 @@ -Info file internals, produced by Makeinfo, -*- Text -*- -from input file internals.texinfo. - - +Info file internals, produced by Makeinfo, -*- Text -*- from input +file internals.texinfo. This file documents the internals of the GNU compiler. Copyright (C) 1988 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 -section entitled ``GNU CC General Public License'' is 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 section entitled ``GNU CC General Public License'' and -this permission notice may be included in translations approved by the -Free Software Foundation instead of in the original English. - +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 section entitled ``GNU CC General Public License'' is +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 section entitled ``GNU CC General Public +License'' and this permission notice may be included in translations +approved by the Free Software Foundation instead of in the original +English. - -  File: internals, Node: Top, Next: Copying, Up: (DIR) Introduction ************ -This manual documents how to run, install and port the GNU C compiler, as -well as its new features and incompatibilities, and how to report bugs. - +This manual documents how to run, install and port the GNU C +compiler, as well as its new features and incompatibilities, and how +to report bugs. * Menu: @@ -44,6 +41,7 @@ well as its new features and incompatibi * Contributors:: People who have contributed to GNU CC. * Options:: Command options supported by `gcc'. * Installation:: How to configure, compile and install GNU CC. +* Trouble:: If you have trouble installing GNU CC. * Incompatibilities:: Incompatibilities of GNU CC. * Extensions:: GNU extensions to the C language. * Bugs:: How to report bugs (if you want to get them fixed). @@ -54,146 +52,155 @@ well as its new features and incompatibi * Machine Desc:: How to write machine description instruction patterns. * Machine Macros:: How to write the machine description C macros. - +  File: internals, Node: Copying, Next: Contributors, Prev: Top, Up: Top GNU CC GENERAL PUBLIC LICENSE ***************************** - (Clarified 11 Feb 1988) + (Clarified 11 Feb 1988) - The license agreements of most software companies keep you at the mercy -of those companies. By contrast, our general public license is intended to -give everyone the right to share GNU CC. To make sure that you get the -rights we want you to have, we need to make restrictions that forbid anyone -to deny you these rights or to ask you to surrender the rights. Hence this -license agreement. - - Specifically, we want to make sure that you have the right to give away -copies of GNU CC, that you receive source code or else can get it if you -want it, that you can change GNU CC or use pieces of it in new free -programs, and that you know you can do these things. + The license agreements of most software companies keep you at the +mercy of those companies. By contrast, our general public license is +intended to give everyone the right to share GNU CC. To make sure +that you get the rights we want you to have, we need to make +restrictions that forbid anyone to deny you these rights or to ask +you to surrender the rights. Hence this license agreement. + + Specifically, we want to make sure that you have the right to give +away copies of GNU CC, that you receive source code or else can get +it if you want it, that you can change GNU CC or use pieces of it in +new free programs, and that you know you can do these things. To make sure that everyone has such rights, we have to forbid you to -deprive anyone else of these rights. For example, if you distribute copies -of GNU CC, 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 tell them their rights. - - Also, for our own protection, we must make certain that everyone finds -out that there is no warranty for GNU CC. If GNU CC is modified by someone -else and passed on, we want its recipients to know that what they have is -not what we distributed, so that any problems introduced by others will not -reflect on our reputation. - - Therefore we (Richard Stallman and the Free Software Foundation, Inc.) -make the following terms which say what you must do to be allowed to -distribute or change GNU CC. +deprive anyone else of these rights. For example, if you distribute +copies of GNU CC, 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 tell them their rights. + + Also, for our own protection, we must make certain that everyone +finds out that there is no warranty for GNU CC. If GNU CC is +modified by someone else and passed on, we want its recipients to +know that what they have is not what we distributed, so that any +problems introduced by others will not reflect on our reputation. + + Therefore we (Richard Stallman and the Free Software Foundation, +Inc.) make the following terms which say what you must do to be +allowed to distribute or change GNU CC. COPYING POLICIES ================ - 1. You may copy and distribute verbatim copies of GNU CC source code as you - receive it, in any medium, provided that you conspicuously and - appropriately publish on each copy a valid copyright notice - ``Copyright (C) 1988 Free Software Foundation, Inc.'' (or with - whatever year is appropriate); keep intact the notices on all files - that refer to this License Agreement and to the absence of any - warranty; and give any other recipients of the GNU CC program a copy - of this License Agreement along with the program. You may charge a - distribution fee for the physical act of transferring a copy. - - 2. You may modify your copy or copies of GNU CC or any portion of it, and - copy and distribute such modifications under the terms of Paragraph 1 - above, provided that you also do the following: - - * cause the modified files to carry prominent notices stating that - you changed the files and the date of any change; and - - * cause the whole of any work that you distribute or publish, that - in whole or in part contains or is a derivative of GNU CC or any - part thereof, to be licensed at no charge to all third parties on - terms identical to those contained in this License Agreement - (except that you may choose to grant more extensive warranty - protection to some or all third parties, at your option). + 1. You may copy and distribute verbatim copies of GNU CC source + code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy a valid + copyright notice ``Copyright (C) 1988 Free Software Foundation, + Inc.'' (or with whatever year is appropriate); keep intact the + notices on all files that refer to this License Agreement and to + the absence of any warranty; and give any other recipients of + the GNU CC program a copy of this License Agreement along with + the program. You may charge a distribution fee for the physical + act of transferring a copy. + + 2. You may modify your copy or copies of GNU CC or any portion of + it, and copy and distribute such modifications under the terms + of Paragraph 1 above, provided that you also do the following: + + * cause the modified files to carry prominent notices stating + that you changed the files and the date of any change; and + + * cause the whole of any work that you distribute or publish, + that in whole or in part contains or is a derivative of GNU + CC or any part thereof, to be licensed at no charge to all + third parties on terms identical to those contained in this + License Agreement (except that you may choose to grant more + extensive warranty protection to some or all third parties, + at your option). * You may charge a distribution fee for the physical act of - transferring a copy, and you may at your option offer warranty - protection in exchange for a fee. + transferring a copy, and you may at your option offer + warranty protection in exchange for a fee. - Mere aggregation of another unrelated program with this program (or - its derivative) on a volume of a storage or distribution medium does - not bring the other program under the scope of these terms. - - 3. You may copy and distribute GNU CC (or a portion or derivative of it, - under Paragraph 2) in object code or executable form under the terms - of Paragraphs 1 and 2 above provided that you also do one of the - following: - - * accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of - Paragraphs 1 and 2 above; or, + Mere aggregation of another unrelated program with this program + (or its derivative) on a volume of a storage or distribution + medium does not bring the other program under the scope of these + terms. + + 3. You may copy and distribute GNU CC (or a portion or derivative + of it, under Paragraph 2) in object code or executable form + under the terms of Paragraphs 1 and 2 above provided that you + also do one of the following: + + * accompany it with the complete corresponding + machine-readable source code, which must be distributed + under the terms of Paragraphs 1 and 2 above; or, * accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal shipping charge) a complete machine-readable copy of the - corresponding source code, to be distributed under the terms of - Paragraphs 1 and 2 above; or, + corresponding source code, to be distributed under the + terms of Paragraphs 1 and 2 above; or, - * accompany it with the information you received as to where the - corresponding source code may be obtained. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form alone.) - - For an executable file, complete source code means all the source code - for all modules it contains; but, as a special exception, it need not - include source code for modules which are standard libraries that - accompany the operating system on which the executable file runs. - - 4. You may not copy, sublicense, distribute or transfer GNU CC except as - expressly provided under this License Agreement. Any attempt - otherwise to copy, sublicense, distribute or transfer GNU CC is void - and your rights to use the program under this License agreement shall - be automatically terminated. However, parties who have received - computer software programs from you with this License Agreement will - not have their licenses terminated so long as such parties remain in - full compliance. - - 5. If you wish to incorporate parts of GNU CC into other free programs - whose distribution conditions are different, write to the Free - Software Foundation at 675 Mass Ave, Cambridge, MA 02139. We have not - yet worked out a simple rule that can be stated here, but we will - often permit this. We 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. - -Your comments and suggestions about our licensing policies and our software -are welcome! Please contact the Free Software Foundation, Inc., 675 Mass -Ave, Cambridge, MA 02139, or call (617) 876-3296. + * accompany it with the information you received as to where + the corresponding source code may be obtained. (This + alternative is allowed only for noncommercial distribution + and only if you received the program in object code or + executable form alone.) + + For an executable file, complete source code means all the + source code for all modules it contains; but, as a special + exception, it need not include source code for modules which are + standard libraries that accompany the operating system on which + the executable file runs. + + 4. You may not copy, sublicense, distribute or transfer GNU CC + except as expressly provided under this License Agreement. Any + attempt otherwise to copy, sublicense, distribute or transfer + GNU CC is void and your rights to use the program under this + License agreement shall be automatically terminated. However, + parties who have received computer software programs from you + with this License Agreement will not have their licenses + terminated so long as such parties remain in full compliance. + + 5. If you wish to incorporate parts of GNU CC into other free + programs whose distribution conditions are different, write to + the Free Software Foundation at 675 Mass Ave, Cambridge, MA + 02139. We have not yet worked out a simple rule that can be + stated here, but we will often permit this. We 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. + +Your comments and suggestions about our licensing policies and our +software are welcome! Please contact the Free Software Foundation, +Inc., 675 Mass Ave, Cambridge, MA 02139, or call (617) 876-3296. NO WARRANTY =========== BECAUSE GNU CC IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY NO -WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC, RICHARD M. -STALLMAN AND/OR OTHER PARTIES PROVIDE GNU CC "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 GNU CC IS WITH YOU. -SHOULD GNU CC PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY -SERVICING, REPAIR OR CORRECTION. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M. STALLMAN, -THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY WHO MAY MODIFY -AND REDISTRIBUTE GNU CC AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE (INCLUDING -BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES -SUSTAINED BY THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY -OTHER PROGRAMS) GNU CC, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. +WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT +WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC, +RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE GNU CC "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 GNU CC IS WITH YOU. SHOULD GNU CC PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M. +STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY +WHO MAY MODIFY AND REDISTRIBUTE GNU CC AS PERMITTED ABOVE, BE LIABLE +TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER +SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE +OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR +DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES +OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) GNU +CC, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, +OR FOR ANY CLAIM BY ANY OTHER PARTY. +  File: internals, Node: Contributors, Next: Options, Prev: Copying, Up: Top @@ -201,13 +208,14 @@ File: internals, Node: Contributors, N Contributors to GNU CC ********************** -In addition to Richard Stallman, several people have written parts of GNU CC. +In addition to Richard Stallman, several people have written parts of +GNU CC. - * The idea of using RTL and some of the optimization ideas came from the - U. of Arizona Portable Optimizer, written by Jack Davidson and - Christopher Fraser. See ``Register Allocation and Exhaustive Peephole - Optimization'', Software Practice and Experience 14 (9), Sept. 1984, - 857-866. + * The idea of using RTL and some of the optimization ideas came + from the U. of Arizona Portable Optimizer, written by Jack + Davidson and Christopher Fraser. See ``Register Allocation and + Exhaustive Peephole Optimization'', Software Practice and + Experience 14 (9), Sept. 1984, 857-866. * Paul Rubin wrote most of the preprocessor. @@ -216,23 +224,33 @@ In addition to Richard Stallman, several * Ted Lemon wrote parts of the RTL reader and printer. - * Nobuyuki Hikichi of Software Research Associates, Tokyo, contributed - the support for the SONY NEWS machine. + * Nobuyuki Hikichi of Software Research Associates, Tokyo, + contributed the support for the SONY NEWS machine. + + * Charles LaBrec contributed the support for the Integrated + Solutions 68020 system. - * Charles LaBrec contributed the support for the Integrated Solutions - 68020 system. + * Michael Tiemann of MCC wrote most of the description of the + National Semiconductor 32000 series cpu. He also wrote the code + for inline function integration and for the SPARC cpu and + Motorola 88000 cpu and part of the Sun FPA support. - * Michael Tiemann of MCC wrote the description of the National - Semiconductor 32000 series cpu, with some contributions from Jan Stein - of the Chalmers Computer Club. Tiemann also wrote the code for inline - function integration. + * Jan Stein of the Chalmers Computer Society provided support for + Genix, as well as part of the 32000 machine description. - * Michael Kashtan of SRI adapted GNU CC to the Vomit-Making System. + * Randy Smith finished the Sun FPA support. + + * Robert Brown implemented the support for Encore 32000 systems. + + * David Kashtan of SRI adapted GNU CC to the Vomit-Making System. * Alex Crain provided changes for the 3b1. - * Chris Hanson and another person who should remind me of his name - assisted in making GNU CC work on HP-UX for the 9000 series 300. + * Greg Satz and Chris Hanson assisted in making GNU CC work on + HP-UX for the 9000 series 300. + + * William Schelter did most of the work on the Intel 80386 support. +  File: internals, Node: Options, Next: Installation, Prev: Contributors, Up: Top @@ -240,158 +258,171 @@ File: internals, Node: Options, Next: GNU CC Command Options ********************** -The GNU C compiler uses a command syntax much like the Unix C compiler. -The `gcc' program accepts options and file names as operands. Multiple -single-letter options may *not* be grouped: `-dr' is very different from -`-d -r'. +The GNU C compiler uses a command syntax much like the Unix C compiler. +The `gcc' program accepts options and file names as operands. +Multiple single-letter options may *not* be grouped: `-dr' is very +different from `-d -r'. When you invoke GNU CC, it normally does preprocessing, compilation, -assembly and linking. File names which end in `.c' are taken as C source -to be preprocessed and compiled; compiler output files plus any input files -with names ending in `.s' are assembled; then the resulting object files, -plus any other input files, are linked together to produce an executable. - -Command options allow you to stop this process at an intermediate stage. -For example, the `-c' option says not to run the linker. Then the output -consists of object files output by the assembler. - -Other command options are passed on to one stage. Some options control the -preprocessor and others the compiler itself. Yet other options control the -assembler and linker; these are not documented here because the GNU -assembler and linker are not yet released. - -Here are the options to control the overall compilation process, including -those that say whether to link, whether to assemble, and so on. +assembly and linking. File names which end in `.c' are taken as C +source to be preprocessed and compiled; compiler output files plus +any input files with names ending in `.s' are assembled; then the +resulting object files, plus any other input files, are linked +together to produce an executable. + +Command options allow you to stop this process at an intermediate +stage. For example, the `-c' option says not to run the linker. +Then the output consists of object files output by the assembler. + +Other command options are passed on to one stage. Some options +control the preprocessor and others the compiler itself. Yet other +options control the assembler and linker; these are not documented +here because the GNU assembler and linker are not yet released. + +Here are the options to control the overall compilation process, +including those that say whether to link, whether to assemble, and so +on. `-o FILE' - Place output in file 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. - - If `-o' is not specified, the default is to put an excutable file in - `a.out', the object file `SOURCE.c' in `SOURCE.o', an assembler file - in `SOURCE.s', and preprocessed C on standard output. + Place output in file 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. + + If `-o' is not specified, the default is to put an executable + file in `a.out', the object file `SOURCE.c' in `SOURCE.o', an + assembler file in `SOURCE.s', and preprocessed C on standard + output. `-c' - Compile or assemble the source files, but do not link. Produce object - files with names made by replacing `.c' or `.s' with `.o' at the end - of the input file names. Do nothing at all for object files specified - as input. + Compile or assemble the source files, but do not link. Produce + object files with names made by replacing `.c' or `.s' with `.o' + at the end of the input file names. Do nothing at all for + object files specified as input. `-S' - Compile into assembler code but do not assemble. The assembler output - file name is made by replacing `.c' with `.s' at the end of the input - file name. Do nothing at all for assembler source files or object - files specified as input. + Compile into assembler code but do not assemble. The assembler + output file name is made by replacing `.c' with `.s' at the end + of the input file name. Do nothing at all for assembler source + files or object files specified as input. `-E' Run only the C preprocessor. Preprocess all the C source files specified and output the results to standard output. `-v' - Compiler driver program prints the commands it executes as it runs the - preprocessor, compiler proper, assembler and linker. Some of these - are directed to print their own version numbers. + Compiler driver program prints the commands it executes as it + runs the preprocessor, compiler proper, assembler and linker. + Some of these are directed to print their own version numbers. `-BPREFIX' - Compiler driver program tries PREFIX as a prefix for each program it - tries to run. These programs are `cpp', `cc1', `as' and `ld'. - - For each subprogram to be run, the compiler driver first tries the - `-B' prefix, if any. If that name is not found, or if `-B' was not - specified, the driver tries two standard prefixes, which are - `/usr/lib/gcc-' and `/usr/local/lib/gcc-'. 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 `PATH' - environment variable. - - The run-time support file `gnulib' is also searched for using the `-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. Most of the time, on most - machines, you can do without it. + Compiler driver program tries PREFIX as a prefix for each + program it tries to run. These programs are `cpp', `cc1', `as' + and `ld'. + + For each subprogram to be run, the compiler driver first tries + the `-B' prefix, if any. If that name is not found, or if `-B' + was not specified, the driver tries two standard prefixes, which + are `/usr/lib/gcc-' and `/usr/local/lib/gcc-'. 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 `PATH' environment variable. + + The run-time support file `gnulib' is also searched for using + the `-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. Most of + the time, on most machines, you can do without it. These options control the details of C compilation itself. `-ansi' Support all ANSI standard C programs. - This turns off certain features of GNU C that are incompatible with - ANSI C, such as the `asm', `inline' and `typeof' keywords, and - predefined macros such as `unix' and `vax' that identify the type of - system you are using. It also enables the undesirable and rarely used - ANSI trigraph feature. - - The `-ansi' option does not cause non-ANSI programs to be rejected - gratuitously. For that, `-pedantic' is required in addition to `-ansi'. - - The macro `__STRICT_ANSI__' is predefined when the `-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. + This turns off certain features of GNU C that are incompatible + with ANSI C, such as the `asm', `inline' and `typeof' keywords, + and predefined macros such as `unix' and `vax' that identify the + type of system you are using. It also enables the undesirable + and rarely used ANSI trigraph feature. + + The `-ansi' option does not cause non-ANSI programs to be + rejected gratuitously. For that, `-pedantic' is required in + addition to `-ansi'. + + The macro `__STRICT_ANSI__' is predefined when the `-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. `-traditional' Attempt to support some aspects of traditional C compilers. Specifically: - * All `extern' declarations take effect globally even if they are - written inside of a function definition. This includes implicit - declarations of functions. + * All `extern' declarations take effect globally even if they + are written inside of a function definition. This includes + implicit declarations of functions. - * The keywords `typeof', `inline', `signed', `const' and `volatile' - are not recognized. + * The keywords `typeof', `inline', `signed', `const' and + `volatile' are not recognized. * Comparisons between pointers and integers are always allowed. - * Integer types `unsigned short' and `unsigned char' promote to - `unsigned int'. + * Integer types `unsigned short' and `unsigned char' promote + to `unsigned int'. - * In the preprocessor, comments convert to nothing at all, rather - than to a space. This allows traditional token concatenation. + * Out-of-range floating point literals are not an error. - * In the preprocessor, single and double quote characters are - ignored when scanning macro definitions, so that macro arguments - can be replaced even within a string or character constant. - Quote characters are also ignored when skipping text inside a - failing conditional directive. + * In the preprocessor, comments convert to nothing at all, + rather than to a space. This allows traditional token + concatenation. + + * In the preprocessor, 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. `-O' - Optimize. Optimizing compilation takes somewhat more time, and a lot - more memory for a large function. + Optimize. Optimizing compilation takes somewhat more time, and + a lot more memory for a large function. - Without `-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 `-O', only variables declared `register' are allocated in - registers. The resulting compiled code is a little worse than - produced by PCC without `-O'. + Without `-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 `-O', only variables declared `register' are allocated + in registers. The resulting compiled code is a little worse + than produced by PCC without `-O'. - With `-O', the compiler tries to reduce code size and execution time. + With `-O', the compiler tries to reduce code size and execution + time. Some of the `-f' options described below turn specific kinds of optimization on or off. `-g' - Produce debugging information in DBX format. + Produce debugging information in the operating system's native + format (for DBX or SDB). - Unlike most other C compilers, GNU CC allows you to use `-g' with - `-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. + Unlike most other C compilers, GNU CC allows you to use `-g' + with `-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. `-gg' - Produce debugging information in GDB's own format. This requires the - GNU assembler and linker in order to work. + Produce debugging information in GDB's own format. This + requires the GNU assembler and linker in order to work. `-w' Inhibit all warning messages. @@ -399,26 +430,27 @@ These options control the details of C c `-W' Print extra warning messages for these events: - * An automatic variable is used without first being initialized. + * 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. They occur only for variables that are - candidates for register allocation. Therefore, they do not occur - for a variable that is declared `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 the flow analysis pass before the - warnings are printed. - - These warnings are made optional because GNU CC is not smart - enough to see all the reasons why the code might be correct - despite appearing to have an error. Here is one example of how - this can happen: + because they require data flow information that is computed + only when optimizing. They occur only for variables that + are candidates for register allocation. Therefore, they do + not occur for a variable that is declared `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 the flow + analysis pass before the warnings are printed. + + These warnings are made optional because GNU CC is not + smart enough to see all the reasons why the code might be + correct despite appearing to have an error. Here is one + example of how this can happen: { int x; @@ -433,7 +465,6 @@ These options control the details of C c foo (x); } - If the value of `y' is always 1, 2 or 3, then `x' is always initialized, but GNU CC doesn't know this. Here is another common case: @@ -445,22 +476,23 @@ These options control the details of C c if (change_y) y = save_y; } + This has no bug because `save_y' is used only if it is set. - This has no bug because `x' is used only if it is set. - - * A nonvolatile automatic variable might be changed by a call to - `longjmp'. These warnings as well are possible only in + * A nonvolatile automatic variable might be changed by a call + to `longjmp'. These warnings as well are possible only in optimizing compilation. - The compiler sees only the calls to `setjmp'. It cannot know - where `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 `longjmp' - cannot in fact be called at the place which would cause a problem. - - * 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 inspire such a warning: + The compiler sees only the calls to `setjmp'. It cannot + know where `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 `longjmp' cannot in fact be called at the + place which would cause a problem. + + * 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 inspire such a warning: foo (a) { @@ -468,306 +500,395 @@ These options control the details of C c return a; } + Spurious warnings can occur because GNU CC does not realize + that certain functions (including `abort' and `longjmp') + will never return. - Spurious warnings can occur because GNU CC does not realize that - certain functions (including `abort' and `longjmp') will never - return. - - In the future, other useful warnings may also be enabled by this option. + In the future, other useful warnings may also be enabled by this + option. `-Wimplicit' Warn whenever a function is implicitly declared. `-Wreturn-type' - Warn whenever a function is defined with a return-type that defaults - to `int'. Also warn about any `return' statement with no return-value - in a function whose return-type is not `void'. + Warn whenever a function is defined with a return-type that + defaults to `int'. Also warn about any `return' statement with + no return-value in a function whose return-type is not `void'. `-Wcomment' Warn whenever a comment-start sequence `/*' appears in a comment. +`-Wall' + All of the above `-W' options combined. + +`-Wwrite-strings' + Give string constants the type `const char[LENGTH]' so that + copying the address of one into a non-`const' `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 `const' in + declarations and prototypes. Otherwise, it will just be a + nuisance; this is why we did not make `-Wall' request these + warnings. + `-p' - Generate extra code to write profile information suitable for the - analysis program `prof'. + Generate extra code to write profile information suitable for + the analysis program `prof'. `-pg' - Generate extra code to write profile information suitable for the - analysis program `gprof'. + Generate extra code to write profile information suitable for + the analysis program `gprof'. -`-nostdinc' - Don't search the standard directories for include files. Only the - directories you specify explicitly with the `-I' option will be - searched. +`-lLIBRARY' + Search a standard list of directories for a library named + LIBRARY, which is actually a file named `libLIBRARY.a'. The + linker 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 `-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 `-l' option and specifying a file name is that `-l' searches + several directories. + +`-LDIR' + Add directory DIR to the list of directories to be searched for + `-l'. `-nostdlib' Don't use the standard system libraries and startup files when - linking. Only the files you specify (plus `gnulib') will be passed to - the linker. + linking. Only the files you specify (plus `gnulib') will be + passed to the linker. `-mMACHINESPEC' - Machine-dependent option specifying something about the type of target - machine. These options are defined by the macro `TARGET_SWITCHES' in - the machine description. The default for the options is also defined - by that macro, which enables you to change the defaults. - - These are the `-m' options defined in the 68000 machine description: - - `-m68020' - Generate output for a 68020 (rather than a 68000). This is the - default if you use the unmodified sources. + Machine-dependent option specifying something about the type of + target machine. These options are defined by the macro + `TARGET_SWITCHES' in the machine description. The default for + the options is also defined by that macro, which enables you to + change the defaults. + + These are the `-m' options defined in the 68000 machine + description: + + `-m68020' + `-mc68020' + Generate output for a 68020 (rather than a 68000). This is + the default if you use the unmodified sources. - `-m68000' + `-m68000' + `-mc68000' Generate output for a 68000 (rather than a 68020). - `-m68881' - Generate output containing 68881 instructions for floating point. - This is the default if you use the unmodified sources. + `-m68881' + Generate output containing 68881 instructions for floating + point. This is the default if you use the unmodified + sources. + + `-mfpa' + Generate output containing Sun FPA instructions for + floating point. - `-msoft-float' + `-msoft-float' Generate output containing library calls for floating point. - `-mshort' + `-mshort' Consider type `int' to be 16 bits wide, like `short int'. - `-mnobitfield' + `-mnobitfield' Do not use the bit-field instructions. `-m68000' implies `-mnobitfield'. - `-mbitfield' + `-mbitfield' Do use the bit-field instructions. `-m68020' implies - `-mbitfield'. This is the default if you use the unmodified - sources. + `-mbitfield'. This is the default if you use the + unmodified sources. - `-mrtd' - Use a different function-calling convention, in which functions - that take a fixed number of arguments return with the `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 `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.) + `-mrtd' + Use a different function-calling convention, in which + functions that take a fixed number of arguments return with + the `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 `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 `rtd' instruction is supported by the 68010 and 68020 processors, but not by the 68000. These `-m' options are defined in the Vax machine description: - `-munix' - Do not output certain jump instructions (`aobleq' and so on) that - the Unix assembler for the Vax cannot handle across long ranges. - - `-mgnu' - Do output those jump instructions, on the assumption that you - will assemble with the GNU assembler. + `-munix' + Do not output certain jump instructions (`aobleq' and so + on) that the Unix assembler for the Vax cannot handle + across long ranges. + + `-mgnu' + Do output those jump instructions, on the assumption that + you will assemble with the GNU assembler. + + `-mg' + Output code for g-format floating point numbers instead of + d-format. `-fFLAG' Specify machine-independent flags. These are the flags: - `-ffloat-store' + `-ffloat-store' Do not store floating-point variables in registers. This - prevents undesirable excess precision on machines such as the - 68000 where the floating registers (of the 68881) keep more - precision than a `double' is supposed to have. - - For most programs, the excess precision does only good, but a few - programs rely on the precise definition of IEEE floating point. - Use `-ffloat-store' for such programs. - - `-fno-asm' - Do not recognize `asm', `inline' or `typeof' as a keyword. These - words may then be used as identifiers. - - `-fno-defer-pop' - Always pop the arguments to each function call as soon as that - function returns. Normally the compiler (when optimizing) lets - arguments accumulate on the stack for several function calls and - pops them all at once. - - `-fcombine-regs' - Allow the combine pass to combine an instruction that copies one - register into another. This might or might not produce better - code when used in addition to `-O'. I am interested in hearing - about the difference this makes. + prevents undesirable excess precision on machines such as + the 68000 where the floating registers (of the 68881) keep + more precision than a `double' is supposed to have. + + For most programs, the excess precision does only good, but + a few programs rely on the precise definition of IEEE + floating point. Use `-ffloat-store' for such programs. + + `-fno-asm' + Do not recognize `asm', `inline' or `typeof' as a keyword. + These words may then be used as identifiers. + + `-fno-defer-pop' + Always pop the arguments to each function call as soon as + that function returns. Normally the compiler (when + optimizing) lets arguments accumulate on the stack for + several function calls and pops them all at once. + + `-fcombine-regs' + Allow the combine pass to combine an instruction that + copies one register into another. This might or might not + produce better code when used in addition to `-O'. I am + interested in hearing about the difference this makes. + + `-fforce-mem' + Force memory operands to be copied into registers before + doing arithmetic on them. This may produce better code by + making all memory references potential common + subexpressions. When they are not common subexpressions, + instruction combination should eliminate the separate + register-load. I am interested in hearing about the + difference this makes. - `-fforce-mem' - Force memory operands to be copied into registers before doing - arithmetic on them. This may produce better code by making all - memory references potential common subexpressions. When they are - not common subexpressions, instruction combination should - eliminate the separate register-load. I am interested in hearing + `-fforce-addr' + Force memory address constants to be copied into registers + before doing arithmetic on them. This may produce better + code just as `-fforce-mem' may. I am interested in hearing about the difference this makes. - `-fforce-addr' - Force memory address constants to be copied into registers before - doing arithmetic on them. This may produce better code just as - `-fforce-mem' may. I am interested in hearing about the - difference this makes. - - `-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. *It also makes debugging impossible.* + `-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. *It also makes + debugging impossible.* 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 `FRAME_POINTER_REQUIRED' - controls whether a target machine supports this flag. *note - Registers::. - - `-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 `static', then the function is normally not output as - assembler code in its own right. - - `-fkeep-inline-functions' - Even if all calls to a given function are integrated, and the - function is declared `static', nevertheless output a separate - run-time callable version of the function. - - `-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. Writing into string - constants is a very bad idea; ``constants'' should be constant. - - `-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. + because the standard calling sequence automatically handles + the frame pointer and nothing is saved by pretending it + doesn't exist. The machine-description macro + `FRAME_POINTER_REQUIRED' controls whether a target machine + supports this flag. *Note Registers::. + + `-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 `static', then the function is + normally not output as assembler code in its own right. + + `-fkeep-inline-functions' + Even if all calls to a given function are integrated, and + the function is declared `static', nevertheless output a + separate run-time callable version of the function. + + `-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. + Writing into string constants is a very bad idea; + ``constants'' should be constant. + + `-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. + + `-fvolatile' + Consider all memory references through pointers to be + volatile. - `-fvolatile' - Consider all memory references through pointers to be volatile. - - `-funsigned-char' + `-funsigned-char' Let the type `char' be the unsigned, like `unsigned char'. - Each kind of machine has a default for what `char' should be. It - is either like `unsigned char' by default or like `signed char' - by default. (Actually, at present, the default is always signed.) - - The type `char' is always a distinct type from either `signed - char' or `unsigned char', even though its behavior is always just - like one of those two. + Each kind of machine has a default for what `char' should + be. It is either like `unsigned char' by default or like + `signed char' by default. (Actually, at present, the + default is always signed.) + + The type `char' is always a distinct type from either + `signed char' or `unsigned char', even though its behavior + is always just like one of those two. - `-fsigned-char' + `-fsigned-char' Let the type `char' be signed, like `signed char'. - `-ffixed-REG' - Treat the register named 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). - - REG must be the name of a register. The register names accepted - are machine-specific and are defined in the `REGISTER_NAMES' - macro in the machine description macro file. - - `-fcall-used-REG' - Treat the register named REG as an allocatable 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 REG. - - Use of this flag for a register that has a fixed pervasive role - in the machine's execution model, such as the stack pointer or - frame pointer, will produce disastrous results. - - `-fcall-saved-REG' - Treat the register named REG as an allocatable 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 REG if they use it. - - Use of this flag for a register that has a fixed pervasive role - in the machine's execution model, such as the stack pointer or - frame pointer, will produce disastrous results. - - A different sort of disaster will result from the use of this - flag for a register in which function values are may be returned. + `-ffixed-REG' + Treat the register named 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). + + REG must be the name of a register. The register names + accepted are machine-specific and are defined in the + `REGISTER_NAMES' macro in the machine description macro file. + + `-fcall-used-REG' + Treat the register named REG as an allocatable 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 REG. + + Use of this flag for a register that has a fixed pervasive + role in the machine's execution model, such as the stack + pointer or frame pointer, will produce disastrous results. + + `-fcall-saved-REG' + Treat the register named REG as an allocatable 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 REG if they use it. + + Use of this flag for a register that has a fixed pervasive + role in the machine's execution model, such as the stack + pointer or frame pointer, will produce disastrous results. + + A different sort of disaster will result from the use of + this flag for a register in which function values are may + be returned. `-dLETTERS' - Says to make debugging dumps at times specified by LETTERS. Here are - the possible letters: + Says to make debugging dumps at times specified by LETTERS. + Here are the possible letters: - `r' + `r' Dump after RTL generation. - `j' + + `j' Dump after first jump optimization. - `J' + + `J' Dump after last jump optimization. - `s' - Dump after CSE (including the jump optimization that sometimes - follows CSE). - `L' + + `s' + Dump after CSE (including the jump optimization that + sometimes follows CSE). + + `L' Dump after loop optimization. - `f' + + `f' Dump after flow analysis. - `c' + + `c' Dump after instruction combination. - `l' + + `l' Dump after local register allocation. - `g' + + `g' Dump after global register allocation. - `m' + + `m' Print statistics on memory usage, at the end of the run. `-pedantic' - Issue all the warnings demanded by strict ANSI standard C; reject all - programs that use forbidden extensions. + Issue all the warnings demanded by strict ANSI standard C; + reject all programs that use forbidden extensions. - Valid ANSI standard C programs should compile properly with or without - this option (though a rare few will require `-ansi'). However, - without this option, certain GNU extensions and traditional C features - are supported as well. With this option, they are rejected. There is - no reason to use this option; it exists only to satisfy pedants. - -These options control the C preprocessor, which is run on each C source -file before actual compilation. If you use the `-E' option, nothing is -done except C preprocessing. Some of these options make sense only -together with `-E' because they request preprocessor output that is not -suitable for actual compilation. + Valid ANSI standard C programs should compile properly with or + without this option (though a rare few will require `-ansi'). + However, without this option, certain GNU extensions and + traditional C features are supported as well. With this option, + they are rejected. There is no reason to use this option; it + exists only to satisfy pedants. + +These options control the C preprocessor, which is run on each C +source file before actual compilation. If you use the `-E' option, +nothing is done except C preprocessing. Some of these options make +sense only together with `-E' because they request preprocessor +output that is not suitable for actual compilation. `-C' - Tell the preprocessor not to discard comments. Used with the `-E' - option. + Tell the preprocessor not to discard comments. Used with the + `-E' option. `-IDIR' Search directory DIR for include files. +`-I-' + Any directories specified with `-I' options before the `-I-' + option are searched only for the case of `#include "FILE"'; they + are not searched for `#include '. + + If additional directories are specified with `-I' options after + the `-I-', these directories are searched for all `#include' + directives. (Ordinarily *all* `-I' directories are used this + way.) + + In addition, the `-I-' option inhibits the use of the current + directory as the first search directory for `#include "FILE"'. + Therefore, the current directory is searched only if it is + requested explicitly with `-I.'. Specifying both `-I-' and + `-I.' allows you to control precisely which directories are + searched before the current one and which are searched after. + +`-nostdinc' + Do not search the standard system directories for header files. + Only the directories you have specified with `-I' options (and + the current directory, if appropriate) are searched. + + Between `-nostdinc' and `-I-', you can eliminate all directories + from the search path except those you specify. + `-M' - Tell the preprocessor to output a rule suitable for `make' describing - the dependencies of each source file. For each source file, the - preprocessor outputs one `make'-rule whose target is the object file - name for that source file and whose dependencies are all the files - `#include'd in it. This rule may be a single line or may be continued - with `\'-newline if it is long. + Tell the preprocessor to output a rule suitable for `make' + describing the dependencies of each source file. For each + source file, the preprocessor outputs one `make'-rule whose + target is the object file name for that source file and whose + dependencies are all the files `#include'd in it. This rule may + be a single line or may be continued with `\'-newline if it is + long. `-M' implies `-E'. `-MM' - Like `-M' but the output mentions only the user-header files included - with `#include "FILE"'. System header files included with `#include - ' are omitted. + Like `-M' but the output mentions only the user-header files + included with `#include "FILE"'. System header files included + with `#include ' are omitted. `-MM' implies `-E'. @@ -784,466 +905,306 @@ suitable for actual compilation. Support ANSI C trigraphs. You don't want to know about this brain-damage. The `-ansi' option also has this effect. +  -File: internals, Node: Installation, Next: Incompatibilities, Prev: Options, Up: Top +File: internals, Node: Installation, Next: Trouble, Prev: Options, Up: Top Installing GNU CC ***************** Here is the procedure for installing GNU CC on a Unix system. - * Menu: * VMS Install:: See below for installation on VMS. + 1. Edit `Makefile'. If you are using HPUX, or any form of system + V, you must make a few changes described in comments at the + beginning of the file. - 1. Edit `Makefile'. If you are using HPUX, you must make a few changes - described in comments at the beginning of the file. - - 2. Choose configuration files. - - * Make a symbolic link named `config.h' to the top-level config - file for the machine you are using (*Note Config::.). This file - is responsible for defining information about the host machine. - It includes `tm.h'. - - The file's name should be `config-MACHINE.h'. On VMS, use - `config-vms.h' rather than `config-vax.h'. On the HP 9000 series - 300, use `config-hp9k3.h' rather than `config-m68k.h'. - - If your system does not support symbolic links, you might want to - set up `config.h' to contain a `#include' command which refers to - the appropriate file. - - * Make a symbolic link named `tm.h' to the machine-description - macro file for your machine (its name should be `tm-MACHINE.h'). - - For the 68000/68020, do not use `tm-m68k.h' directly; instead use - one of the files `tm-sun3.h', `tm-sun2.h', `tm-isi68.h', - `tm-news800.h' or `tm-3b1.h'. Each of those files includes - `tm-m68k.h' but sets up a few things differently as appropriate - to the specific model of machine. - - There are two files you can use for a 680x0 running HPUX: - `tm-hp9k320.h' and `tm-hp9k320g.h'. Use the former if you are - installing GNU CC alone. The latter is for another option where - GNU CC together with the GNU assembler, linker, debugger and - other utilities are used to replace all of HPUX that deals with - compilation. Not all of the pieces of GNU software needed for - this mode of operation are as yet in distribution; full - instructions will appear here in the future. - - For the 32000, use `tm-sequent.h' if you are using a Sequent - machine; otherwise, use `tm-ns32k.h'. - - For the vax, use `tm-vax.h' on BSD Unix, `tm-ultrix.h' on Ultrix, - or `tm-vms.h' on VMS. - - * Make a symbolic link named `md' to the machine description - pattern file (its name should be `MACHINE.md'). - - * Make a symbolic link named `aux-output.c' to the output - subroutine file for your machine (its name should be - `OUTPUT-MACHINE.c'). - - 3. Make sure the Bison parser generator is installed. (This is unnecessary - if the Bison output file `parse.tab.c' is more recent than `parse.y' - and you do not plan to change `parse.y'.) - - Note that if you have an old version of Bison you may get an error - from the line with the `%expect' directive. If so, simply remove that - line from `parse.y' and proceed. - - 4. If you are using a Sun, make sure the environment variable - `FLOAT_OPTION' is not set. If this option were set to `f68881' when - `gnulib' is compiled, the resulting code would demand to be linked - with a special startup file and will not link properly without special - pains. - - 5. Build the compiler. Just type `make' in the compiler directory. - - 6. Move the first-stage object files and executables into a subdirectory - with this command: - - make stage1 - - - The files are moved into a subdirectory named `stage1'. Once - installation is complete, you may wish to delete these files with `rm - -r stage1'. - - 7. Recompile the compiler with itself, with this command: - - make CC=stage1/gcc CFLAGS="-g -O -Bstage1/" - - - On a 68000 or 68020 system lacking floating point hardware, unless you - have selected a `tm.h' file that expects by default that there is no - such hardware, do this instead: - - make CC=stage1/gcc CFLAGS="-g -O -Bstage1/ -msoft-float" - - - 8. If you wish to test the compiler by compiling it with itself one more - time, do this: - - make stage2 - make CC=stage2/gcc CFLAGS="-g -O -Bstage2/" - foreach file (*.o) - cmp $file stage2/$file - end - - - This will notify you if any of these stage 3 object files differs from - those of stage 2. Any difference, no matter how innocuous, indicates - that the stage 2 compiler has compiled GNU CC incorrectly, and is - therefore a potentially serious bug which you should investigate and - report (*Note Bugs::.). - - 9. Install the compiler driver, the compiler's passes and run-time support. - You can use the following command: - - make install - - - This copies the files `cc1', `cpp' and `gnulib' to files `gcc-cc1', - `gcc-cpp' and `gcc-gnulib' in directory `/usr/local/lib', which is - where the compiler driver program looks for them. It also copies the - driver program `gcc' into the directory `/usr/local', so that it - appears in typical execution search paths. - - *Warning: the GNU CPP may not work for `ioctl.h', `ttychars.h' and - other system header files unless the `-traditional' option is used.* - The bug is in the header files: at least on some machines, they rely - on behavior that is incompatible with ANSI C. This behavior consists - of substituting for macro argument names when they appear inside of - character constants. The `-traditional' option tells GNU CC to behave - the way these headers expect. - - Because of this problem, you might prefer to configure GNU CC to use - the system's own C preprocessor. To do so, make the file - `/usr/local/lib/gcc-cpp' a link to `/lib/cpp'. + 2. On a Sequent system, go to the Berkeley universe. - Alternatively, on Sun systems and 4.3BSD at least, you can correct the - include files by running the shell script `fixincludes'. This - installs modified, corrected copies of the files `ioctl.h' and - `ttychars.h' in a special directory where only GNU CC will normally - look for them. + 3. Choose configuration files. - The file `/usr/include/vaxuba/qvioctl.h' used in the X window system - needs a similar correction. + * Make a symbolic link named `config.h' to the top-level + config file for the machine you are using (*note + Config::.). This file is responsible for defining + information about the host machine. It includes `tm.h'. -If you cannot install the compiler's passes and run-time support in -`/usr/local/lib', you can alternatively use the `-B' option to specify a -prefix by which they may be found. The compiler concatenates the prefix -with the names `cpp', `cc1' and `gnulib'. Thus, you can put the files in -a directory `/usr/foo/gcc' and specify `-B/usr/foo/gcc/' when you run GNU CC. + The file's name should be `config-MACHINE.h', with these + exceptions: - -File: internals, Node: VMS Install, Prev: Installation, Up: Installation + `config-vms.h' + for vaxen running VMS. -Installing GNU CC on VMS -======================== + `config-vaxv.h' + for vaxen running system V. -The VMS version of GNU CC is normally distributed as a Backup saveset, so -the only installation required is to copy the files. But here is how to -rebuild GNU CC if you change it: + `config-i386v.h' + for Intel 80386's running system V. - 1. Copy the file `tm-vms.h' to `tm.h', `config-vms.h' to `config.h', - `vax.md' to `md.' and `output-vax.c' to `aux-output.c'. + `config-sun4.h' + for Suns (model 3 or 4) running *operating system* + version 4. - 2. Type `@make' to do recompile everything. + `config-hp9k3.h' + for the HP 9000 series 300. - -File: internals, Node: Incompatibilities, Next: Extensions, Prev: Installation, Up: Top + `config-gnx.h' + for the ns32000 running Genix -Incompatibilities of GNU CC -*************************** + If your system does not support symbolic links, you might + want to set up `config.h' to contain a `#include' command + which refers to the appropriate file. -There are several noteworthy incompatibilities between GNU C and most -existing (non-ANSI) versions of C. + * Make a symbolic link named `tm.h' to the + machine-description macro file for your machine (its name + should be `tm-MACHINE.h'). -Ultimately our intention is that the `-traditional' option will eliminate -most of these incompatibilities by telling GNU C to behave like the other C -compilers. + If your system is a 68000, don't use the file `tm-m68k.h' + directly. Instead, use one of these files: - * GNU CC normally makes string constants read-only. If several - identical-looking string constants are used, GNU CC stores only one - copy of the string. + `tm-sun3.h' + for Sun 3 machines. - One consequence is that you cannot call `mktemp' with a string - constant argument. The function `mktemp' always alters the string its - argument points to. + `tm-sun2.h' + for Sun 2 machines. - Another consequence is that `sscanf' does not work on some systems - when passed a string constant as its format control string. This is - because `sscanf' incorrectly tries to write into the string constant. + `tm-3b1.h' + for AT&T 3b1 (aka 7300 Unix PC). - The best solution to these problems is to change the program to use - `char'-array variables with initialization strings for these purposes - instead of string constants. But if this is not possible, you can use - the `-fwritable-strings' flag, which directs GNU CC to handle string - constants the same way most C compilers do. + `tm-isi68.h' + for Integrated Solutions systems. - * GNU CC does not substitute macro arguments when they appear inside of - string constants. For example, the following macro in GNU CC + `tm-news800.h' + for SONY News systems. - #define foo(a) "a" + `tm-hp9k320.h' + for HPUX systems, if you are using GNU CC with the + system's assembler and linker. + `tm-hp9k320g.h' + for HPUX systems, if you are using the GNU assembler, + linker and other utilities. Not all of the pieces of + GNU software needed for this mode of operation are as + yet in distribution; full instructions will appear + here in the future. - will produce output `"a"' regardless of what the argument A is. + For the vax, use `tm-vax.h' on BSD Unix, `tm-vaxv.h' on + system V, or `tm-vms.h' on VMS. - The `-traditional' option directs GNU CC to handle such cases (among - others) in the old-fashioned (non-ANSI) fashion. + For the SPARC (Sun 4), use `tm-sparc.h'. - * When you use `setjmp' and `longjmp', the only automatic variables - guaranteed to remain valid are those declared `volatile'. This is a - consequence of automatic register allocation. Consider this function: + For the Motorola 88000, use `tm-m88k.h'. The support for + the 88000 has a few unfinished spots because there was no + way to run the output. Bugs are suspected in handling of + branch-tables and in the function prologue and epilogue. - jmp_buf j; - - foo () - { - int a, b; - - a = fun1 (); - if (setjmp (j)) - return a; - - a = fun2 (); - /* `longjmp (j)' may be occur in `fun3'. */ - return a + fun3 (); - } + For the 80386, don't use `tm-i386.h' directly. Use + `tm-i386v.h' if the target machine is running system V, + `tm-seq386.h' for a Sequent 386 system, or `tm-compaq.h' + for a Compaq. + For the 32000, use `tm-sequent.h' if you are using a + Sequent machine, or `tm-encore.h' for an Encore machine, or + `tm-gnx.h' if you are using Genix version 3; otherwise, + perhaps `tm-ns32k.h' will work for you. - Here `a' may or may not be restored to its first value when the - `longjmp' occurs. If `a' is allocated in a register, then its first - value is restored; otherwise, it keeps the last value stored in it. + Note that Genix has bugs in `alloca' and `malloc'; you must + get the compiled versions of these from GNU Emacs and edit + GNU CC's `Makefile' to use them. - If you use the `-W' option with the `-O' option, you will get a - warning when GNU CC thinks such a problem might be possible. + Note that Encore systems are supported only under BSD. - * 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. + * Make a symbolic link named `md' to the machine description + pattern file (its name should be `MACHINE.md'). - In some other C compilers, a `extern' declaration affects all the rest - of the file even if it happens within a block. + * Make a symbolic link named `aux-output.c' to the output + subroutine file for your machine (its name should be + `output-MACHINE.c'). - The `-traditional' option directs GNU C to treat all `extern' - declarations as global, like traditional compilers. + 4. Make sure the Bison parser generator is installed. (This is + unnecessary if the Bison output files `c-parse.tab.c' and + `cexp.c' are more recent than `c-parse.y' and `cexp.y' and you + do not plan to change the `.y' files.) + + Note that if you have an old version of Bison you may get an + error from the line with the `%expect' directive. If so, simply + remove that line from `c-parse.y' and proceed. + + 5. If you are using a Sun, make sure the environment variable + `FLOAT_OPTION' is not set. If this option were set to `f68881' + when `gnulib' is compiled, the resulting code would demand to be + linked with a special startup file and will not link properly + without special pains. - * In traditional C, you can combine `long', etc., with a typedef name, - as shown here: + 6. Build the compiler. Just type `make' in the compiler directory. - typedef int foo; - typedef long foo bar; + 7. Move the first-stage object files and executables into a + subdirectory with this command: + make stage1 - In ANSI C, this is not allowed: `long' and other type modifiers - require an explicit `int'. Because this criterion is expressed by - Bison grammar rules rather than C code, the `-traditional' flag cannot - alter it. + The files are moved into a subdirectory named `stage1'. Once + installation is complete, you may wish to delete these files + with `rm -r stage1'. - * When compiling functions that return structures or unions, GNU CC - output code uses a method different from that used on most versions of - Unix. As a result, code compiled with GNU CC cannot call a - structure-returning function compiled with PCC, and vice versa. + 8. Recompile the compiler with itself, with this command: - 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 - in a special, fixed register. + make CC=stage1/gcc CFLAGS="-g -O -Bstage1/" - PCC usually handles all sizes of structures and unions by returning - the address of a block of static storage containing the value. This - method is not used in GCC because it is slower and nonreentrant. + On a 68000 or 68020 system lacking floating point hardware, + unless you have selected a `tm.h' file that expects by default + that there is no such hardware, do this instead: - On systems where PCC works this way, you may be able to make - GCC-compiled code call such functions that were compiled with PCC by - declaring them to return a pointer to the structure or union instead - of the structure or union itself. For example, instead of this: + make CC=stage1/gcc CFLAGS="-g -O -Bstage1/ -msoft-float" - struct foo nextfoo (); + 9. If you wish to test the compiler by compiling it with itself one + more time, do this: + make stage2 + Make CC=stage2/gcc CFLAGS="-g -O -Bstage2/" + foreach file (*.o) + cmp $file stage2/$file + end - write this: + This will notify you if any of these stage 3 object files + differs from those of stage 2. Any difference, no matter how + innocuous, indicates that the stage 2 compiler has compiled GNU + CC incorrectly, and is therefore a potentially serious bug which + you should investigate and report (*note Bugs::.). - struct foo *nextfoo (); - #define nextfoo *nextfoo + Aside from the `-B' option, the options should be the same as + when you made stage 2. + 10. Install the compiler driver, the compiler's passes and run-time + support. You can use the following command: - (Note that this assumes you are using the GNU preprocessor, so that - the ANSI antirecursion rules for macro expansions are effective.) + make install - -File: internals, Node: Extensions, Next: Bugs, Prev: Incompatibilities, Up: Top + This copies the files `cc1', `cpp' and `gnulib' to files + `gcc-cc1', `gcc-cpp' and `gcc-gnulib' in directory + `/usr/local/lib', which is where the compiler driver program + looks for them. It also copies the driver program `gcc' into + the directory `/usr/local', so that it appears in typical + execution search paths. + + *Warning: there is a bug in `alloca' in the Sun library. To + avoid this bug, install the binaries of GNU CC that were + compiled by GNU CC. They use `alloca' as a built-in function + and never the one in the library.* + + *Warning: the GNU CPP may not work for `ioctl.h', `ttychars.h' + and other system header files unless the `-traditional' option + is used.* The bug is in the header files: at least on some + machines, they rely on behavior that is incompatible with ANSI + C. This behavior consists of substituting for macro argument + names when they appear inside of character constants. The + `-traditional' option tells GNU CC to behave the way these + headers expect. -GNU Extensions to the C Language -******************************** + Because of this problem, you might prefer to configure GNU CC to + use the system's own C preprocessor. To do so, make the file + `/usr/local/lib/gcc-cpp' a link to `/lib/cpp'. -GNU C provides several language features not found in ANSI standard C. -(The `-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 `__GNUC__', which is -always defined under GNU CC. + Alternatively, on Sun systems and 4.3BSD at least, you can + correct the include files by running the shell script + `fixincludes'. This installs modified, corrected copies of the + files `ioctl.h', `ttychars.h' and many others, in a special + directory where only GNU CC will normally look for them. + See the file `fixincludes' for a list of all the files we know + to require correction. -* Menu: +If you cannot install the compiler's passes and run-time support in +`/usr/local/lib', you can alternatively use the `-B' option to +specify a prefix by which they may be found. The compiler +concatenates the prefix with the names `cpp', `cc1' and `gnulib'. +Thus, you can put the files in a directory `/usr/foo/gcc' and specify +`-B/usr/foo/gcc/' when you run GNU CC. -* Statement Exprs:: Putting statements and declarations inside expressions. -* Naming Types:: Giving a name to the type of some expression. -* Typeof:: `typeof': referring to the type of an expression. -* Lvalues:: Using `?:', `,' and casts in lvalues. -* Conditionals:: Omitting the middle operand of a `?:' expression. -* Zero-Length:: Zero-length arrays. -* Variable-Length:: Arrays whose length is computed at run time. -* Subscripting:: Any array can be subscripted, even if not an lvalue. -* Pointer Arith:: Arithmetic on `void'-pointers and function pointers. -* Constructors:: Constructor expressions give structures, unions - or arrays as values. -* Dollar Signs:: Dollar sign is allowed in identifiers. -* 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. +Also, you can specify an alternative default directory for these +files by setting the Make variable `libdir' when you make GNU CC.  -File: internals, Node: Statement Exprs, Next: Naming Types, Prev: Extensions, Up: Extensions - -Statements and Declarations inside of Expressions -================================================= - -A compound statement in parentheses may appear inside an expression in GNU -C. This allows you to declare variables within an expression. For example: - - ({ int y = foo (); int z; - if (y > 0) z = y; - else z = - y; - z; }) - - -is a valid (though slightly more complex than necessary) expression for the -absolute value of `foo ()'. - -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: - - #define max(a,b) ((a) > (b) ? (a) : (b)) - - -But this definition computes either A or 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 `int'), you can define the macro safely as follows: - - #define maxint(a,b) \ - ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) - +File: internals, Node: VMS Install, Prev: Installation, Up: Installation -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. +Installing GNU CC on VMS +======================== -If you don't know the type of the operand, you can still do this, but you -must use `typeof' (*Note Typeof::.) or type naming (*Note Naming Types::.). +The VMS version of GNU CC is distributed in an unusual tape format +which consists of several tape files. The first is a command file; +the second is an executable program which reads Unix tar format; the +third is another command file which uses this program to read the +remainder of the tape. + +To load the tape, it suffices to mount it `/foreign' and then do +`@mta0:' to execute the command file at the beginning of the tape. + +The tape contains executables and object files as well as sources, so +no compilation is necessary unless you change the sources. (This is +a good thing, since you probably don't have any other C compiler.) +If you must recompile, here is how: + + 1. Copy the file `tm-vms.h' to `tm.h', `config-vms.h' to + `config.h', `vax.md' to `md.' and `output-vax.c' to + `aux-output.c'. - -File: internals, Node: Naming Types, Next: Typeof, Prev: Statement Exprs, Up: Extensions + 2. Type `@make' to do recompile everything. -Naming an Expression's Type -=========================== +To install the `GCC' command so you can use the compiler easily, in +the same manner as you use the VMS C compiler, you must install the +VMS CLD file for GNU CC as follows: -You can give a name to the type of an expression using a `typedef' -declaration with an initializer. Here is how to define NAME as a type name -for the type of EXP: + 1. Define the VMS logical names `GNU_CC' and `GNU_CC_INCLUDE' to + point to the directories where the GNU CC executables + (`gcc-cpp', `gcc-cc1', etc.) and the C include files are kept. + This should be done with the commands: - typedef NAME = EXP; + $ assign /super /system disk:[gcc] gnu_cc + $ assign /super /system disk:[gcc.include] gnu_cc_include + with the appropriate disk and directory names. These commands + can be placed in your system startup file so they will be + executed whenever the machine is rebooted. -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: + 2. Install the `GCC' command with the command line: - #define max(a,b) \ - ({typedef _ta = (a), _tb = (b); \ - _ta _a = (a); _tb _b = (b); \ - _a > _b ? _a : _b; }) + $ set command /table=sys$library:dcltables gnu_cc:gcc + Now you can invoke the compiler with a command like `gcc + /verbose file.c', which is equivalent to the command `gcc -v -c + file.c' in Unix. -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 `a' and `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.  -File: internals, Node: Typeof, Next: Lvalues, Prev: Naming Types, Up: Extensions - -Referring to a Type with `typeof' -================================= - -Another way to refer to the type of an expression is with `typeof'. The -syntax of using of this keyword looks like `sizeof', but the construct acts -semantically like a type name defined with `typedef'. - -There are two ways of writing the argument to `typeof': with an expression -or with a type. Here is an example with an expression: - - typeof (x[0](1)) - - -This assumes that `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: - - typeof (int *) +File: internals, Node: Trouble, Next: Incompatibilities, Prev: Installation, Up: Top +Trouble in Installation +*********************** -Here the type described is that of pointers to `int'. +Here are some of the things that have caused trouble for people +installing GNU CC. -A `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 -`sizeof' or `typeof'. + * On certain systems, defining certain environment variables such + as `CC' can interfere with the functioning of `make'. + + * Cross compilation can run into trouble for certain machines + because some target machines' assemblers require floating point + numbers to be written as *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. + + It is possible to fix this by writing machine-independent code + which understands the floating point representation of the + target machine. I am not interested in doing that much work to + compensate for bugs in assemblers. - * This declares `y' with the type of what `x' points to. - typeof (*x) y; - - - * This declares `y' as an array of such values. - - typeof (*x) y[4]; - - - * This declares `y' as an array of pointers to characters: - - typeof (typeof (char *)[4]) y; - - - It is equivalent to the following traditional C declaration: - - char *y[4]; - - - To see the meaning of the declaration using `typeof', and why it might - be a useful way to write, let's rewrite it with these macros: - - #define pointer(T) typeof(T *) - #define array(T, N) typeof(T [N]) - - - Now the declaration can be rewritten this way: - - array (pointer (char), 4) y; - - - Thus, `array (pointer (char), 4)' is the type of arrays of 4 pointers - to `char'. - -