1090 lines
48 KiB
Plaintext
1090 lines
48 KiB
Plaintext
This is Info file gcc.info, produced by Makeinfo version 1.68 from the
|
||
input file ../../gcc-2.95.2/gcc/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 and the internals of the GNU compiler.
|
||
|
||
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 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 sections entitled "GNU General Public License" and "Funding
|
||
for Free Software" are included exactly as in the original, and
|
||
provided that the entire resulting derived work is distributed under
|
||
the terms of a permission notice identical to this one.
|
||
|
||
Permission is granted to copy and distribute translations of this
|
||
manual into another language, under the above conditions for modified
|
||
versions, except that the sections entitled "GNU General Public
|
||
License" and "Funding for Free Software", and this permission notice,
|
||
may be included in translations approved by the Free Software Foundation
|
||
instead of in the original English.
|
||
|
||
|
||
File: gcc.info, Node: Temporaries, Next: Copy Assignment, Prev: Static Definitions, Up: C++ Misunderstandings
|
||
|
||
Temporaries May Vanish Before You Expect
|
||
----------------------------------------
|
||
|
||
It is dangerous to use pointers or references to *portions* of a
|
||
temporary object. The compiler may very well delete the object before
|
||
you expect it to, leaving a pointer to garbage. The most common place
|
||
where this problem crops up is in classes like string classes,
|
||
especially ones that define a conversion function to type `char *' or
|
||
`const char *' - which is one reason why the standard `string' class
|
||
requires you to call the `c_str' member function. However, any class
|
||
that returns a pointer to some internal structure is potentially
|
||
subject to this problem.
|
||
|
||
For example, a program may use a function `strfunc' that returns
|
||
`string' objects, and another function `charfunc' that operates on
|
||
pointers to `char':
|
||
|
||
string strfunc ();
|
||
void charfunc (const char *);
|
||
|
||
void
|
||
f ()
|
||
{
|
||
const char *p = strfunc().c_str();
|
||
...
|
||
charfunc (p);
|
||
...
|
||
charfunc (p);
|
||
}
|
||
|
||
In this situation, it may seem reasonable to save a pointer to the C
|
||
string returned by the `c_str' member function and use that rather than
|
||
call `c_str' repeatedly. However, the temporary string created by the
|
||
call to `strfunc' is destroyed after `p' is initialized, at which point
|
||
`p' is left pointing to freed memory.
|
||
|
||
Code like this may run successfully under some other compilers,
|
||
particularly obsolete cfront-based compilers that delete temporaries
|
||
along with normal local variables. However, the GNU C++ behavior is
|
||
standard-conforming, so if your program depends on late destruction of
|
||
temporaries it is not portable.
|
||
|
||
The safe way to write such code is to give the temporary a name,
|
||
which forces it to remain until the end of the scope of the name. For
|
||
example:
|
||
|
||
string& tmp = strfunc ();
|
||
charfunc (tmp.c_str ());
|
||
|
||
|
||
File: gcc.info, Node: Copy Assignment, Prev: Temporaries, Up: C++ Misunderstandings
|
||
|
||
Implicit Copy-Assignment for Virtual Bases
|
||
------------------------------------------
|
||
|
||
When a base class is virtual, only one subobject of the base class
|
||
belongs to each full object. Also, the constructors and destructors are
|
||
invoked only once, and called from the most-derived class. However, such
|
||
objects behave unspecified when being assigned. For example:
|
||
|
||
struct Base{
|
||
char *name;
|
||
Base(char *n) : name(strdup(n)){}
|
||
Base& operator= (const Base& other){
|
||
free (name);
|
||
name = strdup (other.name);
|
||
}
|
||
};
|
||
|
||
struct A:virtual Base{
|
||
int val;
|
||
A():Base("A"){}
|
||
};
|
||
|
||
struct B:virtual Base{
|
||
int bval;
|
||
B():Base("B"){}
|
||
};
|
||
|
||
struct Derived:public A, public B{
|
||
Derived():Base("Derived"){}
|
||
};
|
||
|
||
void func(Derived &d1, Derived &d2)
|
||
{
|
||
d1 = d2;
|
||
}
|
||
|
||
The C++ standard specifies that `Base::Base' is only called once
|
||
when constructing or copy-constructing a Derived object. It is
|
||
unspecified whether `Base::operator=' is called more than once when the
|
||
implicit copy-assignment for Derived objects is invoked (as it is
|
||
inside `func' in the example).
|
||
|
||
g++ implements the "intuitive" algorithm for copy-assignment: assign
|
||
all direct bases, then assign all members. In that algorithm, the
|
||
virtual base subobject can be encountered many times. In the example,
|
||
copying proceeds in the following order: `val', `name' (via `strdup'),
|
||
`bval', and `name' again.
|
||
|
||
If application code relies on copy-assignment, a user-defined
|
||
copy-assignment operator removes any uncertainties. With such an
|
||
operator, the application can define whether and how the virtual base
|
||
subobject is assigned.
|
||
|
||
|
||
File: gcc.info, Node: Protoize Caveats, Next: Non-bugs, Prev: C++ Misunderstandings, Up: Trouble
|
||
|
||
Caveats of using `protoize'
|
||
===========================
|
||
|
||
The conversion programs `protoize' and `unprotoize' can sometimes
|
||
change a source file in a way that won't work unless you rearrange it.
|
||
|
||
* `protoize' can insert references to a type name or type tag before
|
||
the definition, or in a file where they are not defined.
|
||
|
||
If this happens, compiler error messages should show you where the
|
||
new references are, so fixing the file by hand is straightforward.
|
||
|
||
* There are some C constructs which `protoize' cannot figure out.
|
||
For example, it can't determine argument types for declaring a
|
||
pointer-to-function variable; this you must do by hand. `protoize'
|
||
inserts a comment containing `???' each time it finds such a
|
||
variable; so you can find all such variables by searching for this
|
||
string. ANSI C does not require declaring the argument types of
|
||
pointer-to-function types.
|
||
|
||
* Using `unprotoize' can easily introduce bugs. If the program
|
||
relied on prototypes to bring about conversion of arguments, these
|
||
conversions will not take place in the program without prototypes.
|
||
One case in which you can be sure `unprotoize' is safe is when you
|
||
are removing prototypes that were made with `protoize'; if the
|
||
program worked before without any prototypes, it will work again
|
||
without them.
|
||
|
||
You can find all the places where this problem might occur by
|
||
compiling the program with the `-Wconversion' option. It prints a
|
||
warning whenever an argument is converted.
|
||
|
||
* Both conversion programs can be confused if there are macro calls
|
||
in and around the text to be converted. In other words, the
|
||
standard syntax for a declaration or definition must not result
|
||
from expanding a macro. This problem is inherent in the design of
|
||
C and cannot be fixed. If only a few functions have confusing
|
||
macro calls, you can easily convert them manually.
|
||
|
||
* `protoize' cannot get the argument types for a function whose
|
||
definition was not actually compiled due to preprocessing
|
||
conditionals. When this happens, `protoize' changes nothing in
|
||
regard to such a function. `protoize' tries to detect such
|
||
instances and warn about them.
|
||
|
||
You can generally work around this problem by using `protoize' step
|
||
by step, each time specifying a different set of `-D' options for
|
||
compilation, until all of the functions have been converted.
|
||
There is no automatic way to verify that you have got them all,
|
||
however.
|
||
|
||
* Confusion may result if there is an occasion to convert a function
|
||
declaration or definition in a region of source code where there
|
||
is more than one formal parameter list present. Thus, attempts to
|
||
convert code containing multiple (conditionally compiled) versions
|
||
of a single function header (in the same vicinity) may not produce
|
||
the desired (or expected) results.
|
||
|
||
If you plan on converting source files which contain such code, it
|
||
is recommended that you first make sure that each conditionally
|
||
compiled region of source code which contains an alternative
|
||
function header also contains at least one additional follower
|
||
token (past the final right parenthesis of the function header).
|
||
This should circumvent the problem.
|
||
|
||
* `unprotoize' can become confused when trying to convert a function
|
||
definition or declaration which contains a declaration for a
|
||
pointer-to-function formal argument which has the same name as the
|
||
function being defined or declared. We recommand you avoid such
|
||
choices of formal parameter names.
|
||
|
||
* You might also want to correct some of the indentation by hand and
|
||
break long lines. (The conversion programs don't write lines
|
||
longer than eighty characters in any case.)
|
||
|
||
|
||
File: gcc.info, Node: Non-bugs, Next: Warnings and Errors, Prev: Protoize Caveats, Up: Trouble
|
||
|
||
Certain Changes We Don't Want to Make
|
||
=====================================
|
||
|
||
This section lists changes that people frequently request, but which
|
||
we do not make because we think GCC is better without them.
|
||
|
||
* Checking the number and type of arguments to a function which has
|
||
an old-fashioned definition and no prototype.
|
||
|
||
Such a feature would work only occasionally--only for calls that
|
||
appear in the same file as the called function, following the
|
||
definition. The only way to check all calls reliably is to add a
|
||
prototype for the function. But adding a prototype eliminates the
|
||
motivation for this feature. So the feature is not worthwhile.
|
||
|
||
* Warning about using an expression whose type is signed as a shift
|
||
count.
|
||
|
||
Shift count operands are probably signed more often than unsigned.
|
||
Warning about this would cause far more annoyance than good.
|
||
|
||
* Warning about assigning a signed value to an unsigned variable.
|
||
|
||
Such assignments must be very common; warning about them would
|
||
cause more annoyance than good.
|
||
|
||
* Warning about unreachable code.
|
||
|
||
It's very common to have unreachable code in machine-generated
|
||
programs. For example, this happens normally in some files of GNU
|
||
C itself.
|
||
|
||
* Warning when a non-void function value is ignored.
|
||
|
||
Coming as I do from a Lisp background, I balk at the idea that
|
||
there is something dangerous about discarding a value. There are
|
||
functions that return values which some callers may find useful;
|
||
it makes no sense to clutter the program with a cast to `void'
|
||
whenever the value isn't useful.
|
||
|
||
* Assuming (for optimization) that the address of an external symbol
|
||
is never zero.
|
||
|
||
This assumption is false on certain systems when `#pragma weak' is
|
||
used.
|
||
|
||
* Making `-fshort-enums' the default.
|
||
|
||
This would cause storage layout to be incompatible with most other
|
||
C compilers. And it doesn't seem very important, given that you
|
||
can get the same result in other ways. The case where it matters
|
||
most is when the enumeration-valued object is inside a structure,
|
||
and in that case you can specify a field width explicitly.
|
||
|
||
* Making bitfields unsigned by default on particular machines where
|
||
"the ABI standard" says to do so.
|
||
|
||
The ANSI C standard leaves it up to the implementation whether a
|
||
bitfield declared plain `int' is signed or not. This in effect
|
||
creates two alternative dialects of C.
|
||
|
||
The GNU C compiler supports both dialects; you can specify the
|
||
signed dialect with `-fsigned-bitfields' and the unsigned dialect
|
||
with `-funsigned-bitfields'. However, this leaves open the
|
||
question of which dialect to use by default.
|
||
|
||
Currently, the preferred dialect makes plain bitfields signed,
|
||
because this is simplest. Since `int' is the same as `signed int'
|
||
in every other context, it is cleanest for them to be the same in
|
||
bitfields as well.
|
||
|
||
Some computer manufacturers have published Application Binary
|
||
Interface standards which specify that plain bitfields should be
|
||
unsigned. It is a mistake, however, to say anything about this
|
||
issue in an ABI. This is because the handling of plain bitfields
|
||
distinguishes two dialects of C. Both dialects are meaningful on
|
||
every type of machine. Whether a particular object file was
|
||
compiled using signed bitfields or unsigned is of no concern to
|
||
other object files, even if they access the same bitfields in the
|
||
same data structures.
|
||
|
||
A given program is written in one or the other of these two
|
||
dialects. The program stands a chance to work on most any machine
|
||
if it is compiled with the proper dialect. It is unlikely to work
|
||
at all if compiled with the wrong dialect.
|
||
|
||
Many users appreciate the GNU C compiler because it provides an
|
||
environment that is uniform across machines. These users would be
|
||
inconvenienced if the compiler treated plain bitfields differently
|
||
on certain machines.
|
||
|
||
Occasionally users write programs intended only for a particular
|
||
machine type. On these occasions, the users would benefit if the
|
||
GNU C compiler were to support by default the same dialect as the
|
||
other compilers on that machine. But such applications are rare.
|
||
And users writing a program to run on more than one type of
|
||
machine cannot possibly benefit from this kind of compatibility.
|
||
|
||
This is why GCC does and will treat plain bitfields in the same
|
||
fashion on all types of machines (by default).
|
||
|
||
There are some arguments for making bitfields unsigned by default
|
||
on all machines. If, for example, this becomes a universal de
|
||
facto standard, it would make sense for GCC to go along with it.
|
||
This is something to be considered in the future.
|
||
|
||
(Of course, users strongly concerned about portability should
|
||
indicate explicitly in each bitfield whether it is signed or not.
|
||
In this way, they write programs which have the same meaning in
|
||
both C dialects.)
|
||
|
||
* Undefining `__STDC__' when `-ansi' is not used.
|
||
|
||
Currently, GCC defines `__STDC__' as long as you don't use
|
||
`-traditional'. This provides good results in practice.
|
||
|
||
Programmers normally use conditionals on `__STDC__' to ask whether
|
||
it is safe to use certain features of ANSI C, such as function
|
||
prototypes or ANSI token concatenation. Since plain `gcc' supports
|
||
all the features of ANSI C, the correct answer to these questions
|
||
is "yes".
|
||
|
||
Some users try to use `__STDC__' to check for the availability of
|
||
certain library facilities. This is actually incorrect usage in
|
||
an ANSI C program, because the ANSI C standard says that a
|
||
conforming freestanding implementation should define `__STDC__'
|
||
even though it does not have the library facilities. `gcc -ansi
|
||
-pedantic' is a conforming freestanding implementation, and it is
|
||
therefore required to define `__STDC__', even though it does not
|
||
come with an ANSI C library.
|
||
|
||
Sometimes people say that defining `__STDC__' in a compiler that
|
||
does not completely conform to the ANSI C standard somehow
|
||
violates the standard. This is illogical. The standard is a
|
||
standard for compilers that claim to support ANSI C, such as `gcc
|
||
-ansi'--not for other compilers such as plain `gcc'. Whatever the
|
||
ANSI C standard says is relevant to the design of plain `gcc'
|
||
without `-ansi' only for pragmatic reasons, not as a requirement.
|
||
|
||
GCC normally defines `__STDC__' to be 1, and in addition defines
|
||
`__STRICT_ANSI__' if you specify the `-ansi' option. On some
|
||
hosts, system include files use a different convention, where
|
||
`__STDC__' is normally 0, but is 1 if the user specifies strict
|
||
conformance to the C Standard. GCC follows the host convention
|
||
when processing system include files, but when processing user
|
||
files it follows the usual GNU C convention.
|
||
|
||
* Undefining `__STDC__' in C++.
|
||
|
||
Programs written to compile with C++-to-C translators get the
|
||
value of `__STDC__' that goes with the C compiler that is
|
||
subsequently used. These programs must test `__STDC__' to
|
||
determine what kind of C preprocessor that compiler uses: whether
|
||
they should concatenate tokens in the ANSI C fashion or in the
|
||
traditional fashion.
|
||
|
||
These programs work properly with GNU C++ if `__STDC__' is defined.
|
||
They would not work otherwise.
|
||
|
||
In addition, many header files are written to provide prototypes
|
||
in ANSI C but not in traditional C. Many of these header files
|
||
can work without change in C++ provided `__STDC__' is defined. If
|
||
`__STDC__' is not defined, they will all fail, and will all need
|
||
to be changed to test explicitly for C++ as well.
|
||
|
||
* Deleting "empty" loops.
|
||
|
||
Historically, GCC has not deleted "empty" loops under the
|
||
assumption that the most likely reason you would put one in a
|
||
program is to have a delay, so deleting them will not make real
|
||
programs run any faster.
|
||
|
||
However, the rationale here is that optimization of a nonempty loop
|
||
cannot produce an empty one, which holds for C but is not always
|
||
the case for C++.
|
||
|
||
Moreover, with `-funroll-loops' small "empty" loops are already
|
||
removed, so the current behavior is both sub-optimal and
|
||
inconsistent and will change in the future.
|
||
|
||
* Making side effects happen in the same order as in some other
|
||
compiler.
|
||
|
||
It is never safe to depend on the order of evaluation of side
|
||
effects. For example, a function call like this may very well
|
||
behave differently from one compiler to another:
|
||
|
||
void func (int, int);
|
||
|
||
int i = 2;
|
||
func (i++, i++);
|
||
|
||
There is no guarantee (in either the C or the C++ standard language
|
||
definitions) that the increments will be evaluated in any
|
||
particular order. Either increment might happen first. `func'
|
||
might get the arguments `2, 3', or it might get `3, 2', or even
|
||
`2, 2'.
|
||
|
||
* Not allowing structures with volatile fields in registers.
|
||
|
||
Strictly speaking, there is no prohibition in the ANSI C standard
|
||
against allowing structures with volatile fields in registers, but
|
||
it does not seem to make any sense and is probably not what you
|
||
wanted to do. So the compiler will give an error message in this
|
||
case.
|
||
|
||
|
||
File: gcc.info, Node: Warnings and Errors, Prev: Non-bugs, Up: Trouble
|
||
|
||
Warning Messages and Error Messages
|
||
===================================
|
||
|
||
The GNU compiler can produce two kinds of diagnostics: errors and
|
||
warnings. Each kind has a different purpose:
|
||
|
||
*Errors* report problems that make it impossible to compile your
|
||
program. GCC reports errors with the source file name and line
|
||
number where the problem is apparent.
|
||
|
||
*Warnings* report other unusual conditions in your code that *may*
|
||
indicate a problem, although compilation can (and does) proceed.
|
||
Warning messages also report the source file name and line number,
|
||
but include the text `warning:' to distinguish them from error
|
||
messages.
|
||
|
||
Warnings may indicate danger points where you should check to make
|
||
sure that your program really does what you intend; or the use of
|
||
obsolete features; or the use of nonstandard features of GNU C or C++.
|
||
Many warnings are issued only if you ask for them, with one of the `-W'
|
||
options (for instance, `-Wall' requests a variety of useful warnings).
|
||
|
||
GCC always tries to compile your program if possible; it never
|
||
gratuitously rejects a program whose meaning is clear merely because
|
||
(for instance) it fails to conform to a standard. In some cases,
|
||
however, the C and C++ standards specify that certain extensions are
|
||
forbidden, and a diagnostic *must* be issued by a conforming compiler.
|
||
The `-pedantic' option tells GCC to issue warnings in such cases;
|
||
`-pedantic-errors' says to make them errors instead. This does not
|
||
mean that *all* non-ANSI constructs get warnings or errors.
|
||
|
||
*Note Options to Request or Suppress Warnings: Warning Options, for
|
||
more detail on these and related command-line options.
|
||
|
||
|
||
File: gcc.info, Node: Bugs, Next: Service, Prev: Trouble, Up: Top
|
||
|
||
Reporting Bugs
|
||
**************
|
||
|
||
Your bug reports play an essential role in making GCC reliable.
|
||
|
||
When you encounter a problem, the first thing to do is to see if it
|
||
is already known. *Note Trouble::. If it isn't known, then you should
|
||
report the problem.
|
||
|
||
Reporting a bug may help you by bringing a solution to your problem,
|
||
or it may not. (If it does not, look in the service directory; see
|
||
*Note Service::.) In any case, the principal function of a bug report
|
||
is to help the entire community by making the next version of GCC work
|
||
better. Bug reports are your contribution to the maintenance of GCC.
|
||
|
||
Since the maintainers are very overloaded, we cannot respond to every
|
||
bug report. However, if the bug has not been fixed, we are likely to
|
||
send you a patch and ask you to tell us whether it works.
|
||
|
||
In order for a bug report to serve its purpose, you must include the
|
||
information that makes for fixing the bug.
|
||
|
||
* Menu:
|
||
|
||
* Criteria: Bug Criteria. Have you really found a bug?
|
||
* Where: Bug Lists. Where to send your bug report.
|
||
* Reporting: Bug Reporting. How to report a bug effectively.
|
||
* Patches: Sending Patches. How to send a patch for GCC.
|
||
* Known: Trouble. Known problems.
|
||
* Help: Service. Where to ask for help.
|
||
|
||
|
||
File: gcc.info, Node: Bug Criteria, Next: Bug Lists, Up: Bugs
|
||
|
||
Have You Found a Bug?
|
||
=====================
|
||
|
||
If you are not sure whether you have found a bug, here are some
|
||
guidelines:
|
||
|
||
* If the compiler gets a fatal signal, for any input whatever, that
|
||
is a compiler bug. Reliable compilers never crash.
|
||
|
||
* If the compiler produces invalid assembly code, for any input
|
||
whatever (except an `asm' statement), that is a compiler bug,
|
||
unless the compiler reports errors (not just warnings) which would
|
||
ordinarily prevent the assembler from being run.
|
||
|
||
* If the compiler produces valid assembly code that does not
|
||
correctly execute the input source code, that is a compiler bug.
|
||
|
||
However, you must double-check to make sure, because you may have
|
||
run into an incompatibility between GNU C and traditional C (*note
|
||
Incompatibilities::.). These incompatibilities might be considered
|
||
bugs, but they are inescapable consequences of valuable features.
|
||
|
||
Or you may have a program whose behavior is undefined, which
|
||
happened by chance to give the desired results with another C or
|
||
C++ compiler.
|
||
|
||
For example, in many nonoptimizing compilers, you can write `x;'
|
||
at the end of a function instead of `return x;', with the same
|
||
results. But the value of the function is undefined if `return'
|
||
is omitted; it is not a bug when GCC produces different results.
|
||
|
||
Problems often result from expressions with two increment
|
||
operators, as in `f (*p++, *p++)'. Your previous compiler might
|
||
have interpreted that expression the way you intended; GCC might
|
||
interpret it another way. Neither compiler is wrong. The bug is
|
||
in your code.
|
||
|
||
After you have localized the error to a single source line, it
|
||
should be easy to check for these things. If your program is
|
||
correct and well defined, you have found a compiler bug.
|
||
|
||
* If the compiler produces an error message for valid input, that is
|
||
a compiler bug.
|
||
|
||
* If the compiler does not produce an error message for invalid
|
||
input, that is a compiler bug. However, you should note that your
|
||
idea of "invalid input" might be my idea of "an extension" or
|
||
"support for traditional practice".
|
||
|
||
* If you are an experienced user of C or C++ (or Fortran or
|
||
Objective-C) compilers, your suggestions for improvement of GCC
|
||
are welcome in any case.
|
||
|
||
|
||
File: gcc.info, Node: Bug Lists, Next: Bug Reporting, Prev: Bug Criteria, Up: Bugs
|
||
|
||
Where to Report Bugs
|
||
====================
|
||
|
||
Send bug reports for the GNU Compiler Collection to
|
||
`gcc-bugs@gcc.gnu.org'. In accordance with the GNU-wide convention, in
|
||
which bug reports for tool "foo" are sent to `bug-foo@gnu.org', the
|
||
address `bug-gcc@gnu.org' may also be used; it will forward to the
|
||
address given above.
|
||
|
||
Please read
|
||
`<URL:http://www.gnu.org/software/gcc/faq.html#bugreport>' for bug
|
||
reporting instructions before you post a bug report.
|
||
|
||
Often people think of posting bug reports to the newsgroup instead of
|
||
mailing them. This appears to work, but it has one problem which can be
|
||
crucial: a newsgroup posting does not contain a mail path back to the
|
||
sender. Thus, if maintainers need more information, they may be unable
|
||
to reach you. For this reason, you should always send bug reports by
|
||
mail to the proper mailing list.
|
||
|
||
As a last resort, send bug reports on paper to:
|
||
|
||
GNU Compiler Bugs
|
||
Free Software Foundation
|
||
59 Temple Place - Suite 330
|
||
Boston, MA 02111-1307, USA
|
||
|
||
|
||
File: gcc.info, Node: Bug Reporting, Next: Sending Patches, Prev: Bug Lists, Up: Bugs
|
||
|
||
How to Report Bugs
|
||
==================
|
||
|
||
You may find additional and/or more up-to-date instructions at
|
||
`<URL:http://www.gnu.org/software/gcc/faq.html#bugreport>'.
|
||
|
||
The fundamental principle of reporting bugs usefully is this:
|
||
*report all the facts*. If you are not sure whether to state a fact or
|
||
leave it out, state it!
|
||
|
||
Often people omit facts because they think they know what causes the
|
||
problem and they conclude that some details don't matter. Thus, you
|
||
might assume that the name of the variable you use in an example does
|
||
not matter. Well, probably it doesn't, but one cannot be sure.
|
||
Perhaps the bug is a stray memory reference which happens to fetch from
|
||
the location where that name is stored in memory; perhaps, if the name
|
||
were different, the contents of that location would fool the compiler
|
||
into doing the right thing despite the bug. Play it safe and give a
|
||
specific, complete example. That is the easiest thing for you to do,
|
||
and the most helpful.
|
||
|
||
Keep in mind that the purpose of a bug report is to enable someone to
|
||
fix the bug if it is not known. It isn't very important what happens if
|
||
the bug is already known. Therefore, always write your bug reports on
|
||
the assumption that the bug is not known.
|
||
|
||
Sometimes people give a few sketchy facts and ask, "Does this ring a
|
||
bell?" This cannot help us fix a bug, so it is basically useless. We
|
||
respond by asking for enough details to enable us to investigate. You
|
||
might as well expedite matters by sending them to begin with.
|
||
|
||
Try to make your bug report self-contained. If we have to ask you
|
||
for more information, it is best if you include all the previous
|
||
information in your response, as well as the information that was
|
||
missing.
|
||
|
||
Please report each bug in a separate message. This makes it easier
|
||
for us to track which bugs have been fixed and to forward your bugs
|
||
reports to the appropriate maintainer.
|
||
|
||
To enable someone to investigate the bug, you should include all
|
||
these things:
|
||
|
||
* The version of GCC. You can get this by running it with the `-v'
|
||
option.
|
||
|
||
Without this, we won't know whether there is any point in looking
|
||
for the bug in the current version of GCC.
|
||
|
||
* A complete input file that will reproduce the bug. If the bug is
|
||
in the C preprocessor, send a source file and any header files
|
||
that it requires. If the bug is in the compiler proper (`cc1'),
|
||
send the preprocessor output generated by adding `-save-temps' to
|
||
the compilation command (*note Debugging Options::.). When you do
|
||
this, use the same `-I', `-D' or `-U' options that you used in
|
||
actual compilation. Then send the INPUT.i or INPUT.ii files
|
||
generated.
|
||
|
||
A single statement is not enough of an example. In order to
|
||
compile it, it must be embedded in a complete file of compiler
|
||
input; and the bug might depend on the details of how this is done.
|
||
|
||
Without a real example one can compile, all anyone can do about
|
||
your bug report is wish you luck. It would be futile to try to
|
||
guess how to provoke the bug. For example, bugs in register
|
||
allocation and reloading frequently depend on every little detail
|
||
of the function they happen in.
|
||
|
||
Even if the input file that fails comes from a GNU program, you
|
||
should still send the complete test case. Don't ask the GCC
|
||
maintainers to do the extra work of obtaining the program in
|
||
question--they are all overworked as it is. Also, the problem may
|
||
depend on what is in the header files on your system; it is
|
||
unreliable for the GCC maintainers to try the problem with the
|
||
header files available to them. By sending CPP output, you can
|
||
eliminate this source of uncertainty and save us a certain
|
||
percentage of wild goose chases.
|
||
|
||
* The command arguments you gave GCC to compile that example and
|
||
observe the bug. For example, did you use `-O'? To guarantee you
|
||
won't omit something important, list all the options.
|
||
|
||
If we were to try to guess the arguments, we would probably guess
|
||
wrong and then we would not encounter the bug.
|
||
|
||
* The type of machine you are using, and the operating system name
|
||
and version number.
|
||
|
||
* The operands you gave to the `configure' command when you installed
|
||
the compiler.
|
||
|
||
* A complete list of any modifications you have made to the compiler
|
||
source. (We don't promise to investigate the bug unless it
|
||
happens in an unmodified compiler. But if you've made
|
||
modifications and don't tell us, then you are sending us on a wild
|
||
goose chase.)
|
||
|
||
Be precise about these changes. A description in English is not
|
||
enough--send a context diff for them.
|
||
|
||
Adding files of your own (such as a machine description for a
|
||
machine we don't support) is a modification of the compiler source.
|
||
|
||
* Details of any other deviations from the standard procedure for
|
||
installing GCC.
|
||
|
||
* A description of what behavior you observe that you believe is
|
||
incorrect. For example, "The compiler gets a fatal signal," or,
|
||
"The assembler instruction at line 208 in the output is incorrect."
|
||
|
||
Of course, if the bug is that the compiler gets a fatal signal,
|
||
then one can't miss it. But if the bug is incorrect output, the
|
||
maintainer might not notice unless it is glaringly wrong. None of
|
||
us has time to study all the assembler code from a 50-line C
|
||
program just on the chance that one instruction might be wrong.
|
||
We need *you* to do this part!
|
||
|
||
Even if the problem you experience is a fatal signal, you should
|
||
still say so explicitly. Suppose something strange is going on,
|
||
such as, your copy of the compiler is out of synch, or you have
|
||
encountered a bug in the C library on your system. (This has
|
||
happened!) Your copy might crash and the copy here would not. If
|
||
you said to expect a crash, then when the compiler here fails to
|
||
crash, we would know that the bug was not happening. If you don't
|
||
say to expect a crash, then we would not know whether the bug was
|
||
happening. We would not be able to draw any conclusion from our
|
||
observations.
|
||
|
||
If the problem is a diagnostic when compiling GCC with some other
|
||
compiler, say whether it is a warning or an error.
|
||
|
||
Often the observed symptom is incorrect output when your program
|
||
is run. Sad to say, this is not enough information unless the
|
||
program is short and simple. None of us has time to study a large
|
||
program to figure out how it would work if compiled correctly,
|
||
much less which line of it was compiled wrong. So you will have
|
||
to do that. Tell us which source line it is, and what incorrect
|
||
result happens when that line is executed. A person who
|
||
understands the program can find this as easily as finding a bug
|
||
in the program itself.
|
||
|
||
* If you send examples of assembler code output from GCC, please use
|
||
`-g' when you make them. The debugging information includes
|
||
source line numbers which are essential for correlating the output
|
||
with the input.
|
||
|
||
* If you wish to mention something in the GCC source, refer to it by
|
||
context, not by line number.
|
||
|
||
The line numbers in the development sources don't match those in
|
||
your sources. Your line numbers would convey no useful
|
||
information to the maintainers.
|
||
|
||
* Additional information from a debugger might enable someone to
|
||
find a problem on a machine which he does not have available.
|
||
However, you need to think when you collect this information if
|
||
you want it to have any chance of being useful.
|
||
|
||
For example, many people send just a backtrace, but that is never
|
||
useful by itself. A simple backtrace with arguments conveys little
|
||
about GCC because the compiler is largely data-driven; the same
|
||
functions are called over and over for different RTL insns, doing
|
||
different things depending on the details of the insn.
|
||
|
||
Most of the arguments listed in the backtrace are useless because
|
||
they are pointers to RTL list structure. The numeric values of the
|
||
pointers, which the debugger prints in the backtrace, have no
|
||
significance whatever; all that matters is the contents of the
|
||
objects they point to (and most of the contents are other such
|
||
pointers).
|
||
|
||
In addition, most compiler passes consist of one or more loops that
|
||
scan the RTL insn sequence. The most vital piece of information
|
||
about such a loop--which insn it has reached--is usually in a
|
||
local variable, not in an argument.
|
||
|
||
What you need to provide in addition to a backtrace are the values
|
||
of the local variables for several stack frames up. When a local
|
||
variable or an argument is an RTX, first print its value and then
|
||
use the GDB command `pr' to print the RTL expression that it points
|
||
to. (If GDB doesn't run on your machine, use your debugger to call
|
||
the function `debug_rtx' with the RTX as an argument.) In
|
||
general, whenever a variable is a pointer, its value is no use
|
||
without the data it points to.
|
||
|
||
Here are some things that are not necessary:
|
||
|
||
* A description of the envelope of the bug.
|
||
|
||
Often people who encounter a bug spend a lot of time investigating
|
||
which changes to the input file will make the bug go away and which
|
||
changes will not affect it.
|
||
|
||
This is often time consuming and not very useful, because the way
|
||
we will find the bug is by running a single example under the
|
||
debugger with breakpoints, not by pure deduction from a series of
|
||
examples. You might as well save your time for something else.
|
||
|
||
Of course, if you can find a simpler example to report *instead* of
|
||
the original one, that is a convenience. Errors in the output
|
||
will be easier to spot, running under the debugger will take less
|
||
time, etc. Most GCC bugs involve just one function, so the most
|
||
straightforward way to simplify an example is to delete all the
|
||
function definitions except the one where the bug occurs. Those
|
||
earlier in the file may be replaced by external declarations if
|
||
the crucial function depends on them. (Exception: inline
|
||
functions may affect compilation of functions defined later in the
|
||
file.)
|
||
|
||
However, simplification is not vital; if you don't want to do this,
|
||
report the bug anyway and send the entire test case you used.
|
||
|
||
* In particular, some people insert conditionals `#ifdef BUG' around
|
||
a statement which, if removed, makes the bug not happen. These
|
||
are just clutter; we won't pay any attention to them anyway.
|
||
Besides, you should send us cpp output, and that can't have
|
||
conditionals.
|
||
|
||
* A patch for the bug.
|
||
|
||
A patch for the bug is useful if it is a good one. But don't omit
|
||
the necessary information, such as the test case, on the
|
||
assumption that a patch is all we need. We might see problems
|
||
with your patch and decide to fix the problem another way, or we
|
||
might not understand it at all.
|
||
|
||
Sometimes with a program as complicated as GCC it is very hard to
|
||
construct an example that will make the program follow a certain
|
||
path through the code. If you don't send the example, we won't be
|
||
able to construct one, so we won't be able to verify that the bug
|
||
is fixed.
|
||
|
||
And if we can't understand what bug you are trying to fix, or why
|
||
your patch should be an improvement, we won't install it. A test
|
||
case will help us to understand.
|
||
|
||
*Note Sending Patches::, for guidelines on how to make it easy for
|
||
us to understand and install your patches.
|
||
|
||
* A guess about what the bug is or what it depends on.
|
||
|
||
Such guesses are usually wrong. Even I can't guess right about
|
||
such things without first using the debugger to find the facts.
|
||
|
||
* A core dump file.
|
||
|
||
We have no way of examining a core dump for your type of machine
|
||
unless we have an identical system--and if we do have one, we
|
||
should be able to reproduce the crash ourselves.
|
||
|
||
|
||
File: gcc.info, Node: Sending Patches, Prev: Bug Reporting, Up: Bugs
|
||
|
||
Sending Patches for GCC
|
||
=======================
|
||
|
||
If you would like to write bug fixes or improvements for the GNU C
|
||
compiler, that is very helpful. Send suggested fixes to the patches
|
||
mailing list, `gcc-patches@gcc.gnu.org'.
|
||
|
||
Please follow these guidelines so we can study your patches
|
||
efficiently. If you don't follow these guidelines, your information
|
||
might still be useful, but using it will take extra work. Maintaining
|
||
GNU C is a lot of work in the best of circumstances, and we can't keep
|
||
up unless you do your best to help.
|
||
|
||
* Send an explanation with your changes of what problem they fix or
|
||
what improvement they bring about. For a bug fix, just include a
|
||
copy of the bug report, and explain why the change fixes the bug.
|
||
|
||
(Referring to a bug report is not as good as including it, because
|
||
then we will have to look it up, and we have probably already
|
||
deleted it if we've already fixed the bug.)
|
||
|
||
* Always include a proper bug report for the problem you think you
|
||
have fixed. We need to convince ourselves that the change is
|
||
right before installing it. Even if it is right, we might have
|
||
trouble judging it if we don't have a way to reproduce the problem.
|
||
|
||
* Include all the comments that are appropriate to help people
|
||
reading the source in the future understand why this change was
|
||
needed.
|
||
|
||
* Don't mix together changes made for different reasons. Send them
|
||
*individually*.
|
||
|
||
If you make two changes for separate reasons, then we might not
|
||
want to install them both. We might want to install just one. If
|
||
you send them all jumbled together in a single set of diffs, we
|
||
have to do extra work to disentangle them--to figure out which
|
||
parts of the change serve which purpose. If we don't have time
|
||
for this, we might have to ignore your changes entirely.
|
||
|
||
If you send each change as soon as you have written it, with its
|
||
own explanation, then the two changes never get tangled up, and we
|
||
can consider each one properly without any extra work to
|
||
disentangle them.
|
||
|
||
Ideally, each change you send should be impossible to subdivide
|
||
into parts that we might want to consider separately, because each
|
||
of its parts gets its motivation from the other parts.
|
||
|
||
* Send each change as soon as that change is finished. Sometimes
|
||
people think they are helping us by accumulating many changes to
|
||
send them all together. As explained above, this is absolutely
|
||
the worst thing you could do.
|
||
|
||
Since you should send each change separately, you might as well
|
||
send it right away. That gives us the option of installing it
|
||
immediately if it is important.
|
||
|
||
* Use `diff -c' to make your diffs. Diffs without context are hard
|
||
for us to install reliably. More than that, they make it hard for
|
||
us to study the diffs to decide whether we want to install them.
|
||
Unidiff format is better than contextless diffs, but not as easy
|
||
to read as `-c' format.
|
||
|
||
If you have GNU diff, use `diff -cp', which shows the name of the
|
||
function that each change occurs in.
|
||
|
||
* Write the change log entries for your changes. We get lots of
|
||
changes, and we don't have time to do all the change log writing
|
||
ourselves.
|
||
|
||
Read the `ChangeLog' file to see what sorts of information to put
|
||
in, and to learn the style that we use. The purpose of the change
|
||
log is to show people where to find what was changed. So you need
|
||
to be specific about what functions you changed; in large
|
||
functions, it's often helpful to indicate where within the
|
||
function the change was.
|
||
|
||
On the other hand, once you have shown people where to find the
|
||
change, you need not explain its purpose. Thus, if you add a new
|
||
function, all you need to say about it is that it is new. If you
|
||
feel that the purpose needs explaining, it probably does--but the
|
||
explanation will be much more useful if you put it in comments in
|
||
the code.
|
||
|
||
If you would like your name to appear in the header line for who
|
||
made the change, send us the header line.
|
||
|
||
* When you write the fix, keep in mind that we can't install a
|
||
change that would break other systems.
|
||
|
||
People often suggest fixing a problem by changing
|
||
machine-independent files such as `toplev.c' to do something
|
||
special that a particular system needs. Sometimes it is totally
|
||
obvious that such changes would break GCC for almost all users.
|
||
We can't possibly make a change like that. At best it might tell
|
||
us how to write another patch that would solve the problem
|
||
acceptably.
|
||
|
||
Sometimes people send fixes that *might* be an improvement in
|
||
general--but it is hard to be sure of this. It's hard to install
|
||
such changes because we have to study them very carefully. Of
|
||
course, a good explanation of the reasoning by which you concluded
|
||
the change was correct can help convince us.
|
||
|
||
The safest changes are changes to the configuration files for a
|
||
particular machine. These are safe because they can't create new
|
||
bugs on other machines.
|
||
|
||
Please help us keep up with the workload by designing the patch in
|
||
a form that is good to install.
|
||
|
||
|
||
File: gcc.info, Node: Service, Next: Contributing, Prev: Bugs, Up: Top
|
||
|
||
How To Get Help with GCC
|
||
************************
|
||
|
||
If you need help installing, using or changing GCC, there are two
|
||
ways to find it:
|
||
|
||
* Send a message to a suitable network mailing list. First try
|
||
`gcc-bugs@gcc.gnu.org' or `bug-gcc@gnu.org', and if that brings no
|
||
response, try `gcc@gcc.gnu.org'.
|
||
|
||
* Look in the service directory for someone who might help you for a
|
||
fee. The service directory is found in the file named `SERVICE'
|
||
in the GCC distribution.
|
||
|
||
|
||
File: gcc.info, Node: Contributing, Next: VMS, Prev: Service, Up: Top
|
||
|
||
Contributing to GCC Development
|
||
*******************************
|
||
|
||
If you would like to help pretest GCC releases to assure they work
|
||
well, or if you would like to work on improving GCC, please contact the
|
||
maintainers at `gcc@gcc.gnu.org'. A pretester should be willing to try
|
||
to investigate bugs as well as report them.
|
||
|
||
If you'd like to work on improvements, please ask for suggested
|
||
projects or suggest your own ideas. If you have already written an
|
||
improvement, please tell us about it. If you have not yet started
|
||
work, it is useful to contact `gcc@gcc.gnu.org' before you start; the
|
||
maintainers may be able to suggest ways to make your extension fit in
|
||
better with the rest of GCC and with other development plans.
|
||
|
||
|
||
File: gcc.info, Node: VMS, Next: Portability, Prev: Contributing, Up: Top
|
||
|
||
Using GCC on VMS
|
||
****************
|
||
|
||
Here is how to use GCC on VMS.
|
||
|
||
* Menu:
|
||
|
||
* Include Files and VMS:: Where the preprocessor looks for the include files.
|
||
* Global Declarations:: How to do globaldef, globalref and globalvalue with
|
||
GCC.
|
||
* VMS Misc:: Misc information.
|
||
|
||
|
||
File: gcc.info, Node: Include Files and VMS, Next: Global Declarations, Up: VMS
|
||
|
||
Include Files and VMS
|
||
=====================
|
||
|
||
Due to the differences between the filesystems of Unix and VMS, GCC
|
||
attempts to translate file names in `#include' into names that VMS will
|
||
understand. The basic strategy is to prepend a prefix to the
|
||
specification of the include file, convert the whole filename to a VMS
|
||
filename, and then try to open the file. GCC tries various prefixes
|
||
one by one until one of them succeeds:
|
||
|
||
1. The first prefix is the `GNU_CC_INCLUDE:' logical name: this is
|
||
where GNU C header files are traditionally stored. If you wish to
|
||
store header files in non-standard locations, then you can assign
|
||
the logical `GNU_CC_INCLUDE' to be a search list, where each
|
||
element of the list is suitable for use with a rooted logical.
|
||
|
||
2. The next prefix tried is `SYS$SYSROOT:[SYSLIB.]'. This is where
|
||
VAX-C header files are traditionally stored.
|
||
|
||
3. If the include file specification by itself is a valid VMS
|
||
filename, the preprocessor then uses this name with no prefix in
|
||
an attempt to open the include file.
|
||
|
||
4. If the file specification is not a valid VMS filename (i.e. does
|
||
not contain a device or a directory specifier, and contains a `/'
|
||
character), the preprocessor tries to convert it from Unix syntax
|
||
to VMS syntax.
|
||
|
||
Conversion works like this: the first directory name becomes a
|
||
device, and the rest of the directories are converted into
|
||
VMS-format directory names. For example, the name `X11/foobar.h'
|
||
is translated to `X11:[000000]foobar.h' or `X11:foobar.h',
|
||
whichever one can be opened. This strategy allows you to assign a
|
||
logical name to point to the actual location of the header files.
|
||
|
||
5. If none of these strategies succeeds, the `#include' fails.
|
||
|
||
Include directives of the form:
|
||
|
||
#include foobar
|
||
|
||
are a common source of incompatibility between VAX-C and GCC. VAX-C
|
||
treats this much like a standard `#include <foobar.h>' directive. That
|
||
is incompatible with the ANSI C behavior implemented by GCC: to expand
|
||
the name `foobar' as a macro. Macro expansion should eventually yield
|
||
one of the two standard formats for `#include':
|
||
|
||
#include "FILE"
|
||
#include <FILE>
|
||
|
||
If you have this problem, the best solution is to modify the source
|
||
to convert the `#include' directives to one of the two standard forms.
|
||
That will work with either compiler. If you want a quick and dirty fix,
|
||
define the file names as macros with the proper expansion, like this:
|
||
|
||
#define stdio <stdio.h>
|
||
|
||
This will work, as long as the name doesn't conflict with anything else
|
||
in the program.
|
||
|
||
Another source of incompatibility is that VAX-C assumes that:
|
||
|
||
#include "foobar"
|
||
|
||
is actually asking for the file `foobar.h'. GCC does not make this
|
||
assumption, and instead takes what you ask for literally; it tries to
|
||
read the file `foobar'. The best way to avoid this problem is to
|
||
always specify the desired file extension in your include directives.
|
||
|
||
GCC for VMS is distributed with a set of include files that is
|
||
sufficient to compile most general purpose programs. Even though the
|
||
GCC distribution does not contain header files to define constants and
|
||
structures for some VMS system-specific functions, there is no reason
|
||
why you cannot use GCC with any of these functions. You first may have
|
||
to generate or create header files, either by using the public domain
|
||
utility `UNSDL' (which can be found on a DECUS tape), or by extracting
|
||
the relevant modules from one of the system macro libraries, and using
|
||
an editor to construct a C header file.
|
||
|
||
A `#include' file name cannot contain a DECNET node name. The
|
||
preprocessor reports an I/O error if you attempt to use a node name,
|
||
whether explicitly, or implicitly via a logical name.
|
||
|