This is doc/gcc.info, produced by makeinfo version 4.2 from doc/gcc.texi. INFO-DIR-SECTION Programming START-INFO-DIR-ENTRY * gcc: (gcc). The GNU Compiler Collection. END-INFO-DIR-ENTRY This file documents the use of the GNU compilers. 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, 2001, 2002 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being "GNU General Public License" and "Funding Free Software", the Front-Cover texts being (a) (see below), and with the Back-Cover Texts being (b) (see below). A copy of the license is included in the section entitled "GNU Free Documentation License". (a) The FSF's Front-Cover Text is: A GNU Manual (b) The FSF's Back-Cover Text is: You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development.  File: gcc.info, Node: Constant string objects, Next: compatibility_alias, Prev: Garbage Collection, Up: Objective-C Constant string objects ======================= GNU Objective-C provides constant string objects that are generated directly by the compiler. You declare a constant string object by prefixing a C constant string with the character `@': id myString = @"this is a constant string object"; The constant string objects are usually instances of the `NXConstantString' class which is provided by the GNU Objective-C runtime. To get the definition of this class you must include the `objc/NXConstStr.h' header file. User defined libraries may want to implement their own constant string class. To be able to support them, the GNU Objective-C compiler provides a new command line options `-fconstant-string-class=CLASS-NAME'. The provided class should adhere to a strict structure, the same as `NXConstantString''s structure: @interface NXConstantString : Object { char *c_string; unsigned int len; } @end User class libraries may choose to inherit the customized constant string class from a different class than `Object'. There is no requirement in the methods the constant string class has to implement. When a file is compiled with the `-fconstant-string-class' option, all the constant string objects will be instances of the class specified as argument to this option. It is possible to have multiple compilation units referring to different constant string classes, neither the compiler nor the linker impose any restrictions in doing this.  File: gcc.info, Node: compatibility_alias, Prev: Constant string objects, Up: Objective-C compatibility_alias =================== This is a feature of the Objective-C compiler rather than of the runtime, anyway since it is documented nowhere and its existence was forgotten, we are documenting it here. The keyword `@compatibility_alias' allows you to define a class name as equivalent to another class name. For example: @compatibility_alias WOApplication GSWApplication; tells the compiler that each time it encounters `WOApplication' as a class name, it should replace it with `GSWApplication' (that is, `WOApplication' is just an alias for `GSWApplication'). There are some constraints on how this can be used-- * `WOApplication' (the alias) must not be an existing class; * `GSWApplication' (the real class) must be an existing class.  File: gcc.info, Node: Gcov, Next: Trouble, Prev: Objective-C, Up: Top `gcov': a Test Coverage Program ******************************* `gcov' is a tool you can use in conjunction with GCC to test code coverage in your programs. * 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.  File: gcc.info, Node: Gcov Intro, Next: Invoking Gcov, Up: Gcov Introduction to `gcov' ====================== `gcov' is a test coverage program. Use it in concert with GCC to analyze your programs to help create more efficient, faster running code. You can use `gcov' as a profiling tool to help discover where your optimization efforts will best affect your code. You can also use `gcov' along with the other profiling tool, `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 `gcov' or `gprof', you can find out some basic performance statistics, such as: * how often each line of code executes * what lines of code are actually executed * how much computing time each section of code uses 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. `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 `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 `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. `gcov' creates a logfile called `SOURCEFILE.gcov' which indicates how many times each line of a source file `SOURCEFILE.c' has executed. You can use these logfiles along with `gprof' to aid in fine-tuning the performance of your programs. `gprof' gives timing information you can use along with the information you get from `gcov'. `gcov' works only on code compiled with GCC. It is not compatible with any other profiling or test coverage mechanism.  File: gcc.info, Node: Invoking Gcov, Next: Gcov and Optimization, Prev: Gcov Intro, Up: Gcov Invoking gcov ============= gcov [OPTIONS] SOURCEFILE `gcov' accepts the following options: `-h' `--help' Display help about using `gcov' (on the standard output), and exit without doing any further processing. `-v' `--version' Display the `gcov' version number (on the standard output), and exit without doing any further processing. `-b' `--branch-probabilities' 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. `-c' `--branch-counts' Write branch frequencies as the number of branches taken, rather than the percentage of branches taken. `-n' `--no-output' Do not create the `gcov' output file. `-l' `--long-file-names' Create long file names for included source files. For example, if the header file `x.h' contains code, and was included in the file `a.c', then running `gcov' on the file `a.c' will produce an output file called `a.c.x.h.gcov' instead of `x.h.gcov'. This can be useful if `x.h' is included in multiple source files. `-f' `--function-summaries' Output summaries for each function in addition to the file level summary. `-o DIRECTORY' `--object-directory DIRECTORY' The directory where the object files live. Gcov will search for `.bb', `.bbg', and `.da' files in this directory. When using `gcov', you must first compile your program with two special GCC options: `-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 `.da' file will be placed in the source directory. Running `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 `tmp.c', this is what you see when you use the basic `gcov' facility: $ 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. The file `tmp.c.gcov' contains output from `gcov'. Here is a sample: 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 } When you use the `-b' option, your output looks like this: $ 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. Here is a sample of a resulting `tmp.c.gcov' file: 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 } 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 `exit' or `longjmp', and thus may not return every time they are called. The execution counts are cumulative. If the example program were executed again without removing the `.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 `.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 `.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.  File: gcc.info, Node: Gcov and Optimization, Next: Gcov Data Files, Prev: Invoking Gcov, Up: Gcov Using `gcov' with GCC Optimization ================================== If you plan to use `gcov' to help optimize your code, you must first compile your program with two special GCC options: `-fprofile-arcs -ftest-coverage'. Aside from that, you can use any other GCC 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: if (a != b) c = 1; else c = 0; can be compiled into one instruction on some machines. In this case, there is no way for `gcov' to calculate separate execution counts for each line because there isn't separate code for each line. Hence the `gcov' output looks like this if you compiled the program with optimization: 100 if (a != b) 100 c = 1; 100 else 100 c = 0; 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.  File: gcc.info, Node: Gcov Data Files, Prev: Gcov and Optimization, Up: Gcov Brief description of `gcov' data files ====================================== `gcov' uses three files for doing profiling. The names of these files are derived from the original _source_ file by substituting the file suffix with either `.bb', `.bbg', or `.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 `.bb' and `.bbg' files are generated when the source file is compiled with the GCC `-ftest-coverage' option. The `.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 `.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 `.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 `.bb' file, enables gcov to reconstruct the program flow. In the `.bbg' file, the format is: 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) ... 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 `.da' file is generated when a program containing object files built with the GCC `-fprofile-arcs' option is executed. A separate `.da' file is created for each source file compiled with this option, and the name of the `.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 `.da' suffix. The format of the `.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 attempts to combine the existing `.da' files with the new counts for this invocation of the program. It ignores the contents of any `.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 `gcov-io.h' to store integers; the functions in this header provide a machine-independent mechanism for storing and retrieving data from a stream.  File: gcc.info, Node: Trouble, Next: Bugs, Prev: Gcov, Up: Top Known Causes of Trouble with GCC ******************************** 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. * 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:: GCC uses corrected versions of system header files. This is necessary, but doesn't always work smoothly. * Standard Libraries:: GCC uses the system C library, which might not be compliant with the ISO 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 `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.  File: gcc.info, Node: Actual Bugs, Next: Cross-Compiler Problems, Up: Trouble Actual Bugs We Haven't Fixed Yet ================================ * The `fixincludes' script interacts badly with automounters; if the directory of system header files is automounted, it tends to be unmounted while `fixincludes' is running. This would seem to be a bug in the automounter. We don't know any good way to work around it. * The `fixproto' script will sometimes add prototypes for the `sigsetjmp' and `siglongjmp' functions that reference the `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. * When `-pedantic-errors' is specified, GCC will incorrectly give an error message when a function name is specified in an expression involving the comma operator.  File: gcc.info, Node: Cross-Compiler Problems, Next: Interoperation, Prev: Actual Bugs, Up: Trouble Cross-Compiler Problems ======================= You may run into problems with cross compilation on certain machines, for several reasons. * 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. 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 `REAL_VALUE_TYPE'. But doing so is a substantial amount of work for each target machine. *Note Cross Compilation and Floating Point: (gccint)Cross-compilation. * At present, the program `mips-tfile' which adds debug support to object files on MIPS systems does not work in a cross compile environment.  File: gcc.info, Node: Interoperation, Next: External Bugs, Prev: Cross-Compiler Problems, Up: Trouble Interoperation ============== This section lists various difficulties encountered in using GCC together with other compilers or with the assemblers, linkers, libraries and debuggers on certain systems. * G++ 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. * Older GDB versions sometimes fail to read the output of GCC version 2. If you have trouble, get GDB version 4.4 or later. * 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. * The GNU assembler (GAS) does not support PIC. To generate PIC code, you must use some other assembler, such as `/bin/as'. * 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. * On some SGI systems, when you use `-lgl_s' as an option, it gets translated magically to `-lgl_s -lX11_s -lc_s'. Naturally, this does not happen when you use GCC. You must specify all three options explicitly. * On a Sparc, GCC aligns all values of type `double' on an 8-byte boundary, and it expects every `double' to be so aligned. The Sun compiler usually gives `double' values 8-byte alignment, with one exception: function arguments of type `double' may not be aligned. As a result, if a function compiled with Sun CC takes the address of an argument of type `double' and passes this pointer of type `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 GCC. 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 `access_double' instead of directly with `*': 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; } Storing into the pointer can be done likewise with the same union. * On Solaris, the `malloc' function in the `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 `libmalloc.a' library. The solution is to not use the `libmalloc.a' library. Use instead `malloc' and related functions from `libc.a'; they do not have this problem. * Sun forgot to include a static version of `libdl.a' with some versions of SunOS (mainly 4.1). This results in undefined symbols when linking static binaries (that is, if you use `-static'). If you see undefined symbols `_dlclose', `_dlsym' or `_dlopen' when linking, compile and link against the file `mit/util/misc/dlsym.c' from the MIT version of X windows. * 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). * On HP-UX version 9.01 on the HP PA, the HP compiler `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. * On the HP PA machine, ADB sometimes fails to work on functions compiled with GCC. Specifically, it fails to work on functions that use `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. * Debugging (`-g') is not supported on the HP PA machine, unless you use the preliminary GNU tools. * Taking the address of a label may generate errors from the HP-UX PA assembler. GAS for the PA does not have this problem. * 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. * 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. * GCC compiled code sometimes emits warnings from the HP-UX assembler of the form: (warning) Use of GR3 when frame >= 8192 may cause conflict. These warnings are harmless and can be safely ignored. * On the IBM RS/6000, compiling code of the form extern int foo; ... foo ... static int foo; will cause the linker to report an undefined symbol `foo'. Although this behavior differs from most other systems, it is not a bug because redefining an `extern' variable as `static' is undefined in ISO C. * In extremely rare cases involving some very large functions you may receive errors from the AIX Assembler complaining about a displacement that is too large. If you should run into it, you can work around by making your function smaller. * The `libstdc++.a' library in GCC relies on the SVR4 dynamic linker semantics which merges global symbols between libraries and applications, especially necessary for C++ streams functionality. This is not the default behavior of AIX shared libraries and dynamic linking. `libstdc++.a' is built on AIX with "runtime-linking" enabled so that symbol merging can occur. To utilize this feature, the application linked with `libstdc++.a' must include the `-Wl,-brtl' flag on the link line. G++ cannot impose this because this option may interfere with the semantics of the user program and users may not always use `g++' to link his or her application. Applications are not required to use the `-Wl,-brtl' flag on the link line--the rest of the `libstdc++.a' library which is not dependent on the symbol merging semantics will continue to function correctly. * An application can interpose its own definition of functions for functions invoked by `libstdc++.a' with "runtime-linking" enabled on AIX. To accomplish this the application must be linked with "runtime-linking" option and the functions explicitly must be exported by the application (`-Wl,-brtl,-bE:exportfile'). * 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'. * Even if you specify `-fdollars-in-identifiers', you cannot successfully use `$' in identifiers on the RS/6000 due to a restriction in the IBM assembler. GAS supports these identifiers. * There is an assembler bug in versions of DG/UX prior to 5.4.2.01 that occurs when the `fldcr' instruction is used. GCC uses `fldcr' on the 88100 to serialize volatile memory references. Use the option `-mno-serialize-volatile' if your version of the assembler has this bug. * 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. * On NewsOS version 3, if you include both of the files `stddef.h' and `sys/types.h', you get an error because there are two typedefs of `size_t'. You should change `sys/types.h' by adding these lines around the definition of `size_t': #ifndef _SIZE_T #define _SIZE_T ACTUAL-TYPEDEF-HERE #endif * 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. * On the IBM RT PC, the MetaWare HighC compiler (hc) uses a different convention for structure and union returning. Use the option `-mhc-struct-return' to tell GCC to use a convention compatible with it. * 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: -fcall-saved-r2 -fcall-saved-r3 -fcall-saved-r4 -fcall-saved-r5 * 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: -L/usr/local/lib/gcc-lib/we32k-att-sysv/2.8.1 -lgcc -lc_s The first specifies where to find the library `libgcc.a' specified with the `-lgcc' option. GCC does linking by invoking `ld', just as `cc' does, and there is no reason why it _should_ matter which compilation program you use to invoke `ld'. If someone tracks this problem down, it can probably be fixed easily. * 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 `ecvt', `fcvt' and `gcvt'. Given valid floating point numbers, they sometimes print `NaN'. * 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 `-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 `specs' so that it unconditionally passes `-O0' to the assembler, and never passes `-O2' or `-O3'.  File: gcc.info, Node: External Bugs, Next: Incompatibilities, Prev: Interoperation, Up: Trouble Problems Compiling Certain Programs =================================== Certain programs have problems compiling. * 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 `X11/Xlib.h' and `X11/Xutil.h'. People recommend adding `-I/usr/include/mit' to use the MIT versions of the header files, using the `-traditional' switch to turn off ISO C, or fixing the header files by adding this: #ifdef __STDC__ #define NeedFunctionPrototypes 0 #endif * 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 `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: MALLOC=/usr/local/lib/libgmalloc.a Alternatively, if you have compiled `gmalloc.c' from Emacs 19, copy the object file to `gmalloc.o' and use this option when you relink GCC: MALLOC=gmalloc.o  File: gcc.info, Node: Incompatibilities, Next: Fixed Headers, Prev: External Bugs, Up: Trouble Incompatibilities of GCC ======================== There are several noteworthy incompatibilities between GNU C and K&R (non-ISO) versions of C. The `-traditional' option eliminates many of these incompatibilities, _but not all_, by telling GCC to behave like a K&R C compiler. * GCC normally makes string constants read-only. If several identical-looking string constants are used, GCC stores only one copy of the string. One consequence is that you cannot call `mktemp' with a string constant argument. The function `mktemp' always alters the string its argument points to. Another consequence is that `sscanf' does not work on some systems when passed a string constant as its format control string or input. This is because `sscanf' incorrectly tries to write into the string constant. Likewise `fscanf' and `scanf'. 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 GCC to handle string constants the same way most C compilers do. `-traditional' also has this effect, among others. * `-2147483648' is positive. This is because 2147483648 cannot fit in the type `int', so (following the ISO C rules) its data type is `unsigned long int'. Negating this value yields 2147483648 again. * GCC does not substitute macro arguments when they appear inside of string constants. For example, the following macro in GCC #define foo(a) "a" will produce output `"a"' regardless of what the argument A is. The `-traditional' option directs GCC to handle such cases (among others) in the old-fashioned (non-ISO) fashion. * 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: jmp_buf j; foo () { int a, b; a = fun1 (); if (setjmp (j)) return a; a = fun2 (); /* `longjmp (j)' may occur in `fun3'. */ return a + fun3 (); } 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. If you use the `-W' option with the `-O' option, you will get a warning when GCC thinks such a problem might be possible. The `-traditional' option directs GCC to put variables in the stack by default, rather than in registers, in functions that call `setjmp'. This results in the behavior found in traditional C compilers. * 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: foobar ( #define luser hack) ISO C does not permit such a construct. It would make sense to support it when `-traditional' is used, but it is too much work to implement. * 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. * 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 `extern' declaration affects all the rest of the file even if it happens within a block. The `-traditional' option directs GCC to treat all `extern' declarations as global, like traditional compilers. * In traditional C, you can combine `long', etc., with a typedef name, as shown here: typedef int foo; typedef long foo bar; In ISO 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. * PCC allows typedef names to be used as function parameters. The difficulty described immediately above applies here too. * 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; * GCC treats all characters of identifiers as significant, even when in `-traditional' mode. According to K&R-1 (2.2), "No more than the first eight characters are significant, although more may be used.". Also according to K&R-1 (2.2), "An identifier is a sequence of letters and digits; the first character must be a letter. The underscore _ counts as a letter.", but GCC also allows dollar signs in identifiers. * PCC allows whitespace in the middle of compound assignment operators such as `+='. GCC, following the ISO standard, does not allow this. The difficulty described immediately above applies here too. * 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: #if 0 You can't expect this to work. #endif The best solution to such a problem is to put the text into an actual C comment delimited by `/*...*/'. However, `-traditional' suppresses these error messages. * Many user programs contain the declaration `long time ();'. In the past, the system header files on many systems did not actually declare `time', so it did not matter what type your program declared it to return. But in systems with ISO C headers, `time' is declared to return `time_t', and if that is not the same as `long', then `long time ();' is erroneous. The solution is to change your program to use appropriate system headers (`' on systems with ISO C headers) and not to declare `time' if the system header files declare it, or failing that to use `time_t' as the return type of `time'. * When compiling functions that return `float', PCC converts it to a double. GCC actually returns a `float'. If you are concerned with PCC compatibility, you should declare your functions to return `double'; you might as well say what you mean. * 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 `STRUCT_VALUE' and `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 `-fpcc-struct-return'. * GCC complains about program fragments such as `0x74ae-0x4000' which appear to be two hexadecimal constants separated by the minus operator. Actually, this string is a single "preprocessing token". Each such token must correspond to one token in C. Since this does not, GCC prints an error message. Although it may appear obvious that what is meant is an operator and two values, the ISO C standard specifically requires that this be treated as erroneous. A "preprocessing token" is a "preprocessing number" if it begins with a digit and is followed by letters, underscores, digits, periods and `e+', `e-', `E+', `E-', `p+', `p-', `P+', or `P-' character sequences. (In strict C89 mode, the sequences `p+', `p-', `P+' and `P-' cannot appear in preprocessing numbers.) To make the above program fragment valid, place whitespace in front of the minus sign. This whitespace will end the preprocessing number.  File: gcc.info, Node: Fixed Headers, Next: Standard Libraries, Prev: Incompatibilities, Up: Trouble 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 ISO 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 `fixincludes' (or for certain targets an alternative such as `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. * 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.) * 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. * On Lynxos, GCC by default does not fix the header files. This is because bugs in the shell cause the `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.  File: gcc.info, Node: Standard Libraries, Next: Disappointments, Prev: Fixed Headers, Up: Trouble Standard Libraries ================== GCC by itself attempts to be a conforming freestanding implementation. *Note Language Standards Supported by GCC: Standards, for details of what this means. Beyond the library facilities required of such an implementation, 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 `-Wall') that you don't expect. For example, the `sprintf' function on SunOS 4.1.3 returns `char *' while the C standard says that `sprintf' returns an `int'. The `fixincludes' program could make the prototype for this function match the Standard, but that would be wrong, since the function will still return `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 `glibc') provides ISO C, POSIX, BSD, SystemV and X/Open compatibility for GNU/Linux and HURD-based GNU systems; no recent version of it supports other systems, though some very old versions did. Version 2.2 of the GNU C library includes nearly complete C99 support. You could also ask your operating system vendor if newer libraries are available.