-This is doc/gcc.info, produced by makeinfo version 4.5 from
+This is doc/gcc.info, produced by makeinfo version 4.11 from
doc/gcc.texi.
INFO-DIR-SECTION Programming
funds for GNU development.
\1f
-File: gcc.info, Node: Warning Options, Next: Debugging Options, Prev: Language Independent Options, Up: Invoking GCC
+File: gcc.info, Node: Other Builtins, Next: Target Builtins, Prev: Vector Extensions, Up: C Extensions
+
+5.44 Other built-in functions provided by GCC
+=============================================
+
+GCC provides a large number of built-in functions other than the ones
+mentioned above. Some of these are for internal use in the processing
+of exceptions or variable-length argument lists and will not be
+documented here because they may change from time to time; we do not
+recommend general use of these functions.
+
+ The remaining functions are provided for optimization purposes.
+
+ GCC includes built-in versions of many of the functions in the
+standard C library. The versions prefixed with `__builtin_' will
+always be treated as having the same meaning as the C library function
+even if you specify the `-fno-builtin' option. (*note C Dialect
+Options::) Many of these functions are only optimized in certain cases;
+if they are not optimized in a particular case, a call to the library
+function will be emitted.
+
+ The functions `abort', `exit', `_Exit' and `_exit' are recognized
+and presumed not to return, but otherwise are not built in. `_exit' is
+not recognized in strict ISO C mode (`-ansi', `-std=c89' or
+`-std=c99'). `_Exit' is not recognized in strict C89 mode (`-ansi' or
+`-std=c89').
+
+ Outside strict ISO C mode, the functions `alloca', `bcmp', `bzero',
+`index', `rindex', `ffs', `fputs_unlocked', `printf_unlocked' and
+`fprintf_unlocked' may be handled as built-in functions. All these
+functions have corresponding versions prefixed with `__builtin_', which
+may be used even in strict C89 mode.
+
+ The ISO C99 functions `conj', `conjf', `conjl', `creal', `crealf',
+`creall', `cimag', `cimagf', `cimagl', `llabs' and `imaxabs' are
+handled as built-in functions except in strict ISO C89 mode. There are
+also built-in versions of the ISO C99 functions `cosf', `cosl',
+`fabsf', `fabsl', `sinf', `sinl', `sqrtf', and `sqrtl', that are
+recognized in any mode since ISO C89 reserves these names for the
+purpose to which ISO C99 puts them. All these functions have
+corresponding versions prefixed with `__builtin_'.
+
+ The ISO C89 functions `abs', `cos', `fabs', `fprintf', `fputs',
+`labs', `memcmp', `memcpy', `memset', `printf', `sin', `sqrt', `strcat',
+`strchr', `strcmp', `strcpy', `strcspn', `strlen', `strncat',
+`strncmp', `strncpy', `strpbrk', `strrchr', `strspn', and `strstr' are
+all recognized as built-in functions unless `-fno-builtin' is specified
+(or `-fno-builtin-FUNCTION' is specified for an individual function).
+All of these functions have corresponding versions prefixed with
+`__builtin_'.
+
+ GCC provides built-in versions of the ISO C99 floating point
+comparison macros that avoid raising exceptions for unordered operands.
+They have the same names as the standard macros ( `isgreater',
+`isgreaterequal', `isless', `islessequal', `islessgreater', and
+`isunordered') , with `__builtin_' prefixed. We intend for a library
+implementor to be able to simply `#define' each standard macro to its
+built-in equivalent.
+
+ -- Built-in Function: int __builtin_types_compatible_p (TYPE1, TYPE2)
+ You can use the built-in function `__builtin_types_compatible_p' to
+ determine whether two types are the same.
+
+ This built-in function returns 1 if the unqualified versions of the
+ types TYPE1 and TYPE2 (which are types, not expressions) are
+ compatible, 0 otherwise. The result of this built-in function can
+ be used in integer constant expressions.
+
+ This built-in function ignores top level qualifiers (e.g., `const',
+ `volatile'). For example, `int' is equivalent to `const int'.
+
+ The type `int[]' and `int[5]' are compatible. On the other hand,
+ `int' and `char *' are not compatible, even if the size of their
+ types, on the particular architecture are the same. Also, the
+ amount of pointer indirection is taken into account when
+ determining similarity. Consequently, `short *' is not similar to
+ `short **'. Furthermore, two types that are typedefed are
+ considered compatible if their underlying types are compatible.
+
+ An `enum' type is considered to be compatible with another `enum'
+ type. For example, `enum {foo, bar}' is similar to `enum {hot,
+ dog}'.
+
+ You would typically use this function in code whose execution
+ varies depending on the arguments' types. For example:
+
+ #define foo(x) \
+ ({ \
+ typeof (x) tmp; \
+ if (__builtin_types_compatible_p (typeof (x), long double)) \
+ tmp = foo_long_double (tmp); \
+ else if (__builtin_types_compatible_p (typeof (x), double)) \
+ tmp = foo_double (tmp); \
+ else if (__builtin_types_compatible_p (typeof (x), float)) \
+ tmp = foo_float (tmp); \
+ else \
+ abort (); \
+ tmp; \
+ })
+
+ _Note:_ This construct is only available for C.
+
+
+ -- Built-in Function: TYPE __builtin_choose_expr (CONST_EXP, EXP1,
+ EXP2)
+ You can use the built-in function `__builtin_choose_expr' to
+ evaluate code depending on the value of a constant expression.
+ This built-in function returns EXP1 if CONST_EXP, which is a
+ constant expression that must be able to be determined at compile
+ time, is nonzero. Otherwise it returns 0.
+
+ This built-in function is analogous to the `? :' operator in C,
+ except that the expression returned has its type unaltered by
+ promotion rules. Also, the built-in function does not evaluate
+ the expression that was not chosen. For example, if CONST_EXP
+ evaluates to true, EXP2 is not evaluated even if it has
+ side-effects.
+
+ This built-in function can return an lvalue if the chosen argument
+ is an lvalue.
+
+ If EXP1 is returned, the return type is the same as EXP1's type.
+ Similarly, if EXP2 is returned, its return type is the same as
+ EXP2.
+
+ Example:
+
+ #define foo(x) \
+ __builtin_choose_expr (__builtin_types_compatible_p (typeof (x), double), \
+ foo_double (x), \
+ __builtin_choose_expr (__builtin_types_compatible_p (typeof (x), float), \
+ foo_float (x), \
+ /* The void expression results in a compile-time error \
+ when assigning the result to something. */ \
+ (void)0))
+
+ _Note:_ This construct is only available for C. Furthermore, the
+ unused expression (EXP1 or EXP2 depending on the value of
+ CONST_EXP) may still generate syntax errors. This may change in
+ future revisions.
+
+
+ -- Built-in Function: int __builtin_constant_p (EXP)
+ You can use the built-in function `__builtin_constant_p' to
+ determine if a value is known to be constant at compile-time and
+ hence that GCC can perform constant-folding on expressions
+ involving that value. The argument of the function is the value
+ to test. The function returns the integer 1 if the argument is
+ known to be a compile-time constant and 0 if it is not known to be
+ a compile-time constant. A return of 0 does not indicate that the
+ value is _not_ a constant, but merely that GCC cannot prove it is
+ a constant with the specified value of the `-O' option.
+
+ You would typically use this function in an embedded application
+ where memory was a critical resource. If you have some complex
+ calculation, you may want it to be folded if it involves
+ constants, but need to call a function if it does not. For
+ example:
+
+ #define Scale_Value(X) \
+ (__builtin_constant_p (X) \
+ ? ((X) * SCALE + OFFSET) : Scale (X))
+
+ You may use this built-in function in either a macro or an inline
+ function. However, if you use it in an inlined function and pass
+ an argument of the function as the argument to the built-in, GCC
+ will never return 1 when you call the inline function with a
+ string constant or compound literal (*note Compound Literals::)
+ and will not return 1 when you pass a constant numeric value to
+ the inline function unless you specify the `-O' option.
+
+ You may also use `__builtin_constant_p' in initializers for static
+ data. For instance, you can write
+
+ static const int table[] = {
+ __builtin_constant_p (EXPRESSION) ? (EXPRESSION) : -1,
+ /* ... */
+ };
+
+ This is an acceptable initializer even if EXPRESSION is not a
+ constant expression. GCC must be more conservative about
+ evaluating the built-in in this case, because it has no
+ opportunity to perform optimization.
+
+ Previous versions of GCC did not accept this built-in in data
+ initializers. The earliest version where it is completely safe is
+ 3.0.1.
+
+ -- Built-in Function: long __builtin_expect (long EXP, long C)
+ You may use `__builtin_expect' to provide the compiler with branch
+ prediction information. In general, you should prefer to use
+ actual profile feedback for this (`-fprofile-arcs'), as
+ programmers are notoriously bad at predicting how their programs
+ actually perform. However, there are applications in which this
+ data is hard to collect.
+
+ The return value is the value of EXP, which should be an integral
+ expression. The value of C must be a compile-time constant. The
+ semantics of the built-in are that it is expected that EXP == C.
+ For example:
+
+ if (__builtin_expect (x, 0))
+ foo ();
+
+ would indicate that we do not expect to call `foo', since we
+ expect `x' to be zero. Since you are limited to integral
+ expressions for EXP, you should use constructions such as
+
+ if (__builtin_expect (ptr != NULL, 1))
+ error ();
+
+ when testing pointer or floating-point values.
+
+ -- Built-in Function: void __builtin_prefetch (const void *ADDR, ...)
+ This function is used to minimize cache-miss latency by moving
+ data into a cache before it is accessed. You can insert calls to
+ `__builtin_prefetch' into code for which you know addresses of
+ data in memory that is likely to be accessed soon. If the target
+ supports them, data prefetch instructions will be generated. If
+ the prefetch is done early enough before the access then the data
+ will be in the cache by the time it is accessed.
+
+ The value of ADDR is the address of the memory to prefetch. There
+ are two optional arguments, RW and LOCALITY. The value of RW is a
+ compile-time constant one or zero; one means that the prefetch is
+ preparing for a write to the memory address and zero, the default,
+ means that the prefetch is preparing for a read. The value
+ LOCALITY must be a compile-time constant integer between zero and
+ three. A value of zero means that the data has no temporal
+ locality, so it need not be left in the cache after the access. A
+ value of three means that the data has a high degree of temporal
+ locality and should be left in all levels of cache possible.
+ Values of one and two mean, respectively, a low or moderate degree
+ of temporal locality. The default is three.
+
+ for (i = 0; i < n; i++)
+ {
+ a[i] = a[i] + b[i];
+ __builtin_prefetch (&a[i+j], 1, 1);
+ __builtin_prefetch (&b[i+j], 0, 1);
+ /* ... */
+ }
+
+ Data prefetch does not generate faults if ADDR is invalid, but the
+ address expression itself must be valid. For example, a prefetch
+ of `p->next' will not fault if `p->next' is not a valid address,
+ but evaluation will fault if `p' is not a valid address.
+
+ If the target does not support data prefetch, the address
+ expression is evaluated if it includes side effects but no other
+ code is generated and GCC does not issue a warning.
+
+\1f
+File: gcc.info, Node: Target Builtins, Next: Pragmas, Prev: Other Builtins, Up: C Extensions
+
+5.45 Built-in Functions Specific to Particular Target Machines
+==============================================================
+
+On some target machines, GCC supports many built-in functions specific
+to those machines. Generally these generate calls to specific machine
+instructions, but allow the compiler to schedule those calls.
+
+* Menu:
+
+* X86 Built-in Functions::
+* PowerPC AltiVec Built-in Functions::
+
+\1f
+File: gcc.info, Node: X86 Built-in Functions, Next: PowerPC AltiVec Built-in Functions, Up: Target Builtins
+
+5.45.1 X86 Built-in Functions
+-----------------------------
+
+These built-in functions are available for the i386 and x86-64 family
+of computers, depending on the command-line switches used.
+
+ The following machine modes are available for use with MMX built-in
+functions (*note Vector Extensions::): `V2SI' for a vector of two
+32-bit integers, `V4HI' for a vector of four 16-bit integers, and
+`V8QI' for a vector of eight 8-bit integers. Some of the built-in
+functions operate on MMX registers as a whole 64-bit entity, these use
+`DI' as their mode.
+
+ If 3Dnow extensions are enabled, `V2SF' is used as a mode for a
+vector of two 32-bit floating point values.
+
+ If SSE extensions are enabled, `V4SF' is used for a vector of four
+32-bit floating point values. Some instructions use a vector of four
+32-bit integers, these use `V4SI'. Finally, some instructions operate
+on an entire vector register, interpreting it as a 128-bit integer,
+these use mode `TI'.
+
+ The following built-in functions are made available by `-mmmx'. All
+of them generate the machine instruction that is part of the name.
+
+ v8qi __builtin_ia32_paddb (v8qi, v8qi)
+ v4hi __builtin_ia32_paddw (v4hi, v4hi)
+ v2si __builtin_ia32_paddd (v2si, v2si)
+ v8qi __builtin_ia32_psubb (v8qi, v8qi)
+ v4hi __builtin_ia32_psubw (v4hi, v4hi)
+ v2si __builtin_ia32_psubd (v2si, v2si)
+ v8qi __builtin_ia32_paddsb (v8qi, v8qi)
+ v4hi __builtin_ia32_paddsw (v4hi, v4hi)
+ v8qi __builtin_ia32_psubsb (v8qi, v8qi)
+ v4hi __builtin_ia32_psubsw (v4hi, v4hi)
+ v8qi __builtin_ia32_paddusb (v8qi, v8qi)
+ v4hi __builtin_ia32_paddusw (v4hi, v4hi)
+ v8qi __builtin_ia32_psubusb (v8qi, v8qi)
+ v4hi __builtin_ia32_psubusw (v4hi, v4hi)
+ v4hi __builtin_ia32_pmullw (v4hi, v4hi)
+ v4hi __builtin_ia32_pmulhw (v4hi, v4hi)
+ di __builtin_ia32_pand (di, di)
+ di __builtin_ia32_pandn (di,di)
+ di __builtin_ia32_por (di, di)
+ di __builtin_ia32_pxor (di, di)
+ v8qi __builtin_ia32_pcmpeqb (v8qi, v8qi)
+ v4hi __builtin_ia32_pcmpeqw (v4hi, v4hi)
+ v2si __builtin_ia32_pcmpeqd (v2si, v2si)
+ v8qi __builtin_ia32_pcmpgtb (v8qi, v8qi)
+ v4hi __builtin_ia32_pcmpgtw (v4hi, v4hi)
+ v2si __builtin_ia32_pcmpgtd (v2si, v2si)
+ v8qi __builtin_ia32_punpckhbw (v8qi, v8qi)
+ v4hi __builtin_ia32_punpckhwd (v4hi, v4hi)
+ v2si __builtin_ia32_punpckhdq (v2si, v2si)
+ v8qi __builtin_ia32_punpcklbw (v8qi, v8qi)
+ v4hi __builtin_ia32_punpcklwd (v4hi, v4hi)
+ v2si __builtin_ia32_punpckldq (v2si, v2si)
+ v8qi __builtin_ia32_packsswb (v4hi, v4hi)
+ v4hi __builtin_ia32_packssdw (v2si, v2si)
+ v8qi __builtin_ia32_packuswb (v4hi, v4hi)
+
+ The following built-in functions are made available either with
+`-msse', or with a combination of `-m3dnow' and `-march=athlon'. All
+of them generate the machine instruction that is part of the name.
+
+ v4hi __builtin_ia32_pmulhuw (v4hi, v4hi)
+ v8qi __builtin_ia32_pavgb (v8qi, v8qi)
+ v4hi __builtin_ia32_pavgw (v4hi, v4hi)
+ v4hi __builtin_ia32_psadbw (v8qi, v8qi)
+ v8qi __builtin_ia32_pmaxub (v8qi, v8qi)
+ v4hi __builtin_ia32_pmaxsw (v4hi, v4hi)
+ v8qi __builtin_ia32_pminub (v8qi, v8qi)
+ v4hi __builtin_ia32_pminsw (v4hi, v4hi)
+ int __builtin_ia32_pextrw (v4hi, int)
+ v4hi __builtin_ia32_pinsrw (v4hi, int, int)
+ int __builtin_ia32_pmovmskb (v8qi)
+ void __builtin_ia32_maskmovq (v8qi, v8qi, char *)
+ void __builtin_ia32_movntq (di *, di)
+ void __builtin_ia32_sfence (void)
+
+ The following built-in functions are available when `-msse' is used.
+All of them generate the machine instruction that is part of the name.
+
+ int __builtin_ia32_comieq (v4sf, v4sf)
+ int __builtin_ia32_comineq (v4sf, v4sf)
+ int __builtin_ia32_comilt (v4sf, v4sf)
+ int __builtin_ia32_comile (v4sf, v4sf)
+ int __builtin_ia32_comigt (v4sf, v4sf)
+ int __builtin_ia32_comige (v4sf, v4sf)
+ int __builtin_ia32_ucomieq (v4sf, v4sf)
+ int __builtin_ia32_ucomineq (v4sf, v4sf)
+ int __builtin_ia32_ucomilt (v4sf, v4sf)
+ int __builtin_ia32_ucomile (v4sf, v4sf)
+ int __builtin_ia32_ucomigt (v4sf, v4sf)
+ int __builtin_ia32_ucomige (v4sf, v4sf)
+ v4sf __builtin_ia32_addps (v4sf, v4sf)
+ v4sf __builtin_ia32_subps (v4sf, v4sf)
+ v4sf __builtin_ia32_mulps (v4sf, v4sf)
+ v4sf __builtin_ia32_divps (v4sf, v4sf)
+ v4sf __builtin_ia32_addss (v4sf, v4sf)
+ v4sf __builtin_ia32_subss (v4sf, v4sf)
+ v4sf __builtin_ia32_mulss (v4sf, v4sf)
+ v4sf __builtin_ia32_divss (v4sf, v4sf)
+ v4si __builtin_ia32_cmpeqps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpltps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpleps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpgtps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpgeps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpunordps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpneqps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpnltps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpnleps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpngtps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpngeps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpordps (v4sf, v4sf)
+ v4si __builtin_ia32_cmpeqss (v4sf, v4sf)
+ v4si __builtin_ia32_cmpltss (v4sf, v4sf)
+ v4si __builtin_ia32_cmpless (v4sf, v4sf)
+ v4si __builtin_ia32_cmpgtss (v4sf, v4sf)
+ v4si __builtin_ia32_cmpgess (v4sf, v4sf)
+ v4si __builtin_ia32_cmpunordss (v4sf, v4sf)
+ v4si __builtin_ia32_cmpneqss (v4sf, v4sf)
+ v4si __builtin_ia32_cmpnlts (v4sf, v4sf)
+ v4si __builtin_ia32_cmpnless (v4sf, v4sf)
+ v4si __builtin_ia32_cmpngtss (v4sf, v4sf)
+ v4si __builtin_ia32_cmpngess (v4sf, v4sf)
+ v4si __builtin_ia32_cmpordss (v4sf, v4sf)
+ v4sf __builtin_ia32_maxps (v4sf, v4sf)
+ v4sf __builtin_ia32_maxss (v4sf, v4sf)
+ v4sf __builtin_ia32_minps (v4sf, v4sf)
+ v4sf __builtin_ia32_minss (v4sf, v4sf)
+ v4sf __builtin_ia32_andps (v4sf, v4sf)
+ v4sf __builtin_ia32_andnps (v4sf, v4sf)
+ v4sf __builtin_ia32_orps (v4sf, v4sf)
+ v4sf __builtin_ia32_xorps (v4sf, v4sf)
+ v4sf __builtin_ia32_movss (v4sf, v4sf)
+ v4sf __builtin_ia32_movhlps (v4sf, v4sf)
+ v4sf __builtin_ia32_movlhps (v4sf, v4sf)
+ v4sf __builtin_ia32_unpckhps (v4sf, v4sf)
+ v4sf __builtin_ia32_unpcklps (v4sf, v4sf)
+ v4sf __builtin_ia32_cvtpi2ps (v4sf, v2si)
+ v4sf __builtin_ia32_cvtsi2ss (v4sf, int)
+ v2si __builtin_ia32_cvtps2pi (v4sf)
+ int __builtin_ia32_cvtss2si (v4sf)
+ v2si __builtin_ia32_cvttps2pi (v4sf)
+ int __builtin_ia32_cvttss2si (v4sf)
+ v4sf __builtin_ia32_rcpps (v4sf)
+ v4sf __builtin_ia32_rsqrtps (v4sf)
+ v4sf __builtin_ia32_sqrtps (v4sf)
+ v4sf __builtin_ia32_rcpss (v4sf)
+ v4sf __builtin_ia32_rsqrtss (v4sf)
+ v4sf __builtin_ia32_sqrtss (v4sf)
+ v4sf __builtin_ia32_shufps (v4sf, v4sf, int)
+ void __builtin_ia32_movntps (float *, v4sf)
+ int __builtin_ia32_movmskps (v4sf)
+
+ The following built-in functions are available when `-msse' is used.
+
+`v4sf __builtin_ia32_loadaps (float *)'
+ Generates the `movaps' machine instruction as a load from memory.
+
+`void __builtin_ia32_storeaps (float *, v4sf)'
+ Generates the `movaps' machine instruction as a store to memory.
+
+`v4sf __builtin_ia32_loadups (float *)'
+ Generates the `movups' machine instruction as a load from memory.
+
+`void __builtin_ia32_storeups (float *, v4sf)'
+ Generates the `movups' machine instruction as a store to memory.
+
+`v4sf __builtin_ia32_loadsss (float *)'
+ Generates the `movss' machine instruction as a load from memory.
+
+`void __builtin_ia32_storess (float *, v4sf)'
+ Generates the `movss' machine instruction as a store to memory.
+
+`v4sf __builtin_ia32_loadhps (v4sf, v2si *)'
+ Generates the `movhps' machine instruction as a load from memory.
+
+`v4sf __builtin_ia32_loadlps (v4sf, v2si *)'
+ Generates the `movlps' machine instruction as a load from memory
+
+`void __builtin_ia32_storehps (v4sf, v2si *)'
+ Generates the `movhps' machine instruction as a store to memory.
+
+`void __builtin_ia32_storelps (v4sf, v2si *)'
+ Generates the `movlps' machine instruction as a store to memory.
+
+ The following built-in functions are available when `-m3dnow' is
+used. All of them generate the machine instruction that is part of the
+name.
+
+ void __builtin_ia32_femms (void)
+ v8qi __builtin_ia32_pavgusb (v8qi, v8qi)
+ v2si __builtin_ia32_pf2id (v2sf)
+ v2sf __builtin_ia32_pfacc (v2sf, v2sf)
+ v2sf __builtin_ia32_pfadd (v2sf, v2sf)
+ v2si __builtin_ia32_pfcmpeq (v2sf, v2sf)
+ v2si __builtin_ia32_pfcmpge (v2sf, v2sf)
+ v2si __builtin_ia32_pfcmpgt (v2sf, v2sf)
+ v2sf __builtin_ia32_pfmax (v2sf, v2sf)
+ v2sf __builtin_ia32_pfmin (v2sf, v2sf)
+ v2sf __builtin_ia32_pfmul (v2sf, v2sf)
+ v2sf __builtin_ia32_pfrcp (v2sf)
+ v2sf __builtin_ia32_pfrcpit1 (v2sf, v2sf)
+ v2sf __builtin_ia32_pfrcpit2 (v2sf, v2sf)
+ v2sf __builtin_ia32_pfrsqrt (v2sf)
+ v2sf __builtin_ia32_pfrsqrtit1 (v2sf, v2sf)
+ v2sf __builtin_ia32_pfsub (v2sf, v2sf)
+ v2sf __builtin_ia32_pfsubr (v2sf, v2sf)
+ v2sf __builtin_ia32_pi2fd (v2si)
+ v4hi __builtin_ia32_pmulhrw (v4hi, v4hi)
+
+ The following built-in functions are available when both `-m3dnow'
+and `-march=athlon' are used. All of them generate the machine
+instruction that is part of the name.
+
+ v2si __builtin_ia32_pf2iw (v2sf)
+ v2sf __builtin_ia32_pfnacc (v2sf, v2sf)
+ v2sf __builtin_ia32_pfpnacc (v2sf, v2sf)
+ v2sf __builtin_ia32_pi2fw (v2si)
+ v2sf __builtin_ia32_pswapdsf (v2sf)
+ v2si __builtin_ia32_pswapdsi (v2si)
+
+\1f
+File: gcc.info, Node: PowerPC AltiVec Built-in Functions, Prev: X86 Built-in Functions, Up: Target Builtins
+
+5.45.2 PowerPC AltiVec Built-in Functions
+-----------------------------------------
+
+These built-in functions are available for the PowerPC family of
+computers, depending on the command-line switches used.
+
+ The following machine modes are available for use with AltiVec
+built-in functions (*note Vector Extensions::): `V4SI' for a vector of
+four 32-bit integers, `V4SF' for a vector of four 32-bit floating point
+numbers, `V8HI' for a vector of eight 16-bit integers, and `V16QI' for
+a vector of sixteen 8-bit integers.
+
+ The following functions are made available by including
+`<altivec.h>' and using `-maltivec' and `-mabi=altivec'. The functions
+implement the functionality described in Motorola's AltiVec Programming
+Interface Manual.
+
+ _Note:_ Only the `<altivec.h>' interface is supported. Internally,
+GCC uses built-in functions to achieve the functionality in the
+aforementioned header file, but they are not supported and are subject
+to change without notice.
+
+ vector signed char vec_abs (vector signed char, vector signed char);
+ vector signed short vec_abs (vector signed short, vector signed short);
+ vector signed int vec_abs (vector signed int, vector signed int);
+ vector signed float vec_abs (vector signed float, vector signed float);
+
+ vector signed char vec_abss (vector signed char, vector signed char);
+ vector signed short vec_abss (vector signed short, vector signed short);
+
+ vector signed char vec_add (vector signed char, vector signed char);
+ vector unsigned char vec_add (vector signed char, vector unsigned char);
+
+ vector unsigned char vec_add (vector unsigned char, vector signed char);
+
+ vector unsigned char vec_add (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_add (vector signed short, vector signed short);
+ vector unsigned short vec_add (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_add (vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_add (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_add (vector signed int, vector signed int);
+ vector unsigned int vec_add (vector signed int, vector unsigned int);
+ vector unsigned int vec_add (vector unsigned int, vector signed int);
+ vector unsigned int vec_add (vector unsigned int, vector unsigned int);
+ vector float vec_add (vector float, vector float);
+
+ vector unsigned int vec_addc (vector unsigned int, vector unsigned int);
+
+ vector unsigned char vec_adds (vector signed char,
+ vector unsigned char);
+ vector unsigned char vec_adds (vector unsigned char,
+ vector signed char);
+ vector unsigned char vec_adds (vector unsigned char,
+ vector unsigned char);
+ vector signed char vec_adds (vector signed char, vector signed char);
+ vector unsigned short vec_adds (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_adds (vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_adds (vector unsigned short,
+ vector unsigned short);
+ vector signed short vec_adds (vector signed short, vector signed short);
+
+ vector unsigned int vec_adds (vector signed int, vector unsigned int);
+ vector unsigned int vec_adds (vector unsigned int, vector signed int);
+ vector unsigned int vec_adds (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_adds (vector signed int, vector signed int);
+
+ vector float vec_and (vector float, vector float);
+ vector float vec_and (vector float, vector signed int);
+ vector float vec_and (vector signed int, vector float);
+ vector signed int vec_and (vector signed int, vector signed int);
+ vector unsigned int vec_and (vector signed int, vector unsigned int);
+ vector unsigned int vec_and (vector unsigned int, vector signed int);
+ vector unsigned int vec_and (vector unsigned int, vector unsigned int);
+ vector signed short vec_and (vector signed short, vector signed short);
+ vector unsigned short vec_and (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_and (vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_and (vector unsigned short,
+ vector unsigned short);
+ vector signed char vec_and (vector signed char, vector signed char);
+ vector unsigned char vec_and (vector signed char, vector unsigned char);
+
+ vector unsigned char vec_and (vector unsigned char, vector signed char);
+
+ vector unsigned char vec_and (vector unsigned char,
+ vector unsigned char);
+
+ vector float vec_andc (vector float, vector float);
+ vector float vec_andc (vector float, vector signed int);
+ vector float vec_andc (vector signed int, vector float);
+ vector signed int vec_andc (vector signed int, vector signed int);
+ vector unsigned int vec_andc (vector signed int, vector unsigned int);
+ vector unsigned int vec_andc (vector unsigned int, vector signed int);
+ vector unsigned int vec_andc (vector unsigned int, vector unsigned int);
+
+ vector signed short vec_andc (vector signed short, vector signed short);
+
+ vector unsigned short vec_andc (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_andc (vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_andc (vector unsigned short,
+ vector unsigned short);
+ vector signed char vec_andc (vector signed char, vector signed char);
+ vector unsigned char vec_andc (vector signed char,
+ vector unsigned char);
+ vector unsigned char vec_andc (vector unsigned char,
+ vector signed char);
+ vector unsigned char vec_andc (vector unsigned char,
+ vector unsigned char);
+
+ vector unsigned char vec_avg (vector unsigned char,
+ vector unsigned char);
+ vector signed char vec_avg (vector signed char, vector signed char);
+ vector unsigned short vec_avg (vector unsigned short,
+ vector unsigned short);
+ vector signed short vec_avg (vector signed short, vector signed short);
+ vector unsigned int vec_avg (vector unsigned int, vector unsigned int);
+ vector signed int vec_avg (vector signed int, vector signed int);
+
+ vector float vec_ceil (vector float);
+
+ vector signed int vec_cmpb (vector float, vector float);
+
+ vector signed char vec_cmpeq (vector signed char, vector signed char);
+ vector signed char vec_cmpeq (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_cmpeq (vector signed short,
+ vector signed short);
+ vector signed short vec_cmpeq (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_cmpeq (vector signed int, vector signed int);
+ vector signed int vec_cmpeq (vector unsigned int, vector unsigned int);
+ vector signed int vec_cmpeq (vector float, vector float);
+
+ vector signed int vec_cmpge (vector float, vector float);
+
+ vector signed char vec_cmpgt (vector unsigned char,
+ vector unsigned char);
+ vector signed char vec_cmpgt (vector signed char, vector signed char);
+ vector signed short vec_cmpgt (vector unsigned short,
+ vector unsigned short);
+ vector signed short vec_cmpgt (vector signed short,
+ vector signed short);
+ vector signed int vec_cmpgt (vector unsigned int, vector unsigned int);
+ vector signed int vec_cmpgt (vector signed int, vector signed int);
+ vector signed int vec_cmpgt (vector float, vector float);
+
+ vector signed int vec_cmple (vector float, vector float);
+
+ vector signed char vec_cmplt (vector unsigned char,
+ vector unsigned char);
+ vector signed char vec_cmplt (vector signed char, vector signed char);
+ vector signed short vec_cmplt (vector unsigned short,
+ vector unsigned short);
+ vector signed short vec_cmplt (vector signed short,
+ vector signed short);
+ vector signed int vec_cmplt (vector unsigned int, vector unsigned int);
+ vector signed int vec_cmplt (vector signed int, vector signed int);
+ vector signed int vec_cmplt (vector float, vector float);
+
+ vector float vec_ctf (vector unsigned int, const char);
+ vector float vec_ctf (vector signed int, const char);
+
+ vector signed int vec_cts (vector float, const char);
+
+ vector unsigned int vec_ctu (vector float, const char);
+
+ void vec_dss (const char);
+
+ void vec_dssall (void);
+
+ void vec_dst (void *, int, const char);
+
+ void vec_dstst (void *, int, const char);
+
+ void vec_dststt (void *, int, const char);
+
+ void vec_dstt (void *, int, const char);
+
+ vector float vec_expte (vector float, vector float);
+
+ vector float vec_floor (vector float, vector float);
+
+ vector float vec_ld (int, vector float *);
+ vector float vec_ld (int, float *):
+ vector signed int vec_ld (int, int *);
+ vector signed int vec_ld (int, vector signed int *);
+ vector unsigned int vec_ld (int, vector unsigned int *);
+ vector unsigned int vec_ld (int, unsigned int *);
+ vector signed short vec_ld (int, short *, vector signed short *);
+ vector unsigned short vec_ld (int, unsigned short *,
+ vector unsigned short *);
+ vector signed char vec_ld (int, signed char *);
+ vector signed char vec_ld (int, vector signed char *);
+ vector unsigned char vec_ld (int, unsigned char *);
+ vector unsigned char vec_ld (int, vector unsigned char *);
+
+ vector signed char vec_lde (int, signed char *);
+ vector unsigned char vec_lde (int, unsigned char *);
+ vector signed short vec_lde (int, short *);
+ vector unsigned short vec_lde (int, unsigned short *);
+ vector float vec_lde (int, float *);
+ vector signed int vec_lde (int, int *);
+ vector unsigned int vec_lde (int, unsigned int *);
+
+ void float vec_ldl (int, float *);
+ void float vec_ldl (int, vector float *);
+ void signed int vec_ldl (int, vector signed int *);
+ void signed int vec_ldl (int, int *);
+ void unsigned int vec_ldl (int, unsigned int *);
+ void unsigned int vec_ldl (int, vector unsigned int *);
+ void signed short vec_ldl (int, vector signed short *);
+ void signed short vec_ldl (int, short *);
+ void unsigned short vec_ldl (int, vector unsigned short *);
+ void unsigned short vec_ldl (int, unsigned short *);
+ void signed char vec_ldl (int, vector signed char *);
+ void signed char vec_ldl (int, signed char *);
+ void unsigned char vec_ldl (int, vector unsigned char *);
+ void unsigned char vec_ldl (int, unsigned char *);
+
+ vector float vec_loge (vector float);
+
+ vector unsigned char vec_lvsl (int, void *, int *);
+
+ vector unsigned char vec_lvsr (int, void *, int *);
+
+ vector float vec_madd (vector float, vector float, vector float);
+
+ vector signed short vec_madds (vector signed short, vector signed short,
+ vector signed short);
+
+ vector unsigned char vec_max (vector signed char, vector unsigned char);
+
+ vector unsigned char vec_max (vector unsigned char, vector signed char);
+
+ vector unsigned char vec_max (vector unsigned char,
+ vector unsigned char);
+ vector signed char vec_max (vector signed char, vector signed char);
+ vector unsigned short vec_max (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_max (vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_max (vector unsigned short,
+ vector unsigned short);
+ vector signed short vec_max (vector signed short, vector signed short);
+ vector unsigned int vec_max (vector signed int, vector unsigned int);
+ vector unsigned int vec_max (vector unsigned int, vector signed int);
+ vector unsigned int vec_max (vector unsigned int, vector unsigned int);
+ vector signed int vec_max (vector signed int, vector signed int);
+ vector float vec_max (vector float, vector float);
+
+ vector signed char vec_mergeh (vector signed char, vector signed char);
+ vector unsigned char vec_mergeh (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_mergeh (vector signed short,
+ vector signed short);
+ vector unsigned short vec_mergeh (vector unsigned short,
+ vector unsigned short);
+ vector float vec_mergeh (vector float, vector float);
+ vector signed int vec_mergeh (vector signed int, vector signed int);
+ vector unsigned int vec_mergeh (vector unsigned int,
+ vector unsigned int);
+
+ vector signed char vec_mergel (vector signed char, vector signed char);
+ vector unsigned char vec_mergel (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_mergel (vector signed short,
+ vector signed short);
+ vector unsigned short vec_mergel (vector unsigned short,
+ vector unsigned short);
+ vector float vec_mergel (vector float, vector float);
+ vector signed int vec_mergel (vector signed int, vector signed int);
+ vector unsigned int vec_mergel (vector unsigned int,
+ vector unsigned int);
+
+ vector unsigned short vec_mfvscr (void);
+
+ vector unsigned char vec_min (vector signed char, vector unsigned char);
+
+ vector unsigned char vec_min (vector unsigned char, vector signed char);
+
+ vector unsigned char vec_min (vector unsigned char,
+ vector unsigned char);
+ vector signed char vec_min (vector signed char, vector signed char);
+ vector unsigned short vec_min (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_min (vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_min (vector unsigned short,
+ vector unsigned short);
+ vector signed short vec_min (vector signed short, vector signed short);
+ vector unsigned int vec_min (vector signed int, vector unsigned int);
+ vector unsigned int vec_min (vector unsigned int, vector signed int);
+ vector unsigned int vec_min (vector unsigned int, vector unsigned int);
+ vector signed int vec_min (vector signed int, vector signed int);
+ vector float vec_min (vector float, vector float);
+
+ vector signed short vec_mladd (vector signed short, vector signed short,
+ vector signed short);
+ vector signed short vec_mladd (vector signed short,
+ vector unsigned short,
+ vector unsigned short);
+ vector signed short vec_mladd (vector unsigned short,
+ vector signed short,
+ vector signed short);
+ vector unsigned short vec_mladd (vector unsigned short,
+ vector unsigned short,
+ vector unsigned short);
+
+ vector signed short vec_mradds (vector signed short,
+ vector signed short,
+ vector signed short);
+
+ vector unsigned int vec_msum (vector unsigned char,
+ vector unsigned char,
+ vector unsigned int);
+ vector signed int vec_msum (vector signed char, vector unsigned char,
+ vector signed int);
+ vector unsigned int vec_msum (vector unsigned short,
+ vector unsigned short,
+ vector unsigned int);
+ vector signed int vec_msum (vector signed short, vector signed short,
+ vector signed int);
+
+ vector unsigned int vec_msums (vector unsigned short,
+ vector unsigned short,
+ vector unsigned int);
+ vector signed int vec_msums (vector signed short, vector signed short,
+ vector signed int);
+
+ void vec_mtvscr (vector signed int);
+ void vec_mtvscr (vector unsigned int);
+ void vec_mtvscr (vector signed short);
+ void vec_mtvscr (vector unsigned short);
+ void vec_mtvscr (vector signed char);
+ void vec_mtvscr (vector unsigned char);
+
+ vector unsigned short vec_mule (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_mule (vector signed char, vector signed char);
+ vector unsigned int vec_mule (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_mule (vector signed short, vector signed short);
+
+ vector unsigned short vec_mulo (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_mulo (vector signed char, vector signed char);
+ vector unsigned int vec_mulo (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_mulo (vector signed short, vector signed short);
+
+ vector float vec_nmsub (vector float, vector float, vector float);
+
+ vector float vec_nor (vector float, vector float);
+ vector signed int vec_nor (vector signed int, vector signed int);
+ vector unsigned int vec_nor (vector unsigned int, vector unsigned int);
+ vector signed short vec_nor (vector signed short, vector signed short);
+ vector unsigned short vec_nor (vector unsigned short,
+ vector unsigned short);
+ vector signed char vec_nor (vector signed char, vector signed char);
+ vector unsigned char vec_nor (vector unsigned char,
+ vector unsigned char);
+
+ vector float vec_or (vector float, vector float);
+ vector float vec_or (vector float, vector signed int);
+ vector float vec_or (vector signed int, vector float);
+ vector signed int vec_or (vector signed int, vector signed int);
+ vector unsigned int vec_or (vector signed int, vector unsigned int);
+ vector unsigned int vec_or (vector unsigned int, vector signed int);
+ vector unsigned int vec_or (vector unsigned int, vector unsigned int);
+ vector signed short vec_or (vector signed short, vector signed short);
+ vector unsigned short vec_or (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_or (vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_or (vector unsigned short,
+ vector unsigned short);
+ vector signed char vec_or (vector signed char, vector signed char);
+ vector unsigned char vec_or (vector signed char, vector unsigned char);
+ vector unsigned char vec_or (vector unsigned char, vector signed char);
+ vector unsigned char vec_or (vector unsigned char,
+ vector unsigned char);
+
+ vector signed char vec_pack (vector signed short, vector signed short);
+ vector unsigned char vec_pack (vector unsigned short,
+ vector unsigned short);
+ vector signed short vec_pack (vector signed int, vector signed int);
+ vector unsigned short vec_pack (vector unsigned int,
+ vector unsigned int);
+
+ vector signed short vec_packpx (vector unsigned int,
+ vector unsigned int);
+
+ vector unsigned char vec_packs (vector unsigned short,
+ vector unsigned short);
+ vector signed char vec_packs (vector signed short, vector signed short);
+
+ vector unsigned short vec_packs (vector unsigned int,
+ vector unsigned int);
+ vector signed short vec_packs (vector signed int, vector signed int);
+
+ vector unsigned char vec_packsu (vector unsigned short,
+ vector unsigned short);
+ vector unsigned char vec_packsu (vector signed short,
+ vector signed short);
+ vector unsigned short vec_packsu (vector unsigned int,
+ vector unsigned int);
+ vector unsigned short vec_packsu (vector signed int, vector signed int);
+
+ vector float vec_perm (vector float, vector float,
+ vector unsigned char);
+ vector signed int vec_perm (vector signed int, vector signed int,
+ vector unsigned char);
+ vector unsigned int vec_perm (vector unsigned int, vector unsigned int,
+ vector unsigned char);
+ vector signed short vec_perm (vector signed short, vector signed short,
+ vector unsigned char);
+ vector unsigned short vec_perm (vector unsigned short,
+ vector unsigned short,
+ vector unsigned char);
+ vector signed char vec_perm (vector signed char, vector signed char,
+ vector unsigned char);
+ vector unsigned char vec_perm (vector unsigned char,
+ vector unsigned char,
+ vector unsigned char);
+
+ vector float vec_re (vector float);
+
+ vector signed char vec_rl (vector signed char, vector unsigned char);
+ vector unsigned char vec_rl (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_rl (vector signed short, vector unsigned short);
+
+ vector unsigned short vec_rl (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_rl (vector signed int, vector unsigned int);
+ vector unsigned int vec_rl (vector unsigned int, vector unsigned int);
+
+ vector float vec_round (vector float);
+
+ vector float vec_rsqrte (vector float);
+
+ vector float vec_sel (vector float, vector float, vector signed int);
+ vector float vec_sel (vector float, vector float, vector unsigned int);
+ vector signed int vec_sel (vector signed int, vector signed int,
+ vector signed int);
+ vector signed int vec_sel (vector signed int, vector signed int,
+ vector unsigned int);
+ vector unsigned int vec_sel (vector unsigned int, vector unsigned int,
+ vector signed int);
+ vector unsigned int vec_sel (vector unsigned int, vector unsigned int,
+ vector unsigned int);
+ vector signed short vec_sel (vector signed short, vector signed short,
+ vector signed short);
+ vector signed short vec_sel (vector signed short, vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_sel (vector unsigned short,
+ vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_sel (vector unsigned short,
+ vector unsigned short,
+ vector unsigned short);
+ vector signed char vec_sel (vector signed char, vector signed char,
+ vector signed char);
+ vector signed char vec_sel (vector signed char, vector signed char,
+ vector unsigned char);
+ vector unsigned char vec_sel (vector unsigned char,
+ vector unsigned char,
+ vector signed char);
+ vector unsigned char vec_sel (vector unsigned char,
+ vector unsigned char,
+ vector unsigned char);
+
+ vector signed char vec_sl (vector signed char, vector unsigned char);
+ vector unsigned char vec_sl (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_sl (vector signed short, vector unsigned short);
+
+ vector unsigned short vec_sl (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_sl (vector signed int, vector unsigned int);
+ vector unsigned int vec_sl (vector unsigned int, vector unsigned int);
+
+ vector float vec_sld (vector float, vector float, const char);
+ vector signed int vec_sld (vector signed int, vector signed int,
+ const char);
+ vector unsigned int vec_sld (vector unsigned int, vector unsigned int,
+ const char);
+ vector signed short vec_sld (vector signed short, vector signed short,
+ const char);
+ vector unsigned short vec_sld (vector unsigned short,
+ vector unsigned short, const char);
+ vector signed char vec_sld (vector signed char, vector signed char,
+ const char);
+ vector unsigned char vec_sld (vector unsigned char,
+ vector unsigned char,
+ const char);
+
+ vector signed int vec_sll (vector signed int, vector unsigned int);
+ vector signed int vec_sll (vector signed int, vector unsigned short);
+ vector signed int vec_sll (vector signed int, vector unsigned char);
+ vector unsigned int vec_sll (vector unsigned int, vector unsigned int);
+ vector unsigned int vec_sll (vector unsigned int,
+ vector unsigned short);
+ vector unsigned int vec_sll (vector unsigned int, vector unsigned char);
+
+ vector signed short vec_sll (vector signed short, vector unsigned int);
+ vector signed short vec_sll (vector signed short,
+ vector unsigned short);
+ vector signed short vec_sll (vector signed short, vector unsigned char);
+
+ vector unsigned short vec_sll (vector unsigned short,
+ vector unsigned int);
+ vector unsigned short vec_sll (vector unsigned short,
+ vector unsigned short);
+ vector unsigned short vec_sll (vector unsigned short,
+ vector unsigned char);
+ vector signed char vec_sll (vector signed char, vector unsigned int);
+ vector signed char vec_sll (vector signed char, vector unsigned short);
+ vector signed char vec_sll (vector signed char, vector unsigned char);
+ vector unsigned char vec_sll (vector unsigned char,
+ vector unsigned int);
+ vector unsigned char vec_sll (vector unsigned char,
+ vector unsigned short);
+ vector unsigned char vec_sll (vector unsigned char,
+ vector unsigned char);
+
+ vector float vec_slo (vector float, vector signed char);
+ vector float vec_slo (vector float, vector unsigned char);
+ vector signed int vec_slo (vector signed int, vector signed char);
+ vector signed int vec_slo (vector signed int, vector unsigned char);
+ vector unsigned int vec_slo (vector unsigned int, vector signed char);
+ vector unsigned int vec_slo (vector unsigned int, vector unsigned char);
+
+ vector signed short vec_slo (vector signed short, vector signed char);
+ vector signed short vec_slo (vector signed short, vector unsigned char);
+
+ vector unsigned short vec_slo (vector unsigned short,
+ vector signed char);
+ vector unsigned short vec_slo (vector unsigned short,
+ vector unsigned char);
+ vector signed char vec_slo (vector signed char, vector signed char);
+ vector signed char vec_slo (vector signed char, vector unsigned char);
+ vector unsigned char vec_slo (vector unsigned char, vector signed char);
+
+ vector unsigned char vec_slo (vector unsigned char,
+ vector unsigned char);
+
+ vector signed char vec_splat (vector signed char, const char);
+ vector unsigned char vec_splat (vector unsigned char, const char);
+ vector signed short vec_splat (vector signed short, const char);
+ vector unsigned short vec_splat (vector unsigned short, const char);
+ vector float vec_splat (vector float, const char);
+ vector signed int vec_splat (vector signed int, const char);
+ vector unsigned int vec_splat (vector unsigned int, const char);
+
+ vector signed char vec_splat_s8 (const char);
+
+ vector signed short vec_splat_s16 (const char);
+
+ vector signed int vec_splat_s32 (const char);
+
+ vector unsigned char vec_splat_u8 (const char);
+
+ vector unsigned short vec_splat_u16 (const char);
+
+ vector unsigned int vec_splat_u32 (const char);
+
+ vector signed char vec_sr (vector signed char, vector unsigned char);
+ vector unsigned char vec_sr (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_sr (vector signed short, vector unsigned short);
+
+ vector unsigned short vec_sr (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_sr (vector signed int, vector unsigned int);
+ vector unsigned int vec_sr (vector unsigned int, vector unsigned int);
+
+ vector signed char vec_sra (vector signed char, vector unsigned char);
+ vector unsigned char vec_sra (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_sra (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_sra (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_sra (vector signed int, vector unsigned int);
+ vector unsigned int vec_sra (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_srl (vector signed int, vector unsigned int);
+ vector signed int vec_srl (vector signed int, vector unsigned short);
+ vector signed int vec_srl (vector signed int, vector unsigned char);
+ vector unsigned int vec_srl (vector unsigned int, vector unsigned int);
+ vector unsigned int vec_srl (vector unsigned int,
+ vector unsigned short);
+ vector unsigned int vec_srl (vector unsigned int, vector unsigned char);
+
+ vector signed short vec_srl (vector signed short, vector unsigned int);
+ vector signed short vec_srl (vector signed short,
+ vector unsigned short);
+ vector signed short vec_srl (vector signed short, vector unsigned char);
+
+ vector unsigned short vec_srl (vector unsigned short,
+ vector unsigned int);
+ vector unsigned short vec_srl (vector unsigned short,
+ vector unsigned short);
+ vector unsigned short vec_srl (vector unsigned short,
+ vector unsigned char);
+ vector signed char vec_srl (vector signed char, vector unsigned int);
+ vector signed char vec_srl (vector signed char, vector unsigned short);
+ vector signed char vec_srl (vector signed char, vector unsigned char);
+ vector unsigned char vec_srl (vector unsigned char,
+ vector unsigned int);
+ vector unsigned char vec_srl (vector unsigned char,
+ vector unsigned short);
+ vector unsigned char vec_srl (vector unsigned char,
+ vector unsigned char);
+
+ vector float vec_sro (vector float, vector signed char);
+ vector float vec_sro (vector float, vector unsigned char);
+ vector signed int vec_sro (vector signed int, vector signed char);
+ vector signed int vec_sro (vector signed int, vector unsigned char);
+ vector unsigned int vec_sro (vector unsigned int, vector signed char);
+ vector unsigned int vec_sro (vector unsigned int, vector unsigned char);
+
+ vector signed short vec_sro (vector signed short, vector signed char);
+ vector signed short vec_sro (vector signed short, vector unsigned char);
+
+ vector unsigned short vec_sro (vector unsigned short,
+ vector signed char);
+ vector unsigned short vec_sro (vector unsigned short,
+ vector unsigned char);
+ vector signed char vec_sro (vector signed char, vector signed char);
+ vector signed char vec_sro (vector signed char, vector unsigned char);
+ vector unsigned char vec_sro (vector unsigned char, vector signed char);
+
+ vector unsigned char vec_sro (vector unsigned char,
+ vector unsigned char);
+
+ void vec_st (vector float, int, float *);
+ void vec_st (vector float, int, vector float *);
+ void vec_st (vector signed int, int, int *);
+ void vec_st (vector signed int, int, unsigned int *);
+ void vec_st (vector unsigned int, int, unsigned int *);
+ void vec_st (vector unsigned int, int, vector unsigned int *);
+ void vec_st (vector signed short, int, short *);
+ void vec_st (vector signed short, int, vector unsigned short *);
+ void vec_st (vector signed short, int, vector signed short *);
+ void vec_st (vector unsigned short, int, unsigned short *);
+ void vec_st (vector unsigned short, int, vector unsigned short *);
+ void vec_st (vector signed char, int, signed char *);
+ void vec_st (vector signed char, int, unsigned char *);
+ void vec_st (vector signed char, int, vector signed char *);
+ void vec_st (vector unsigned char, int, unsigned char *);
+ void vec_st (vector unsigned char, int, vector unsigned char *);
+
+ void vec_ste (vector signed char, int, unsigned char *);
+ void vec_ste (vector signed char, int, signed char *);
+ void vec_ste (vector unsigned char, int, unsigned char *);
+ void vec_ste (vector signed short, int, short *);
+ void vec_ste (vector signed short, int, unsigned short *);
+ void vec_ste (vector unsigned short, int, void *);
+ void vec_ste (vector signed int, int, unsigned int *);
+ void vec_ste (vector signed int, int, int *);
+ void vec_ste (vector unsigned int, int, unsigned int *);
+ void vec_ste (vector float, int, float *);
+
+ void vec_stl (vector float, int, vector float *);
+ void vec_stl (vector float, int, float *);
+ void vec_stl (vector signed int, int, vector signed int *);
+ void vec_stl (vector signed int, int, int *);
+ void vec_stl (vector signed int, int, unsigned int *);
+ void vec_stl (vector unsigned int, int, vector unsigned int *);
+ void vec_stl (vector unsigned int, int, unsigned int *);
+ void vec_stl (vector signed short, int, short *);
+ void vec_stl (vector signed short, int, unsigned short *);
+ void vec_stl (vector signed short, int, vector signed short *);
+ void vec_stl (vector unsigned short, int, unsigned short *);
+ void vec_stl (vector unsigned short, int, vector signed short *);
+ void vec_stl (vector signed char, int, signed char *);
+ void vec_stl (vector signed char, int, unsigned char *);
+ void vec_stl (vector signed char, int, vector signed char *);
+ void vec_stl (vector unsigned char, int, unsigned char *);
+ void vec_stl (vector unsigned char, int, vector unsigned char *);
+
+ vector signed char vec_sub (vector signed char, vector signed char);
+ vector unsigned char vec_sub (vector signed char, vector unsigned char);
+
+ vector unsigned char vec_sub (vector unsigned char, vector signed char);
+
+ vector unsigned char vec_sub (vector unsigned char,
+ vector unsigned char);
+ vector signed short vec_sub (vector signed short, vector signed short);
+ vector unsigned short vec_sub (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_sub (vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_sub (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_sub (vector signed int, vector signed int);
+ vector unsigned int vec_sub (vector signed int, vector unsigned int);
+ vector unsigned int vec_sub (vector unsigned int, vector signed int);
+ vector unsigned int vec_sub (vector unsigned int, vector unsigned int);
+ vector float vec_sub (vector float, vector float);
+
+ vector unsigned int vec_subc (vector unsigned int, vector unsigned int);
+
+ vector unsigned char vec_subs (vector signed char,
+ vector unsigned char);
+ vector unsigned char vec_subs (vector unsigned char,
+ vector signed char);
+ vector unsigned char vec_subs (vector unsigned char,
+ vector unsigned char);
+ vector signed char vec_subs (vector signed char, vector signed char);
+ vector unsigned short vec_subs (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_subs (vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_subs (vector unsigned short,
+ vector unsigned short);
+ vector signed short vec_subs (vector signed short, vector signed short);
+
+ vector unsigned int vec_subs (vector signed int, vector unsigned int);
+ vector unsigned int vec_subs (vector unsigned int, vector signed int);
+ vector unsigned int vec_subs (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_subs (vector signed int, vector signed int);
+
+ vector unsigned int vec_sum4s (vector unsigned char,
+ vector unsigned int);
+ vector signed int vec_sum4s (vector signed char, vector signed int);
+ vector signed int vec_sum4s (vector signed short, vector signed int);
+
+ vector signed int vec_sum2s (vector signed int, vector signed int);
+
+ vector signed int vec_sums (vector signed int, vector signed int);
+
+ vector float vec_trunc (vector float);
+
+ vector signed short vec_unpackh (vector signed char);
+ vector unsigned int vec_unpackh (vector signed short);
+ vector signed int vec_unpackh (vector signed short);
+
+ vector signed short vec_unpackl (vector signed char);
+ vector unsigned int vec_unpackl (vector signed short);
+ vector signed int vec_unpackl (vector signed short);
+
+ vector float vec_xor (vector float, vector float);
+ vector float vec_xor (vector float, vector signed int);
+ vector float vec_xor (vector signed int, vector float);
+ vector signed int vec_xor (vector signed int, vector signed int);
+ vector unsigned int vec_xor (vector signed int, vector unsigned int);
+ vector unsigned int vec_xor (vector unsigned int, vector signed int);
+ vector unsigned int vec_xor (vector unsigned int, vector unsigned int);
+ vector signed short vec_xor (vector signed short, vector signed short);
+ vector unsigned short vec_xor (vector signed short,
+ vector unsigned short);
+ vector unsigned short vec_xor (vector unsigned short,
+ vector signed short);
+ vector unsigned short vec_xor (vector unsigned short,
+ vector unsigned short);
+ vector signed char vec_xor (vector signed char, vector signed char);
+ vector unsigned char vec_xor (vector signed char, vector unsigned char);
+
+ vector unsigned char vec_xor (vector unsigned char, vector signed char);
+
+ vector unsigned char vec_xor (vector unsigned char,
+ vector unsigned char);
+
+ vector signed int vec_all_eq (vector signed char, vector unsigned char);
+
+ vector signed int vec_all_eq (vector signed char, vector signed char);
+ vector signed int vec_all_eq (vector unsigned char, vector signed char);
+
+ vector signed int vec_all_eq (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_all_eq (vector signed short,
+ vector unsigned short);
+ vector signed int vec_all_eq (vector signed short, vector signed short);
+
+ vector signed int vec_all_eq (vector unsigned short,
+ vector signed short);
+ vector signed int vec_all_eq (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_all_eq (vector signed int, vector unsigned int);
+ vector signed int vec_all_eq (vector signed int, vector signed int);
+ vector signed int vec_all_eq (vector unsigned int, vector signed int);
+ vector signed int vec_all_eq (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_all_eq (vector float, vector float);
+
+ vector signed int vec_all_ge (vector signed char, vector unsigned char);
+
+ vector signed int vec_all_ge (vector unsigned char, vector signed char);
+
+ vector signed int vec_all_ge (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_all_ge (vector signed char, vector signed char);
+ vector signed int vec_all_ge (vector signed short,
+ vector unsigned short);
+ vector signed int vec_all_ge (vector unsigned short,
+ vector signed short);
+ vector signed int vec_all_ge (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_all_ge (vector signed short, vector signed short);
+
+ vector signed int vec_all_ge (vector signed int, vector unsigned int);
+ vector signed int vec_all_ge (vector unsigned int, vector signed int);
+ vector signed int vec_all_ge (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_all_ge (vector signed int, vector signed int);
+ vector signed int vec_all_ge (vector float, vector float);
+
+ vector signed int vec_all_gt (vector signed char, vector unsigned char);
+
+ vector signed int vec_all_gt (vector unsigned char, vector signed char);
+
+ vector signed int vec_all_gt (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_all_gt (vector signed char, vector signed char);
+ vector signed int vec_all_gt (vector signed short,
+ vector unsigned short);
+ vector signed int vec_all_gt (vector unsigned short,
+ vector signed short);
+ vector signed int vec_all_gt (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_all_gt (vector signed short, vector signed short);
+
+ vector signed int vec_all_gt (vector signed int, vector unsigned int);
+ vector signed int vec_all_gt (vector unsigned int, vector signed int);
+ vector signed int vec_all_gt (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_all_gt (vector signed int, vector signed int);
+ vector signed int vec_all_gt (vector float, vector float);
+
+ vector signed int vec_all_in (vector float, vector float);
+
+ vector signed int vec_all_le (vector signed char, vector unsigned char);
+
+ vector signed int vec_all_le (vector unsigned char, vector signed char);
+
+ vector signed int vec_all_le (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_all_le (vector signed char, vector signed char);
+ vector signed int vec_all_le (vector signed short,
+ vector unsigned short);
+ vector signed int vec_all_le (vector unsigned short,
+ vector signed short);
+ vector signed int vec_all_le (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_all_le (vector signed short, vector signed short);
+
+ vector signed int vec_all_le (vector signed int, vector unsigned int);
+ vector signed int vec_all_le (vector unsigned int, vector signed int);
+ vector signed int vec_all_le (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_all_le (vector signed int, vector signed int);
+ vector signed int vec_all_le (vector float, vector float);
+
+ vector signed int vec_all_lt (vector signed char, vector unsigned char);
+
+ vector signed int vec_all_lt (vector unsigned char, vector signed char);
+
+ vector signed int vec_all_lt (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_all_lt (vector signed char, vector signed char);
+ vector signed int vec_all_lt (vector signed short,
+ vector unsigned short);
+ vector signed int vec_all_lt (vector unsigned short,
+ vector signed short);
+ vector signed int vec_all_lt (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_all_lt (vector signed short, vector signed short);
+
+ vector signed int vec_all_lt (vector signed int, vector unsigned int);
+ vector signed int vec_all_lt (vector unsigned int, vector signed int);
+ vector signed int vec_all_lt (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_all_lt (vector signed int, vector signed int);
+ vector signed int vec_all_lt (vector float, vector float);
+
+ vector signed int vec_all_nan (vector float);
+
+ vector signed int vec_all_ne (vector signed char, vector unsigned char);
+
+ vector signed int vec_all_ne (vector signed char, vector signed char);
+ vector signed int vec_all_ne (vector unsigned char, vector signed char);
+
+ vector signed int vec_all_ne (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_all_ne (vector signed short,
+ vector unsigned short);
+ vector signed int vec_all_ne (vector signed short, vector signed short);
+
+ vector signed int vec_all_ne (vector unsigned short,
+ vector signed short);
+ vector signed int vec_all_ne (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_all_ne (vector signed int, vector unsigned int);
+ vector signed int vec_all_ne (vector signed int, vector signed int);
+ vector signed int vec_all_ne (vector unsigned int, vector signed int);
+ vector signed int vec_all_ne (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_all_ne (vector float, vector float);
+
+ vector signed int vec_all_nge (vector float, vector float);
+
+ vector signed int vec_all_ngt (vector float, vector float);
+
+ vector signed int vec_all_nle (vector float, vector float);
+
+ vector signed int vec_all_nlt (vector float, vector float);
+
+ vector signed int vec_all_numeric (vector float);
+
+ vector signed int vec_any_eq (vector signed char, vector unsigned char);
+
+ vector signed int vec_any_eq (vector signed char, vector signed char);
+ vector signed int vec_any_eq (vector unsigned char, vector signed char);
+
+ vector signed int vec_any_eq (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_any_eq (vector signed short,
+ vector unsigned short);
+ vector signed int vec_any_eq (vector signed short, vector signed short);
+
+ vector signed int vec_any_eq (vector unsigned short,
+ vector signed short);
+ vector signed int vec_any_eq (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_any_eq (vector signed int, vector unsigned int);
+ vector signed int vec_any_eq (vector signed int, vector signed int);
+ vector signed int vec_any_eq (vector unsigned int, vector signed int);
+ vector signed int vec_any_eq (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_any_eq (vector float, vector float);
+
+ vector signed int vec_any_ge (vector signed char, vector unsigned char);
+
+ vector signed int vec_any_ge (vector unsigned char, vector signed char);
+
+ vector signed int vec_any_ge (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_any_ge (vector signed char, vector signed char);
+ vector signed int vec_any_ge (vector signed short,
+ vector unsigned short);
+ vector signed int vec_any_ge (vector unsigned short,
+ vector signed short);
+ vector signed int vec_any_ge (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_any_ge (vector signed short, vector signed short);
+
+ vector signed int vec_any_ge (vector signed int, vector unsigned int);
+ vector signed int vec_any_ge (vector unsigned int, vector signed int);
+ vector signed int vec_any_ge (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_any_ge (vector signed int, vector signed int);
+ vector signed int vec_any_ge (vector float, vector float);
+
+ vector signed int vec_any_gt (vector signed char, vector unsigned char);
+
+ vector signed int vec_any_gt (vector unsigned char, vector signed char);
+
+ vector signed int vec_any_gt (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_any_gt (vector signed char, vector signed char);
+ vector signed int vec_any_gt (vector signed short,
+ vector unsigned short);
+ vector signed int vec_any_gt (vector unsigned short,
+ vector signed short);
+ vector signed int vec_any_gt (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_any_gt (vector signed short, vector signed short);
+
+ vector signed int vec_any_gt (vector signed int, vector unsigned int);
+ vector signed int vec_any_gt (vector unsigned int, vector signed int);
+ vector signed int vec_any_gt (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_any_gt (vector signed int, vector signed int);
+ vector signed int vec_any_gt (vector float, vector float);
+
+ vector signed int vec_any_le (vector signed char, vector unsigned char);
+
+ vector signed int vec_any_le (vector unsigned char, vector signed char);
+
+ vector signed int vec_any_le (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_any_le (vector signed char, vector signed char);
+ vector signed int vec_any_le (vector signed short,
+ vector unsigned short);
+ vector signed int vec_any_le (vector unsigned short,
+ vector signed short);
+ vector signed int vec_any_le (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_any_le (vector signed short, vector signed short);
+
+ vector signed int vec_any_le (vector signed int, vector unsigned int);
+ vector signed int vec_any_le (vector unsigned int, vector signed int);
+ vector signed int vec_any_le (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_any_le (vector signed int, vector signed int);
+ vector signed int vec_any_le (vector float, vector float);
+
+ vector signed int vec_any_lt (vector signed char, vector unsigned char);
+
+ vector signed int vec_any_lt (vector unsigned char, vector signed char);
+
+ vector signed int vec_any_lt (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_any_lt (vector signed char, vector signed char);
+ vector signed int vec_any_lt (vector signed short,
+ vector unsigned short);
+ vector signed int vec_any_lt (vector unsigned short,
+ vector signed short);
+ vector signed int vec_any_lt (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_any_lt (vector signed short, vector signed short);
+
+ vector signed int vec_any_lt (vector signed int, vector unsigned int);
+ vector signed int vec_any_lt (vector unsigned int, vector signed int);
+ vector signed int vec_any_lt (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_any_lt (vector signed int, vector signed int);
+ vector signed int vec_any_lt (vector float, vector float);
+
+ vector signed int vec_any_nan (vector float);
+
+ vector signed int vec_any_ne (vector signed char, vector unsigned char);
+
+ vector signed int vec_any_ne (vector signed char, vector signed char);
+ vector signed int vec_any_ne (vector unsigned char, vector signed char);
+
+ vector signed int vec_any_ne (vector unsigned char,
+ vector unsigned char);
+ vector signed int vec_any_ne (vector signed short,
+ vector unsigned short);
+ vector signed int vec_any_ne (vector signed short, vector signed short);
+
+ vector signed int vec_any_ne (vector unsigned short,
+ vector signed short);
+ vector signed int vec_any_ne (vector unsigned short,
+ vector unsigned short);
+ vector signed int vec_any_ne (vector signed int, vector unsigned int);
+ vector signed int vec_any_ne (vector signed int, vector signed int);
+ vector signed int vec_any_ne (vector unsigned int, vector signed int);
+ vector signed int vec_any_ne (vector unsigned int, vector unsigned int);
+
+ vector signed int vec_any_ne (vector float, vector float);
+
+ vector signed int vec_any_nge (vector float, vector float);
+
+ vector signed int vec_any_ngt (vector float, vector float);
+
+ vector signed int vec_any_nle (vector float, vector float);
+
+ vector signed int vec_any_nlt (vector float, vector float);
+
+ vector signed int vec_any_numeric (vector float);
+
+ vector signed int vec_any_out (vector float, vector float);
+
+\1f
+File: gcc.info, Node: Pragmas, Next: Unnamed Fields, Prev: Target Builtins, Up: C Extensions
+
+5.46 Pragmas Accepted by GCC
+============================
+
+GCC supports several types of pragmas, primarily in order to compile
+code originally written for other compilers. Note that in general we
+do not recommend the use of pragmas; *Note Function Attributes::, for
+further explanation.
+
+* Menu:
+
+* ARM Pragmas::
+* Darwin Pragmas::
+* Solaris Pragmas::
+* Tru64 Pragmas::
+
+\1f
+File: gcc.info, Node: ARM Pragmas, Next: Darwin Pragmas, Up: Pragmas
+
+5.46.1 ARM Pragmas
+------------------
+
+The ARM target defines pragmas for controlling the default addition of
+`long_call' and `short_call' attributes to functions. *Note Function
+Attributes::, for information about the effects of these attributes.
+
+`long_calls'
+ Set all subsequent functions to have the `long_call' attribute.
+
+`no_long_calls'
+ Set all subsequent functions to have the `short_call' attribute.
+
+`long_calls_off'
+ Do not affect the `long_call' or `short_call' attributes of
+ subsequent functions.
+
+\1f
+File: gcc.info, Node: Darwin Pragmas, Next: Solaris Pragmas, Prev: ARM Pragmas, Up: Pragmas
+
+5.46.2 Darwin Pragmas
+---------------------
+
+The following pragmas are available for all architectures running the
+Darwin operating system. These are useful for compatibility with other
+MacOS compilers.
+
+`mark TOKENS...'
+ This pragma is accepted, but has no effect.
+
+`options align=ALIGNMENT'
+ This pragma sets the alignment of fields in structures. The
+ values of ALIGNMENT may be `mac68k', to emulate m68k alignment, or
+ `power', to emulate PowerPC alignment. Uses of this pragma nest
+ properly; to restore the previous setting, use `reset' for the
+ ALIGNMENT.
+
+`segment TOKENS...'
+ This pragma is accepted, but has no effect.
+
+`unused (VAR [, VAR]...)'
+ This pragma declares variables to be possibly unused. GCC will not
+ produce warnings for the listed variables. The effect is similar
+ to that of the `unused' attribute, except that this pragma may
+ appear anywhere within the variables' scopes.
+
+\1f
+File: gcc.info, Node: Solaris Pragmas, Next: Tru64 Pragmas, Prev: Darwin Pragmas, Up: Pragmas
+
+5.46.3 Solaris Pragmas
+----------------------
+
+For compatibility with the SunPRO compiler, the following pragma is
+supported.
+
+`redefine_extname OLDNAME NEWNAME'
+ This pragma gives the C function OLDNAME the assembler label
+ NEWNAME. The pragma must appear before the function declaration.
+ This pragma is equivalent to the asm labels extension (*note Asm
+ Labels::). The preprocessor defines `__PRAGMA_REDEFINE_EXTNAME'
+ if the pragma is available.
+
+\1f
+File: gcc.info, Node: Tru64 Pragmas, Prev: Solaris Pragmas, Up: Pragmas
+
+5.46.4 Tru64 Pragmas
+--------------------
+
+For compatibility with the Compaq C compiler, the following pragma is
+supported.
+
+`extern_prefix STRING'
+ This pragma renames all subsequent function and variable
+ declarations such that STRING is prepended to the name. This
+ effect may be terminated by using another `extern_prefix' pragma
+ with the empty string.
+
+ This pragma is similar in intent to to the asm labels extension
+ (*note Asm Labels::) in that the system programmer wants to change
+ the assembly-level ABI without changing the source-level API. The
+ preprocessor defines `__PRAGMA_EXTERN_PREFIX' if the pragma is
+ available.
+
+\1f
+File: gcc.info, Node: Unnamed Fields, Prev: Pragmas, Up: C Extensions
+
+5.47 Unnamed struct/union fields within structs/unions.
+=======================================================
+
+For compatibility with other compilers, GCC allows you to define a
+structure or union that contains, as fields, structures and unions
+without names. For example:
+
+ struct {
+ int a;
+ union {
+ int b;
+ float c;
+ };
+ int d;
+ } foo;
+
+ In this example, the user would be able to access members of the
+unnamed union with code like `foo.b'. Note that only unnamed structs
+and unions are allowed, you may not have, for example, an unnamed `int'.
+
+ You must never create such structures that cause ambiguous field
+definitions. For example, this structure:
+
+ struct {
+ int a;
+ struct {
+ int a;
+ };
+ } foo;
+
+ It is ambiguous which `a' is being referred to with `foo.a'. Such
+constructs are not supported and must be avoided. In the future, such
+constructs may be detected and treated as compilation errors.
+
+\1f
+File: gcc.info, Node: C++ Extensions, Next: Objective-C, Prev: C Extensions, Up: Top
+
+6 Extensions to the C++ Language
+********************************
+
+The GNU compiler provides these extensions to the C++ language (and you
+can also use most of the C language extensions in your C++ programs).
+If you want to write code that checks whether these features are
+available, you can test for the GNU compiler the same way as for C
+programs: check for a predefined macro `__GNUC__'. You can also use
+`__GNUG__' to test specifically for GNU C++ (*note Standard Predefined
+Macros: (cpp.info)Standard Predefined.).
+
+* Menu:
+
+* Min and Max:: C++ Minimum and maximum operators.
+* Volatiles:: What constitutes an access to a volatile object.
+* Restricted Pointers:: C99 restricted pointers and references.
+* Vague Linkage:: Where G++ puts inlines, vtables and such.
+* C++ Interface:: You can use a single C++ header file for both
+ declarations and definitions.
+* Template Instantiation:: Methods for ensuring that exactly one copy of
+ each needed template instantiation is emitted.
+* Bound member functions:: You can extract a function pointer to the
+ method denoted by a `->*' or `.*' expression.
+* C++ Attributes:: Variable, function, and type attributes for C++ only.
+* Java Exceptions:: Tweaking exception handling to work with Java.
+* Deprecated Features:: Things might disappear from g++.
+* Backwards Compatibility:: Compatibilities with earlier definitions of C++.
+
+\1f
+File: gcc.info, Node: Min and Max, Next: Volatiles, Up: C++ Extensions
+
+6.1 Minimum and Maximum Operators in C++
+========================================
+
+It is very convenient to have operators which return the "minimum" or
+the "maximum" of two arguments. In GNU C++ (but not in GNU C),
+
+`A <? B'
+ is the "minimum", returning the smaller of the numeric values A
+ and B;
+
+`A >? B'
+ is the "maximum", returning the larger of the numeric values A and
+ B.
+
+ These operations are not primitive in ordinary C++, since you can
+use a macro to return the minimum of two things in C++, as in the
+following example.
+
+ #define MIN(X,Y) ((X) < (Y) ? : (X) : (Y))
+
+You might then use `int min = MIN (i, j);' to set MIN to the minimum
+value of variables I and J.
-Options to Request or Suppress Warnings
+ However, side effects in `X' or `Y' may cause unintended behavior.
+For example, `MIN (i++, j++)' will fail, incrementing the smaller
+counter twice. The GNU C `typeof' extension allows you to write safe
+macros that avoid this kind of problem (*note Typeof::). However,
+writing `MIN' and `MAX' as macros also forces you to use function-call
+notation for a fundamental arithmetic operation. Using GNU C++
+extensions, you can write `int min = i <? j;' instead.
+
+ Since `<?' and `>?' are built into the compiler, they properly
+handle expressions with side-effects; `int min = i++ <? j++;' works
+correctly.
+
+\1f
+File: gcc.info, Node: Volatiles, Next: Restricted Pointers, Prev: Min and Max, Up: C++ Extensions
+
+6.2 When is a Volatile Object Accessed?
=======================================
- Warnings are diagnostic messages that report constructions which are
-not inherently erroneous but which are risky or suggest there may have
-been an error.
-
- You can request many specific warnings with options beginning `-W',
-for example `-Wimplicit' to request warnings on implicit declarations.
-Each of these specific warning options also has a negative form
-beginning `-Wno-' to turn off warnings; for example, `-Wno-implicit'.
-This manual lists only one of the two forms, whichever is not the
-default.
-
- The following options control the amount and kinds of warnings
-produced by GCC; for further, language-specific options also refer to
-*Note C++ Dialect Options:: and *Note Objective-C Dialect Options::.
-
-`-fsyntax-only'
- Check the code for syntax errors, but don't do anything beyond
- that.
-
-`-pedantic'
- Issue all the warnings demanded by strict ISO C and ISO C++;
- reject all programs that use forbidden extensions, and some other
- programs that do not follow ISO C and ISO C++. For ISO C, follows
- the version of the ISO C standard specified by any `-std' option
- used.
-
- Valid ISO C and ISO C++ programs should compile properly with or
- without this option (though a rare few will require `-ansi' or a
- `-std' option specifying the required version of ISO C). However,
- without this option, certain GNU extensions and traditional C and
- C++ features are supported as well. With this option, they are
- rejected.
-
- `-pedantic' does not cause warning messages for use of the
- alternate keywords whose names begin and end with `__'. Pedantic
- warnings are also disabled in the expression that follows
- `__extension__'. However, only system header files should use
- these escape routes; application programs should avoid them.
- *Note Alternate Keywords::.
-
- Some users try to use `-pedantic' to check programs for strict ISO
- C conformance. They soon find that it does not do quite what they
- want: it finds some non-ISO practices, but not all--only those for
- which ISO C _requires_ a diagnostic, and some others for which
- diagnostics have been added.
-
- A feature to report any failure to conform to ISO C might be
- useful in some instances, but would require considerable
- additional work and would be quite different from `-pedantic'. We
- don't have plans to support such a feature in the near future.
-
- Where the standard specified with `-std' represents a GNU extended
- dialect of C, such as `gnu89' or `gnu99', there is a corresponding
- "base standard", the version of ISO C on which the GNU extended
- dialect is based. Warnings from `-pedantic' are given where they
- are required by the base standard. (It would not make sense for
- such warnings to be given only for features not in the specified
- GNU C dialect, since by definition the GNU dialects of C include
- all features the compiler supports with the given option, and
- there would be nothing to warn about.)
-
-`-pedantic-errors'
- Like `-pedantic', except that errors are produced rather than
- warnings.
-
-`-w'
- Inhibit all warning messages.
-
-`-Wno-import'
- Inhibit warning messages about the use of `#import'.
-
-`-Wchar-subscripts'
- Warn if an array subscript has type `char'. This is a common cause
- of error, as programmers often forget that this type is signed on
- some machines.
-
-`-Wcomment'
- Warn whenever a comment-start sequence `/*' appears in a `/*'
- comment, or whenever a Backslash-Newline appears in a `//' comment.
-
-`-Wformat'
- Check calls to `printf' and `scanf', etc., to make sure that the
- arguments supplied have types appropriate to the format string
- specified, and that the conversions specified in the format string
- make sense. This includes standard functions, and others
- specified by format attributes (*note Function Attributes::), in
- the `printf', `scanf', `strftime' and `strfmon' (an X/Open
- extension, not in the C standard) families.
-
- The formats are checked against the format features supported by
- GNU libc version 2.2. These include all ISO C89 and C99 features,
- as well as features from the Single Unix Specification and some
- BSD and GNU extensions. Other library implementations may not
- support all these features; GCC does not support warning about
- features that go beyond a particular library's limitations.
- However, if `-pedantic' is used with `-Wformat', warnings will be
- given about format features not in the selected standard version
- (but not for `strfmon' formats, since those are not in any version
- of the C standard). *Note Options Controlling C Dialect: C
- Dialect Options.
-
- `-Wformat' is included in `-Wall'. For more control over some
- aspects of format checking, the options `-Wno-format-y2k',
- `-Wno-format-extra-args', `-Wformat-nonliteral',
- `-Wformat-security' and `-Wformat=2' are available, but are not
- included in `-Wall'.
-
-`-Wno-format-y2k'
- If `-Wformat' is specified, do not warn about `strftime' formats
- which may yield only a two-digit year.
-
-`-Wno-format-extra-args'
- If `-Wformat' is specified, do not warn about excess arguments to a
- `printf' or `scanf' format function. The C standard specifies
- that such arguments are ignored.
-
- Where the unused arguments lie between used arguments that are
- specified with `$' operand number specifications, normally
- warnings are still given, since the implementation could not know
- what type to pass to `va_arg' to skip the unused arguments.
- However, in the case of `scanf' formats, this option will suppress
- the warning if the unused arguments are all pointers, since the
- Single Unix Specification says that such unused arguments are
- allowed.
-
-`-Wformat-nonliteral'
- If `-Wformat' is specified, also warn if the format string is not a
- string literal and so cannot be checked, unless the format function
- takes its format arguments as a `va_list'.
-
-`-Wformat-security'
- If `-Wformat' is specified, also warn about uses of format
- functions that represent possible security problems. At present,
- this warns about calls to `printf' and `scanf' functions where the
- format string is not a string literal and there are no format
- arguments, as in `printf (foo);'. This may be a security hole if
- the format string came from untrusted input and contains `%n'.
- (This is currently a subset of what `-Wformat-nonliteral' warns
- about, but in future warnings may be added to `-Wformat-security'
- that are not included in `-Wformat-nonliteral'.)
-
-`-Wformat=2'
- Enable `-Wformat' plus format checks not included in `-Wformat'.
- Currently equivalent to `-Wformat -Wformat-nonliteral
- -Wformat-security'.
-
-`-Wimplicit-int'
- Warn when a declaration does not specify a type.
-
-`-Wimplicit-function-declaration'
-`-Werror-implicit-function-declaration'
- Give a warning (or error) whenever a function is used before being
- declared.
-
-`-Wimplicit'
- Same as `-Wimplicit-int' and `-Wimplicit-function-declaration'.
-
-`-Wmain'
- Warn if the type of `main' is suspicious. `main' should be a
- function with external linkage, returning int, taking either zero
- arguments, two, or three arguments of appropriate types.
-
-`-Wmissing-braces'
- Warn if an aggregate or union initializer is not fully bracketed.
- In the following example, the initializer for `a' is not fully
- bracketed, but that for `b' is fully bracketed.
-
- int a[2][2] = { 0, 1, 2, 3 };
- int b[2][2] = { { 0, 1 }, { 2, 3 } };
-
-`-Wparentheses'
- Warn if parentheses are omitted in certain contexts, such as when
- there is an assignment in a context where a truth value is
- expected, or when operators are nested whose precedence people
- often get confused about.
-
- Also warn about constructions where there may be confusion to which
- `if' statement an `else' branch belongs. Here is an example of
- such a case:
+Both the C and C++ standard have the concept of volatile objects. These
+are normally accessed by pointers and used for accessing hardware. The
+standards encourage compilers to refrain from optimizations concerning
+accesses to volatile objects that it might perform on non-volatile
+objects. The C standard leaves it implementation defined as to what
+constitutes a volatile access. The C++ standard omits to specify this,
+except to say that C++ should behave in a similar manner to C with
+respect to volatiles, where possible. The minimum either standard
+specifies is that at a sequence point all previous accesses to volatile
+objects have stabilized and no subsequent accesses have occurred. Thus
+an implementation is free to reorder and combine volatile accesses
+which occur between sequence points, but cannot do so for accesses
+across a sequence point. The use of volatiles does not allow you to
+violate the restriction on updating objects multiple times within a
+sequence point.
+
+ In most expressions, it is intuitively obvious what is a read and
+what is a write. For instance
+
+ volatile int *dst = SOMEVALUE;
+ volatile int *src = SOMEOTHERVALUE;
+ *dst = *src;
+
+will cause a read of the volatile object pointed to by SRC and stores
+the value into the volatile object pointed to by DST. There is no
+guarantee that these reads and writes are atomic, especially for objects
+larger than `int'.
+
+ Less obvious expressions are where something which looks like an
+access is used in a void context. An example would be,
+
+ volatile int *src = SOMEVALUE;
+ *src;
+
+ With C, such expressions are rvalues, and as rvalues cause a read of
+the object, GCC interprets this as a read of the volatile being pointed
+to. The C++ standard specifies that such expressions do not undergo
+lvalue to rvalue conversion, and that the type of the dereferenced
+object may be incomplete. The C++ standard does not specify explicitly
+that it is this lvalue to rvalue conversion which is responsible for
+causing an access. However, there is reason to believe that it is,
+because otherwise certain simple expressions become undefined. However,
+because it would surprise most programmers, G++ treats dereferencing a
+pointer to volatile object of complete type in a void context as a read
+of the object. When the object has incomplete type, G++ issues a
+warning.
+
+ struct S;
+ struct T {int m;};
+ volatile S *ptr1 = SOMEVALUE;
+ volatile T *ptr2 = SOMEVALUE;
+ *ptr1;
+ *ptr2;
+
+ In this example, a warning is issued for `*ptr1', and `*ptr2' causes
+a read of the object pointed to. If you wish to force an error on the
+first case, you must force a conversion to rvalue with, for instance a
+static cast, `static_cast<S>(*ptr1)'.
+
+ When using a reference to volatile, G++ does not treat equivalent
+expressions as accesses to volatiles, but instead issues a warning that
+no volatile is accessed. The rationale for this is that otherwise it
+becomes difficult to determine where volatile access occur, and not
+possible to ignore the return value from functions returning volatile
+references. Again, if you wish to force a read, cast the reference to
+an rvalue.
- {
- if (a)
- if (b)
- foo ();
- else
- bar ();
- }
+\1f
+File: gcc.info, Node: Restricted Pointers, Next: Vague Linkage, Prev: Volatiles, Up: C++ Extensions
- In C, every `else' branch belongs to the innermost possible `if'
- statement, which in this example is `if (b)'. This is often not
- what the programmer expected, as illustrated in the above example
- by indentation the programmer chose. When there is the potential
- for this confusion, GCC will issue a warning when this flag is
- specified. To eliminate the warning, add explicit braces around
- the innermost `if' statement so there is no way the `else' could
- belong to the enclosing `if'. The resulting code would look like
- this:
+6.3 Restricting Pointer Aliasing
+================================
- {
- if (a)
- {
- if (b)
- foo ();
- else
- bar ();
- }
- }
+As with gcc, g++ understands the C99 feature of restricted pointers,
+specified with the `__restrict__', or `__restrict' type qualifier.
+Because you cannot compile C++ by specifying the `-std=c99' language
+flag, `restrict' is not a keyword in C++.
+
+ In addition to allowing restricted pointers, you can specify
+restricted references, which indicate that the reference is not aliased
+in the local context.
+
+ void fn (int *__restrict__ rptr, int &__restrict__ rref)
+ {
+ ...
+ }
+
+In the body of `fn', RPTR points to an unaliased integer and RREF
+refers to a (different) unaliased integer.
+
+ You may also specify whether a member function's THIS pointer is
+unaliased by using `__restrict__' as a member function qualifier.
+
+ void T::fn () __restrict__
+ {
+ ...
+ }
+
+Within the body of `T::fn', THIS will have the effective definition `T
+*__restrict__ const this'. Notice that the interpretation of a
+`__restrict__' member function qualifier is different to that of
+`const' or `volatile' qualifier, in that it is applied to the pointer
+rather than the object. This is consistent with other compilers which
+implement restricted pointers.
+
+ As with all outermost parameter qualifiers, `__restrict__' is
+ignored in function definition matching. This means you only need to
+specify `__restrict__' in a function definition, rather than in a
+function prototype as well.
+
+\1f
+File: gcc.info, Node: Vague Linkage, Next: C++ Interface, Prev: Restricted Pointers, Up: C++ Extensions
+
+6.4 Vague Linkage
+=================
+
+There are several constructs in C++ which require space in the object
+file but are not clearly tied to a single translation unit. We say that
+these constructs have "vague linkage". Typically such constructs are
+emitted wherever they are needed, though sometimes we can be more
+clever.
+
+Inline Functions
+ Inline functions are typically defined in a header file which can
+ be included in many different compilations. Hopefully they can
+ usually be inlined, but sometimes an out-of-line copy is
+ necessary, if the address of the function is taken or if inlining
+ fails. In general, we emit an out-of-line copy in all translation
+ units where one is needed. As an exception, we only emit inline
+ virtual functions with the vtable, since it will always require a
+ copy.
+
+ Local static variables and string constants used in an inline
+ function are also considered to have vague linkage, since they
+ must be shared between all inlined and out-of-line instances of
+ the function.
+
+VTables
+ C++ virtual functions are implemented in most compilers using a
+ lookup table, known as a vtable. The vtable contains pointers to
+ the virtual functions provided by a class, and each object of the
+ class contains a pointer to its vtable (or vtables, in some
+ multiple-inheritance situations). If the class declares any
+ non-inline, non-pure virtual functions, the first one is chosen as
+ the "key method" for the class, and the vtable is only emitted in
+ the translation unit where the key method is defined.
+
+ _Note:_ If the chosen key method is later defined as inline, the
+ vtable will still be emitted in every translation unit which
+ defines it. Make sure that any inline virtuals are declared
+ inline in the class body, even if they are not defined there.
+
+type_info objects
+ C++ requires information about types to be written out in order to
+ implement `dynamic_cast', `typeid' and exception handling. For
+ polymorphic classes (classes with virtual functions), the type_info
+ object is written out along with the vtable so that `dynamic_cast'
+ can determine the dynamic type of a class object at runtime. For
+ all other types, we write out the type_info object when it is
+ used: when applying `typeid' to an expression, throwing an object,
+ or referring to a type in a catch clause or exception
+ specification.
+
+Template Instantiations
+ Most everything in this section also applies to template
+ instantiations, but there are other options as well. *Note
+ Where's the Template?: Template Instantiation.
+
+
+ When used with GNU ld version 2.8 or later on an ELF system such as
+Linux/GNU or Solaris 2, or on Microsoft Windows, duplicate copies of
+these constructs will be discarded at link time. This is known as
+COMDAT support.
+
+ On targets that don't support COMDAT, but do support weak symbols,
+GCC will use them. This way one copy will override all the others, but
+the unused copies will still take up space in the executable.
+
+ For targets which do not support either COMDAT or weak symbols, most
+entities with vague linkage will be emitted as local symbols to avoid
+duplicate definition errors from the linker. This will not happen for
+local statics in inlines, however, as having multiple copies will
+almost certainly break things.
+
+ *Note Declarations and Definitions in One Header: C++ Interface, for
+another way to control placement of these constructs.
+
+\1f
+File: gcc.info, Node: C++ Interface, Next: Template Instantiation, Prev: Vague Linkage, Up: C++ Extensions
+
+6.5 Declarations and Definitions in One Header
+==============================================
+
+C++ object definitions can be quite complex. In principle, your source
+code will need two kinds of things for each object that you use across
+more than one source file. First, you need an "interface"
+specification, describing its structure with type declarations and
+function prototypes. Second, you need the "implementation" itself. It
+can be tedious to maintain a separate interface description in a header
+file, in parallel to the actual implementation. It is also dangerous,
+since separate interface and implementation definitions may not remain
+parallel.
+
+ With GNU C++, you can use a single header file for both purposes.
+
+ _Warning:_ The mechanism to specify this is in transition. For the
+ nonce, you must use one of two `#pragma' commands; in a future
+ release of GNU C++, an alternative mechanism will make these
+ `#pragma' commands unnecessary.
+
+ The header file contains the full definitions, but is marked with
+`#pragma interface' in the source code. This allows the compiler to
+use the header file only as an interface specification when ordinary
+source files incorporate it with `#include'. In the single source file
+where the full implementation belongs, you can use either a naming
+convention or `#pragma implementation' to indicate this alternate use
+of the header file.
+
+`#pragma interface'
+`#pragma interface "SUBDIR/OBJECTS.h"'
+ Use this directive in _header files_ that define object classes,
+ to save space in most of the object files that use those classes.
+ Normally, local copies of certain information (backup copies of
+ inline member functions, debugging information, and the internal
+ tables that implement virtual functions) must be kept in each
+ object file that includes class definitions. You can use this
+ pragma to avoid such duplication. When a header file containing
+ `#pragma interface' is included in a compilation, this auxiliary
+ information will not be generated (unless the main input source
+ file itself uses `#pragma implementation'). Instead, the object
+ files will contain references to be resolved at link time.
+
+ The second form of this directive is useful for the case where you
+ have multiple headers with the same name in different directories.
+ If you use this form, you must specify the same string to `#pragma
+ implementation'.
+
+`#pragma implementation'
+`#pragma implementation "OBJECTS.h"'
+ Use this pragma in a _main input file_, when you want full output
+ from included header files to be generated (and made globally
+ visible). The included header file, in turn, should use `#pragma
+ interface'. Backup copies of inline member functions, debugging
+ information, and the internal tables used to implement virtual
+ functions are all generated in implementation files.
+
+ If you use `#pragma implementation' with no argument, it applies to
+ an include file with the same basename(1) as your source file.
+ For example, in `allclass.cc', giving just `#pragma implementation'
+ by itself is equivalent to `#pragma implementation "allclass.h"'.
+
+ In versions of GNU C++ prior to 2.6.0 `allclass.h' was treated as
+ an implementation file whenever you would include it from
+ `allclass.cc' even if you never specified `#pragma
+ implementation'. This was deemed to be more trouble than it was
+ worth, however, and disabled.
+
+ If you use an explicit `#pragma implementation', it must appear in
+ your source file _before_ you include the affected header files.
+
+ Use the string argument if you want a single implementation file to
+ include code from multiple header files. (You must also use
+ `#include' to include the header file; `#pragma implementation'
+ only specifies how to use the file--it doesn't actually include
+ it.)
+
+ There is no way to split up the contents of a single header file
+ into multiple implementation files.
+
+ `#pragma implementation' and `#pragma interface' also have an effect
+on function inlining.
+
+ If you define a class in a header file marked with `#pragma
+interface', the effect on a function defined in that class is similar to
+an explicit `extern' declaration--the compiler emits no code at all to
+define an independent version of the function. Its definition is used
+only for inlining with its callers.
+
+ Conversely, when you include the same header file in a main source
+file that declares it as `#pragma implementation', the compiler emits
+code for the function itself; this defines a version of the function
+that can be found via pointers (or by callers compiled without
+inlining). If all calls to the function can be inlined, you can avoid
+emitting the function by compiling with `-fno-implement-inlines'. If
+any calls were not inlined, you will get linker errors.
+
+ ---------- Footnotes ----------
+
+ (1) A file's "basename" was the name stripped of all leading path
+information and of trailing suffixes, such as `.h' or `.C' or `.cc'.
+
+\1f
+File: gcc.info, Node: Template Instantiation, Next: Bound member functions, Prev: C++ Interface, Up: C++ Extensions
+
+6.6 Where's the Template?
+=========================
+
+C++ templates are the first language feature to require more
+intelligence from the environment than one usually finds on a UNIX
+system. Somehow the compiler and linker have to make sure that each
+template instance occurs exactly once in the executable if it is needed,
+and not at all otherwise. There are two basic approaches to this
+problem, which I will refer to as the Borland model and the Cfront
+model.
+
+Borland model
+ Borland C++ solved the template instantiation problem by adding
+ the code equivalent of common blocks to their linker; the compiler
+ emits template instances in each translation unit that uses them,
+ and the linker collapses them together. The advantage of this
+ model is that the linker only has to consider the object files
+ themselves; there is no external complexity to worry about. This
+ disadvantage is that compilation time is increased because the
+ template code is being compiled repeatedly. Code written for this
+ model tends to include definitions of all templates in the header
+ file, since they must be seen to be instantiated.
+
+Cfront model
+ The AT&T C++ translator, Cfront, solved the template instantiation
+ problem by creating the notion of a template repository, an
+ automatically maintained place where template instances are
+ stored. A more modern version of the repository works as follows:
+ As individual object files are built, the compiler places any
+ template definitions and instantiations encountered in the
+ repository. At link time, the link wrapper adds in the objects in
+ the repository and compiles any needed instances that were not
+ previously emitted. The advantages of this model are more optimal
+ compilation speed and the ability to use the system linker; to
+ implement the Borland model a compiler vendor also needs to
+ replace the linker. The disadvantages are vastly increased
+ complexity, and thus potential for error; for some code this can be
+ just as transparent, but in practice it can been very difficult to
+ build multiple programs in one directory and one program in
+ multiple directories. Code written for this model tends to
+ separate definitions of non-inline member templates into a
+ separate file, which should be compiled separately.
+
+ When used with GNU ld version 2.8 or later on an ELF system such as
+Linux/GNU or Solaris 2, or on Microsoft Windows, g++ supports the
+Borland model. On other systems, g++ implements neither automatic
+model.
+
+ A future version of g++ will support a hybrid model whereby the
+compiler will emit any instantiations for which the template definition
+is included in the compile, and store template definitions and
+instantiation context information into the object file for the rest.
+The link wrapper will extract that information as necessary and invoke
+the compiler to produce the remaining instantiations. The linker will
+then combine duplicate instantiations.
+
+ In the mean time, you have the following options for dealing with
+template instantiations:
+
+ 1. Compile your template-using code with `-frepo'. The compiler will
+ generate files with the extension `.rpo' listing all of the
+ template instantiations used in the corresponding object files
+ which could be instantiated there; the link wrapper, `collect2',
+ will then update the `.rpo' files to tell the compiler where to
+ place those instantiations and rebuild any affected object files.
+ The link-time overhead is negligible after the first pass, as the
+ compiler will continue to place the instantiations in the same
+ files.
+
+ This is your best option for application code written for the
+ Borland model, as it will just work. Code written for the Cfront
+ model will need to be modified so that the template definitions
+ are available at one or more points of instantiation; usually this
+ is as simple as adding `#include <tmethods.cc>' to the end of each
+ template header.
+
+ For library code, if you want the library to provide all of the
+ template instantiations it needs, just try to link all of its
+ object files together; the link will fail, but cause the
+ instantiations to be generated as a side effect. Be warned,
+ however, that this may cause conflicts if multiple libraries try
+ to provide the same instantiations. For greater control, use
+ explicit instantiation as described in the next option.
+
+ 2. Compile your code with `-fno-implicit-templates' to disable the
+ implicit generation of template instances, and explicitly
+ instantiate all the ones you use. This approach requires more
+ knowledge of exactly which instances you need than do the others,
+ but it's less mysterious and allows greater control. You can
+ scatter the explicit instantiations throughout your program,
+ perhaps putting them in the translation units where the instances
+ are used or the translation units that define the templates
+ themselves; you can put all of the explicit instantiations you
+ need into one big file; or you can create small files like
+
+ #include "Foo.h"
+ #include "Foo.cc"
+
+ template class Foo<int>;
+ template ostream& operator <<
+ (ostream&, const Foo<int>&);
+
+ for each of the instances you need, and create a template
+ instantiation library from those.
+
+ If you are using Cfront-model code, you can probably get away with
+ not using `-fno-implicit-templates' when compiling files that don't
+ `#include' the member template definitions.
+
+ If you use one big file to do the instantiations, you may want to
+ compile it without `-fno-implicit-templates' so you get all of the
+ instances required by your explicit instantiations (but not by any
+ other files) without having to specify them as well.
+
+ g++ has extended the template instantiation syntax outlined in the
+ Working Paper to allow forward declaration of explicit
+ instantiations (with `extern'), instantiation of the compiler
+ support data for a template class (i.e. the vtable) without
+ instantiating any of its members (with `inline'), and
+ instantiation of only the static data members of a template class,
+ without the support data or member functions (with (`static'):
+
+ extern template int max (int, int);
+ inline template class Foo<int>;
+ static template class Foo<int>;
+
+ 3. Do nothing. Pretend g++ does implement automatic instantiation
+ management. Code written for the Borland model will work fine, but
+ each translation unit will contain instances of each of the
+ templates it uses. In a large program, this can lead to an
+ unacceptable amount of code duplication.
+
+ 4. Add `#pragma interface' to all files containing template
+ definitions. For each of these files, add `#pragma implementation
+ "FILENAME"' to the top of some `.C' file which `#include's it.
+ Then compile everything with `-fexternal-templates'. The
+ templates will then only be expanded in the translation unit which
+ implements them (i.e. has a `#pragma implementation' line for the
+ file where they live); all other files will use external
+ references. If you're lucky, everything should work properly. If
+ you get undefined symbol errors, you need to make sure that each
+ template instance which is used in the program is used in the file
+ which implements that template. If you don't have any use for a
+ particular instance in that file, you can just instantiate it
+ explicitly, using the syntax from the latest C++ working paper:
+
+ template class A<int>;
+ template ostream& operator << (ostream&, const A<int>&);
+
+ This strategy will work with code written for either model. If
+ you are using code written for the Cfront model, the file
+ containing a class template and the file containing its member
+ templates should be implemented in the same translation unit.
+
+ 5. A slight variation on this approach is to use the flag
+ `-falt-external-templates' instead. This flag causes template
+ instances to be emitted in the translation unit that implements the
+ header where they are first instantiated, rather than the one which
+ implements the file where the templates are defined. This header
+ must be the same in all translation units, or things are likely to
+ break.
+
+ *Note Declarations and Definitions in One Header: C++ Interface,
+ for more discussion of these pragmas.
+
+\1f
+File: gcc.info, Node: Bound member functions, Next: C++ Attributes, Prev: Template Instantiation, Up: C++ Extensions
+
+6.7 Extracting the function pointer from a bound pointer to member function
+===========================================================================
+
+In C++, pointer to member functions (PMFs) are implemented using a wide
+pointer of sorts to handle all the possible call mechanisms; the PMF
+needs to store information about how to adjust the `this' pointer, and
+if the function pointed to is virtual, where to find the vtable, and
+where in the vtable to look for the member function. If you are using
+PMFs in an inner loop, you should really reconsider that decision. If
+that is not an option, you can extract the pointer to the function that
+would be called for a given object/PMF pair and call it directly inside
+the inner loop, to save a bit of time.
+
+ Note that you will still be paying the penalty for the call through a
+function pointer; on most modern architectures, such a call defeats the
+branch prediction features of the CPU. This is also true of normal
+virtual function calls.
+
+ The syntax for this extension is
+
+ extern A a;
+ extern int (A::*fp)();
+ typedef int (*fptr)(A *);
+
+ fptr p = (fptr)(a.*fp);
+
+ For PMF constants (i.e. expressions of the form `&Klasse::Member'),
+no object is needed to obtain the address of the function. They can be
+converted to function pointers directly:
+
+ fptr p1 = (fptr)(&A::foo);
+
+ You must specify `-Wno-pmf-conversions' to use this extension.
+
+\1f
+File: gcc.info, Node: C++ Attributes, Next: Java Exceptions, Prev: Bound member functions, Up: C++ Extensions
+
+6.8 C++-Specific Variable, Function, and Type Attributes
+========================================================
+
+Some attributes only make sense for C++ programs.
+
+`init_priority (PRIORITY)'
+ In Standard C++, objects defined at namespace scope are guaranteed
+ to be initialized in an order in strict accordance with that of
+ their definitions _in a given translation unit_. No guarantee is
+ made for initializations across translation units. However, GNU
+ C++ allows users to control the order of initialization of objects
+ defined at namespace scope with the `init_priority' attribute by
+ specifying a relative PRIORITY, a constant integral expression
+ currently bounded between 101 and 65535 inclusive. Lower numbers
+ indicate a higher priority.
+
+ In the following example, `A' would normally be created before
+ `B', but the `init_priority' attribute has reversed that order:
+
+ Some_Class A __attribute__ ((init_priority (2000)));
+ Some_Class B __attribute__ ((init_priority (543)));
+
+ Note that the particular values of PRIORITY do not matter; only
+ their relative ordering.
+
+`java_interface'
+ This type attribute informs C++ that the class is a Java
+ interface. It may only be applied to classes declared within an
+ `extern "Java"' block. Calls to methods declared in this
+ interface will be dispatched using GCJ's interface table
+ mechanism, instead of regular virtual table dispatch.
+
+
+\1f
+File: gcc.info, Node: Java Exceptions, Next: Deprecated Features, Prev: C++ Attributes, Up: C++ Extensions
+
+6.9 Java Exceptions
+===================
+
+The Java language uses a slightly different exception handling model
+from C++. Normally, GNU C++ will automatically detect when you are
+writing C++ code that uses Java exceptions, and handle them
+appropriately. However, if C++ code only needs to execute destructors
+when Java exceptions are thrown through it, GCC will guess incorrectly.
+Sample problematic code is:
+
+ struct S { ~S(); };
+ extern void bar(); // is written in Java, and may throw exceptions
+ void foo()
+ {
+ S s;
+ bar();
+ }
+
+The usual effect of an incorrect guess is a link failure, complaining of
+a missing routine called `__gxx_personality_v0'.
+
+ You can inform the compiler that Java exceptions are to be used in a
+translation unit, irrespective of what it might think, by writing
+`#pragma GCC java_exceptions' at the head of the file. This `#pragma'
+must appear before any functions that throw or catch exceptions, or run
+destructors when exceptions are thrown through them.
+
+ You cannot mix Java and C++ exceptions in the same translation unit.
+It is believed to be safe to throw a C++ exception from one file through
+another file compiled for the Java exception model, or vice versa, but
+there may be bugs in this area.
+
+\1f
+File: gcc.info, Node: Deprecated Features, Next: Backwards Compatibility, Prev: Java Exceptions, Up: C++ Extensions
+
+6.10 Deprecated Features
+========================
+
+In the past, the GNU C++ compiler was extended to experiment with new
+features, at a time when the C++ language was still evolving. Now that
+the C++ standard is complete, some of those features are superseded by
+superior alternatives. Using the old features might cause a warning in
+some cases that the feature will be dropped in the future. In other
+cases, the feature might be gone already.
+
+ While the list below is not exhaustive, it documents some of the
+options that are now deprecated:
+
+`-fexternal-templates'
+`-falt-external-templates'
+ These are two of the many ways for g++ to implement template
+ instantiation. *Note Template Instantiation::. The C++ standard
+ clearly defines how template definitions have to be organized
+ across implementation units. g++ has an implicit instantiation
+ mechanism that should work just fine for standard-conforming code.
+
+`-fstrict-prototype'
+`-fno-strict-prototype'
+ Previously it was possible to use an empty prototype parameter
+ list to indicate an unspecified number of parameters (like C),
+ rather than no parameters, as C++ demands. This feature has been
+ removed, except where it is required for backwards compatibility
+ *Note Backwards Compatibility::.
+
+ The named return value extension has been deprecated, and is now
+removed from g++.
+
+ The use of initializer lists with new expressions has been
+deprecated, and is now removed from g++.
+
+ Floating and complex non-type template parameters have been
+deprecated, and are now removed from g++.
+
+ The implicit typename extension has been deprecated and will be
+removed from g++ at some point. In some cases g++ determines that a
+dependant type such as `TPL<T>::X' is a type without needing a
+`typename' keyword, contrary to the standard.
+
+\1f
+File: gcc.info, Node: Backwards Compatibility, Prev: Deprecated Features, Up: C++ Extensions
+
+6.11 Backwards Compatibility
+============================
+
+Now that there is a definitive ISO standard C++, G++ has a specification
+to adhere to. The C++ language evolved over time, and features that
+used to be acceptable in previous drafts of the standard, such as the
+ARM [Annotated C++ Reference Manual], are no longer accepted. In order
+to allow compilation of C++ written to such drafts, G++ contains some
+backwards compatibilities. _All such backwards compatibility features
+are liable to disappear in future versions of G++._ They should be
+considered deprecated *Note Deprecated Features::.
+
+`For scope'
+ If a variable is declared at for scope, it used to remain in scope
+ until the end of the scope which contained the for statement
+ (rather than just within the for scope). G++ retains this, but
+ issues a warning, if such a variable is accessed outside the for
+ scope.
+
+`Implicit C language'
+ Old C system header files did not contain an `extern "C" {...}'
+ scope to set the language. On such systems, all header files are
+ implicitly scoped inside a C language scope. Also, an empty
+ prototype `()' will be treated as an unspecified number of
+ arguments, rather than no arguments, as C++ demands.
+
+\1f
+File: gcc.info, Node: Objective-C, Next: Compatibility, Prev: C++ Extensions, Up: Top
+
+7 GNU Objective-C runtime features
+**********************************
+
+This document is meant to describe some of the GNU Objective-C runtime
+features. It is not intended to teach you Objective-C, there are
+several resources on the Internet that present the language. Questions
+and comments about this document to Ovidiu Predescu <ovidiu@cup.hp.com>.
+
+* Menu:
+
+* Executing code before main::
+* Type encoding::
+* Garbage Collection::
+* Constant string objects::
+* compatibility_alias::
+
+\1f
+File: gcc.info, Node: Executing code before main, Next: Type encoding, Prev: Objective-C, Up: Objective-C
+
+7.1 `+load': Executing code before main
+=======================================
+
+The GNU Objective-C runtime provides a way that allows you to execute
+code before the execution of the program enters the `main' function.
+The code is executed on a per-class and a per-category basis, through a
+special class method `+load'.
+
+ This facility is very useful if you want to initialize global
+variables which can be accessed by the program directly, without
+sending a message to the class first. The usual way to initialize
+global variables, in the `+initialize' method, might not be useful
+because `+initialize' is only called when the first message is sent to a
+class object, which in some cases could be too late.
+
+ Suppose for example you have a `FileStream' class that declares
+`Stdin', `Stdout' and `Stderr' as global variables, like below:
+
+
+ FileStream *Stdin = nil;
+ FileStream *Stdout = nil;
+ FileStream *Stderr = nil;
+
+ @implementation FileStream
+
+ + (void)initialize
+ {
+ Stdin = [[FileStream new] initWithFd:0];
+ Stdout = [[FileStream new] initWithFd:1];
+ Stderr = [[FileStream new] initWithFd:2];
+ }
+
+ /* Other methods here */
+ @end
+
+ In this example, the initialization of `Stdin', `Stdout' and
+`Stderr' in `+initialize' occurs too late. The programmer can send a
+message to one of these objects before the variables are actually
+initialized, thus sending messages to the `nil' object. The
+`+initialize' method which actually initializes the global variables is
+not invoked until the first message is sent to the class object. The
+solution would require these variables to be initialized just before
+entering `main'.
+
+ The correct solution of the above problem is to use the `+load'
+method instead of `+initialize':
+
+
+ @implementation FileStream
+
+ + (void)load
+ {
+ Stdin = [[FileStream new] initWithFd:0];
+ Stdout = [[FileStream new] initWithFd:1];
+ Stderr = [[FileStream new] initWithFd:2];
+ }
+
+ /* Other methods here */
+ @end
+
+ The `+load' is a method that is not overridden by categories. If a
+class and a category of it both implement `+load', both methods are
+invoked. This allows some additional initializations to be performed in
+a category.
+
+ This mechanism is not intended to be a replacement for `+initialize'.
+You should be aware of its limitations when you decide to use it
+instead of `+initialize'.
+
+* Menu:
+
+* What you can and what you cannot do in +load::
+
+\1f
+File: gcc.info, Node: What you can and what you cannot do in +load, Prev: Executing code before main, Up: Executing code before main
+
+7.1.1 What you can and what you cannot do in `+load'
+----------------------------------------------------
+
+The `+load' implementation in the GNU runtime guarantees you the
+following things:
+
+ * you can write whatever C code you like;
+
+ * you can send messages to Objective-C constant strings (`@"this is a
+ constant string"');
+
+ * you can allocate and send messages to objects whose class is
+ implemented in the same file;
+
+ * the `+load' implementation of all super classes of a class are
+ executed before the `+load' of that class is executed;
+
+ * the `+load' implementation of a class is executed before the
+ `+load' implementation of any category.
+
+
+ In particular, the following things, even if they can work in a
+particular case, are not guaranteed:
+
+ * allocation of or sending messages to arbitrary objects;
+
+ * allocation of or sending messages to objects whose classes have a
+ category implemented in the same file;
+
+
+ You should make no assumptions about receiving `+load' in sibling
+classes when you write `+load' of a class. The order in which sibling
+classes receive `+load' is not guaranteed.
+
+ The order in which `+load' and `+initialize' are called could be
+problematic if this matters. If you don't allocate objects inside
+`+load', it is guaranteed that `+load' is called before `+initialize'.
+If you create an object inside `+load' the `+initialize' method of
+object's class is invoked even if `+load' was not invoked. Note if you
+explicitly call `+load' on a class, `+initialize' will be called first.
+To avoid possible problems try to implement only one of these methods.
+
+ The `+load' method is also invoked when a bundle is dynamically
+loaded into your running program. This happens automatically without
+any intervening operation from you. When you write bundles and you
+need to write `+load' you can safely create and send messages to
+objects whose classes already exist in the running program. The same
+restrictions as above apply to classes defined in bundle.
+
+\1f
+File: gcc.info, Node: Type encoding, Next: Garbage Collection, Prev: Executing code before main, Up: Objective-C
+
+7.2 Type encoding
+=================
+
+The Objective-C compiler generates type encodings for all the types.
+These type encodings are used at runtime to find out information about
+selectors and methods and about objects and classes.
+
+ The types are encoded in the following way:
+
+`char' `c'
+`unsigned char' `C'
+`short' `s'
+`unsigned short' `S'
+`int' `i'
+`unsigned int' `I'
+`long' `l'
+`unsigned long' `L'
+`long long' `q'
+`unsigned long `Q'
+long'
+`float' `f'
+`double' `d'
+`void' `v'
+`id' `@'
+`Class' `#'
+`SEL' `:'
+`char*' `*'
+unknown type `?'
+bit-fields `b' followed by the starting position of the
+ bit-field, the type of the bit-field and the size of
+ the bit-field (the bit-fields encoding was changed
+ from the NeXT's compiler encoding, see below)
+
+ The encoding of bit-fields has changed to allow bit-fields to be
+properly handled by the runtime functions that compute sizes and
+alignments of types that contain bit-fields. The previous encoding
+contained only the size of the bit-field. Using only this information
+it is not possible to reliably compute the size occupied by the
+bit-field. This is very important in the presence of the Boehm's
+garbage collector because the objects are allocated using the typed
+memory facility available in this collector. The typed memory
+allocation requires information about where the pointers are located
+inside the object.
+
+ The position in the bit-field is the position, counting in bits, of
+the bit closest to the beginning of the structure.
+
+ The non-atomic types are encoded as follows:
+
+pointers `^' followed by the pointed type.
+arrays `[' followed by the number of elements in the array
+ followed by the type of the elements followed by `]'
+structures `{' followed by the name of the structure (or `?' if the
+ structure is unnamed), the `=' sign, the type of the
+ members and by `}'
+unions `(' followed by the name of the structure (or `?' if the
+ union is unnamed), the `=' sign, the type of the members
+ followed by `)'
+
+ Here are some types and their encodings, as they are generated by the
+compiler on an i386 machine:
+
+
+Objective-C type Compiler encoding
+ int a[10]; `[10i]'
+ struct { `{?=i[3f]b128i3b131i2c}'
+ int i;
+ float f[3];
+ int a:3;
+ int b:2;
+ char c;
+ }
+
+
+ In addition to the types the compiler also encodes the type
+specifiers. The table below describes the encoding of the current
+Objective-C type specifiers:
+
+
+Specifier Encoding
+`const' `r'
+`in' `n'
+`inout' `N'
+`out' `o'
+`bycopy' `O'
+`oneway' `V'
+
+
+ The type specifiers are encoded just before the type. Unlike types
+however, the type specifiers are only encoded when they appear in method
+argument types.
+
+\1f
+File: gcc.info, Node: Garbage Collection, Next: Constant string objects, Prev: Type encoding, Up: Objective-C
+
+7.3 Garbage Collection
+======================
+
+Support for a new memory management policy has been added by using a
+powerful conservative garbage collector, known as the
+Boehm-Demers-Weiser conservative garbage collector. It is available
+from `http://www.hpl.hp.com/personal/Hans_Boehm/gc/'.
+
+ To enable the support for it you have to configure the compiler
+using an additional argument, `--enable-objc-gc'. You need to have
+garbage collector installed before building the compiler. This will
+build an additional runtime library which has several enhancements to
+support the garbage collector. The new library has a new name,
+`libobjc_gc.a' to not conflict with the non-garbage-collected library.
+
+ When the garbage collector is used, the objects are allocated using
+the so-called typed memory allocation mechanism available in the
+Boehm-Demers-Weiser collector. This mode requires precise information
+on where pointers are located inside objects. This information is
+computed once per class, immediately after the class has been
+initialized.
+
+ There is a new runtime function `class_ivar_set_gcinvisible()' which
+can be used to declare a so-called "weak pointer" reference. Such a
+pointer is basically hidden for the garbage collector; this can be
+useful in certain situations, especially when you want to keep track of
+the allocated objects, yet allow them to be collected. This kind of
+pointers can only be members of objects, you cannot declare a global
+pointer as a weak reference. Every type which is a pointer type can be
+declared a weak pointer, including `id', `Class' and `SEL'.
+
+ Here is an example of how to use this feature. Suppose you want to
+implement a class whose instances hold a weak pointer reference; the
+following class does this:
+
+
+ @interface WeakPointer : Object
+ {
+ const void* weakPointer;
+ }
+
+ - initWithPointer:(const void*)p;
+ - (const void*)weakPointer;
+ @end
+
+
+ @implementation WeakPointer
+
+ + (void)initialize
+ {
+ class_ivar_set_gcinvisible (self, "weakPointer", YES);
+ }
+
+ - initWithPointer:(const void*)p
+ {
+ weakPointer = p;
+ return self;
+ }
+
+ - (const void*)weakPointer
+ {
+ return weakPointer;
+ }
+
+ @end
+
+ Weak pointers are supported through a new type character specifier
+represented by the `!' character. The `class_ivar_set_gcinvisible()'
+function adds or removes this specifier to the string type description
+of the instance variable named as argument.
+
+\1f
+File: gcc.info, Node: Constant string objects, Next: compatibility_alias, Prev: Garbage Collection, Up: Objective-C
+
+7.4 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.
-`-Wsequence-point'
- Warn about code that may have undefined semantics because of
- violations of sequence point rules in the C standard.
-
- The C standard defines the order in which expressions in a C
- program are evaluated in terms of "sequence points", which
- represent a partial ordering between the execution of parts of the
- program: those executed before the sequence point, and those
- executed after it. These occur after the evaluation of a full
- expression (one which is not part of a larger expression), after
- the evaluation of the first operand of a `&&', `||', `? :' or `,'
- (comma) operator, before a function is called (but after the
- evaluation of its arguments and the expression denoting the called
- function), and in certain other places. Other than as expressed
- by the sequence point rules, the order of evaluation of
- subexpressions of an expression is not specified. All these rules
- describe only a partial order rather than a total order, since,
- for example, if two functions are called within one expression
- with no sequence point between them, the order in which the
- functions are called is not specified. However, the standards
- committee have ruled that function calls do not overlap.
-
- It is not specified when between sequence points modifications to
- the values of objects take effect. Programs whose behavior
- depends on this have undefined behavior; the C standard specifies
- that "Between the previous and next sequence point an object shall
- have its stored value modified at most once by the evaluation of
- an expression. Furthermore, the prior value shall be read only to
- determine the value to be stored.". If a program breaks these
- rules, the results on any particular implementation are entirely
- unpredictable.
-
- Examples of code with undefined behavior are `a = a++;', `a[n] =
- b[n++]' and `a[i++] = i;'. Some more complicated cases are not
- diagnosed by this option, and it may give an occasional false
- positive result, but in general it has been found fairly effective
- at detecting this sort of problem in programs.
-
- The present implementation of this option only works for C
- programs. A future implementation may also work for C++ programs.
-
- The C standard is worded confusingly, therefore there is some
- debate over the precise meaning of the sequence point rules in
- subtle cases. Links to discussions of the problem, including
- proposed formal definitions, may be found on our readings page, at
- `http://gcc.gnu.org/readings.html'.
-
-`-Wreturn-type'
- Warn whenever a function is defined with a return-type that
- defaults to `int'. Also warn about any `return' statement with no
- return-value in a function whose return-type is not `void'.
-
- For C++, a function without return type always produces a
- diagnostic message, even when `-Wno-return-type' is specified.
- The only exceptions are `main' and functions defined in system
- headers.
-
-`-Wswitch'
- Warn whenever a `switch' statement has an index of enumeral type
- and lacks a `case' for one or more of the named codes of that
- enumeration. (The presence of a `default' label prevents this
- warning.) `case' labels outside the enumeration range also
- provoke warnings when this option is used.
-
-`-Wtrigraphs'
- Warn if any trigraphs are encountered that might change the
- meaning of the program (trigraphs within comments are not warned
- about).
-
-`-Wunused-function'
- Warn whenever a static function is declared but not defined or a
- non\-inline static function is unused.
-
-`-Wunused-label'
- Warn whenever a label is declared but not used.
-
- To suppress this warning use the `unused' attribute (*note
- Variable Attributes::).
-
-`-Wunused-parameter'
- Warn whenever a function parameter is unused aside from its
- declaration.
-
- To suppress this warning use the `unused' attribute (*note
- Variable Attributes::).
-
-`-Wunused-variable'
- Warn whenever a local variable or non-constant static variable is
- unused aside from its declaration
-
- To suppress this warning use the `unused' attribute (*note
- Variable Attributes::).
-
-`-Wunused-value'
- Warn whenever a statement computes a result that is explicitly not
- used.
-
- To suppress this warning cast the expression to `void'.
-
-`-Wunused'
- All all the above `-Wunused' options combined.
-
- In order to get a warning about an unused function parameter, you
- must either specify `-W -Wunused' or separately specify
- `-Wunused-parameter'.
-
-`-Wuninitialized'
- Warn if an automatic variable is used without first being
- initialized or if a variable may be clobbered by a `setjmp' call.
-
- These warnings are possible only in optimizing compilation,
- because they require data flow information that is computed only
- when optimizing. If you don't specify `-O', you simply won't get
- these warnings.
-
- These warnings occur only for variables that are candidates for
- register allocation. Therefore, they do not occur for a variable
- that is declared `volatile', or whose address is taken, or whose
- size is other than 1, 2, 4 or 8 bytes. Also, they do not occur for
- structures, unions or arrays, even when they are in registers.
-
- Note that there may be no warning about a variable that is used
- only to compute a value that itself is never used, because such
- computations may be deleted by data flow analysis before the
- warnings are printed.
-
- These warnings are made optional because GCC is not smart enough
- to see all the reasons why the code might be correct despite
- appearing to have an error. Here is one example of how this can
- happen:
+ 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.
+
+\1f
+File: gcc.info, Node: compatibility_alias, Prev: Constant string objects, Up: Objective-C
+
+7.5 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.
+
+
+\1f
+File: gcc.info, Node: Compatibility, Next: Gcov, Prev: Objective-C, Up: Top
+
+8 Binary Compatibility
+**********************
+
+Binary compatibility encompasses several related concepts:
+
+"application binary interface (ABI)"
+ The set of runtime conventions followed by all of the tools that
+ deal with binary representations of a program, including
+ compilers, assemblers, linkers, and language runtime support.
+ Some ABIs are formal with a written specification, possibly
+ designed by multiple interested parties. Others are simply the
+ way things are actually done by a particular set of tools.
+
+"ABI conformance"
+ A compiler conforms to an ABI if it generates code that follows
+ all of the specifications enumerated by that ABI. A library
+ conforms to an ABI if it is implemented according to that ABI. An
+ application conforms to an ABI if it is built using tools that
+ conform to that ABI and does not contain source code that
+ specifically changes behavior specified by the ABI.
+
+"calling conventions"
+ Calling conventions are a subset of an ABI that specify of how
+ arguments are passed and function results are returned.
+
+"interoperability"
+ Different sets of tools are interoperable if they generate files
+ that can be used in the same program. The set of tools includes
+ compilers, assemblers, linkers, libraries, header files, startup
+ files, and debuggers. Binaries produced by different sets of
+ tools are not interoperable unless they implement the same ABI.
+ This applies to different versions of the same tools as well as
+ tools from different vendors.
+
+"intercallability"
+ Whether a function in a binary built by one set of tools can call a
+ function in a binary built by a different set of tools is a subset
+ of interoperability.
+
+"implementation-defined features"
+ Language standards include lists of implementation-defined
+ features whose behavior can vary from one implementation to
+ another. Some of these features are normally covered by a
+ platform's ABI and others are not. The features that are not
+ covered by an ABI generally affect how a program behaves, but not
+ intercallability.
+
+"compatibility"
+ Conformance to the same ABI and the same behavior of
+ implementation-defined features are both relevant for
+ compatibility.
+
+ The application binary interface implemented by a C or C++ compiler
+affects code generation and runtime support for:
+
+ * size and alignment of data types
+
+ * layout of structured types
+
+ * calling conventions
+
+ * register usage conventions
+
+ * interfaces for runtime arithmetic support
+
+ * object file formats
+
+ In addition, the application binary interface implemented by a C++
+compiler affects code generation and runtime support for:
+ * name mangling
+
+ * exception handling
+
+ * invoking constructors and destructors
+
+ * layout, alignment, and padding of classes
+
+ * layout and alignment of virtual tables
+
+ Some GCC compilation options cause the compiler to generate code that
+does not conform to the platform's default ABI. Other options cause
+different program behavior for implementation-defined features that are
+not covered by an ABI. These options are provided for consistency with
+other compilers that do not follow the platform's default ABI or the
+usual behavior of implementation-defined features for the platform. Be
+very careful about using such options.
+
+ Most platforms have a well-defined ABI that covers C code, but ABIs
+that cover C++ functionality are not yet common.
+
+ Starting with GCC 3.2, GCC binary conventions for C++ are based on a
+written, vendor-neutral C++ ABI that was designed to be specific to
+64-bit Itanium but also includes generic specifications that apply to
+any platform. This C++ ABI is also implemented by other compiler
+vendors on some platforms, notably GNU/Linux and BSD systems. We have
+tried hard to provide a stable ABI that will be compatible with future
+GCC releases, but it is possible that we will encounter problems that
+make this difficult. Such problems could include different
+interpretations of the C++ ABI by different vendors, bugs in the ABI, or
+bugs in the implementation of the ABI in different compilers. GCC's
+`-Wabi' switch warns when G++ generates code that is probably not
+compatible with the C++ ABI.
+
+ The C++ library used with a C++ compiler includes the Standard C++
+Library, with functionality defined in the C++ Standard, plus language
+runtime support. The runtime support is included in a C++ ABI, but
+there is no formal ABI for the Standard C++ Library. Two
+implementations of that library are interoperable if one follows the
+de-facto ABI of the other and if they are both built with the same
+compiler, or with compilers that conform to the same ABI for C++
+compiler and runtime support.
+
+ When G++ and another C++ compiler conform to the same C++ ABI, but
+the implementations of the Standard C++ Library that they normally use
+do not follow the same ABI for the Standard C++ Library, object files
+built with those compilers can be used in the same program only if they
+use the same C++ library. This requires specifying the location of the
+C++ library header files when invoking the compiler whose usual library
+is not being used. The location of GCC's C++ header files depends on
+how the GCC build was configured, but can be seen by using the G++ `-v'
+option. With default configuration options for G++ 3.2 the compile
+line for a different C++ compiler needs to include
+
+ -IGCC_INSTALL_DIRECTORY/include/c++/3.2
+
+ Similarly, compiling code with G++ that must use a C++ library other
+than the GNU C++ library requires specifying the location of the header
+files for that other library.
+
+ The most straightforward way to link a program to use a particular
+C++ library is to use a C++ driver that specifies that C++ library by
+default. The `g++' driver, for example, tells the linker where to find
+GCC's C++ library (`libstdc++') plus the other libraries and startup
+files it needs, in the proper order.
+
+ If a program must use a different C++ library and it's not possible
+to do the final link using a C++ driver that uses that library by
+default, it is necessary to tell `g++' the location and name of that
+library. It might also be necessary to specify different startup files
+and other runtime support libraries, and to suppress the use of GCC's
+support libraries with one or more of the options `-nostdlib',
+`-nostartfiles', and `-nodefaultlibs'.
+
+\1f
+File: gcc.info, Node: Gcov, Next: Trouble, Prev: Compatibility, Up: Top
+
+9 `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.
+
+\1f
+File: gcc.info, Node: Gcov Intro, Next: Invoking Gcov, Up: Gcov
+
+9.1 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.
+
+\1f
+File: gcc.info, Node: Invoking Gcov, Next: Gcov and Optimization, Prev: Gcov Intro, Up: Gcov
+
+9.2 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.
+
+\1f
+File: gcc.info, Node: Gcov and Optimization, Next: Gcov Data Files, Prev: Invoking Gcov, Up: Gcov
+
+9.3 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.
+
+\1f
+File: gcc.info, Node: Gcov Data Files, Prev: Gcov and Optimization, Up: Gcov
+
+9.4 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.
+
+\1f
+File: gcc.info, Node: Trouble, Next: Bugs, Prev: Gcov, Up: Top
+
+10 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.
+
+\1f
+File: gcc.info, Node: Actual Bugs, Next: Cross-Compiler Problems, Up: Trouble
+
+10.1 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.
+
+\1f
+File: gcc.info, Node: Cross-Compiler Problems, Next: Interoperation, Prev: Actual Bugs, Up: Trouble
+
+10.2 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.
+
+\1f
+File: gcc.info, Node: Interoperation, Next: External Bugs, Prev: Cross-Compiler Problems, Up: Trouble
+
+10.3 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.
+
+ * On many platforms, GCC supports a different ABI for C++ than do
+ other compilers, so the object files compiled by GCC cannot be
+ used with object files generated by another C++ compiler.
+
+ An area where the difference is most apparent is name mangling.
+ The use of different name mangling 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)
{
- int x;
- switch (y)
- {
- case 1: x = 1;
- break;
- case 2: x = 4;
- break;
- case 3: x = 5;
- }
- foo (x);
+ 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;
}
- If the value of `y' is always 1, 2 or 3, then `x' is always
- initialized, but GCC doesn't know this. Here is another common
- case:
+ 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'.
+\1f
+File: gcc.info, Node: External Bugs, Next: Incompatibilities, Prev: Interoperation, Up: Trouble
+
+10.4 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
+
+\1f
+File: gcc.info, Node: Incompatibilities, Next: Fixed Headers, Prev: External Bugs, Up: Trouble
+
+10.5 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 save_y;
- if (change_y) save_y = y, y = new_y;
- ...
- if (change_y) y = save_y;
+ int a, b;
+
+ a = fun1 ();
+ if (setjmp (j))
+ return a;
+
+ a = fun2 ();
+ /* `longjmp (j)' may occur in `fun3'. */
+ return a + fun3 ();
}
- This has no bug because `save_y' is used only if it is set.
-
- This option also warns when a non-volatile automatic variable
- might be changed by a call to `longjmp'. These warnings as well
- are possible only in optimizing compilation.
-
- The compiler sees only the calls to `setjmp'. It cannot know
- where `longjmp' will be called; in fact, a signal handler could
- call it at any point in the code. As a result, you may get a
- warning even when there is in fact no problem because `longjmp'
- cannot in fact be called at the place which would cause a problem.
-
- Some spurious warnings can be avoided if you declare all the
- functions you use that never return as `noreturn'. *Note Function
- Attributes::.
-
-`-Wreorder (C++ only)'
- Warn when the order of member initializers given in the code does
- not match the order in which they must be executed. For instance:
-
-`-Wunknown-pragmas'
- Warn when a #pragma directive is encountered which is not
- understood by GCC. If this command line option is used, warnings
- will even be issued for unknown pragmas in system header files.
- This is not the case if the warnings were only enabled by the
- `-Wall' command line option.
-
-`-Wall'
- All of the above `-W' options combined. This enables all the
- warnings about constructions that some users consider
- questionable, and that are easy to avoid (or modify to prevent the
- warning), even in conjunction with macros.
-
-`-Wdiv-by-zero'
- Warn about compile-time integer division by zero. This is
- default. To inhibit the warning messages, use `-Wno-div-by-zero'.
- Floating point division by zero is not warned about, as it can be
- a legitimate way of obtaining infinities and NaNs.
-
-`-Wmultichar'
- Warn if a multicharacter constant (`'FOOF'') is used. This is
- default. To inhibit the warning messages, use `-Wno-multichar'.
- Usually they indicate a typo in the user's code, as they have
- implementation-defined values, and should not be used in portable
- code.
-
-`-Wsystem-headers'
- Print warning messages for constructs found in system header files.
- Warnings from system headers are normally suppressed, on the
- assumption that they usually do not indicate real problems and
- would only make the compiler output harder to read. Using this
- command line option tells GCC to emit warnings from system headers
- as if they occurred in user code. However, note that using
- `-Wall' in conjunction with this option will _not_ warn about
- unknown pragmas in system headers--for that, `-Wunknown-pragmas'
- must also be used.
-
- The following `-W...' options are not implied by `-Wall'. Some of
-them warn about constructions that users generally do not consider
-questionable, but which occasionally you might wish to check for;
-others warn about constructions that are necessary or hard to avoid in
-some cases, and there is no simple way to modify the code to suppress
-the warning.
-
-`-W'
- Print extra warning messages for these events:
-
- * A function can return either with or without a value.
- (Falling off the end of the function body is considered
- returning without a value.) For example, this function would
- evoke such a warning:
-
- foo (a)
- {
- if (a > 0)
- return a;
- }
-
- * An expression-statement or the left-hand side of a comma
- expression contains no side effects. To suppress the
- warning, cast the unused expression to void. For example, an
- expression such as `x[i,j]' will cause a warning, but
- `x[(void)i,j]' will not.
-
- * An unsigned value is compared against zero with `<' or `<='.
-
- * A comparison like `x<=y<=z' appears; this is equivalent to
- `(x<=y ? 1 : 0) <= z', which is a different interpretation
- from that of ordinary mathematical notation.
-
- * Storage-class specifiers like `static' are not the first
- things in a declaration. According to the C Standard, this
- usage is obsolescent.
-
- * The return type of a function has a type qualifier such as
- `const'. Such a type qualifier has no effect, since the
- value returned by a function is not an lvalue. (But don't
- warn about the GNU extension of `volatile void' return types.
- That extension will be warned about if `-pedantic' is
- specified.)
-
- * If `-Wall' or `-Wunused' is also specified, warn about unused
- arguments.
-
- * A comparison between signed and unsigned values could produce
- an incorrect result when the signed value is converted to
- unsigned. (But don't warn if `-Wno-sign-compare' is also
- specified.)
-
- * An aggregate has a partly bracketed initializer. For
- example, the following code would evoke such a warning,
- because braces are missing around the initializer for `x.h':
-
- struct s { int f, g; };
- struct t { struct s h; int i; };
- struct t x = { 1, 2, 3 };
-
- * An aggregate has an initializer which does not initialize all
- members. For example, the following code would cause such a
- warning, because `x.h' would be implicitly initialized to
- zero:
-
- struct s { int f, g, h; };
- struct s x = { 3, 4 };
-
-`-Wfloat-equal'
- Warn if floating point values are used in equality comparisons.
-
- The idea behind this is that sometimes it is convenient (for the
- programmer) to consider floating-point values as approximations to
- infinitely precise real numbers. If you are doing this, then you
- need to compute (by analysing the code, or in some other way) the
- maximum or likely maximum error that the computation introduces,
- and allow for it when performing comparisons (and when producing
- output, but that's a different problem). In particular, instead
- of testing for equality, you would check to see whether the two
- values have ranges that overlap; and this is done with the
- relational operators, so equality comparisons are probably
- mistaken.
-
-`-Wtraditional (C only)'
- Warn about certain constructs that behave differently in
- traditional and ISO C. Also warn about ISO C constructs that have
- no traditional C equivalent, and/or problematic constructs which
- should be avoided.
-
- * Macro parameters that appear within string literals in the
- macro body. In traditional C macro replacement takes place
- within string literals, but does not in ISO C.
-
- * In traditional C, some preprocessor directives did not exist.
- Traditional preprocessors would only consider a line to be a
- directive if the `#' appeared in column 1 on the line.
- Therefore `-Wtraditional' warns about directives that
- traditional C understands but would ignore because the `#'
- does not appear as the first character on the line. It also
- suggests you hide directives like `#pragma' not understood by
- traditional C by indenting them. Some traditional
- implementations would not recognize `#elif', so it suggests
- avoiding it altogether.
-
- * A function-like macro that appears without arguments.
-
- * The unary plus operator.
-
- * The `U' integer constant suffix, or the `F' or `L' floating
- point constant suffixes. (Traditional C does support the `L'
- suffix on integer constants.) Note, these suffixes appear in
- macros defined in the system headers of most modern systems,
- e.g. the `_MIN'/`_MAX' macros in `<limits.h>'. Use of these
- macros in user code might normally lead to spurious warnings,
- however gcc's integrated preprocessor has enough context to
- avoid warning in these cases.
-
- * A function declared external in one block and then used after
- the end of the block.
-
- * A `switch' statement has an operand of type `long'.
-
- * A non-`static' function declaration follows a `static' one.
- This construct is not accepted by some traditional C
- compilers.
-
- * The ISO type of an integer constant has a different width or
- signedness from its traditional type. This warning is only
- issued if the base of the constant is ten. I.e. hexadecimal
- or octal values, which typically represent bit patterns, are
- not warned about.
-
- * Usage of ISO string concatenation is detected.
-
- * Initialization of automatic aggregates.
-
- * Identifier conflicts with labels. Traditional C lacks a
- separate namespace for labels.
-
- * Initialization of unions. If the initializer is zero, the
- warning is omitted. This is done under the assumption that
- the zero initializer in user code appears conditioned on e.g.
- `__STDC__' to avoid missing initializer warnings and relies
- on default initialization to zero in the traditional C case.
-
- * Conversions by prototypes between fixed/floating point values
- and vice versa. The absence of these prototypes when
- compiling with traditional C would cause serious problems.
- This is a subset of the possible conversion warnings, for the
- full set use `-Wconversion'.
-
-`-Wundef'
- Warn if an undefined identifier is evaluated in an `#if' directive.
-
-`-Wshadow'
- Warn whenever a local variable shadows another local variable,
- parameter or global variable or whenever a built-in function is
- shadowed.
-
-`-Wlarger-than-LEN'
- Warn whenever an object of larger than LEN bytes is defined.
-
-`-Wpointer-arith'
- Warn about anything that depends on the "size of" a function type
- or of `void'. GNU C assigns these types a size of 1, for
- convenience in calculations with `void *' pointers and pointers to
- functions.
-
-`-Wbad-function-cast (C only)'
- Warn whenever a function call is cast to a non-matching type. For
- example, warn if `int malloc()' is cast to `anything *'.
-
-`-Wcast-qual'
- Warn whenever a pointer is cast so as to remove a type qualifier
- from the target type. For example, warn if a `const char *' is
- cast to an ordinary `char *'.
-
-`-Wcast-align'
- Warn whenever a pointer is cast such that the required alignment
- of the target is increased. For example, warn if a `char *' is
- cast to an `int *' on machines where integers can only be accessed
- at two- or four-byte boundaries.
-
-`-Wwrite-strings'
- When compiling C, give string constants the type `const
- char[LENGTH]' so that copying the address of one into a
- non-`const' `char *' pointer will get a warning; when compiling
- C++, warn about the deprecated conversion from string constants to
- `char *'. These warnings will help you find at compile time code
- that can try to write into a string constant, but only if you have
- been very careful about using `const' in declarations and
- prototypes. Otherwise, it will just be a nuisance; this is why we
- did not make `-Wall' request these warnings.
-
-`-Wconversion'
- Warn if a prototype causes a type conversion that is different
- from what would happen to the same argument in the absence of a
- prototype. This includes conversions of fixed point to floating
- and vice versa, and conversions changing the width or signedness
- of a fixed point argument except when the same as the default
- promotion.
-
- Also, warn if a negative integer constant expression is implicitly
- converted to an unsigned type. For example, warn about the
- assignment `x = -1' if `x' is unsigned. But do not warn about
- explicit casts like `(unsigned) -1'.
-
-`-Wsign-compare'
- Warn when a comparison between signed and unsigned values could
- produce an incorrect result when the signed value is converted to
- unsigned. This warning is also enabled by `-W'; to get the other
- warnings of `-W' without this warning, use `-W -Wno-sign-compare'.
-
-`-Waggregate-return'
- Warn if any functions that return structures or unions are defined
- or called. (In languages where you can return an array, this also
- elicits a warning.)
-
-`-Wstrict-prototypes (C only)'
- Warn if a function is declared or defined without specifying the
- argument types. (An old-style function definition is permitted
- without a warning if preceded by a declaration which specifies the
- argument types.)
-
-`-Wmissing-prototypes (C only)'
- Warn if a global function is defined without a previous prototype
- declaration. This warning is issued even if the definition itself
- provides a prototype. The aim is to detect global functions that
- fail to be declared in header files.
-
-`-Wmissing-declarations'
- Warn if a global function is defined without a previous
- declaration. Do so even if the definition itself provides a
- prototype. Use this option to detect global functions that are
- not declared in header files.
-
-`-Wmissing-noreturn'
- Warn about functions which might be candidates for attribute
- `noreturn'. Note these are only possible candidates, not absolute
- ones. Care should be taken to manually verify functions actually
- do not ever return before adding the `noreturn' attribute,
- otherwise subtle code generation bugs could be introduced. You
- will not get a warning for `main' in hosted C environments.
-
-`-Wmissing-format-attribute'
- If `-Wformat' is enabled, also warn about functions which might be
- candidates for `format' attributes. Note these are only possible
- candidates, not absolute ones. GCC will guess that `format'
- attributes might be appropriate for any function that calls a
- function like `vprintf' or `vscanf', but this might not always be
- the case, and some functions for which `format' attributes are
- appropriate may not be detected. This option has no effect unless
- `-Wformat' is enabled (possibly by `-Wall').
-
-`-Wno-deprecated-declarations'
- Do not warn about uses of functions, variables, and types marked as
- deprecated by using the `deprecated' attribute. (*note Function
- Attributes::, *note Variable Attributes::, *note Type
- Attributes::.)
-
-`-Wpacked'
- Warn if a structure is given the packed attribute, but the packed
- attribute has no effect on the layout or size of the structure.
- Such structures may be mis-aligned for little benefit. For
- instance, in this code, the variable `f.x' in `struct bar' will be
- misaligned even though `struct bar' does not itself have the
- packed attribute:
-
- struct foo {
- int x;
- char a, b, c, d;
- } __attribute__((packed));
- struct bar {
- char z;
- struct foo f;
- };
+ 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 (`<time.h>' 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.
+
+\1f
+File: gcc.info, Node: Fixed Headers, Next: Standard Libraries, Prev: Incompatibilities, Up: Trouble
+
+10.6 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.
+
+\1f
+File: gcc.info, Node: Standard Libraries, Next: Disappointments, Prev: Fixed Headers, Up: Trouble
+
+10.7 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.
+
+\1f
+File: gcc.info, Node: Disappointments, Next: C++ Misunderstandings, Prev: Standard Libraries, Up: Trouble
+
+10.8 Disappointments and Misunderstandings
+==========================================
+
+These problems are perhaps regrettable, but we don't know any practical
+way around them.
+
+ * Certain local variables aren't recognized by debuggers when you
+ compile with optimization.
+
+ This occurs because sometimes GCC optimizes the variable out of
+ existence. There is no way to tell the debugger how to compute the
+ value such a variable "would have had", and it is not clear that
+ would be desirable anyway. So GCC simply does not mention the
+ eliminated variable when it writes debugging information.
+
+ You have to expect a certain amount of disagreement between the
+ executable and your source code, when you use optimization.
+
+ * Users often think it is a bug when GCC reports an error for code
+ like this:
+
+ int foo (struct mumble *);
+
+ struct mumble { ... };
+
+ int foo (struct mumble *x)
+ { ... }
+
+ This code really is erroneous, because the scope of `struct
+ mumble' in the prototype is limited to the argument list
+ containing it. It does not refer to the `struct mumble' defined
+ with file scope immediately below--they are two unrelated types
+ with similar names in different scopes.
+
+ But in the definition of `foo', the file-scope type is used
+ because that is available to be inherited. Thus, the definition
+ and the prototype do not match, and you get an error.
+
+ This behavior may seem silly, but it's what the ISO standard
+ specifies. It is easy enough for you to make your code work by
+ moving the definition of `struct mumble' above the prototype.
+ It's not worth being incompatible with ISO C just to avoid an
+ error for the example shown above.
+
+ * Accesses to bit-fields even in volatile objects works by accessing
+ larger objects, such as a byte or a word. You cannot rely on what
+ size of object is accessed in order to read or write the
+ bit-field; it may even vary for a given bit-field according to the
+ precise usage.
+
+ If you care about controlling the amount of memory that is
+ accessed, use volatile but do not use bit-fields.
+
+ * GCC comes with shell scripts to fix certain known problems in
+ system header files. They install corrected copies of various
+ header files in a special directory where only GCC will normally
+ look for them. The scripts adapt to various systems by searching
+ all the system header files for the problem cases that we know
+ about.
+
+ If new system header files are installed, nothing automatically
+ arranges to update the corrected header files. You will have to
+ reinstall GCC to fix the new header files. More specifically, go
+ to the build directory and delete the files `stmp-fixinc' and
+ `stmp-headers', and the subdirectory `include'; then do `make
+ install' again.
+
+ * On 68000 and x86 systems, for instance, you can get paradoxical
+ results if you test the precise values of floating point numbers.
+ For example, you can find that a floating point value which is not
+ a NaN is not equal to itself. This results from the fact that the
+ floating point registers hold a few more bits of precision than
+ fit in a `double' in memory. Compiled code moves values between
+ memory and floating point registers at its convenience, and moving
+ them into memory truncates them.
+
+ You can partially avoid this problem by using the `-ffloat-store'
+ option (*note Optimize Options::).
+
+ * On the MIPS, variable argument functions using `varargs.h' cannot
+ have a floating point value for the first argument. The reason
+ for this is that in the absence of a prototype in scope, if the
+ first argument is a floating point, it is passed in a floating
+ point register, rather than an integer register.
+
+ If the code is rewritten to use the ISO standard `stdarg.h' method
+ of variable arguments, and the prototype is in scope at the time
+ of the call, everything will work fine.
+
+ * On the H8/300 and H8/300H, variable argument functions must be
+ implemented using the ISO standard `stdarg.h' method of variable
+ arguments. Furthermore, calls to functions using `stdarg.h'
+ variable arguments must have a prototype for the called function
+ in scope at the time of the call.
+
+ * On AIX and other platforms without weak symbol support, templates
+ need to be instantiated explicitly and symbols for static members
+ of templates will not be generated.
+
+\1f
+File: gcc.info, Node: C++ Misunderstandings, Next: Protoize Caveats, Prev: Disappointments, Up: Trouble
-`-Wpadded'
- Warn if padding is included in a structure, either to align an
- element of the structure or to align the whole structure.
- Sometimes when this happens it is possible to rearrange the fields
- of the structure to reduce the padding and so make the structure
- smaller.
-
-`-Wredundant-decls'
- Warn if anything is declared more than once in the same scope,
- even in cases where multiple declaration is valid and changes
- nothing.
-
-`-Wnested-externs (C only)'
- Warn if an `extern' declaration is encountered within a function.
-
-`-Wunreachable-code'
- Warn if the compiler detects that code will never be executed.
-
- This option is intended to warn when the compiler detects that at
- least a whole line of source code will never be executed, because
- some condition is never satisfied or because it is after a
- procedure that never returns.
-
- It is possible for this option to produce a warning even though
- there are circumstances under which part of the affected line can
- be executed, so care should be taken when removing
- apparently-unreachable code.
-
- For instance, when a function is inlined, a warning may mean that
- the line is unreachable in only one inlined copy of the function.
-
- This option is not made part of `-Wall' because in a debugging
- version of a program there is often substantial code which checks
- correct functioning of the program and is, hopefully, unreachable
- because the program does work. Another common use of unreachable
- code is to provide behavior which is selectable at compile-time.
-
-`-Winline'
- Warn if a function can not be inlined and it was declared as
- inline.
-
-`-Wlong-long'
- Warn if `long long' type is used. This is default. To inhibit
- the warning messages, use `-Wno-long-long'. Flags `-Wlong-long'
- and `-Wno-long-long' are taken into account only when `-pedantic'
- flag is used.
-
-`-Wdisabled-optimization'
- Warn if a requested optimization pass is disabled. This warning
- does not generally indicate that there is anything wrong with your
- code; it merely indicates that GCC's optimizers were unable to
- handle the code effectively. Often, the problem is that your code
- is too big or too complex; GCC will refuse to optimize programs
- when the optimization itself is likely to take inordinate amounts
- of time.
-
-`-Werror'
- Make all warnings into errors.
+10.9 Common Misunderstandings with GNU C++
+==========================================
+
+C++ is a complex language and an evolving one, and its standard
+definition (the ISO C++ standard) was only recently completed. As a
+result, your C++ compiler may occasionally surprise you, even when its
+behavior is correct. This section discusses some areas that frequently
+give rise to questions of this sort.
+
+* Menu:
+
+* Static Definitions:: Static member declarations are not definitions
+* Temporaries:: Temporaries may vanish before you expect
+* Copy Assignment:: Copy Assignment operators copy virtual bases twice
+
+\1f
+File: gcc.info, Node: Static Definitions, Next: Temporaries, Up: C++ Misunderstandings
+
+10.9.1 Declare _and_ Define Static Members
+------------------------------------------
+
+When a class has static data members, it is not enough to _declare_ the
+static member; you must also _define_ it. For example:
+
+ class Foo
+ {
+ ...
+ void method();
+ static int bar;
+ };
+
+ This declaration only establishes that the class `Foo' has an `int'
+named `Foo::bar', and a member function named `Foo::method'. But you
+still need to define _both_ `method' and `bar' elsewhere. According to
+the ISO standard, you must supply an initializer in one (and only one)
+source file, such as:
+
+ int Foo::bar = 0;
+
+ Other C++ compilers may not correctly implement the standard
+behavior. As a result, when you switch to `g++' from one of these
+compilers, you may discover that a program that appeared to work
+correctly in fact does not conform to the standard: `g++' reports as
+undefined symbols any static data members that lack definitions.
+
+\1f
+File: gcc.info, Node: Temporaries, Next: Copy Assignment, Prev: Static Definitions, Up: C++ Misunderstandings
+
+10.9.2 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 ());
+
+\1f
+File: gcc.info, Node: Copy Assignment, Prev: Temporaries, Up: C++ Misunderstandings
+
+10.9.3 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.
+
+\1f
+File: gcc.info, Node: Protoize Caveats, Next: Non-bugs, Prev: C++ Misunderstandings, Up: Trouble
+
+10.10 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. ISO 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 recommend 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.)
+
+\1f
+File: gcc.info, Node: Non-bugs, Next: Warnings and Errors, Prev: Protoize Caveats, Up: Trouble
+
+10.11 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 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.
+
+ * 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 bit-fields unsigned by default on particular machines where
+ "the ABI standard" says to do so.
+
+ The ISO C standard leaves it up to the implementation whether a
+ bit-field 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 bit-fields 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
+ bit-fields as well.
+
+ Some computer manufacturers have published Application Binary
+ Interface standards which specify that plain bit-fields should be
+ unsigned. It is a mistake, however, to say anything about this
+ issue in an ABI. This is because the handling of plain bit-fields
+ distinguishes two dialects of C. Both dialects are meaningful on
+ every type of machine. Whether a particular object file was
+ compiled using signed bit-fields or unsigned is of no concern to
+ other object files, even if they access the same bit-fields 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 bit-fields
+ 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 bit-fields in the same
+ fashion on all types of machines (by default).
+
+ There are some arguments for making bit-fields 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 bit-field 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 ISO C, such as function
+ prototypes or ISO token concatenation. Since plain `gcc' supports
+ all the features of ISO 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 ISO C program, because the ISO 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 ISO C library.
+
+ Sometimes people say that defining `__STDC__' in a compiler that
+ does not completely conform to the ISO C standard somehow violates
+ the standard. This is illogical. The standard is a standard for
+ compilers that claim to support ISO C, such as `gcc -ansi'--not
+ for other compilers such as plain `gcc'. Whatever the ISO 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, or a `-std'
+ option for strict conformance to some version of ISO C. 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 ISO 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 ISO 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 ISO 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.
+
+ * Making certain warnings into errors by default.
+
+ Some ISO C testsuites report failure when the compiler does not
+ produce an error message for a certain program.
+
+ ISO C requires a "diagnostic" message for certain kinds of invalid
+ programs, but a warning is defined by GCC to count as a
+ diagnostic. If GCC produces a warning but not an error, that is
+ correct ISO C support. If test suites call this "failure", they
+ should be run with the GCC option `-pedantic-errors', which will
+ turn these warnings into errors.
+
+
+\1f
+File: gcc.info, Node: Warnings and Errors, Prev: Non-bugs, Up: Trouble
+
+10.12 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-ISO constructs get warnings or errors.
+
+ *Note Options to Request or Suppress Warnings: Warning Options, for
+more detail on these and related command-line options.
+
+\1f
+File: gcc.info, Node: Bugs, Next: Service, Prev: Trouble, Up: Top
+
+11 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.
+* GNATS: gccbug. You can use a bug reporting tool.
+* Known: Trouble. Known problems.
+* Help: Service. Where to ask for help.
+
+\1f
+File: gcc.info, Node: Bug Criteria, Next: Bug Lists, Up: Bugs
+
+11.1 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 one of the languages GCC
+ supports, your suggestions for improvement of GCC are welcome in
+ any case.
+
+\1f
+File: gcc.info, Node: Bug Lists, Next: Bug Reporting, Prev: Bug Criteria, Up: Bugs
+
+11.2 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 `http://gcc.gnu.org/bugs.html' for additional and/or
+more up-to-date bug reporting instructions before you post a bug report.
+
+\1f
+File: gcc.info, Node: Bug Reporting, Next: gccbug, Prev: Bug Lists, Up: Bugs
+
+11.3 How to Report Bugs
+=======================
+
+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.
+
+ See `http://gcc.gnu.org/contribute.html' 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.
+
+\1f
+File: gcc.info, Node: gccbug, Prev: Bug Reporting, Up: Bugs
+
+11.4 The gccbug script
+======================
+
+To simplify creation of bug reports, and to allow better tracking of
+reports, we use the GNATS bug tracking system. Part of that system is
+the `gccbug' script. This is a Unix shell script, so you need a shell
+to run it. It is normally installed in the same directory where `gcc'
+is installed.
+
+ The gccbug script is derived from send-pr, *note Creating new
+Problem Reports: (send-pr)using send-pr. When invoked, it starts a
+text editor so you can fill out the various fields of the report. When
+the you quit the editor, the report is automatically send to the bug
+reporting address.
+
+ A number of fields in this bug report form are specific to GCC, and
+are explained at `http://gcc.gnu.org/gnats.html'.
+
+\1f
+File: gcc.info, Node: Service, Next: Contributing, Prev: Bugs, Up: Top
+
+12 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-help@gcc.gnu.org> (for help installing or using GCC), and if
+ that brings no response, try <gcc@gcc.gnu.org>. For help changing
+ GCC, ask <gcc@gcc.gnu.org>. If you think you have found a bug in
+ GCC, please report it following the instructions at *note Bug
+ Reporting::.
+
+ * Look in the service directory for someone who might help you for a
+ fee. The service directory is found at
+ `http://www.gnu.org/prep/service.html'.
+
+\1f
+File: gcc.info, Node: Contributing, Next: VMS, Prev: Service, Up: Top
+
+13 Contributing to GCC Development
+**********************************
+
+If you would like to help pretest GCC releases to assure they work well,
+our current development sources are available by CVS (see
+`http://gcc.gnu.org/cvs.html'). Source and binary snapshots are also
+available for FTP; see `http://gcc.gnu.org/snapshots.html'.
+
+ If you would like to work on improvements to GCC, please read the
+advice at these URLs:
+
+ `http://gcc.gnu.org/contribute.html'
+ `http://gcc.gnu.org/contributewhy.html'
+
+for information on how to make useful contributions and avoid
+duplication of effort. Suggested projects are listed at
+`http://gcc.gnu.org/projects/'.
+
+\1f
+File: gcc.info, Node: VMS, Next: Funding, Prev: Contributing, Up: Top
+
+14 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.
+
+\1f
+File: gcc.info, Node: Include Files and VMS, Next: Global Declarations, Up: VMS
+
+14.1 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 ISO 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.
+
+\1f
+File: gcc.info, Node: Global Declarations, Next: VMS Misc, Prev: Include Files and VMS, Up: VMS
+
+14.2 Global Declarations and VMS
+================================
+
+GCC does not provide the `globalref', `globaldef' and `globalvalue'
+keywords of VAX-C. You can get the same effect with an obscure feature
+of GAS, the GNU assembler. (This requires GAS version 1.39 or later.)
+The following macros allow you to use this feature in a fairly natural
+way:
+
+ #ifdef __GNUC__
+ #define GLOBALREF(TYPE,NAME) \
+ TYPE NAME \
+ asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME)
+ #define GLOBALDEF(TYPE,NAME,VALUE) \
+ TYPE NAME \
+ asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME) \
+ = VALUE
+ #define GLOBALVALUEREF(TYPE,NAME) \
+ const TYPE NAME[1] \
+ asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME)
+ #define GLOBALVALUEDEF(TYPE,NAME,VALUE) \
+ const TYPE NAME[1] \
+ asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME) \
+ = {VALUE}
+ #else
+ #define GLOBALREF(TYPE,NAME) \
+ globalref TYPE NAME
+ #define GLOBALDEF(TYPE,NAME,VALUE) \
+ globaldef TYPE NAME = VALUE
+ #define GLOBALVALUEDEF(TYPE,NAME,VALUE) \
+ globalvalue TYPE NAME = VALUE
+ #define GLOBALVALUEREF(TYPE,NAME) \
+ globalvalue TYPE NAME
+ #endif
+
+(The `_$$PsectAttributes_GLOBALSYMBOL' prefix at the start of the name
+is removed by the assembler, after it has modified the attributes of
+the symbol). These macros are provided in the VMS binaries
+distribution in a header file `GNU_HACKS.H'. An example of the usage
+is:
+
+ GLOBALREF (int, ijk);
+ GLOBALDEF (int, jkl, 0);
+
+ The macros `GLOBALREF' and `GLOBALDEF' cannot be used
+straightforwardly for arrays, since there is no way to insert the array
+dimension into the declaration at the right place. However, you can
+declare an array with these macros if you first define a typedef for the
+array type, like this:
+
+ typedef int intvector[10];
+ GLOBALREF (intvector, foo);
+
+ Array and structure initializers will also break the macros; you can
+define the initializer to be a macro of its own, or you can expand the
+`GLOBALDEF' macro by hand. You may find a case where you wish to use
+the `GLOBALDEF' macro with a large array, but you are not interested in
+explicitly initializing each element of the array. In such cases you
+can use an initializer like: `{0,}', which will initialize the entire
+array to `0'.
+
+ A shortcoming of this implementation is that a variable declared with
+`GLOBALVALUEREF' or `GLOBALVALUEDEF' is always an array. For example,
+the declaration:
+
+ GLOBALVALUEREF(int, ijk);
+
+declares the variable `ijk' as an array of type `int [1]'. This is
+done because a globalvalue is actually a constant; its "value" is what
+the linker would normally consider an address. That is not how an
+integer value works in C, but it is how an array works. So treating
+the symbol as an array name gives consistent results--with the
+exception that the value seems to have the wrong type. *Don't try to
+access an element of the array.* It doesn't have any elements. The
+array "address" may not be the address of actual storage.
+
+ The fact that the symbol is an array may lead to warnings where the
+variable is used. Insert type casts to avoid the warnings. Here is an
+example; it takes advantage of the ISO C feature allowing macros that
+expand to use the same name as the macro itself.
+
+ GLOBALVALUEREF (int, ss$_normal);
+ GLOBALVALUEDEF (int, xyzzy,123);
+ #ifdef __GNUC__
+ #define ss$_normal ((int) ss$_normal)
+ #define xyzzy ((int) xyzzy)
+ #endif
+
+ Don't use `globaldef' or `globalref' with a variable whose type is
+an enumeration type; this is not implemented. Instead, make the
+variable an integer, and use a `globalvaluedef' for each of the
+enumeration values. An example of this would be:
+
+ #ifdef __GNUC__
+ GLOBALDEF (int, color, 0);
+ GLOBALVALUEDEF (int, RED, 0);
+ GLOBALVALUEDEF (int, BLUE, 1);
+ GLOBALVALUEDEF (int, GREEN, 3);
+ #else
+ enum globaldef color {RED, BLUE, GREEN = 3};
+ #endif
+
+\1f
+File: gcc.info, Node: VMS Misc, Prev: Global Declarations, Up: VMS
+
+14.3 Other VMS Issues
+=====================
+
+GCC automatically arranges for `main' to return 1 by default if you
+fail to specify an explicit return value. This will be interpreted by
+VMS as a status code indicating a normal successful completion.
+Version 1 of GCC did not provide this default.
+
+ GCC on VMS works only with the GNU assembler, GAS. You need version
+1.37 or later of GAS in order to produce value debugging information for
+the VMS debugger. Use the ordinary VMS linker with the object files
+produced by GAS.
+
+ Under previous versions of GCC, the generated code would occasionally
+give strange results when linked to the sharable `VAXCRTL' library.
+Now this should work.
+
+ A caveat for use of `const' global variables: the `const' modifier
+must be specified in every external declaration of the variable in all
+of the source files that use that variable. Otherwise the linker will
+issue warnings about conflicting attributes for the variable. Your
+program will still work despite the warnings, but the variable will be
+placed in writable storage.
+
+ Although the VMS linker does distinguish between upper and lower case
+letters in global symbols, most VMS compilers convert all such symbols
+into upper case and most run-time library routines also have upper case
+names. To be able to reliably call such routines, GCC (by means of the
+assembler GAS) converts global symbols into upper case like other VMS
+compilers. However, since the usual practice in C is to distinguish
+case, GCC (via GAS) tries to preserve usual C behavior by augmenting
+each name that is not all lower case. This means truncating the name
+to at most 23 characters and then adding more characters at the end
+which encode the case pattern of those 23. Names which contain at
+least one dollar sign are an exception; they are converted directly into
+upper case without augmentation.
+
+ Name augmentation yields bad results for programs that use
+precompiled libraries (such as Xlib) which were generated by another
+compiler. You can use the compiler option `/NOCASE_HACK' to inhibit
+augmentation; it makes external C functions and variables
+case-independent as is usual on VMS. Alternatively, you could write
+all references to the functions and variables in such libraries using
+lower case; this will work on VMS, but is not portable to other
+systems. The compiler option `/NAMES' also provides control over
+global name handling.
+
+ Function and variable names are handled somewhat differently with
+G++. The GNU C++ compiler performs "name mangling" on function names,
+which means that it adds information to the function name to describe
+the data types of the arguments that the function takes. One result of
+this is that the name of a function can become very long. Since the
+VMS linker only recognizes the first 31 characters in a name, special
+action is taken to ensure that each function and variable has a unique
+name that can be represented in 31 characters.
+
+ If the name (plus a name augmentation, if required) is less than 32
+characters in length, then no special action is performed. If the name
+is longer than 31 characters, the assembler (GAS) will generate a hash
+string based upon the function name, truncate the function name to 23
+characters, and append the hash string to the truncated name. If the
+`/VERBOSE' compiler option is used, the assembler will print both the
+full and truncated names of each symbol that is truncated.
+
+ The `/NOCASE_HACK' compiler option should not be used when you are
+compiling programs that use libg++. libg++ has several instances of
+objects (i.e. `Filebuf' and `filebuf') which become indistinguishable
+in a case-insensitive environment. This leads to cases where you need
+to inhibit augmentation selectively (if you were using libg++ and Xlib
+in the same program, for example). There is no special feature for
+doing this, but you can get the result by defining a macro for each
+mixed case symbol for which you wish to inhibit augmentation. The
+macro should expand into the lower case equivalent of itself. For
+example:
+
+ #define StuDlyCapS studlycaps
+
+ These macro definitions can be placed in a header file to minimize
+the number of changes to your source code.
+
+\1f
+File: gcc.info, Node: Funding, Next: GNU Project, Prev: VMS, Up: Top
+
+Funding Free Software
+*********************
+
+If you want to have more free software a few years from now, it makes
+sense for you to help encourage people to contribute funds for its
+development. The most effective approach known is to encourage
+commercial redistributors to donate.
+
+ Users of free software systems can boost the pace of development by
+encouraging for-a-fee distributors to donate part of their selling price
+to free software developers--the Free Software Foundation, and others.
+
+ The way to convince distributors to do this is to demand it and
+expect it from them. So when you compare distributors, judge them
+partly by how much they give to free software development. Show
+distributors they must compete to be the one who gives the most.
+
+ To make this approach work, you must insist on numbers that you can
+compare, such as, "We will donate ten dollars to the Frobnitz project
+for each disk sold." Don't be satisfied with a vague promise, such as
+"A portion of the profits are donated," since it doesn't give a basis
+for comparison.
+
+ Even a precise fraction "of the profits from this disk" is not very
+meaningful, since creative accounting and unrelated business decisions
+can greatly alter what fraction of the sales price counts as profit.
+If the price you pay is $50, ten percent of the profit is probably less
+than a dollar; it might be a few cents, or nothing at all.
+
+ Some redistributors do development work themselves. This is useful
+too; but to keep everyone honest, you need to inquire how much they do,
+and what kind. Some kinds of development make much more long-term
+difference than others. For example, maintaining a separate version of
+a program contributes very little; maintaining the standard version of a
+program for the whole community contributes much. Easy new ports
+contribute little, since someone else would surely do them; difficult
+ports such as adding a new CPU to the GNU Compiler Collection
+contribute more; major new features or packages contribute the most.
+
+ By establishing the idea that supporting further development is "the
+proper thing to do" when distributing free software for a fee, we can
+assure a steady flow of resources into making more free software.
+
+ Copyright (C) 1994 Free Software Foundation, Inc.
+ Verbatim copying and redistribution of this section is permitted
+ without royalty; alteration is not permitted.
+
+\1f
+File: gcc.info, Node: GNU Project, Next: Copying, Prev: Funding, Up: Top
+
+The GNU Project and GNU/Linux
+*****************************
+
+The GNU Project was launched in 1984 to develop a complete Unix-like
+operating system which is free software: the GNU system. (GNU is a
+recursive acronym for "GNU's Not Unix"; it is pronounced "guh-NEW".)
+Variants of the GNU operating system, which use the kernel Linux, are
+now widely used; though these systems are often referred to as "Linux",
+they are more accurately called GNU/Linux systems.
+
+ For more information, see:
+ `http://www.gnu.org/'
+ `http://www.gnu.org/gnu/linux-and-gnu.html'
+
+\1f
+File: gcc.info, Node: Copying, Next: GNU Free Documentation License, Prev: GNU Project, Up: Top
+
+GNU GENERAL PUBLIC LICENSE
+**************************
+
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+========
+
+The licenses for most software are designed to take away your freedom
+to share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it in
+new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software,
+and (2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+ 0. This License applies to any program or other work which contains a
+ notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The "Program",
+ below, refers to any such program or work, and a "work based on
+ the Program" means either the Program or any derivative work under
+ copyright law: that is to say, a work containing the Program or a
+ portion of it, either verbatim or with modifications and/or
+ translated into another language. (Hereinafter, translation is
+ included without limitation in the term "modification".) Each
+ licensee is addressed as "you".
+
+ Activities other than copying, distribution and modification are
+ not covered by this License; they are outside its scope. The act
+ of running the Program is not restricted, and the output from the
+ Program is covered only if its contents constitute a work based on
+ the Program (independent of having been made by running the
+ Program). Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+ source code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any
+ warranty; and give any other recipients of the Program a copy of
+ this License along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy,
+ and you may at your option offer warranty protection in exchange
+ for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+ of it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a. You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b. You must cause any work that you distribute or publish, that
+ in whole or in part contains or is derived from the Program
+ or any part thereof, to be licensed as a whole at no charge
+ to all third parties under the terms of this License.
+
+ c. If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display
+ an announcement including an appropriate copyright notice and
+ a notice that there is no warranty (or else, saying that you
+ provide a warranty) and that users may redistribute the
+ program under these conditions, and telling the user how to
+ view a copy of this License. (Exception: if the Program
+ itself is interactive but does not normally print such an
+ announcement, your work based on the Program is not required
+ to print an announcement.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the
+ Program, and can be reasonably considered independent and separate
+ works in themselves, then this License, and its terms, do not
+ apply to those sections when you distribute them as separate
+ works. But when you distribute the same sections as part of a
+ whole which is a work based on the Program, the distribution of
+ the whole must be on the terms of this License, whose permissions
+ for other licensees extend to the entire whole, and thus to each
+ and every part regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or
+ contest your rights to work written entirely by you; rather, the
+ intent is to exercise the right to control the distribution of
+ derivative or collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the
+ Program with the Program (or with a work based on the Program) on
+ a volume of a storage or distribution medium does not bring the
+ other work under the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms
+ of Sections 1 and 2 above provided that you also do one of the
+ following:
+
+ a. Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Sections 1 and 2 above on a medium customarily used for
+ software interchange; or,
+
+ b. Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a
+ medium customarily used for software interchange; or,
+
+ c. Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with
+ such an offer, in accord with Subsection b above.)
+
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete
+ source code means all the source code for all modules it contains,
+ plus any associated interface definition files, plus the scripts
+ used to control compilation and installation of the executable.
+ However, as a special exception, the source code distributed need
+ not include anything that is normally distributed (in either
+ source or binary form) with the major components (compiler,
+ kernel, and so on) of the operating system on which the executable
+ runs, unless that component itself accompanies the executable.
+
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify
+ or distribute the Program or its derivative works. These actions
+ are prohibited by law if you do not accept this License.
+ Therefore, by modifying or distributing the Program (or any work
+ based on the Program), you indicate your acceptance of this
+ License to do so, and all its terms and conditions for copying,
+ distributing or modifying the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program
+ subject to these terms and conditions. You may not impose any
+ further restrictions on the recipients' exercise of the rights
+ granted herein. You are not responsible for enforcing compliance
+ by third parties to this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent
+ issues), conditions are imposed on you (whether by court order,
+ agreement or otherwise) that contradict the conditions of this
+ License, they do not excuse you from the conditions of this
+ License. If you cannot distribute so as to satisfy simultaneously
+ your obligations under this License and any other pertinent
+ obligations, then as a consequence you may not distribute the
+ Program at all. For example, if a patent license would not permit
+ royalty-free redistribution of the Program by all those who
+ receive copies directly or indirectly through you, then the only
+ way you could satisfy both it and this License would be to refrain
+ entirely from distribution of the Program.
+
+ If any portion of this section is held invalid or unenforceable
+ under any particular circumstance, the balance of the section is
+ intended to apply and the section as a whole is intended to apply
+ in other circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of
+ any such claims; this section has the sole purpose of protecting
+ the integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is
+ willing to distribute software through any other system and a
+ licensee cannot impose that choice.
+
+ This section is intended to make thoroughly clear what is believed
+ to be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces,
+ the original copyright holder who places the Program under this
+ License may add an explicit geographical distribution limitation
+ excluding those countries, so that distribution is permitted only
+ in or among countries not thus excluded. In such case, this
+ License incorporates the limitation as if written in the body of
+ this License.
+
+ 9. The Free Software Foundation may publish revised and/or new
+ versions of the General Public License from time to time. Such
+ new versions will be similar in spirit to the present version, but
+ may differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+ Program specifies a version number of this License which applies
+ to it and "any later version", you have the option of following
+ the terms and conditions either of that version or of any later
+ version published by the Free Software Foundation. If the Program
+ does not specify a version number of this License, you may choose
+ any version ever published by the Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the
+ author to ask for permission. For software which is copyrighted
+ by the Free Software Foundation, write to the Free Software
+ Foundation; we sometimes make exceptions for this. Our decision
+ will be guided by the two goals of preserving the free status of
+ all derivatives of our free software and of promoting the sharing
+ and reuse of software generally.
+
+ NO WARRANTY
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+ WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+ NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
+ QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+ SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+ MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+ INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+ INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+ OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
+ OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+How to Apply These Terms to Your New Programs
+=============================================
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
+ Copyright (C) YEAR NAME OF AUTHOR
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Also add information on how to contact you by electronic and paper
+mail.
+
+ If the program is interactive, make it output a short notice like
+this when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) YEAR NAME OF AUTHOR
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+ type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+ The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+ You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the program,
+if necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ SIGNATURE OF TY COON, 1 April 1989
+ Ty Coon, President of Vice
+
+ This General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use the
+GNU Library General Public License instead of this License.
+
+\1f
+File: gcc.info, Node: GNU Free Documentation License, Next: Contributors, Prev: Copying, Up: Top
+
+GNU Free Documentation License
+******************************
+
+ Version 1.1, March 2000
+
+ Copyright (C) 2000 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ written document "free" in the sense of freedom: to assure everyone
+ the effective freedom to copy and redistribute it, with or without
+ modifying it, either commercially or noncommercially. Secondarily,
+ this License preserves for the author and publisher a way to get
+ credit for their work, while not being considered responsible for
+ modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book.
+ We recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work that contains a
+ notice placed by the copyright holder saying it can be distributed
+ under the terms of this License. The "Document", below, refers to
+ any such manual or work. Any member of the public is a licensee,
+ and is addressed as "you".
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter
+ section of the Document that deals exclusively with the
+ relationship of the publishers or authors of the Document to the
+ Document's overall subject (or to related matters) and contains
+ nothing that could fall directly within that overall subject.
+ (For example, if the Document is in part a textbook of
+ mathematics, a Secondary Section may not explain any mathematics.)
+ The relationship could be a matter of historical connection with
+ the subject or with related matters, or of legal, commercial,
+ philosophical, ethical or political position regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in
+ the notice that says that the Document is released under this
+ License.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, whose contents can be viewed and edited directly
+ and straightforwardly with generic text editors or (for images
+ composed of pixels) generic paint programs or (for drawings) some
+ widely available drawing editor, and that is suitable for input to
+ text formatters or for automatic translation to a variety of
+ formats suitable for input to text formatters. A copy made in an
+ otherwise Transparent file format whose markup has been designed
+ to thwart or discourage subsequent modification by readers is not
+ Transparent. A copy that is not "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and
+ standard-conforming simple HTML designed for human modification.
+ Opaque formats include PostScript, PDF, proprietary formats that
+ can be read and edited only by proprietary word processors, SGML
+ or XML for which the DTD and/or processing tools are not generally
+ available, and the machine-generated HTML produced by some word
+ processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow
+ the conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies of the Document numbering more than
+ 100, and the Document's license notice requires Cover Texts, you
+ must enclose the copies in covers that carry, clearly and legibly,
+ all these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the
+ title equally prominent and visible. You may add other material
+ on the covers in addition. Copying with changes limited to the
+ covers, as long as they preserve the title of the Document and
+ satisfy these conditions, can be treated as verbatim copying in
+ other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a
+ machine-readable Transparent copy along with each Opaque copy, or
+ state in or with each Opaque copy a publicly-accessible
+ computer-network location containing a complete Transparent copy
+ of the Document, free of added material, which the general
+ network-using public has access to download anonymously at no
+ charge using public-standard network protocols. If you use the
+ latter option, you must take reasonably prudent steps, when you
+ begin distribution of Opaque copies in quantity, to ensure that
+ this Transparent copy will remain thus accessible at the stated
+ location until at least one year after the last time you
+ distribute an Opaque copy (directly or through your agents or
+ retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of
+ copies, to give them a chance to provide you with an updated
+ version of the Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with
+ the Modified Version filling the role of the Document, thus
+ licensing distribution and modification of the Modified Version to
+ whoever possesses a copy of it. In addition, you must do these
+ things in the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of
+ previous versions (which should, if there were any, be listed
+ in the History section of the Document). You may use the
+ same title as a previous version if the original publisher of
+ that version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has less than five).
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section entitled "History", and its title, and
+ add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on
+ the Title Page. If there is no section entitled "History" in
+ the Document, create one stating the title, year, authors,
+ and publisher of the Document as given on its Title Page,
+ then add an item describing the Modified Version as stated in
+ the previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in
+ the "History" section. You may omit a network location for a
+ work that was published at least four years before the
+ Document itself, or if the original publisher of the version
+ it refers to gives permission.
+
+ K. In any section entitled "Acknowledgments" or "Dedications",
+ preserve the section's title, and preserve in the section all
+ the substance and tone of each of the contributor
+ acknowledgments and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section
+ titles.
+
+ M. Delete any section entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section as "Endorsements" or to
+ conflict in title with any Invariant Section.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option
+ designate some or all of these sections as invariant. To do this,
+ add their titles to the list of Invariant Sections in the Modified
+ Version's license notice. These titles must be distinct from any
+ other section titles.
+
+ You may add a section entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end
+ of the list of Cover Texts in the Modified Version. Only one
+ passage of Front-Cover Text and one of Back-Cover Text may be
+ added by (or through arrangements made by) any one entity. If the
+ Document already includes a cover text for the same cover,
+ previously added by you or by arrangement made by the same entity
+ you are acting on behalf of, you may not add another; but you may
+ replace the old one, on explicit permission from the previous
+ publisher that added the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination
+ all of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections entitled
+ "History" in the various original documents, forming one section
+ entitled "History"; likewise combine any sections entitled
+ "Acknowledgments", and any sections entitled "Dedications". You
+ must delete all sections entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the
+ documents in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow
+ this License in all other respects regarding verbatim copying of
+ that document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of
+ a storage or distribution medium, does not as a whole count as a
+ Modified Version of the Document, provided no compilation
+ copyright is claimed for the compilation. Such a compilation is
+ called an "aggregate", and this License does not apply to the
+ other self-contained works thus compiled with the Document, on
+ account of their being thus compiled, if they are not themselves
+ derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one
+ quarter of the entire aggregate, the Document's Cover Texts may be
+ placed on covers that surround only the Document within the
+ aggregate. Otherwise they must appear on covers around the whole
+ aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License provided that you also include the
+ original English version of this License. In case of a
+ disagreement between the translation and the original English
+ version of this License, the original English version will prevail.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided for under this License. Any other
+ attempt to copy, modify, sublicense or distribute the Document is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ `http://www.gnu.org/copyleft/'.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If
+ the Document does not specify a version number of this License,
+ you may choose any version ever published (not as a draft) by the
+ Free Software Foundation.
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ 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 LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+ A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have no Invariant Sections, write "with no Invariant Sections"
+instead of saying which ones are invariant. If you have no Front-Cover
+Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being
+LIST"; likewise for Back-Cover Texts.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.