This is Info file gcc.info, produced by Makeinfo version 1.68 from the
input file ../../gcc/gcc.texi.

INFO-DIR-SECTION Programming
START-INFO-DIR-ENTRY
* gcc: (gcc).                  The GNU C compiler.
END-INFO-DIR-ENTRY
   This file documents the use and the internals of the GNU compiler.

   Published by the Free Software Foundation 59 Temple Place - Suite 330
Boston, MA 02111-1307 USA

   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998
Free Software Foundation, Inc.

   Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

   Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided also
that the sections entitled "GNU General Public License" and "Funding
for Free Software" are included exactly as in the original, and
provided that the entire resulting derived work is distributed under
the terms of a permission notice identical to this one.

   Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that the sections entitled "GNU General Public
License" and "Funding for Free Software", and this permission notice,
may be included in translations approved by the Free Software Foundation
instead of in the original English.


File: gcc.info,  Node: Cross-compilation,  Next: Misc,  Prev: Debugging Info,  Up: Target Macros

Cross Compilation and Floating Point
====================================

   While all modern machines use 2's complement representation for
integers, there are a variety of representations for floating point
numbers.  This means that in a cross-compiler the representation of
floating point numbers in the compiled program may be different from
that used in the machine doing the compilation.

   Because different representation systems may offer different amounts
of range and precision, the cross compiler cannot safely use the host
machine's floating point arithmetic.  Therefore, floating point
constants must be represented in the target machine's format.  This
means that the cross compiler cannot use `atof' to parse a floating
point constant; it must have its own special routine to use instead.
Also, constant folding must emulate the target machine's arithmetic (or
must not be done at all).

   The macros in the following table should be defined only if you are
cross compiling between different floating point formats.

   Otherwise, don't define them.  Then default definitions will be set
up which use `double' as the data type, `==' to test for equality, etc.

   You don't need to worry about how many times you use an operand of
any of these macros.  The compiler never uses operands which have side
effects.

`REAL_VALUE_TYPE'
     A macro for the C data type to be used to hold a floating point
     value in the target machine's format.  Typically this would be a
     `struct' containing an array of `int'.

`REAL_VALUES_EQUAL (X, Y)'
     A macro for a C expression which compares for equality the two
     values, X and Y, both of type `REAL_VALUE_TYPE'.

`REAL_VALUES_LESS (X, Y)'
     A macro for a C expression which tests whether X is less than Y,
     both values being of type `REAL_VALUE_TYPE' and interpreted as
     floating point numbers in the target machine's representation.

`REAL_VALUE_LDEXP (X, SCALE)'
     A macro for a C expression which performs the standard library
     function `ldexp', but using the target machine's floating point
     representation.  Both X and the value of the expression have type
     `REAL_VALUE_TYPE'.  The second argument, SCALE, is an integer.

`REAL_VALUE_FIX (X)'
     A macro whose definition is a C expression to convert the
     target-machine floating point value X to a signed integer.  X has
     type `REAL_VALUE_TYPE'.

`REAL_VALUE_UNSIGNED_FIX (X)'
     A macro whose definition is a C expression to convert the
     target-machine floating point value X to an unsigned integer.  X
     has type `REAL_VALUE_TYPE'.

`REAL_VALUE_RNDZINT (X)'
     A macro whose definition is a C expression to round the
     target-machine floating point value X towards zero to an integer
     value (but still as a floating point number).  X has type
     `REAL_VALUE_TYPE', and so does the value.

`REAL_VALUE_UNSIGNED_RNDZINT (X)'
     A macro whose definition is a C expression to round the
     target-machine floating point value X towards zero to an unsigned
     integer value (but still represented as a floating point number).
     X has type `REAL_VALUE_TYPE', and so does the value.

`REAL_VALUE_ATOF (STRING, MODE)'
     A macro for a C expression which converts STRING, an expression of
     type `char *', into a floating point number in the target machine's
     representation for mode MODE.  The value has type
     `REAL_VALUE_TYPE'.

`REAL_INFINITY'
     Define this macro if infinity is a possible floating point value,
     and therefore division by 0 is legitimate.

`REAL_VALUE_ISINF (X)'
     A macro for a C expression which determines whether X, a floating
     point value, is infinity.  The value has type `int'.  By default,
     this is defined to call `isinf'.

`REAL_VALUE_ISNAN (X)'
     A macro for a C expression which determines whether X, a floating
     point value, is a "nan" (not-a-number).  The value has type `int'.
     By default, this is defined to call `isnan'.

   Define the following additional macros if you want to make floating
point constant folding work while cross compiling.  If you don't define
them, cross compilation is still possible, but constant folding will
not happen for floating point values.

`REAL_ARITHMETIC (OUTPUT, CODE, X, Y)'
     A macro for a C statement which calculates an arithmetic operation
     of the two floating point values X and Y, both of type
     `REAL_VALUE_TYPE' in the target machine's representation, to
     produce a result of the same type and representation which is
     stored in OUTPUT (which will be a variable).

     The operation to be performed is specified by CODE, a tree code
     which will always be one of the following: `PLUS_EXPR',
     `MINUS_EXPR', `MULT_EXPR', `RDIV_EXPR', `MAX_EXPR', `MIN_EXPR'.

     The expansion of this macro is responsible for checking for
     overflow.  If overflow happens, the macro expansion should execute
     the statement `return 0;', which indicates the inability to
     perform the arithmetic operation requested.

`REAL_VALUE_NEGATE (X)'
     A macro for a C expression which returns the negative of the
     floating point value X.  Both X and the value of the expression
     have type `REAL_VALUE_TYPE' and are in the target machine's
     floating point representation.

     There is no way for this macro to report overflow, since overflow
     can't happen in the negation operation.

`REAL_VALUE_TRUNCATE (MODE, X)'
     A macro for a C expression which converts the floating point value
     X to mode MODE.

     Both X and the value of the expression are in the target machine's
     floating point representation and have type `REAL_VALUE_TYPE'.
     However, the value should have an appropriate bit pattern to be
     output properly as a floating constant whose precision accords
     with mode MODE.

     There is no way for this macro to report overflow.

`REAL_VALUE_TO_INT (LOW, HIGH, X)'
     A macro for a C expression which converts a floating point value X
     into a double-precision integer which is then stored into LOW and
     HIGH, two variables of type INT.

`REAL_VALUE_FROM_INT (X, LOW, HIGH, MODE)'
     A macro for a C expression which converts a double-precision
     integer found in LOW and HIGH, two variables of type INT, into a
     floating point value which is then stored into X.  The value is in
     the target machine's representation for mode MODE and has the type
     `REAL_VALUE_TYPE'.


File: gcc.info,  Node: Misc,  Prev: Cross-compilation,  Up: Target Macros

Miscellaneous Parameters
========================

   Here are several miscellaneous parameters.

`PREDICATE_CODES'
     Define this if you have defined special-purpose predicates in the
     file `MACHINE.c'.  This macro is called within an initializer of an
     array of structures.  The first field in the structure is the name
     of a predicate and the second field is an array of rtl codes.  For
     each predicate, list all rtl codes that can be in expressions
     matched by the predicate.  The list should have a trailing comma.
     Here is an example of two entries in the list for a typical RISC
     machine:

          #define PREDICATE_CODES \
            {"gen_reg_rtx_operand", {SUBREG, REG}},  \
            {"reg_or_short_cint_operand", {SUBREG, REG, CONST_INT}},

     Defining this macro does not affect the generated code (however,
     incorrect definitions that omit an rtl code that may be matched by
     the predicate can cause the compiler to malfunction).  Instead, it
     allows the table built by `genrecog' to be more compact and
     efficient, thus speeding up the compiler.  The most important
     predicates to include in the list specified by this macro are
     those used in the most insn patterns.

`CASE_VECTOR_MODE'
     An alias for a machine mode name.  This is the machine mode that
     elements of a jump-table should have.

`CASE_VECTOR_SHORTEN_MODE (MIN_OFFSET, MAX_OFFSET, BODY)'
     Optional: return the preferred mode for an `addr_diff_vec' when
     the minimum and maximum offset are known.  If you define this, it
     enables extra code in branch shortening to deal with
     `addr_diff_vec'.  To make this work, you also have to define
     INSN_ALIGN and make the alignment for `addr_diff_vec' explicit.
     The BODY argument is provided so that teh offset_unsigned and scale
     flags can be updated.

`CASE_VECTOR_PC_RELATIVE'
     Define this macro to be a C expression to indicate when jump-tables
     should contain relative addresses.  If jump-tables never contain
     relative addresses, then you need not define this macro.

`CASE_DROPS_THROUGH'
     Define this if control falls through a `case' insn when the index
     value is out of range.  This means the specified default-label is
     actually ignored by the `case' insn proper.

`CASE_VALUES_THRESHOLD'
     Define this to be the smallest number of different values for
     which it is best to use a jump-table instead of a tree of
     conditional branches.  The default is four for machines with a
     `casesi' instruction and five otherwise.  This is best for most
     machines.

`WORD_REGISTER_OPERATIONS'
     Define this macro if operations between registers with integral
     mode smaller than a word are always performed on the entire
     register.  Most RISC machines have this property and most CISC
     machines do not.

`LOAD_EXTEND_OP (MODE)'
     Define this macro to be a C expression indicating when insns that
     read memory in MODE, an integral mode narrower than a word, set the
     bits outside of MODE to be either the sign-extension or the
     zero-extension of the data read.  Return `SIGN_EXTEND' for values
     of MODE for which the insn sign-extends, `ZERO_EXTEND' for which
     it zero-extends, and `NIL' for other modes.

     This macro is not called with MODE non-integral or with a width
     greater than or equal to `BITS_PER_WORD', so you may return any
     value in this case.  Do not define this macro if it would always
     return `NIL'.  On machines where this macro is defined, you will
     normally define it as the constant `SIGN_EXTEND' or `ZERO_EXTEND'.

`SHORT_IMMEDIATES_SIGN_EXTEND'
     Define this macro if loading short immediate values into registers
     sign extends.

`IMPLICIT_FIX_EXPR'
     An alias for a tree code that should be used by default for
     conversion of floating point values to fixed point.  Normally,
     `FIX_ROUND_EXPR' is used.

`FIXUNS_TRUNC_LIKE_FIX_TRUNC'
     Define this macro if the same instructions that convert a floating
     point number to a signed fixed point number also convert validly
     to an unsigned one.

`EASY_DIV_EXPR'
     An alias for a tree code that is the easiest kind of division to
     compile code for in the general case.  It may be `TRUNC_DIV_EXPR',
     `FLOOR_DIV_EXPR', `CEIL_DIV_EXPR' or `ROUND_DIV_EXPR'.  These four
     division operators differ in how they round the result to an
     integer.  `EASY_DIV_EXPR' is used when it is permissible to use
     any of those kinds of division and the choice should be made on
     the basis of efficiency.

`MOVE_MAX'
     The maximum number of bytes that a single instruction can move
     quickly between memory and registers or between two memory
     locations.

`MAX_MOVE_MAX'
     The maximum number of bytes that a single instruction can move
     quickly between memory and registers or between two memory
     locations.  If this is undefined, the default is `MOVE_MAX'.
     Otherwise, it is the constant value that is the largest value that
     `MOVE_MAX' can have at run-time.

`SHIFT_COUNT_TRUNCATED'
     A C expression that is nonzero if on this machine the number of
     bits actually used for the count of a shift operation is equal to
     the number of bits needed to represent the size of the object
     being shifted.  When this macro is non-zero, the compiler will
     assume that it is safe to omit a sign-extend, zero-extend, and
     certain bitwise `and' instructions that truncates the count of a
     shift operation.  On machines that have instructions that act on
     bitfields at variable positions, which may include `bit test'
     instructions, a nonzero `SHIFT_COUNT_TRUNCATED' also enables
     deletion of truncations of the values that serve as arguments to
     bitfield instructions.

     If both types of instructions truncate the count (for shifts) and
     position (for bitfield operations), or if no variable-position
     bitfield instructions exist, you should define this macro.

     However, on some machines, such as the 80386 and the 680x0,
     truncation only applies to shift operations and not the (real or
     pretended) bitfield operations.  Define `SHIFT_COUNT_TRUNCATED' to
     be zero on such machines.  Instead, add patterns to the `md' file
     that include the implied truncation of the shift instructions.

     You need not define this macro if it would always have the value
     of zero.

`TRULY_NOOP_TRUNCATION (OUTPREC, INPREC)'
     A C expression which is nonzero if on this machine it is safe to
     "convert" an integer of INPREC bits to one of OUTPREC bits (where
     OUTPREC is smaller than INPREC) by merely operating on it as if it
     had only OUTPREC bits.

     On many machines, this expression can be 1.

     When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for
     modes for which `MODES_TIEABLE_P' is 0, suboptimal code can result.
     If this is the case, making `TRULY_NOOP_TRUNCATION' return 0 in
     such cases may improve things.

`STORE_FLAG_VALUE'
     A C expression describing the value returned by a comparison
     operator with an integral mode and stored by a store-flag
     instruction (`sCOND') when the condition is true.  This
     description must apply to *all* the `sCOND' patterns and all the
     comparison operators whose results have a `MODE_INT' mode.

     A value of 1 or -1 means that the instruction implementing the
     comparison operator returns exactly 1 or -1 when the comparison is
     true and 0 when the comparison is false.  Otherwise, the value
     indicates which bits of the result are guaranteed to be 1 when the
     comparison is true.  This value is interpreted in the mode of the
     comparison operation, which is given by the mode of the first
     operand in the `sCOND' pattern.  Either the low bit or the sign
     bit of `STORE_FLAG_VALUE' be on.  Presently, only those bits are
     used by the compiler.

     If `STORE_FLAG_VALUE' is neither 1 or -1, the compiler will
     generate code that depends only on the specified bits.  It can also
     replace comparison operators with equivalent operations if they
     cause the required bits to be set, even if the remaining bits are
     undefined.  For example, on a machine whose comparison operators
     return an `SImode' value and where `STORE_FLAG_VALUE' is defined as
     `0x80000000', saying that just the sign bit is relevant, the
     expression

          (ne:SI (and:SI X (const_int POWER-OF-2)) (const_int 0))

     can be converted to

          (ashift:SI X (const_int N))

     where N is the appropriate shift count to move the bit being
     tested into the sign bit.

     There is no way to describe a machine that always sets the
     low-order bit for a true value, but does not guarantee the value
     of any other bits, but we do not know of any machine that has such
     an instruction.  If you are trying to port GNU CC to such a
     machine, include an instruction to perform a logical-and of the
     result with 1 in the pattern for the comparison operators and let
     us know (*note How to Report Bugs: Bug Reporting.).

     Often, a machine will have multiple instructions that obtain a
     value from a comparison (or the condition codes).  Here are rules
     to guide the choice of value for `STORE_FLAG_VALUE', and hence the
     instructions to be used:

        * Use the shortest sequence that yields a valid definition for
          `STORE_FLAG_VALUE'.  It is more efficient for the compiler to
          "normalize" the value (convert it to, e.g., 1 or 0) than for
          the comparison operators to do so because there may be
          opportunities to combine the normalization with other
          operations.

        * For equal-length sequences, use a value of 1 or -1, with -1
          being slightly preferred on machines with expensive jumps and
          1 preferred on other machines.

        * As a second choice, choose a value of `0x80000001' if
          instructions exist that set both the sign and low-order bits
          but do not define the others.

        * Otherwise, use a value of `0x80000000'.

     Many machines can produce both the value chosen for
     `STORE_FLAG_VALUE' and its negation in the same number of
     instructions.  On those machines, you should also define a pattern
     for those cases, e.g., one matching

          (set A (neg:M (ne:M B C)))

     Some machines can also perform `and' or `plus' operations on
     condition code values with less instructions than the corresponding
     `sCOND' insn followed by `and' or `plus'.  On those machines,
     define the appropriate patterns.  Use the names `incscc' and
     `decscc', respectively, for the patterns which perform `plus' or
     `minus' operations on condition code values.  See `rs6000.md' for
     some examples.  The GNU Superoptizer can be used to find such
     instruction sequences on other machines.

     You need not define `STORE_FLAG_VALUE' if the machine has no
     store-flag instructions.

`FLOAT_STORE_FLAG_VALUE'
     A C expression that gives a non-zero floating point value that is
     returned when comparison operators with floating-point results are
     true.  Define this macro on machine that have comparison
     operations that return floating-point values.  If there are no
     such operations, do not define this macro.

`Pmode'
     An alias for the machine mode for pointers.  On most machines,
     define this to be the integer mode corresponding to the width of a
     hardware pointer; `SImode' on 32-bit machine or `DImode' on 64-bit
     machines.  On some machines you must define this to be one of the
     partial integer modes, such as `PSImode'.

     The width of `Pmode' must be at least as large as the value of
     `POINTER_SIZE'.  If it is not equal, you must define the macro
     `POINTERS_EXTEND_UNSIGNED' to specify how pointers are extended to
     `Pmode'.

`FUNCTION_MODE'
     An alias for the machine mode used for memory references to
     functions being called, in `call' RTL expressions.  On most
     machines this should be `QImode'.

`INTEGRATE_THRESHOLD (DECL)'
     A C expression for the maximum number of instructions above which
     the function DECL should not be inlined.  DECL is a
     `FUNCTION_DECL' node.

     The default definition of this macro is 64 plus 8 times the number
     of arguments that the function accepts.  Some people think a larger
     threshold should be used on RISC machines.

`SCCS_DIRECTIVE'
     Define this if the preprocessor should ignore `#sccs' directives
     and print no error message.

`NO_IMPLICIT_EXTERN_C'
     Define this macro if the system header files support C++ as well
     as C.  This macro inhibits the usual method of using system header
     files in C++, which is to pretend that the file's contents are
     enclosed in `extern "C" {...}'.

`HANDLE_PRAGMA (STREAM, NODE)'
     Define this macro if you want to implement any pragmas.  If
     defined, it is a C expression whose value is 1 if the pragma was
     handled by the function.  The argument STREAM is the stdio input
     stream from which the source text can be read.  NODE is the tree
     node for the identifier after the `#pragma'.

     It is generally a bad idea to implement new uses of `#pragma'.  The
     only reason to define this macro is for compatibility with other
     compilers that do support `#pragma' for the sake of any user
     programs which already use it.

`VALID_MACHINE_DECL_ATTRIBUTE (DECL, ATTRIBUTES, IDENTIFIER, ARGS)'
     If defined, a C expression whose value is nonzero if IDENTIFIER
     with arguments ARGS is a valid machine specific attribute for DECL.
     The attributes in ATTRIBUTES have previously been assigned to DECL.

`VALID_MACHINE_TYPE_ATTRIBUTE (TYPE, ATTRIBUTES, IDENTIFIER, ARGS)'
     If defined, a C expression whose value is nonzero if IDENTIFIER
     with arguments ARGS is a valid machine specific attribute for TYPE.
     The attributes in ATTRIBUTES have previously been assigned to TYPE.

`COMP_TYPE_ATTRIBUTES (TYPE1, TYPE2)'
     If defined, a C expression whose value is zero if the attributes on
     TYPE1 and TYPE2 are incompatible, one if they are compatible, and
     two if they are nearly compatible (which causes a warning to be
     generated).

`SET_DEFAULT_TYPE_ATTRIBUTES (TYPE)'
     If defined, a C statement that assigns default attributes to newly
     defined TYPE.

`MERGE_MACHINE_TYPE_ATTRIBUTES (TYPE1, TYPE2)'
     Define this macro if the merging of type attributes needs special
     handling.  If defined, the result is a list of the combined
     TYPE_ATTRIBUTES of TYPE1 and TYPE2.  It is assumed that comptypes
     has already been called and returned 1.

`MERGE_MACHINE_DECL_ATTRIBUTES (OLDDECL, NEWDECL)'
     Define this macro if the merging of decl attributes needs special
     handling.  If defined, the result is a list of the combined
     DECL_MACHINE_ATTRIBUTES of OLDDECL and NEWDECL.  NEWDECL is a
     duplicate declaration of OLDDECL.  Examples of when this is needed
     are when one attribute overrides another, or when an attribute is
     nullified by a subsequent definition.

`SET_DEFAULT_DECL_ATTRIBUTES (DECL, ATTRIBUTES)'
     If defined, a C statement that assigns default attributes to newly
     defined DECL.

`DOLLARS_IN_IDENTIFIERS'
     Define this macro to control use of the character `$' in identifier
     names.  0 means `$' is not allowed by default; 1 means it is
     allowed.  1 is the default; there is no need to define this macro
     in that case.  This macro controls the compiler proper; it does
     not affect the preprocessor.

`NO_DOLLAR_IN_LABEL'
     Define this macro if the assembler does not accept the character
     `$' in label names.  By default constructors and destructors in
     G++ have `$' in the identifiers.  If this macro is defined, `.' is
     used instead.

`NO_DOT_IN_LABEL'
     Define this macro if the assembler does not accept the character
     `.' in label names.  By default constructors and destructors in G++
     have names that use `.'.  If this macro is defined, these names
     are rewritten to avoid `.'.

`DEFAULT_MAIN_RETURN'
     Define this macro if the target system expects every program's
     `main' function to return a standard "success" value by default
     (if no other value is explicitly returned).

     The definition should be a C statement (sans semicolon) to
     generate the appropriate rtl instructions.  It is used only when
     compiling the end of `main'.

`HAVE_ATEXIT'
     Define this if the target system supports the function `atexit'
     from the ANSI C standard.  If this is not defined, and
     `INIT_SECTION_ASM_OP' is not defined, a default `exit' function
     will be provided to support C++.

`EXIT_BODY'
     Define this if your `exit' function needs to do something besides
     calling an external function `_cleanup' before terminating with
     `_exit'.  The `EXIT_BODY' macro is only needed if neither
     `HAVE_ATEXIT' nor `INIT_SECTION_ASM_OP' are defined.

`INSN_SETS_ARE_DELAYED (INSN)'
     Define this macro as a C expression that is nonzero if it is safe
     for the delay slot scheduler to place instructions in the delay
     slot of INSN, even if they appear to use a resource set or
     clobbered in INSN.  INSN is always a `jump_insn' or an `insn'; GNU
     CC knows that every `call_insn' has this behavior.  On machines
     where some `insn' or `jump_insn' is really a function call and
     hence has this behavior, you should define this macro.

     You need not define this macro if it would always return zero.

`INSN_REFERENCES_ARE_DELAYED (INSN)'
     Define this macro as a C expression that is nonzero if it is safe
     for the delay slot scheduler to place instructions in the delay
     slot of INSN, even if they appear to set or clobber a resource
     referenced in INSN.  INSN is always a `jump_insn' or an `insn'.
     On machines where some `insn' or `jump_insn' is really a function
     call and its operands are registers whose use is actually in the
     subroutine it calls, you should define this macro.  Doing so
     allows the delay slot scheduler to move instructions which copy
     arguments into the argument registers into the delay slot of INSN.

     You need not define this macro if it would always return zero.

`MACHINE_DEPENDENT_REORG (INSN)'
     In rare cases, correct code generation requires extra machine
     dependent processing between the second jump optimization pass and
     delayed branch scheduling.  On those machines, define this macro
     as a C statement to act on the code starting at INSN.

`MULTIPLE_SYMBOL_SPACES'
     Define this macro if in some cases global symbols from one
     translation unit may not be bound to undefined symbols in another
     translation unit without user intervention.  For instance, under
     Microsoft Windows symbols must be explicitly imported from shared
     libraries (DLLs).

`GIV_SORT_CRITERION (GIV1, GIV2)'
     In some cases, the strength reduction optimization pass can
     produce better code if this is defined.  This macro controls the
     order that induction variables are combined.  This macro is
     particularly useful if the target has limited addressing modes.
     For instance, the SH target has only positive offsets in
     addresses.  Thus sorting to put the smallest address first allows
     the most combinations to be found.

`ISSUE_RATE'
     A C expression that returns how many instructions can be issued at
     the same time if the machine is a superscalar machine.  This is
     only used by the `Haifa' scheduler, and not the traditional
     scheduler.

`MD_SCHED_INIT (FILE, VERBOSE'
     A C statement which is executed by the `Haifa' scheduler at the
     beginning of each block of instructions that are to be scheduled.
     FILE is either a null pointer, or a stdio stream to write any
     debug output to.  VERBOSE is the verbose level provided by
     `-fsched-verbose-'N.

`MD_SCHED_REORDER (FILE, VERBOSE, READY, N_READY)'
     A C statement which is executed by the `Haifa' scheduler after it
     has scheduled the ready list to allow the machine description to
     reorder it (for example to combine two small instructions together
     on `VLIW' machines).  FILE is either a null pointer, or a stdio
     stream to write any debug output to.  VERBOSE is the verbose level
     provided by `-fsched-verbose-'N.  READY is a pointer to the ready
     list of instructions that are ready to be scheduled.  N_READY is
     the number of elements in the ready list.  The scheduler reads the
     ready list in reverse order, starting with READY[N_READY-1] and
     going to READY[0].

`MD_SCHED_VARIABLE_ISSUE (FILE, VERBOSE, INSN, MORE)'
     A C statement which is executed by the `Haifa' scheduler after it
     has scheduled an insn from the ready list.  FILE is either a null
     pointer, or a stdio stream to write any debug output to.  VERBOSE
     is the verbose level provided by `-fsched-verbose-'N.  INSN is the
     instruction that was scheduled.  MORE is the number of
     instructions that can be issued in the current cycle.  The
     `MD_SCHED_VARIABLE_ISSUE' macro is responsible for updating the
     value of MORE (typically by MORE-).

`MAX_INTEGER_COMPUTATION_MODE'
     Define this to the largest integer machine mode which can be used
     for operations other than load, store and copy operations.

     You need only define this macro if the target holds values larger
     than `word_mode' in general purpose registers.  Most targets
     should not define this macro.

`NEED_MATH_LIBRARY'
     Define this macro as a C expression that is nonzero if `g++' should
     automatically link in the math library or to zero if `g++' should
     not automatically link in the math library.

     You need only define this macro if the target does not always need
     the math library linked into C++ programs.


File: gcc.info,  Node: Config,  Next: Fragments,  Prev: Target Macros,  Up: Top

The Configuration File
**********************

   The configuration file `xm-MACHINE.h' contains macro definitions
that describe the machine and system on which the compiler is running,
unlike the definitions in `MACHINE.h', which describe the machine for
which the compiler is producing output.  Most of the values in
`xm-MACHINE.h' are actually the same on all machines that GNU CC runs
on, so large parts of all configuration files are identical.  But there
are some macros that vary:

`USG'
     Define this macro if the host system is System V.

`VMS'
     Define this macro if the host system is VMS.

`FATAL_EXIT_CODE'
     A C expression for the status code to be returned when the compiler
     exits after serious errors.

`SUCCESS_EXIT_CODE'
     A C expression for the status code to be returned when the compiler
     exits without serious errors.

`HOST_WORDS_BIG_ENDIAN'
     Defined if the host machine stores words of multi-word values in
     big-endian order.  (GNU CC does not depend on the host byte
     ordering within a word.)

`HOST_FLOAT_WORDS_BIG_ENDIAN'
     Define this macro to be 1 if the host machine stores `DFmode',
     `XFmode' or `TFmode' floating point numbers in memory with the
     word containing the sign bit at the lowest address; otherwise,
     define it to be zero.

     This macro need not be defined if the ordering is the same as for
     multi-word integers.

`HOST_FLOAT_FORMAT'
     A numeric code distinguishing the floating point format for the
     host machine.  See `TARGET_FLOAT_FORMAT' in *Note Storage Layout::
     for the alternatives and default.

`HOST_BITS_PER_CHAR'
     A C expression for the number of bits in `char' on the host
     machine.

`HOST_BITS_PER_SHORT'
     A C expression for the number of bits in `short' on the host
     machine.

`HOST_BITS_PER_INT'
     A C expression for the number of bits in `int' on the host machine.

`HOST_BITS_PER_LONG'
     A C expression for the number of bits in `long' on the host
     machine.

`ONLY_INT_FIELDS'
     Define this macro to indicate that the host compiler only supports
     `int' bit fields, rather than other integral types, including
     `enum', as do most C compilers.

`OBSTACK_CHUNK_SIZE'
     A C expression for the size of ordinary obstack chunks.  If you
     don't define this, a usually-reasonable default is used.

`OBSTACK_CHUNK_ALLOC'
     The function used to allocate obstack chunks.  If you don't define
     this, `xmalloc' is used.

`OBSTACK_CHUNK_FREE'
     The function used to free obstack chunks.  If you don't define
     this, `free' is used.

`USE_C_ALLOCA'
     Define this macro to indicate that the compiler is running with the
     `alloca' implemented in C.  This version of `alloca' can be found
     in the file `alloca.c'; to use it, you must also alter the
     `Makefile' variable `ALLOCA'.  (This is done automatically for the
     systems on which we know it is needed.)

     If you do define this macro, you should probably do it as follows:

          #ifndef __GNUC__
          #define USE_C_ALLOCA
          #else
          #define alloca __builtin_alloca
          #endif

     so that when the compiler is compiled with GNU CC it uses the more
     efficient built-in `alloca' function.

`FUNCTION_CONVERSION_BUG'
     Define this macro to indicate that the host compiler does not
     properly handle converting a function value to a
     pointer-to-function when it is used in an expression.

`MULTIBYTE_CHARS'
     Define this macro to enable support for multibyte characters in the
     input to GNU CC.  This requires that the host system support the
     ANSI C library functions for converting multibyte characters to
     wide characters.

`POSIX'
     Define this if your system is POSIX.1 compliant.

`NO_SYS_SIGLIST'
     Define this if your system *does not* provide the variable
     `sys_siglist'.

     Some systems do provide this variable, but with a different name
     such as `_sys_siglist'.  On these systems, you can define
     `sys_siglist' as a macro which expands into the name actually
     provided.

     Autoconf normally defines `SYS_SIGLIST_DECLARED' when it finds a
     declaration of `sys_siglist' in the system header files.  However,
     when you define `sys_siglist' to a different name autoconf will
     not automatically define `SYS_SIGLIST_DECLARED'.  Therefore, if
     you define `sys_siglist', you should also define
     `SYS_SIGLIST_DECLARED'.

`USE_PROTOTYPES'
     Define this to be 1 if you know that the host compiler supports
     prototypes, even if it doesn't define __STDC__, or define it to be
     0 if you do not want any prototypes used in compiling GNU CC.  If
     `USE_PROTOTYPES' is not defined, it will be determined
     automatically whether your compiler supports prototypes by
     checking if `__STDC__' is defined.

`NO_MD_PROTOTYPES'
     Define this if you wish suppression of prototypes generated from
     the machine description file, but to use other prototypes within
     GNU CC.  If `USE_PROTOTYPES' is defined to be 0, or the host
     compiler does not support prototypes, this macro has no effect.

`MD_CALL_PROTOTYPES'
     Define this if you wish to generate prototypes for the `gen_call'
     or `gen_call_value' functions generated from the machine
     description file.  If `USE_PROTOTYPES' is defined to be 0, or the
     host compiler does not support prototypes, or `NO_MD_PROTOTYPES'
     is defined, this macro has no effect.  As soon as all of the
     machine descriptions are modified to have the appropriate number
     of arguments, this macro will be removed.

`PATH_SEPARATOR'
     Define this macro to be a C character constant representing the
     character used to separate components in paths.  The default value
     is the colon character

`DIR_SEPARATOR'
     If your system uses some character other than slash to separate
     directory names within a file specification, define this macro to
     be a C character constant specifying that character.  When GNU CC
     displays file names, the character you specify will be used.  GNU
     CC will test for both slash and the character you specify when
     parsing filenames.

`OBJECT_SUFFIX'
     Define this macro to be a C string representing the suffix for
     object files on your machine.  If you do not define this macro,
     GNU CC will use `.o' as the suffix for object files.

`EXECUTABLE_SUFFIX'
     Define this macro to be a C string representing the suffix for
     executable files on your machine.  If you do not define this
     macro, GNU CC will use the null string as the suffix for object
     files.

`COLLECT_EXPORT_LIST'
     If defined, `collect2' will scan the individual object files
     specified on its command line and create an export list for the
     linker.  Define this macro for systems like AIX, where the linker
     discards object files that are not referenced from `main' and uses
     export lists.

   In addition, configuration files for system V define `bcopy',
`bzero' and `bcmp' as aliases.  Some files define `alloca' as a macro
when compiled with GNU CC, in order to take advantage of the benefit of
GNU CC's built-in `alloca'.


File: gcc.info,  Node: Fragments,  Next: Funding,  Prev: Config,  Up: Top

Makefile Fragments
******************

   When you configure GNU CC using the `configure' script (*note
Installation::.), it will construct the file `Makefile' from the
template file `Makefile.in'.  When it does this, it will incorporate
makefile fragment files from the `config' directory, named `t-TARGET'
and `x-HOST'.  If these files do not exist, it means nothing needs to
be added for a given target or host.

* Menu:

* Target Fragment:: Writing the `t-TARGET' file.
* Host Fragment::   Writing the `x-HOST' file.


File: gcc.info,  Node: Target Fragment,  Next: Host Fragment,  Up: Fragments

The Target Makefile Fragment
============================

   The target makefile fragment, `t-TARGET', defines special target
dependent variables and targets used in the `Makefile':

`LIBGCC1'
     The rule to use to build `libgcc1.a'.  If your target does not
     need to use the functions in `libgcc1.a', set this to empty.
     *Note Interface::.

`CROSS_LIBGCC1'
     The rule to use to build `libgcc1.a' when building a cross
     compiler.  If your target does not need to use the functions in
     `libgcc1.a', set this to empty.  *Note Cross Runtime::.

`LIBGCC2_CFLAGS'
     Compiler flags to use when compiling `libgcc2.c'.

`LIB2FUNCS_EXTRA'
     A list of source file names to be compiled or assembled and
     inserted into `libgcc.a'.

`CRTSTUFF_T_CFLAGS'
     Special flags used when compiling `crtstuff.c'.  *Note
     Initialization::.

`CRTSTUFF_T_CFLAGS_S'
     Special flags used when compiling `crtstuff.c' for shared linking.
     Used if you use `crtbeginS.o' and `crtendS.o' in `EXTRA-PARTS'.
     *Note Initialization::.

`MULTILIB_OPTIONS'
     For some targets, invoking GNU CC in different ways produces
     objects that can not be linked together.  For example, for some
     targets GNU CC produces both big and little endian code.  For
     these targets, you must arrange for multiple versions of
     `libgcc.a' to be compiled, one for each set of incompatible
     options.  When GNU CC invokes the linker, it arranges to link in
     the right version of `libgcc.a', based on the command line options
     used.

     The `MULTILIB_OPTIONS' macro lists the set of options for which
     special versions of `libgcc.a' must be built.  Write options that
     are mutually incompatible side by side, separated by a slash.
     Write options that may be used together separated by a space.  The
     build procedure will build all combinations of compatible options.

     For example, if you set `MULTILIB_OPTIONS' to `m68000/m68020
     msoft-float', `Makefile' will build special versions of `libgcc.a'
     using the following sets of options:  `-m68000', `-m68020',
     `-msoft-float', `-m68000 -msoft-float', and `-m68020 -msoft-float'.

`MULTILIB_DIRNAMES'
     If `MULTILIB_OPTIONS' is used, this variable specifies the
     directory names that should be used to hold the various libraries.
     Write one element in `MULTILIB_DIRNAMES' for each element in
     `MULTILIB_OPTIONS'.  If `MULTILIB_DIRNAMES' is not used, the
     default value will be `MULTILIB_OPTIONS', with all slashes treated
     as spaces.

     For example, if `MULTILIB_OPTIONS' is set to `m68000/m68020
     msoft-float', then the default value of `MULTILIB_DIRNAMES' is
     `m68000 m68020 msoft-float'.  You may specify a different value if
     you desire a different set of directory names.

`MULTILIB_MATCHES'
     Sometimes the same option may be written in two different ways.
     If an option is listed in `MULTILIB_OPTIONS', GNU CC needs to know
     about any synonyms.  In that case, set `MULTILIB_MATCHES' to a
     list of items of the form `option=option' to describe all relevant
     synonyms.  For example, `m68000=mc68000 m68020=mc68020'.

`MULTILIB_EXCEPTIONS'
     Sometimes when there are multiple sets of `MULTILIB_OPTIONS' being
     specified, there are combinations that should not be built.  In
     that case, set `MULTILIB_EXCEPTIONS' to be all of the switch
     exceptions in shell case syntax that should not be built.

     For example, in the PowerPC embedded ABI support, it was not
     desirable to build libraries that compiled with the
     `-mcall-aixdesc' option and either of the `-mcall-aixdesc' or
     `-mlittle' options at the same time, and therefore
     `MULTILIB_EXCEPTIONS' is set to `*mrelocatable/*mcall-aixdesc*
     *mlittle/*mcall-aixdesc*'.

`MULTILIB_EXTRA_OPTS'
     Sometimes it is desirable that when building multiple versions of
     `libgcc.a' certain options should always be passed on to the
     compiler.  In that case, set `MULTILIB_EXTRA_OPTS' to be the list
     of options to be used for all builds.


File: gcc.info,  Node: Host Fragment,  Prev: Target Fragment,  Up: Fragments

The Host Makefile Fragment
==========================

   The host makefile fragment, `x-HOST', defines special host dependent
variables and targets used in the `Makefile':

`CC'
     The compiler to use when building the first stage.

`CLIB'
     Additional host libraries to link with.

`OLDCC'
     The compiler to use when building `libgcc1.a' for a native
     compilation.

`OLDAR'
     The version of `ar' to use when building `libgcc1.a' for a native
     compilation.

`INSTALL'
     The install program to use.


File: gcc.info,  Node: Funding,  Next: GNU/Linux,  Prev: Fragments,  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 C compiler 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.


File: gcc.info,  Node: GNU/Linux,  Next: Copying,  Prev: Funding,  Up: Top

Linux and the GNU Project
*************************

   Many computer users run a modified version of the GNU system every
day, without realizing it.  Through a peculiar turn of events, the
version of GNU which is widely used today is more often known as
"Linux", and many users are not aware of the extent of its connection
with the GNU Project.

   There really is a Linux; it is a kernel, and these people are using
it.  But you can't use a kernel by itself; a kernel is useful only as
part of a whole system.  The system in which Linux is typically used is
a modified variant of the GNU system--in other words, a Linux-based GNU
system.

   Many users are not fully aware of the distinction between the kernel,
which is Linux, and the whole system, which they also call "Linux".
The ambiguous use of the name doesn't promote understanding.

   Programmers generally know that Linux is a kernel.  But since they
have generally heard the whole system called "Linux" as well, they
often envisage a history which fits that name.  For example, many
believe that once Linus Torvalds finished writing the kernel, his
friends looked around for other free software, and for no particular
reason most everything necessary to make a Unix-like system was already
available.

   What they found was no accident--it was the GNU system.  The
available free software added up to a complete system because the GNU
Project had been working since 1984 to make one.  The GNU Manifesto had
set forth the goal of developing a free Unix-like system, called GNU.
By the time Linux was written, the system was almost finished.

   Most free software projects have the goal of developing a particular
program for a particular job.  For example, Linus Torvalds set out to
write a Unix-like kernel (Linux); Donald Knuth set out to write a text
formatter (TeX); Bob Scheifler set out to develop a window system (X
Windows).  It's natural to measure the contribution of this kind of
project by specific programs that came from the project.

   If we tried to measure the GNU Project's contribution in this way,
what would we conclude?  One CD-ROM vendor found that in their "Linux
distribution", GNU software was the largest single contingent, around
28% of the total source code, and this included some of the essential
major components without which there could be no system.  Linux itself
was about 3%.  So if you were going to pick a name for the system based
on who wrote the programs in the system, the most appropriate single
choice would be "GNU".

   But we don't think that is the right way to consider the question.
The GNU Project was not, is not, a project to develop specific software
packages.  It was not a project to develop a C compiler, although we
did.  It was not a project to develop a text editor, although we
developed one.  The GNU Project's aim was to develop *a complete free
Unix-like system*.

   Many people have made major contributions to the free software in the
system, and they all deserve credit.  But the reason it is *a
system*--and not just a collection of useful programs--is because the
GNU Project set out to make it one.  We wrote the programs that were
needed to make a *complete* free system.  We wrote essential but
unexciting major components, such as the assembler and linker, because
you can't have a system without them.  A complete system needs more
than just programming tools, so we wrote other components as well, such
as the Bourne Again SHell, the PostScript interpreter Ghostscript, and
the GNU C library.

   By the early 90s we had put together the whole system aside from the
kernel (and we were also working on a kernel, the GNU Hurd, which runs
on top of Mach).  Developing this kernel has been a lot harder than we
expected, and we are still working on finishing it.

   Fortunately, you don't have to wait for it, because Linux is working
now.  When Linus Torvalds wrote Linux, he filled the last major gap.
People could then put Linux together with the GNU system to make a
complete free system: a Linux-based GNU system (or GNU/Linux system,
for short).

   Putting them together sounds simple, but it was not a trivial job.
The GNU C library (called glibc for short) needed substantial changes.
Integrating a complete system as a distribution that would work "out of
the box" was a big job, too.  It required addressing the issue of how
to install and boot the system--a problem we had not tackled, because
we hadn't yet reached that point.  The people who developed the various
system distributions made a substantial contribution.

   The GNU Project supports GNU/Linux systems as well as *the* GNU
system--even with funds.  We funded the rewriting of the Linux-related
extensions to the GNU C library, so that now they are well integrated,
and the newest GNU/Linux systems use the current library release with
no changes.  We also funded an early stage of the development of Debian
GNU/Linux.

   We use Linux-based GNU systems today for most of our work, and we
hope you use them too.  But please don't confuse the public by using the
name "Linux" ambiguously.  Linux is the kernel, one of the essential
major components of the system.  The system as a whole is more or less
the GNU system.

