@c Copyright (C) 1988-2022 Free Software Foundation, Inc.
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.

@node Target Macros
@chapter Target Description Macros and Functions
@cindex machine description macros
@cindex target description macros
@cindex macros, target description
@cindex @file{tm.h} macros

In addition to the file @file{@var{machine}.md}, a machine description
includes a C header file conventionally given the name
@file{@var{machine}.h} and a C source file named @file{@var{machine}.c}.
The header file defines numerous macros that convey the information
about the target machine that does not fit into the scheme of the
@file{.md} file.  The file @file{tm.h} should be a link to
@file{@var{machine}.h}.  The header file @file{config.h} includes
@file{tm.h} and most compiler source files include @file{config.h}.  The
source file defines a variable @code{targetm}, which is a structure
containing pointers to functions and data relating to the target
machine.  @file{@var{machine}.c} should also contain their definitions,
if they are not defined elsewhere in GCC, and other functions called
through the macros defined in the @file{.h} file.

@menu
* Target Structure::    The @code{targetm} variable.
* Driver::              Controlling how the driver runs the compilation passes.
* Run-time Target::     Defining @samp{-m} options like @option{-m68000} and @option{-m68020}.
* Per-Function Data::   Defining data structures for per-function information.
* Storage Layout::      Defining sizes and alignments of data.
* Type Layout::         Defining sizes and properties of basic user data types.
* Registers::           Naming and describing the hardware registers.
* Register Classes::    Defining the classes of hardware registers.
* Stack and Calling::   Defining which way the stack grows and by how much.
* Varargs::             Defining the varargs macros.
* Trampolines::         Code set up at run time to enter a nested function.
* Library Calls::       Controlling how library routines are implicitly called.
* Addressing Modes::    Defining addressing modes valid for memory operands.
* Anchored Addresses::  Defining how @option{-fsection-anchors} should work.
* Condition Code::      Defining how insns update the condition code.
* Costs::               Defining relative costs of different operations.
* Scheduling::          Adjusting the behavior of the instruction scheduler.
* Sections::            Dividing storage into text, data, and other sections.
* PIC::                 Macros for position independent code.
* Assembler Format::    Defining how to write insns and pseudo-ops to output.
* Debugging Info::      Defining the format of debugging output.
* Floating Point::      Handling floating point for cross-compilers.
* Mode Switching::      Insertion of mode-switching instructions.
* Target Attributes::   Defining target-specific uses of @code{__attribute__}.
* Emulated TLS::        Emulated TLS support.
* MIPS Coprocessors::   MIPS coprocessor support and how to customize it.
* PCH Target::          Validity checking for precompiled headers.
* C++ ABI::             Controlling C++ ABI changes.
* D Language and ABI::  Controlling D ABI changes.
* Named Address Spaces:: Adding support for named address spaces
* Misc::                Everything else.
@end menu

@node Target Structure
@section The Global @code{targetm} Variable
@cindex target hooks
@cindex target functions

@deftypevar {struct gcc_target} targetm
The target @file{.c} file must define the global @code{targetm} variable
which contains pointers to functions and data relating to the target
machine.  The variable is declared in @file{target.h};
@file{target-def.h} defines the macro @code{TARGET_INITIALIZER} which is
used to initialize the variable, and macros for the default initializers
for elements of the structure.  The @file{.c} file should override those
macros for which the default definition is inappropriate.  For example:
@smallexample
#include "target.h"
#include "target-def.h"

/* @r{Initialize the GCC target structure.}  */

#undef TARGET_COMP_TYPE_ATTRIBUTES
#define TARGET_COMP_TYPE_ATTRIBUTES @var{machine}_comp_type_attributes

struct gcc_target targetm = TARGET_INITIALIZER;
@end smallexample
@end deftypevar

Where a macro should be defined in the @file{.c} file in this manner to
form part of the @code{targetm} structure, it is documented below as a
``Target Hook'' with a prototype.  Many macros will change in future
from being defined in the @file{.h} file to being part of the
@code{targetm} structure.

Similarly, there is a @code{targetcm} variable for hooks that are
specific to front ends for C-family languages, documented as ``C
Target Hook''.  This is declared in @file{c-family/c-target.h}, the
initializer @code{TARGETCM_INITIALIZER} in
@file{c-family/c-target-def.h}.  If targets initialize @code{targetcm}
themselves, they should set @code{target_has_targetcm=yes} in
@file{config.gcc}; otherwise a default definition is used.

Similarly, there is a @code{targetm_common} variable for hooks that
are shared between the compiler driver and the compilers proper,
documented as ``Common Target Hook''.  This is declared in
@file{common/common-target.h}, the initializer
@code{TARGETM_COMMON_INITIALIZER} in
@file{common/common-target-def.h}.  If targets initialize
@code{targetm_common} themselves, they should set
@code{target_has_targetm_common=yes} in @file{config.gcc}; otherwise a
default definition is used.

Similarly, there is a @code{targetdm} variable for hooks that are
specific to the D language front end, documented as ``D Target Hook''.
This is declared in @file{d/d-target.h}, the initializer
@code{TARGETDM_INITIALIZER} in @file{d/d-target-def.h}.  If targets
initialize @code{targetdm} themselves, they should set
@code{target_has_targetdm=yes} in @file{config.gcc}; otherwise a default
definition is used.

@node Driver
@section Controlling the Compilation Driver, @file{gcc}
@cindex driver
@cindex controlling the compilation driver

@c prevent bad page break with this line
You can control the compilation driver.

@defmac DRIVER_SELF_SPECS
A list of specs for the driver itself.  It should be a suitable
initializer for an array of strings, with no surrounding braces.

The driver applies these specs to its own command line between loading
default @file{specs} files (but not command-line specified ones) and
choosing the multilib directory or running any subcommands.  It
applies them in the order given, so each spec can depend on the
options added by earlier ones.  It is also possible to remove options
using @samp{%<@var{option}} in the usual way.

This macro can be useful when a port has several interdependent target
options.  It provides a way of standardizing the command line so
that the other specs are easier to write.

Do not define this macro if it does not need to do anything.
@end defmac

@defmac OPTION_DEFAULT_SPECS
A list of specs used to support configure-time default options (i.e.@:
@option{--with} options) in the driver.  It should be a suitable initializer
for an array of structures, each containing two strings, without the
outermost pair of surrounding braces.

The first item in the pair is the name of the default.  This must match
the code in @file{config.gcc} for the target.  The second item is a spec
to apply if a default with this name was specified.  The string
@samp{%(VALUE)} in the spec will be replaced by the value of the default
everywhere it occurs.

The driver will apply these specs to its own command line between loading
default @file{specs} files and processing @code{DRIVER_SELF_SPECS}, using
the same mechanism as @code{DRIVER_SELF_SPECS}.

Do not define this macro if it does not need to do anything.
@end defmac

@defmac CPP_SPEC
A C string constant that tells the GCC driver program options to
pass to CPP@.  It can also specify how to translate options you
give to GCC into options for GCC to pass to the CPP@.

Do not define this macro if it does not need to do anything.
@end defmac

@defmac CPLUSPLUS_CPP_SPEC
This macro is just like @code{CPP_SPEC}, but is used for C++, rather
than C@.  If you do not define this macro, then the value of
@code{CPP_SPEC} (if any) will be used instead.
@end defmac

@defmac CC1_SPEC
A C string constant that tells the GCC driver program options to
pass to @code{cc1}, @code{cc1plus}, @code{f771}, and the other language
front ends.
It can also specify how to translate options you give to GCC into options
for GCC to pass to front ends.

Do not define this macro if it does not need to do anything.
@end defmac

@defmac CC1PLUS_SPEC
A C string constant that tells the GCC driver program options to
pass to @code{cc1plus}.  It can also specify how to translate options you
give to GCC into options for GCC to pass to the @code{cc1plus}.

Do not define this macro if it does not need to do anything.
Note that everything defined in CC1_SPEC is already passed to
@code{cc1plus} so there is no need to duplicate the contents of
CC1_SPEC in CC1PLUS_SPEC@.
@end defmac

@defmac ASM_SPEC
A C string constant that tells the GCC driver program options to
pass to the assembler.  It can also specify how to translate options
you give to GCC into options for GCC to pass to the assembler.
See the file @file{sun3.h} for an example of this.

Do not define this macro if it does not need to do anything.
@end defmac

@defmac ASM_FINAL_SPEC
A C string constant that tells the GCC driver program how to
run any programs which cleanup after the normal assembler.
Normally, this is not needed.  See the file @file{mips.h} for
an example of this.

Do not define this macro if it does not need to do anything.
@end defmac

@defmac AS_NEEDS_DASH_FOR_PIPED_INPUT
Define this macro, with no value, if the driver should give the assembler
an argument consisting of a single dash, @option{-}, to instruct it to
read from its standard input (which will be a pipe connected to the
output of the compiler proper).  This argument is given after any
@option{-o} option specifying the name of the output file.

If you do not define this macro, the assembler is assumed to read its
standard input if given no non-option arguments.  If your assembler
cannot read standard input at all, use a @samp{%@{pipe:%e@}} construct;
see @file{mips.h} for instance.
@end defmac

@defmac LINK_SPEC
A C string constant that tells the GCC driver program options to
pass to the linker.  It can also specify how to translate options you
give to GCC into options for GCC to pass to the linker.

Do not define this macro if it does not need to do anything.
@end defmac

@defmac LIB_SPEC
Another C string constant used much like @code{LINK_SPEC}.  The difference
between the two is that @code{LIB_SPEC} is used at the end of the
command given to the linker.

If this macro is not defined, a default is provided that
loads the standard C library from the usual place.  See @file{gcc.cc}.
@end defmac

@defmac LIBGCC_SPEC
Another C string constant that tells the GCC driver program
how and when to place a reference to @file{libgcc.a} into the
linker command line.  This constant is placed both before and after
the value of @code{LIB_SPEC}.

If this macro is not defined, the GCC driver provides a default that
passes the string @option{-lgcc} to the linker.
@end defmac

@defmac REAL_LIBGCC_SPEC
By default, if @code{ENABLE_SHARED_LIBGCC} is defined, the
@code{LIBGCC_SPEC} is not directly used by the driver program but is
instead modified to refer to different versions of @file{libgcc.a}
depending on the values of the command line flags @option{-static},
@option{-shared}, @option{-static-libgcc}, and @option{-shared-libgcc}.  On
targets where these modifications are inappropriate, define
@code{REAL_LIBGCC_SPEC} instead.  @code{REAL_LIBGCC_SPEC} tells the
driver how to place a reference to @file{libgcc} on the link command
line, but, unlike @code{LIBGCC_SPEC}, it is used unmodified.
@end defmac

@defmac USE_LD_AS_NEEDED
A macro that controls the modifications to @code{LIBGCC_SPEC}
mentioned in @code{REAL_LIBGCC_SPEC}.  If nonzero, a spec will be
generated that uses @option{--as-needed} or equivalent options and the
shared @file{libgcc} in place of the
static exception handler library, when linking without any of
@code{-static}, @code{-static-libgcc}, or @code{-shared-libgcc}.
@end defmac

@defmac LINK_EH_SPEC
If defined, this C string constant is added to @code{LINK_SPEC}.
When @code{USE_LD_AS_NEEDED} is zero or undefined, it also affects
the modifications to @code{LIBGCC_SPEC} mentioned in
@code{REAL_LIBGCC_SPEC}.
@end defmac

@defmac STARTFILE_SPEC
Another C string constant used much like @code{LINK_SPEC}.  The
difference between the two is that @code{STARTFILE_SPEC} is used at
the very beginning of the command given to the linker.

If this macro is not defined, a default is provided that loads the
standard C startup file from the usual place.  See @file{gcc.cc}.
@end defmac

@defmac ENDFILE_SPEC
Another C string constant used much like @code{LINK_SPEC}.  The
difference between the two is that @code{ENDFILE_SPEC} is used at
the very end of the command given to the linker.

Do not define this macro if it does not need to do anything.
@end defmac

@defmac THREAD_MODEL_SPEC
GCC @code{-v} will print the thread model GCC was configured to use.
However, this doesn't work on platforms that are multilibbed on thread
models, such as AIX 4.3.  On such platforms, define
@code{THREAD_MODEL_SPEC} such that it evaluates to a string without
blanks that names one of the recognized thread models.  @code{%*}, the
default value of this macro, will expand to the value of
@code{thread_file} set in @file{config.gcc}.
@end defmac

@defmac SYSROOT_SUFFIX_SPEC
Define this macro to add a suffix to the target sysroot when GCC is
configured with a sysroot.  This will cause GCC to search for usr/lib,
et al, within sysroot+suffix.
@end defmac

@defmac SYSROOT_HEADERS_SUFFIX_SPEC
Define this macro to add a headers_suffix to the target sysroot when
GCC is configured with a sysroot.  This will cause GCC to pass the
updated sysroot+headers_suffix to CPP, causing it to search for
usr/include, et al, within sysroot+headers_suffix.
@end defmac

@defmac EXTRA_SPECS
Define this macro to provide additional specifications to put in the
@file{specs} file that can be used in various specifications like
@code{CC1_SPEC}.

The definition should be an initializer for an array of structures,
containing a string constant, that defines the specification name, and a
string constant that provides the specification.

Do not define this macro if it does not need to do anything.

@code{EXTRA_SPECS} is useful when an architecture contains several
related targets, which have various @code{@dots{}_SPECS} which are similar
to each other, and the maintainer would like one central place to keep
these definitions.

For example, the PowerPC System V.4 targets use @code{EXTRA_SPECS} to
define either @code{_CALL_SYSV} when the System V calling sequence is
used or @code{_CALL_AIX} when the older AIX-based calling sequence is
used.

The @file{config/rs6000/rs6000.h} target file defines:

@smallexample
#define EXTRA_SPECS \
  @{ "cpp_sysv_default", CPP_SYSV_DEFAULT @},

#define CPP_SYS_DEFAULT ""
@end smallexample

The @file{config/rs6000/sysv.h} target file defines:
@smallexample
#undef CPP_SPEC
#define CPP_SPEC \
"%@{posix: -D_POSIX_SOURCE @} \
%@{mcall-sysv: -D_CALL_SYSV @} \
%@{!mcall-sysv: %(cpp_sysv_default) @} \
%@{msoft-float: -D_SOFT_FLOAT@} %@{mcpu=403: -D_SOFT_FLOAT@}"

#undef CPP_SYSV_DEFAULT
#define CPP_SYSV_DEFAULT "-D_CALL_SYSV"
@end smallexample

while the @file{config/rs6000/eabiaix.h} target file defines
@code{CPP_SYSV_DEFAULT} as:

@smallexample
#undef CPP_SYSV_DEFAULT
#define CPP_SYSV_DEFAULT "-D_CALL_AIX"
@end smallexample
@end defmac

@defmac LINK_LIBGCC_SPECIAL_1
Define this macro if the driver program should find the library
@file{libgcc.a}.  If you do not define this macro, the driver program will pass
the argument @option{-lgcc} to tell the linker to do the search.
@end defmac

@defmac LINK_GCC_C_SEQUENCE_SPEC
The sequence in which libgcc and libc are specified to the linker.
By default this is @code{%G %L %G}.
@end defmac

@defmac POST_LINK_SPEC
Define this macro to add additional steps to be executed after linker.
The default value of this macro is empty string.
@end defmac

@defmac LINK_COMMAND_SPEC
A C string constant giving the complete command line need to execute the
linker.  When you do this, you will need to update your port each time a
change is made to the link command line within @file{gcc.cc}.  Therefore,
define this macro only if you need to completely redefine the command
line for invoking the linker and there is no other way to accomplish
the effect you need.  Overriding this macro may be avoidable by overriding
@code{LINK_GCC_C_SEQUENCE_SPEC} instead.
@end defmac

@hook TARGET_ALWAYS_STRIP_DOTDOT

@defmac MULTILIB_DEFAULTS
Define this macro as a C expression for the initializer of an array of
string to tell the driver program which options are defaults for this
target and thus do not need to be handled specially when using
@code{MULTILIB_OPTIONS}.

Do not define this macro if @code{MULTILIB_OPTIONS} is not defined in
the target makefile fragment or if none of the options listed in
@code{MULTILIB_OPTIONS} are set by default.
@xref{Target Fragment}.
@end defmac

@defmac RELATIVE_PREFIX_NOT_LINKDIR
Define this macro to tell @command{gcc} that it should only translate
a @option{-B} prefix into a @option{-L} linker option if the prefix
indicates an absolute file name.
@end defmac

@defmac MD_EXEC_PREFIX
If defined, this macro is an additional prefix to try after
@code{STANDARD_EXEC_PREFIX}.  @code{MD_EXEC_PREFIX} is not searched
when the compiler is built as a cross
compiler.  If you define @code{MD_EXEC_PREFIX}, then be sure to add it
to the list of directories used to find the assembler in @file{configure.ac}.
@end defmac

@defmac STANDARD_STARTFILE_PREFIX
Define this macro as a C string constant if you wish to override the
standard choice of @code{libdir} as the default prefix to
try when searching for startup files such as @file{crt0.o}.
@code{STANDARD_STARTFILE_PREFIX} is not searched when the compiler
is built as a cross compiler.
@end defmac

@defmac STANDARD_STARTFILE_PREFIX_1
Define this macro as a C string constant if you wish to override the
standard choice of @code{/lib} as a prefix to try after the default prefix
when searching for startup files such as @file{crt0.o}.
@code{STANDARD_STARTFILE_PREFIX_1} is not searched when the compiler
is built as a cross compiler.
@end defmac

@defmac STANDARD_STARTFILE_PREFIX_2
Define this macro as a C string constant if you wish to override the
standard choice of @code{/lib} as yet another prefix to try after the
default prefix when searching for startup files such as @file{crt0.o}.
@code{STANDARD_STARTFILE_PREFIX_2} is not searched when the compiler
is built as a cross compiler.
@end defmac

@defmac MD_STARTFILE_PREFIX
If defined, this macro supplies an additional prefix to try after the
standard prefixes.  @code{MD_EXEC_PREFIX} is not searched when the
compiler is built as a cross compiler.
@end defmac

@defmac MD_STARTFILE_PREFIX_1
If defined, this macro supplies yet another prefix to try after the
standard prefixes.  It is not searched when the compiler is built as a
cross compiler.
@end defmac

@defmac INIT_ENVIRONMENT
Define this macro as a C string constant if you wish to set environment
variables for programs called by the driver, such as the assembler and
loader.  The driver passes the value of this macro to @code{putenv} to
initialize the necessary environment variables.
@end defmac

@defmac LOCAL_INCLUDE_DIR
Define this macro as a C string constant if you wish to override the
standard choice of @file{/usr/local/include} as the default prefix to
try when searching for local header files.  @code{LOCAL_INCLUDE_DIR}
comes before @code{NATIVE_SYSTEM_HEADER_DIR} (set in
@file{config.gcc}, normally @file{/usr/include}) in the search order.

Cross compilers do not search either @file{/usr/local/include} or its
replacement.
@end defmac

@defmac NATIVE_SYSTEM_HEADER_COMPONENT
The ``component'' corresponding to @code{NATIVE_SYSTEM_HEADER_DIR}.
See @code{INCLUDE_DEFAULTS}, below, for the description of components.
If you do not define this macro, no component is used.
@end defmac

@defmac INCLUDE_DEFAULTS
Define this macro if you wish to override the entire default search path
for include files.  For a native compiler, the default search path
usually consists of @code{GCC_INCLUDE_DIR}, @code{LOCAL_INCLUDE_DIR},
@code{GPLUSPLUS_INCLUDE_DIR}, and
@code{NATIVE_SYSTEM_HEADER_DIR}.  In addition, @code{GPLUSPLUS_INCLUDE_DIR}
and @code{GCC_INCLUDE_DIR} are defined automatically by @file{Makefile},
and specify private search areas for GCC@.  The directory
@code{GPLUSPLUS_INCLUDE_DIR} is used only for C++ programs.

The definition should be an initializer for an array of structures.
Each array element should have four elements: the directory name (a
string constant), the component name (also a string constant), a flag
for C++-only directories,
and a flag showing that the includes in the directory don't need to be
wrapped in @code{extern @samp{C}} when compiling C++.  Mark the end of
the array with a null element.

The component name denotes what GNU package the include file is part of,
if any, in all uppercase letters.  For example, it might be @samp{GCC}
or @samp{BINUTILS}.  If the package is part of a vendor-supplied
operating system, code the component name as @samp{0}.

For example, here is the definition used for VAX/VMS:

@smallexample
#define INCLUDE_DEFAULTS \
@{                                       \
  @{ "GNU_GXX_INCLUDE:", "G++", 1, 1@},   \
  @{ "GNU_CC_INCLUDE:", "GCC", 0, 0@},    \
  @{ "SYS$SYSROOT:[SYSLIB.]", 0, 0, 0@},  \
  @{ ".", 0, 0, 0@},                      \
  @{ 0, 0, 0, 0@}                         \
@}
@end smallexample
@end defmac

Here is the order of prefixes tried for exec files:

@enumerate
@item
Any prefixes specified by the user with @option{-B}.

@item
The environment variable @code{GCC_EXEC_PREFIX} or, if @code{GCC_EXEC_PREFIX}
is not set and the compiler has not been installed in the configure-time
@var{prefix}, the location in which the compiler has actually been installed.

@item
The directories specified by the environment variable @code{COMPILER_PATH}.

@item
The macro @code{STANDARD_EXEC_PREFIX}, if the compiler has been installed
in the configured-time @var{prefix}.

@item
The location @file{/usr/libexec/gcc/}, but only if this is a native compiler.

@item
The location @file{/usr/lib/gcc/}, but only if this is a native compiler.

@item
The macro @code{MD_EXEC_PREFIX}, if defined, but only if this is a native
compiler.
@end enumerate

Here is the order of prefixes tried for startfiles:

@enumerate
@item
Any prefixes specified by the user with @option{-B}.

@item
The environment variable @code{GCC_EXEC_PREFIX} or its automatically determined
value based on the installed toolchain location.

@item
The directories specified by the environment variable @code{LIBRARY_PATH}
(or port-specific name; native only, cross compilers do not use this).

@item
The macro @code{STANDARD_EXEC_PREFIX}, but only if the toolchain is installed
in the configured @var{prefix} or this is a native compiler.

@item
The location @file{/usr/lib/gcc/}, but only if this is a native compiler.

@item
The macro @code{MD_EXEC_PREFIX}, if defined, but only if this is a native
compiler.

@item
The macro @code{MD_STARTFILE_PREFIX}, if defined, but only if this is a
native compiler, or we have a target system root.

@item
The macro @code{MD_STARTFILE_PREFIX_1}, if defined, but only if this is a
native compiler, or we have a target system root.

@item
The macro @code{STANDARD_STARTFILE_PREFIX}, with any sysroot modifications.
If this path is relative it will be prefixed by @code{GCC_EXEC_PREFIX} and
the machine suffix or @code{STANDARD_EXEC_PREFIX} and the machine suffix.

@item
The macro @code{STANDARD_STARTFILE_PREFIX_1}, but only if this is a native
compiler, or we have a target system root. The default for this macro is
@file{/lib/}.

@item
The macro @code{STANDARD_STARTFILE_PREFIX_2}, but only if this is a native
compiler, or we have a target system root. The default for this macro is
@file{/usr/lib/}.
@end enumerate

@node Run-time Target
@section Run-time Target Specification
@cindex run-time target specification
@cindex predefined macros
@cindex target specifications

@c prevent bad page break with this line
Here are run-time target specifications.

@defmac TARGET_CPU_CPP_BUILTINS ()
This function-like macro expands to a block of code that defines
built-in preprocessor macros and assertions for the target CPU, using
the functions @code{builtin_define}, @code{builtin_define_std} and
@code{builtin_assert}.  When the front end
calls this macro it provides a trailing semicolon, and since it has
finished command line option processing your code can use those
results freely.

@code{builtin_assert} takes a string in the form you pass to the
command-line option @option{-A}, such as @code{cpu=mips}, and creates
the assertion.  @code{builtin_define} takes a string in the form
accepted by option @option{-D} and unconditionally defines the macro.

@code{builtin_define_std} takes a string representing the name of an
object-like macro.  If it doesn't lie in the user's namespace,
@code{builtin_define_std} defines it unconditionally.  Otherwise, it
defines a version with two leading underscores, and another version
with two leading and trailing underscores, and defines the original
only if an ISO standard was not requested on the command line.  For
example, passing @code{unix} defines @code{__unix}, @code{__unix__}
and possibly @code{unix}; passing @code{_mips} defines @code{__mips},
@code{__mips__} and possibly @code{_mips}, and passing @code{_ABI64}
defines only @code{_ABI64}.

You can also test for the C dialect being compiled.  The variable
@code{c_language} is set to one of @code{clk_c}, @code{clk_cplusplus}
or @code{clk_objective_c}.  Note that if we are preprocessing
assembler, this variable will be @code{clk_c} but the function-like
macro @code{preprocessing_asm_p()} will return true, so you might want
to check for that first.  If you need to check for strict ANSI, the
variable @code{flag_iso} can be used.  The function-like macro
@code{preprocessing_trad_p()} can be used to check for traditional
preprocessing.
@end defmac

@defmac TARGET_OS_CPP_BUILTINS ()
Similarly to @code{TARGET_CPU_CPP_BUILTINS} but this macro is optional
and is used for the target operating system instead.
@end defmac

@defmac TARGET_OBJFMT_CPP_BUILTINS ()
Similarly to @code{TARGET_CPU_CPP_BUILTINS} but this macro is optional
and is used for the target object format.  @file{elfos.h} uses this
macro to define @code{__ELF__}, so you probably do not need to define
it yourself.
@end defmac

@deftypevar {extern int} target_flags
This variable is declared in @file{options.h}, which is included before
any target-specific headers.
@end deftypevar

@hook TARGET_DEFAULT_TARGET_FLAGS
This variable specifies the initial value of @code{target_flags}.
Its default setting is 0.
@end deftypevr

@cindex optional hardware or system features
@cindex features, optional, in system conventions

@hook TARGET_HANDLE_OPTION
This hook is called whenever the user specifies one of the
target-specific options described by the @file{.opt} definition files
(@pxref{Options}).  It has the opportunity to do some option-specific
processing and should return true if the option is valid.  The default
definition does nothing but return true.

@var{decoded} specifies the option and its arguments.  @var{opts} and
@var{opts_set} are the @code{gcc_options} structures to be used for
storing option state, and @var{loc} is the location at which the
option was passed (@code{UNKNOWN_LOCATION} except for options passed
via attributes).
@end deftypefn

@hook TARGET_HANDLE_C_OPTION
This target hook is called whenever the user specifies one of the
target-specific C language family options described by the @file{.opt}
definition files(@pxref{Options}).  It has the opportunity to do some
option-specific processing and should return true if the option is
valid.  The arguments are like for @code{TARGET_HANDLE_OPTION}.  The
default definition does nothing but return false.

In general, you should use @code{TARGET_HANDLE_OPTION} to handle
options.  However, if processing an option requires routines that are
only available in the C (and related language) front ends, then you
should use @code{TARGET_HANDLE_C_OPTION} instead.
@end deftypefn

@hook TARGET_OBJC_CONSTRUCT_STRING_OBJECT

@hook TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE

@hook TARGET_OBJC_DECLARE_CLASS_DEFINITION

@hook TARGET_STRING_OBJECT_REF_TYPE_P

@hook TARGET_CHECK_STRING_OBJECT_FORMAT_ARG

@hook TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE

@defmac C_COMMON_OVERRIDE_OPTIONS
This is similar to the @code{TARGET_OPTION_OVERRIDE} hook
but is only used in the C
language frontends (C, Objective-C, C++, Objective-C++) and so can be
used to alter option flag variables which only exist in those
frontends.
@end defmac

@hook TARGET_OPTION_OPTIMIZATION_TABLE
Some machines may desire to change what optimizations are performed for
various optimization levels.   This variable, if defined, describes
options to enable at particular sets of optimization levels.  These
options are processed once
just after the optimization level is determined and before the remainder
of the command options have been parsed, so may be overridden by other
options passed explicitly.

This processing is run once at program startup and when the optimization
options are changed via @code{#pragma GCC optimize} or by using the
@code{optimize} attribute.
@end deftypevr

@hook TARGET_OPTION_INIT_STRUCT

@hook TARGET_COMPUTE_MULTILIB


@defmac SWITCHABLE_TARGET
Some targets need to switch between substantially different subtargets
during compilation.  For example, the MIPS target has one subtarget for
the traditional MIPS architecture and another for MIPS16.  Source code
can switch between these two subarchitectures using the @code{mips16}
and @code{nomips16} attributes.

Such subtargets can differ in things like the set of available
registers, the set of available instructions, the costs of various
operations, and so on.  GCC caches a lot of this type of information
in global variables, and recomputing them for each subtarget takes a
significant amount of time.  The compiler therefore provides a facility
for maintaining several versions of the global variables and quickly
switching between them; see @file{target-globals.h} for details.

Define this macro to 1 if your target needs this facility.  The default
is 0.
@end defmac

@hook TARGET_FLOAT_EXCEPTIONS_ROUNDING_SUPPORTED_P

@node Per-Function Data
@section Defining data structures for per-function information.
@cindex per-function data
@cindex data structures

If the target needs to store information on a per-function basis, GCC
provides a macro and a couple of variables to allow this.  Note, just
using statics to store the information is a bad idea, since GCC supports
nested functions, so you can be halfway through encoding one function
when another one comes along.

GCC defines a data structure called @code{struct function} which
contains all of the data specific to an individual function.  This
structure contains a field called @code{machine} whose type is
@code{struct machine_function *}, which can be used by targets to point
to their own specific data.

If a target needs per-function specific data it should define the type
@code{struct machine_function} and also the macro @code{INIT_EXPANDERS}.
This macro should be used to initialize the function pointer
@code{init_machine_status}.  This pointer is explained below.

One typical use of per-function, target specific data is to create an
RTX to hold the register containing the function's return address.  This
RTX can then be used to implement the @code{__builtin_return_address}
function, for level 0.

Note---earlier implementations of GCC used a single data area to hold
all of the per-function information.  Thus when processing of a nested
function began the old per-function data had to be pushed onto a
stack, and when the processing was finished, it had to be popped off the
stack.  GCC used to provide function pointers called
@code{save_machine_status} and @code{restore_machine_status} to handle
the saving and restoring of the target specific information.  Since the
single data area approach is no longer used, these pointers are no
longer supported.

@defmac INIT_EXPANDERS
Macro called to initialize any target specific information.  This macro
is called once per function, before generation of any RTL has begun.
The intention of this macro is to allow the initialization of the
function pointer @code{init_machine_status}.
@end defmac

@deftypevar {void (*)(struct function *)} init_machine_status
If this function pointer is non-@code{NULL} it will be called once per
function, before function compilation starts, in order to allow the
target to perform any target specific initialization of the
@code{struct function} structure.  It is intended that this would be
used to initialize the @code{machine} of that structure.

@code{struct machine_function} structures are expected to be freed by GC@.
Generally, any memory that they reference must be allocated by using
GC allocation, including the structure itself.
@end deftypevar

@node Storage Layout
@section Storage Layout
@cindex storage layout

Note that the definitions of the macros in this table which are sizes or
alignments measured in bits do not need to be constant.  They can be C
expressions that refer to static variables, such as the @code{target_flags}.
@xref{Run-time Target}.

@defmac BITS_BIG_ENDIAN
Define this macro to have the value 1 if the most significant bit in a
byte has the lowest number; otherwise define it to have the value zero.
This means that bit-field instructions count from the most significant
bit.  If the machine has no bit-field instructions, then this must still
be defined, but it doesn't matter which value it is defined to.  This
macro need not be a constant.

This macro does not affect the way structure fields are packed into
bytes or words; that is controlled by @code{BYTES_BIG_ENDIAN}.
@end defmac

@defmac BYTES_BIG_ENDIAN
Define this macro to have the value 1 if the most significant byte in a
word has the lowest number.  This macro need not be a constant.
@end defmac

@defmac WORDS_BIG_ENDIAN
Define this macro to have the value 1 if, in a multiword object, the
most significant word has the lowest number.  This applies to both
memory locations and registers; see @code{REG_WORDS_BIG_ENDIAN} if the
order of words in memory is not the same as the order in registers.  This
macro need not be a constant.
@end defmac

@defmac REG_WORDS_BIG_ENDIAN
On some machines, the order of words in a multiword object differs between
registers in memory.  In such a situation, define this macro to describe
the order of words in a register.  The macro @code{WORDS_BIG_ENDIAN} controls
the order of words in memory.
@end defmac

@defmac FLOAT_WORDS_BIG_ENDIAN
Define this macro to have the value 1 if @code{DFmode}, @code{XFmode} or
@code{TFmode} floating point numbers are stored in memory with the word
containing the sign bit at the lowest address; otherwise define it to
have the value 0.  This macro need not be a constant.

You need not define this macro if the ordering is the same as for
multi-word integers.
@end defmac

@defmac BITS_PER_WORD
Number of bits in a word.  If you do not define this macro, the default
is @code{BITS_PER_UNIT * UNITS_PER_WORD}.
@end defmac

@defmac MAX_BITS_PER_WORD
Maximum number of bits in a word.  If this is undefined, the default is
@code{BITS_PER_WORD}.  Otherwise, it is the constant value that is the
largest value that @code{BITS_PER_WORD} can have at run-time.
@end defmac

@defmac UNITS_PER_WORD
Number of storage units in a word; normally the size of a general-purpose
register, a power of two from 1 or 8.
@end defmac

@defmac MIN_UNITS_PER_WORD
Minimum number of units in a word.  If this is undefined, the default is
@code{UNITS_PER_WORD}.  Otherwise, it is the constant value that is the
smallest value that @code{UNITS_PER_WORD} can have at run-time.
@end defmac

@defmac POINTER_SIZE
Width of a pointer, in bits.  You must specify a value no wider than the
width of @code{Pmode}.  If it is not equal to the width of @code{Pmode},
you must define @code{POINTERS_EXTEND_UNSIGNED}.  If you do not specify
a value the default is @code{BITS_PER_WORD}.
@end defmac

@defmac POINTERS_EXTEND_UNSIGNED
A C expression that determines how pointers should be extended from
@code{ptr_mode} to either @code{Pmode} or @code{word_mode}.  It is
greater than zero if pointers should be zero-extended, zero if they
should be sign-extended, and negative if some other sort of conversion
is needed.  In the last case, the extension is done by the target's
@code{ptr_extend} instruction.

You need not define this macro if the @code{ptr_mode}, @code{Pmode}
and @code{word_mode} are all the same width.
@end defmac

@defmac PROMOTE_MODE (@var{m}, @var{unsignedp}, @var{type})
A macro to update @var{m} and @var{unsignedp} when an object whose type
is @var{type} and which has the specified mode and signedness is to be
stored in a register.  This macro is only called when @var{type} is a
scalar type.

On most RISC machines, which only have operations that operate on a full
register, define this macro to set @var{m} to @code{word_mode} if
@var{m} is an integer mode narrower than @code{BITS_PER_WORD}.  In most
cases, only integer modes should be widened because wider-precision
floating-point operations are usually more expensive than their narrower
counterparts.

For most machines, the macro definition does not change @var{unsignedp}.
However, some machines, have instructions that preferentially handle
either signed or unsigned quantities of certain modes.  For example, on
the DEC Alpha, 32-bit loads from memory and 32-bit add instructions
sign-extend the result to 64 bits.  On such machines, set
@var{unsignedp} according to which kind of extension is more efficient.

Do not define this macro if it would never modify @var{m}.
@end defmac

@hook TARGET_C_EXCESS_PRECISION
Return a value, with the same meaning as the C99 macro
@code{FLT_EVAL_METHOD} that describes which excess precision should be
applied.

@hook TARGET_PROMOTE_FUNCTION_MODE

@defmac PARM_BOUNDARY
Normal alignment required for function parameters on the stack, in
bits.  All stack parameters receive at least this much alignment
regardless of data type.  On most machines, this is the same as the
size of an integer.
@end defmac

@defmac STACK_BOUNDARY
Define this macro to the minimum alignment enforced by hardware for the
stack pointer on this machine.  The definition is a C expression for the
desired alignment (measured in bits).  This value is used as a default
if @code{PREFERRED_STACK_BOUNDARY} is not defined.  On most machines,
this should be the same as @code{PARM_BOUNDARY}.
@end defmac

@defmac PREFERRED_STACK_BOUNDARY
Define this macro if you wish to preserve a certain alignment for the
stack pointer, greater than what the hardware enforces.  The definition
is a C expression for the desired alignment (measured in bits).  This
macro must evaluate to a value equal to or larger than
@code{STACK_BOUNDARY}.
@end defmac

@defmac INCOMING_STACK_BOUNDARY
Define this macro if the incoming stack boundary may be different
from @code{PREFERRED_STACK_BOUNDARY}.  This macro must evaluate
to a value equal to or larger than @code{STACK_BOUNDARY}.
@end defmac

@defmac FUNCTION_BOUNDARY
Alignment required for a function entry point, in bits.
@end defmac

@defmac BIGGEST_ALIGNMENT
Biggest alignment that any data type can require on this machine, in
bits.  Note that this is not the biggest alignment that is supported,
just the biggest alignment that, when violated, may cause a fault.
@end defmac

@hook TARGET_ABSOLUTE_BIGGEST_ALIGNMENT

@defmac MALLOC_ABI_ALIGNMENT
Alignment, in bits, a C conformant malloc implementation has to
provide.  If not defined, the default value is @code{BITS_PER_WORD}.
@end defmac

@defmac ATTRIBUTE_ALIGNED_VALUE
Alignment used by the @code{__attribute__ ((aligned))} construct.  If
not defined, the default value is @code{BIGGEST_ALIGNMENT}.
@end defmac

@defmac MINIMUM_ATOMIC_ALIGNMENT
If defined, the smallest alignment, in bits, that can be given to an
object that can be referenced in one operation, without disturbing any
nearby object.  Normally, this is @code{BITS_PER_UNIT}, but may be larger
on machines that don't have byte or half-word store operations.
@end defmac

@defmac BIGGEST_FIELD_ALIGNMENT
Biggest alignment that any structure or union field can require on this
machine, in bits.  If defined, this overrides @code{BIGGEST_ALIGNMENT} for
structure and union fields only, unless the field alignment has been set
by the @code{__attribute__ ((aligned (@var{n})))} construct.
@end defmac

@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{type}, @var{computed})
An expression for the alignment of a structure field @var{field} of
type @var{type} if the alignment computed in the usual way (including
applying of @code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the
alignment) is @var{computed}.  It overrides alignment only if the
field alignment has not been set by the
@code{__attribute__ ((aligned (@var{n})))} construct.  Note that @var{field}
may be @code{NULL_TREE} in case we just query for the minimum alignment
of a field of type @var{type} in structure context.
@end defmac

@defmac MAX_STACK_ALIGNMENT
Biggest stack alignment guaranteed by the backend.  Use this macro
to specify the maximum alignment of a variable on stack.

If not defined, the default value is @code{STACK_BOUNDARY}.

@c FIXME: The default should be @code{PREFERRED_STACK_BOUNDARY}.
@c But the fix for PR 32893 indicates that we can only guarantee
@c maximum stack alignment on stack up to @code{STACK_BOUNDARY}, not
@c @code{PREFERRED_STACK_BOUNDARY}, if stack alignment isn't supported.
@end defmac

@defmac MAX_OFILE_ALIGNMENT
Biggest alignment supported by the object file format of this machine.
Use this macro to limit the alignment which can be specified using the
@code{__attribute__ ((aligned (@var{n})))} construct for functions and
objects with static storage duration.  The alignment of automatic
objects may exceed the object file format maximum up to the maximum
supported by GCC.  If not defined, the default value is
@code{BIGGEST_ALIGNMENT}.

On systems that use ELF, the default (in @file{config/elfos.h}) is
the largest supported 32-bit ELF section alignment representable on
a 32-bit host e.g.@: @samp{(((uint64_t) 1 << 28) * 8)}.
On 32-bit ELF the largest supported section alignment in bits is
@samp{(0x80000000 * 8)}, but this is not representable on 32-bit hosts.
@end defmac

@hook TARGET_LOWER_LOCAL_DECL_ALIGNMENT

@hook TARGET_STATIC_RTX_ALIGNMENT

@defmac DATA_ALIGNMENT (@var{type}, @var{basic-align})
If defined, a C expression to compute the alignment for a variable in
the static store.  @var{type} is the data type, and @var{basic-align} is
the alignment that the object would ordinarily have.  The value of this
macro is used instead of that alignment to align the object.

If this macro is not defined, then @var{basic-align} is used.

@findex strcpy
One use of this macro is to increase alignment of medium-size data to
make it all fit in fewer cache lines.  Another is to cause character
arrays to be word-aligned so that @code{strcpy} calls that copy
constants to character arrays can be done inline.
@end defmac

@defmac DATA_ABI_ALIGNMENT (@var{type}, @var{basic-align})
Similar to @code{DATA_ALIGNMENT}, but for the cases where the ABI mandates
some alignment increase, instead of optimization only purposes.  E.g.@
AMD x86-64 psABI says that variables with array type larger than 15 bytes
must be aligned to 16 byte boundaries.

If this macro is not defined, then @var{basic-align} is used.
@end defmac

@hook TARGET_CONSTANT_ALIGNMENT

@defmac LOCAL_ALIGNMENT (@var{type}, @var{basic-align})
If defined, a C expression to compute the alignment for a variable in
the local store.  @var{type} is the data type, and @var{basic-align} is
the alignment that the object would ordinarily have.  The value of this
macro is used instead of that alignment to align the object.

If this macro is not defined, then @var{basic-align} is used.

One use of this macro is to increase alignment of medium-size data to
make it all fit in fewer cache lines.

If the value of this macro has a type, it should be an unsigned type.
@end defmac

@hook TARGET_VECTOR_ALIGNMENT

@defmac STACK_SLOT_ALIGNMENT (@var{type}, @var{mode}, @var{basic-align})
If defined, a C expression to compute the alignment for stack slot.
@var{type} is the data type, @var{mode} is the widest mode available,
and @var{basic-align} is the alignment that the slot would ordinarily
have.  The value of this macro is used instead of that alignment to
align the slot.

If this macro is not defined, then @var{basic-align} is used when
@var{type} is @code{NULL}.  Otherwise, @code{LOCAL_ALIGNMENT} will
be used.

This macro is to set alignment of stack slot to the maximum alignment
of all possible modes which the slot may have.

If the value of this macro has a type, it should be an unsigned type.
@end defmac

@defmac LOCAL_DECL_ALIGNMENT (@var{decl})
If defined, a C expression to compute the alignment for a local
variable @var{decl}.

If this macro is not defined, then
@code{LOCAL_ALIGNMENT (TREE_TYPE (@var{decl}), DECL_ALIGN (@var{decl}))}
is used.

One use of this macro is to increase alignment of medium-size data to
make it all fit in fewer cache lines.

If the value of this macro has a type, it should be an unsigned type.
@end defmac

@defmac MINIMUM_ALIGNMENT (@var{exp}, @var{mode}, @var{align})
If defined, a C expression to compute the minimum required alignment
for dynamic stack realignment purposes for @var{exp} (a type or decl),
@var{mode}, assuming normal alignment @var{align}.

If this macro is not defined, then @var{align} will be used.
@end defmac

@defmac EMPTY_FIELD_BOUNDARY
Alignment in bits to be given to a structure bit-field that follows an
empty field such as @code{int : 0;}.

If @code{PCC_BITFIELD_TYPE_MATTERS} is true, it overrides this macro.
@end defmac

@defmac STRUCTURE_SIZE_BOUNDARY
Number of bits which any structure or union's size must be a multiple of.
Each structure or union's size is rounded up to a multiple of this.

If you do not define this macro, the default is the same as
@code{BITS_PER_UNIT}.
@end defmac

@defmac STRICT_ALIGNMENT
Define this macro to be the value 1 if instructions will fail to work
if given data not on the nominal alignment.  If instructions will merely
go slower in that case, define this macro as 0.
@end defmac

@defmac PCC_BITFIELD_TYPE_MATTERS
Define this if you wish to imitate the way many other C compilers handle
alignment of bit-fields and the structures that contain them.

The behavior is that the type written for a named bit-field (@code{int},
@code{short}, or other integer type) imposes an alignment for the entire
structure, as if the structure really did contain an ordinary field of
that type.  In addition, the bit-field is placed within the structure so
that it would fit within such a field, not crossing a boundary for it.

Thus, on most machines, a named bit-field whose type is written as
@code{int} would not cross a four-byte boundary, and would force
four-byte alignment for the whole structure.  (The alignment used may
not be four bytes; it is controlled by the other alignment parameters.)

An unnamed bit-field will not affect the alignment of the containing
structure.

If the macro is defined, its definition should be a C expression;
a nonzero value for the expression enables this behavior.

Note that if this macro is not defined, or its value is zero, some
bit-fields may cross more than one alignment boundary.  The compiler can
support such references if there are @samp{insv}, @samp{extv}, and
@samp{extzv} insns that can directly reference memory.

The other known way of making bit-fields work is to define
@code{STRUCTURE_SIZE_BOUNDARY} as large as @code{BIGGEST_ALIGNMENT}.
Then every structure can be accessed with fullwords.

Unless the machine has bit-field instructions or you define
@code{STRUCTURE_SIZE_BOUNDARY} that way, you must define
@code{PCC_BITFIELD_TYPE_MATTERS} to have a nonzero value.

If your aim is to make GCC use the same conventions for laying out
bit-fields as are used by another compiler, here is how to investigate
what the other compiler does.  Compile and run this program:

@smallexample
struct foo1
@{
  char x;
  char :0;
  char y;
@};

struct foo2
@{
  char x;
  int :0;
  char y;
@};

main ()
@{
  printf ("Size of foo1 is %d\n",
          sizeof (struct foo1));
  printf ("Size of foo2 is %d\n",
          sizeof (struct foo2));
  exit (0);
@}
@end smallexample

If this prints 2 and 5, then the compiler's behavior is what you would
get from @code{PCC_BITFIELD_TYPE_MATTERS}.
@end defmac

@defmac BITFIELD_NBYTES_LIMITED
Like @code{PCC_BITFIELD_TYPE_MATTERS} except that its effect is limited
to aligning a bit-field within the structure.
@end defmac

@hook TARGET_ALIGN_ANON_BITFIELD

@hook TARGET_NARROW_VOLATILE_BITFIELD

@hook TARGET_MEMBER_TYPE_FORCES_BLK

@defmac ROUND_TYPE_ALIGN (@var{type}, @var{computed}, @var{specified})
Define this macro as an expression for the alignment of a type (given
by @var{type} as a tree node) if the alignment computed in the usual
way is @var{computed} and the alignment explicitly specified was
@var{specified}.

The default is to use @var{specified} if it is larger; otherwise, use
the smaller of @var{computed} and @code{BIGGEST_ALIGNMENT}
@end defmac

@defmac MAX_FIXED_MODE_SIZE
An integer expression for the size in bits of the largest integer
machine mode that should actually be used.  All integer machine modes of
this size or smaller can be used for structures and unions with the
appropriate sizes.  If this macro is undefined, @code{GET_MODE_BITSIZE
(DImode)} is assumed.
@end defmac

@defmac STACK_SAVEAREA_MODE (@var{save_level})
If defined, an expression of type @code{machine_mode} that
specifies the mode of the save area operand of a
@code{save_stack_@var{level}} named pattern (@pxref{Standard Names}).
@var{save_level} is one of @code{SAVE_BLOCK}, @code{SAVE_FUNCTION}, or
@code{SAVE_NONLOCAL} and selects which of the three named patterns is
having its mode specified.

You need not define this macro if it always returns @code{Pmode}.  You
would most commonly define this macro if the
@code{save_stack_@var{level}} patterns need to support both a 32- and a
64-bit mode.
@end defmac

@defmac STACK_SIZE_MODE
If defined, an expression of type @code{machine_mode} that
specifies the mode of the size increment operand of an
@code{allocate_stack} named pattern (@pxref{Standard Names}).

You need not define this macro if it always returns @code{word_mode}.
You would most commonly define this macro if the @code{allocate_stack}
pattern needs to support both a 32- and a 64-bit mode.
@end defmac

@hook TARGET_LIBGCC_CMP_RETURN_MODE

@hook TARGET_LIBGCC_SHIFT_COUNT_MODE

@hook TARGET_UNWIND_WORD_MODE

@hook TARGET_MS_BITFIELD_LAYOUT_P

@hook TARGET_DECIMAL_FLOAT_SUPPORTED_P

@hook TARGET_FIXED_POINT_SUPPORTED_P

@hook TARGET_EXPAND_TO_RTL_HOOK

@hook TARGET_INSTANTIATE_DECLS

@hook TARGET_MANGLE_TYPE

@node Type Layout
@section Layout of Source Language Data Types

These macros define the sizes and other characteristics of the standard
basic data types used in programs being compiled.  Unlike the macros in
the previous section, these apply to specific features of C and related
languages, rather than to fundamental aspects of storage layout.

@defmac INT_TYPE_SIZE
A C expression for the size in bits of the type @code{int} on the
target machine.  If you don't define this, the default is one word.
@end defmac

@defmac SHORT_TYPE_SIZE
A C expression for the size in bits of the type @code{short} on the
target machine.  If you don't define this, the default is half a word.
(If this would be less than one storage unit, it is rounded up to one
unit.)
@end defmac

@defmac LONG_TYPE_SIZE
A C expression for the size in bits of the type @code{long} on the
target machine.  If you don't define this, the default is one word.
@end defmac

@defmac ADA_LONG_TYPE_SIZE
On some machines, the size used for the Ada equivalent of the type
@code{long} by a native Ada compiler differs from that used by C@.  In
that situation, define this macro to be a C expression to be used for
the size of that type.  If you don't define this, the default is the
value of @code{LONG_TYPE_SIZE}.
@end defmac

@defmac LONG_LONG_TYPE_SIZE
A C expression for the size in bits of the type @code{long long} on the
target machine.  If you don't define this, the default is two
words.  If you want to support GNU Ada on your machine, the value of this
macro must be at least 64.
@end defmac

@defmac CHAR_TYPE_SIZE
A C expression for the size in bits of the type @code{char} on the
target machine.  If you don't define this, the default is
@code{BITS_PER_UNIT}.
@end defmac

@defmac BOOL_TYPE_SIZE
A C expression for the size in bits of the C++ type @code{bool} and
C99 type @code{_Bool} on the target machine.  If you don't define
this, and you probably shouldn't, the default is @code{CHAR_TYPE_SIZE}.
@end defmac

@defmac FLOAT_TYPE_SIZE
A C expression for the size in bits of the type @code{float} on the
target machine.  If you don't define this, the default is one word.
@end defmac

@defmac DOUBLE_TYPE_SIZE
A C expression for the size in bits of the type @code{double} on the
target machine.  If you don't define this, the default is two
words.
@end defmac

@defmac LONG_DOUBLE_TYPE_SIZE
A C expression for the size in bits of the type @code{long double} on
the target machine.  If you don't define this, the default is two
words.
@end defmac

@defmac SHORT_FRACT_TYPE_SIZE
A C expression for the size in bits of the type @code{short _Fract} on
the target machine.  If you don't define this, the default is
@code{BITS_PER_UNIT}.
@end defmac

@defmac FRACT_TYPE_SIZE
A C expression for the size in bits of the type @code{_Fract} on
the target machine.  If you don't define this, the default is
@code{BITS_PER_UNIT * 2}.
@end defmac

@defmac LONG_FRACT_TYPE_SIZE
A C expression for the size in bits of the type @code{long _Fract} on
the target machine.  If you don't define this, the default is
@code{BITS_PER_UNIT * 4}.
@end defmac

@defmac LONG_LONG_FRACT_TYPE_SIZE
A C expression for the size in bits of the type @code{long long _Fract} on
the target machine.  If you don't define this, the default is
@code{BITS_PER_UNIT * 8}.
@end defmac

@defmac SHORT_ACCUM_TYPE_SIZE
A C expression for the size in bits of the type @code{short _Accum} on
the target machine.  If you don't define this, the default is
@code{BITS_PER_UNIT * 2}.
@end defmac

@defmac ACCUM_TYPE_SIZE
A C expression for the size in bits of the type @code{_Accum} on
the target machine.  If you don't define this, the default is
@code{BITS_PER_UNIT * 4}.
@end defmac

@defmac LONG_ACCUM_TYPE_SIZE
A C expression for the size in bits of the type @code{long _Accum} on
the target machine.  If you don't define this, the default is
@code{BITS_PER_UNIT * 8}.
@end defmac

@defmac LONG_LONG_ACCUM_TYPE_SIZE
A C expression for the size in bits of the type @code{long long _Accum} on
the target machine.  If you don't define this, the default is
@code{BITS_PER_UNIT * 16}.
@end defmac

@defmac LIBGCC2_GNU_PREFIX
This macro corresponds to the @code{TARGET_LIBFUNC_GNU_PREFIX} target
hook and should be defined if that hook is overriden to be true.  It
causes function names in libgcc to be changed to use a @code{__gnu_}
prefix for their name rather than the default @code{__}.  A port which
uses this macro should also arrange to use @file{t-gnu-prefix} in
the libgcc @file{config.host}.
@end defmac

@defmac WIDEST_HARDWARE_FP_SIZE
A C expression for the size in bits of the widest floating-point format
supported by the hardware.  If you define this macro, you must specify a
value less than or equal to the value of @code{LONG_DOUBLE_TYPE_SIZE}.
If you do not define this macro, the value of @code{LONG_DOUBLE_TYPE_SIZE}
is the default.
@end defmac

@defmac DEFAULT_SIGNED_CHAR
An expression whose value is 1 or 0, according to whether the type
@code{char} should be signed or unsigned by default.  The user can
always override this default with the options @option{-fsigned-char}
and @option{-funsigned-char}.
@end defmac

@hook TARGET_DEFAULT_SHORT_ENUMS

@defmac SIZE_TYPE
A C expression for a string describing the name of the data type to use
for size values.  The typedef name @code{size_t} is defined using the
contents of the string.

The string can contain more than one keyword.  If so, separate them with
spaces, and write first any length keyword, then @code{unsigned} if
appropriate, and finally @code{int}.  The string must exactly match one
of the data type names defined in the function
@code{c_common_nodes_and_builtins} in the file @file{c-family/c-common.cc}.
You may not omit @code{int} or change the order---that would cause the
compiler to crash on startup.

If you don't define this macro, the default is @code{"long unsigned
int"}.
@end defmac

@defmac SIZETYPE
GCC defines internal types (@code{sizetype}, @code{ssizetype},
@code{bitsizetype} and @code{sbitsizetype}) for expressions
dealing with size.  This macro is a C expression for a string describing
the name of the data type from which the precision of @code{sizetype}
is extracted.

The string has the same restrictions as @code{SIZE_TYPE} string.

If you don't define this macro, the default is @code{SIZE_TYPE}.
@end defmac

@defmac PTRDIFF_TYPE
A C expression for a string describing the name of the data type to use
for the result of subtracting two pointers.  The typedef name
@code{ptrdiff_t} is defined using the contents of the string.  See
@code{SIZE_TYPE} above for more information.

If you don't define this macro, the default is @code{"long int"}.
@end defmac

@defmac WCHAR_TYPE
A C expression for a string describing the name of the data type to use
for wide characters.  The typedef name @code{wchar_t} is defined using
the contents of the string.  See @code{SIZE_TYPE} above for more
information.

If you don't define this macro, the default is @code{"int"}.
@end defmac

@defmac WCHAR_TYPE_SIZE
A C expression for the size in bits of the data type for wide
characters.  This is used in @code{cpp}, which cannot make use of
@code{WCHAR_TYPE}.
@end defmac

@defmac WINT_TYPE
A C expression for a string describing the name of the data type to
use for wide characters passed to @code{printf} and returned from
@code{getwc}.  The typedef name @code{wint_t} is defined using the
contents of the string.  See @code{SIZE_TYPE} above for more
information.

If you don't define this macro, the default is @code{"unsigned int"}.
@end defmac

@defmac INTMAX_TYPE
A C expression for a string describing the name of the data type that
can represent any value of any standard or extended signed integer type.
The typedef name @code{intmax_t} is defined using the contents of the
string.  See @code{SIZE_TYPE} above for more information.

If you don't define this macro, the default is the first of
@code{"int"}, @code{"long int"}, or @code{"long long int"} that has as
much precision as @code{long long int}.
@end defmac

@defmac UINTMAX_TYPE
A C expression for a string describing the name of the data type that
can represent any value of any standard or extended unsigned integer
type.  The typedef name @code{uintmax_t} is defined using the contents
of the string.  See @code{SIZE_TYPE} above for more information.

If you don't define this macro, the default is the first of
@code{"unsigned int"}, @code{"long unsigned int"}, or @code{"long long
unsigned int"} that has as much precision as @code{long long unsigned
int}.
@end defmac

@defmac SIG_ATOMIC_TYPE
@defmacx INT8_TYPE
@defmacx INT16_TYPE
@defmacx INT32_TYPE
@defmacx INT64_TYPE
@defmacx UINT8_TYPE
@defmacx UINT16_TYPE
@defmacx UINT32_TYPE
@defmacx UINT64_TYPE
@defmacx INT_LEAST8_TYPE
@defmacx INT_LEAST16_TYPE
@defmacx INT_LEAST32_TYPE
@defmacx INT_LEAST64_TYPE
@defmacx UINT_LEAST8_TYPE
@defmacx UINT_LEAST16_TYPE
@defmacx UINT_LEAST32_TYPE
@defmacx UINT_LEAST64_TYPE
@defmacx INT_FAST8_TYPE
@defmacx INT_FAST16_TYPE
@defmacx INT_FAST32_TYPE
@defmacx INT_FAST64_TYPE
@defmacx UINT_FAST8_TYPE
@defmacx UINT_FAST16_TYPE
@defmacx UINT_FAST32_TYPE
@defmacx UINT_FAST64_TYPE
@defmacx INTPTR_TYPE
@defmacx UINTPTR_TYPE
C expressions for the standard types @code{sig_atomic_t},
@code{int8_t}, @code{int16_t}, @code{int32_t}, @code{int64_t},
@code{uint8_t}, @code{uint16_t}, @code{uint32_t}, @code{uint64_t},
@code{int_least8_t}, @code{int_least16_t}, @code{int_least32_t},
@code{int_least64_t}, @code{uint_least8_t}, @code{uint_least16_t},
@code{uint_least32_t}, @code{uint_least64_t}, @code{int_fast8_t},
@code{int_fast16_t}, @code{int_fast32_t}, @code{int_fast64_t},
@code{uint_fast8_t}, @code{uint_fast16_t}, @code{uint_fast32_t},
@code{uint_fast64_t}, @code{intptr_t}, and @code{uintptr_t}.  See
@code{SIZE_TYPE} above for more information.

If any of these macros evaluates to a null pointer, the corresponding
type is not supported; if GCC is configured to provide
@code{<stdint.h>} in such a case, the header provided may not conform
to C99, depending on the type in question.  The defaults for all of
these macros are null pointers.
@end defmac

@defmac TARGET_PTRMEMFUNC_VBIT_LOCATION
The C++ compiler represents a pointer-to-member-function with a struct
that looks like:

@smallexample
  struct @{
    union @{
      void (*fn)();
      ptrdiff_t vtable_index;
    @};
    ptrdiff_t delta;
  @};
@end smallexample

@noindent
The C++ compiler must use one bit to indicate whether the function that
will be called through a pointer-to-member-function is virtual.
Normally, we assume that the low-order bit of a function pointer must
always be zero.  Then, by ensuring that the vtable_index is odd, we can
distinguish which variant of the union is in use.  But, on some
platforms function pointers can be odd, and so this doesn't work.  In
that case, we use the low-order bit of the @code{delta} field, and shift
the remainder of the @code{delta} field to the left.

GCC will automatically make the right selection about where to store
this bit using the @code{FUNCTION_BOUNDARY} setting for your platform.
However, some platforms such as ARM/Thumb have @code{FUNCTION_BOUNDARY}
set such that functions always start at even addresses, but the lowest
bit of pointers to functions indicate whether the function at that
address is in ARM or Thumb mode.  If this is the case of your
architecture, you should define this macro to
@code{ptrmemfunc_vbit_in_delta}.

In general, you should not have to define this macro.  On architectures
in which function addresses are always even, according to
@code{FUNCTION_BOUNDARY}, GCC will automatically define this macro to
@code{ptrmemfunc_vbit_in_pfn}.
@end defmac

@defmac TARGET_VTABLE_USES_DESCRIPTORS
Normally, the C++ compiler uses function pointers in vtables.  This
macro allows the target to change to use ``function descriptors''
instead.  Function descriptors are found on targets for whom a
function pointer is actually a small data structure.  Normally the
data structure consists of the actual code address plus a data
pointer to which the function's data is relative.

If vtables are used, the value of this macro should be the number
of words that the function descriptor occupies.
@end defmac

@defmac TARGET_VTABLE_ENTRY_ALIGN
By default, the vtable entries are void pointers, the so the alignment
is the same as pointer alignment.  The value of this macro specifies
the alignment of the vtable entry in bits.  It should be defined only
when special alignment is necessary. */
@end defmac

@defmac TARGET_VTABLE_DATA_ENTRY_DISTANCE
There are a few non-descriptor entries in the vtable at offsets below
zero.  If these entries must be padded (say, to preserve the alignment
specified by @code{TARGET_VTABLE_ENTRY_ALIGN}), set this to the number
of words in each data entry.
@end defmac

@node Registers
@section Register Usage
@cindex register usage

This section explains how to describe what registers the target machine
has, and how (in general) they can be used.

The description of which registers a specific instruction can use is
done with register classes; see @ref{Register Classes}.  For information
on using registers to access a stack frame, see @ref{Frame Registers}.
For passing values in registers, see @ref{Register Arguments}.
For returning values in registers, see @ref{Scalar Return}.

@menu
* Register Basics::             Number and kinds of registers.
* Allocation Order::            Order in which registers are allocated.
* Values in Registers::         What kinds of values each reg can hold.
* Leaf Functions::              Renumbering registers for leaf functions.
* Stack Registers::             Handling a register stack such as 80387.
@end menu

@node Register Basics
@subsection Basic Characteristics of Registers

@c prevent bad page break with this line
Registers have various characteristics.

@defmac FIRST_PSEUDO_REGISTER
Number of hardware registers known to the compiler.  They receive
numbers 0 through @code{FIRST_PSEUDO_REGISTER-1}; thus, the first
pseudo register's number really is assigned the number
@code{FIRST_PSEUDO_REGISTER}.
@end defmac

@defmac FIXED_REGISTERS
@cindex fixed register
An initializer that says which registers are used for fixed purposes
all throughout the compiled code and are therefore not available for
general allocation.  These would include the stack pointer, the frame
pointer (except on machines where that can be used as a general
register when no frame pointer is needed), the program counter on
machines where that is considered one of the addressable registers,
and any other numbered register with a standard use.

This information is expressed as a sequence of numbers, separated by
commas and surrounded by braces.  The @var{n}th number is 1 if
register @var{n} is fixed, 0 otherwise.

The table initialized from this macro, and the table initialized by
the following one, may be overridden at run time either automatically,
by the actions of the macro @code{CONDITIONAL_REGISTER_USAGE}, or by
the user with the command options @option{-ffixed-@var{reg}},
@option{-fcall-used-@var{reg}} and @option{-fcall-saved-@var{reg}}.
@end defmac

@defmac CALL_USED_REGISTERS
@cindex call-used register
@cindex call-clobbered register
@cindex call-saved register
Like @code{FIXED_REGISTERS} but has 1 for each register that is
clobbered (in general) by function calls as well as for fixed
registers.  This macro therefore identifies the registers that are not
available for general allocation of values that must live across
function calls.

If a register has 0 in @code{CALL_USED_REGISTERS}, the compiler
automatically saves it on function entry and restores it on function
exit, if the register is used within the function.

Exactly one of @code{CALL_USED_REGISTERS} and @code{CALL_REALLY_USED_REGISTERS}
must be defined.  Modern ports should define @code{CALL_REALLY_USED_REGISTERS}.
@end defmac

@defmac CALL_REALLY_USED_REGISTERS
@cindex call-used register
@cindex call-clobbered register
@cindex call-saved register
Like @code{CALL_USED_REGISTERS} except this macro doesn't require
that the entire set of @code{FIXED_REGISTERS} be included.
(@code{CALL_USED_REGISTERS} must be a superset of @code{FIXED_REGISTERS}).

Exactly one of @code{CALL_USED_REGISTERS} and @code{CALL_REALLY_USED_REGISTERS}
must be defined.  Modern ports should define @code{CALL_REALLY_USED_REGISTERS}.
@end defmac

@cindex call-used register
@cindex call-clobbered register
@cindex call-saved register
@hook TARGET_FNTYPE_ABI

@hook TARGET_INSN_CALLEE_ABI

@cindex call-used register
@cindex call-clobbered register
@cindex call-saved register
@hook TARGET_HARD_REGNO_CALL_PART_CLOBBERED

@hook TARGET_GET_MULTILIB_ABI_NAME

@findex fixed_regs
@findex call_used_regs
@findex global_regs
@findex reg_names
@findex reg_class_contents
@hook TARGET_CONDITIONAL_REGISTER_USAGE

@defmac INCOMING_REGNO (@var{out})
Define this macro if the target machine has register windows.  This C
expression returns the register number as seen by the called function
corresponding to the register number @var{out} as seen by the calling
function.  Return @var{out} if register number @var{out} is not an
outbound register.
@end defmac

@defmac OUTGOING_REGNO (@var{in})
Define this macro if the target machine has register windows.  This C
expression returns the register number as seen by the calling function
corresponding to the register number @var{in} as seen by the called
function.  Return @var{in} if register number @var{in} is not an inbound
register.
@end defmac

@defmac LOCAL_REGNO (@var{regno})
Define this macro if the target machine has register windows.  This C
expression returns true if the register is call-saved but is in the
register window.  Unlike most call-saved registers, such registers
need not be explicitly restored on function exit or during non-local
gotos.
@end defmac

@defmac PC_REGNUM
If the program counter has a register number, define this as that
register number.  Otherwise, do not define it.
@end defmac

@node Allocation Order
@subsection Order of Allocation of Registers
@cindex order of register allocation
@cindex register allocation order

@c prevent bad page break with this line
Registers are allocated in order.

@defmac REG_ALLOC_ORDER
If defined, an initializer for a vector of integers, containing the
numbers of hard registers in the order in which GCC should prefer
to use them (from most preferred to least).

If this macro is not defined, registers are used lowest numbered first
(all else being equal).

One use of this macro is on machines where the highest numbered
registers must always be saved and the save-multiple-registers
instruction supports only sequences of consecutive registers.  On such
machines, define @code{REG_ALLOC_ORDER} to be an initializer that lists
the highest numbered allocable register first.
@end defmac

@defmac ADJUST_REG_ALLOC_ORDER
A C statement (sans semicolon) to choose the order in which to allocate
hard registers for pseudo-registers local to a basic block.

Store the desired register order in the array @code{reg_alloc_order}.
Element 0 should be the register to allocate first; element 1, the next
register; and so on.

The macro body should not assume anything about the contents of
@code{reg_alloc_order} before execution of the macro.

On most machines, it is not necessary to define this macro.
@end defmac

@defmac HONOR_REG_ALLOC_ORDER
Normally, IRA tries to estimate the costs for saving a register in the
prologue and restoring it in the epilogue.  This discourages it from
using call-saved registers.  If a machine wants to ensure that IRA
allocates registers in the order given by REG_ALLOC_ORDER even if some
call-saved registers appear earlier than call-used ones, then define this
macro as a C expression to nonzero. Default is 0.
@end defmac

@defmac IRA_HARD_REGNO_ADD_COST_MULTIPLIER (@var{regno})
In some case register allocation order is not enough for the
Integrated Register Allocator (@acronym{IRA}) to generate a good code.
If this macro is defined, it should return a floating point value
based on @var{regno}.  The cost of using @var{regno} for a pseudo will
be increased by approximately the pseudo's usage frequency times the
value returned by this macro.  Not defining this macro is equivalent
to having it always return @code{0.0}.

On most machines, it is not necessary to define this macro.
@end defmac

@node Values in Registers
@subsection How Values Fit in Registers

This section discusses the macros that describe which kinds of values
(specifically, which machine modes) each register can hold, and how many
consecutive registers are needed for a given mode.

@hook TARGET_HARD_REGNO_NREGS

@defmac HARD_REGNO_NREGS_HAS_PADDING (@var{regno}, @var{mode})
A C expression that is nonzero if a value of mode @var{mode}, stored
in memory, ends with padding that causes it to take up more space than
in registers starting at register number @var{regno} (as determined by
multiplying GCC's notion of the size of the register when containing
this mode by the number of registers returned by
@code{TARGET_HARD_REGNO_NREGS}).  By default this is zero.

For example, if a floating-point value is stored in three 32-bit
registers but takes up 128 bits in memory, then this would be
nonzero.

This macros only needs to be defined if there are cases where
@code{subreg_get_info}
would otherwise wrongly determine that a @code{subreg} can be
represented by an offset to the register number, when in fact such a
@code{subreg} would contain some of the padding not stored in
registers and so not be representable.
@end defmac

@defmac HARD_REGNO_NREGS_WITH_PADDING (@var{regno}, @var{mode})
For values of @var{regno} and @var{mode} for which
@code{HARD_REGNO_NREGS_HAS_PADDING} returns nonzero, a C expression
returning the greater number of registers required to hold the value
including any padding.  In the example above, the value would be four.
@end defmac

@defmac REGMODE_NATURAL_SIZE (@var{mode})
Define this macro if the natural size of registers that hold values
of mode @var{mode} is not the word size.  It is a C expression that
should give the natural size in bytes for the specified mode.  It is
used by the register allocator to try to optimize its results.  This
happens for example on SPARC 64-bit where the natural size of
floating-point registers is still 32-bit.
@end defmac

@hook TARGET_HARD_REGNO_MODE_OK

@defmac HARD_REGNO_RENAME_OK (@var{from}, @var{to})
A C expression that is nonzero if it is OK to rename a hard register
@var{from} to another hard register @var{to}.

One common use of this macro is to prevent renaming of a register to
another register that is not saved by a prologue in an interrupt
handler.

The default is always nonzero.
@end defmac

@hook TARGET_MODES_TIEABLE_P

@hook TARGET_HARD_REGNO_SCRATCH_OK

@defmac AVOID_CCMODE_COPIES
Define this macro if the compiler should avoid copies to/from @code{CCmode}
registers.  You should only define this macro if support for copying to/from
@code{CCmode} is incomplete.
@end defmac

@node Leaf Functions
@subsection Handling Leaf Functions

@cindex leaf functions
@cindex functions, leaf
On some machines, a leaf function (i.e., one which makes no calls) can run
more efficiently if it does not make its own register window.  Often this
means it is required to receive its arguments in the registers where they
are passed by the caller, instead of the registers where they would
normally arrive.

The special treatment for leaf functions generally applies only when
other conditions are met; for example, often they may use only those
registers for its own variables and temporaries.  We use the term ``leaf
function'' to mean a function that is suitable for this special
handling, so that functions with no calls are not necessarily ``leaf
functions''.

GCC assigns register numbers before it knows whether the function is
suitable for leaf function treatment.  So it needs to renumber the
registers in order to output a leaf function.  The following macros
accomplish this.

@defmac LEAF_REGISTERS
Name of a char vector, indexed by hard register number, which
contains 1 for a register that is allowable in a candidate for leaf
function treatment.

If leaf function treatment involves renumbering the registers, then the
registers marked here should be the ones before renumbering---those that
GCC would ordinarily allocate.  The registers which will actually be
used in the assembler code, after renumbering, should not be marked with 1
in this vector.

Define this macro only if the target machine offers a way to optimize
the treatment of leaf functions.
@end defmac

@defmac LEAF_REG_REMAP (@var{regno})
A C expression whose value is the register number to which @var{regno}
should be renumbered, when a function is treated as a leaf function.

If @var{regno} is a register number which should not appear in a leaf
function before renumbering, then the expression should yield @minus{}1, which
will cause the compiler to abort.

Define this macro only if the target machine offers a way to optimize the
treatment of leaf functions, and registers need to be renumbered to do
this.
@end defmac

@findex current_function_is_leaf
@findex current_function_uses_only_leaf_regs
@code{TARGET_ASM_FUNCTION_PROLOGUE} and
@code{TARGET_ASM_FUNCTION_EPILOGUE} must usually treat leaf functions
specially.  They can test the C variable @code{current_function_is_leaf}
which is nonzero for leaf functions.  @code{current_function_is_leaf} is
set prior to local register allocation and is valid for the remaining
compiler passes.  They can also test the C variable
@code{current_function_uses_only_leaf_regs} which is nonzero for leaf
functions which only use leaf registers.
@code{current_function_uses_only_leaf_regs} is valid after all passes
that modify the instructions have been run and is only useful if
@code{LEAF_REGISTERS} is defined.
@c changed this to fix overfull.  ALSO:  why the "it" at the beginning
@c of the next paragraph?!  --mew 2feb93

@node Stack Registers
@subsection Registers That Form a Stack

There are special features to handle computers where some of the
``registers'' form a stack.  Stack registers are normally written by
pushing onto the stack, and are numbered relative to the top of the
stack.

Currently, GCC can only handle one group of stack-like registers, and
they must be consecutively numbered.  Furthermore, the existing
support for stack-like registers is specific to the 80387 floating
point coprocessor.  If you have a new architecture that uses
stack-like registers, you will need to do substantial work on
@file{reg-stack.cc} and write your machine description to cooperate
with it, as well as defining these macros.

@defmac STACK_REGS
Define this if the machine has any stack-like registers.
@end defmac

@defmac STACK_REG_COVER_CLASS
This is a cover class containing the stack registers.  Define this if
the machine has any stack-like registers.
@end defmac

@defmac FIRST_STACK_REG
The number of the first stack-like register.  This one is the top
of the stack.
@end defmac

@defmac LAST_STACK_REG
The number of the last stack-like register.  This one is the bottom of
the stack.
@end defmac

@node Register Classes
@section Register Classes
@cindex register class definitions
@cindex class definitions, register

On many machines, the numbered registers are not all equivalent.
For example, certain registers may not be allowed for indexed addressing;
certain registers may not be allowed in some instructions.  These machine
restrictions are described to the compiler using @dfn{register classes}.

You define a number of register classes, giving each one a name and saying
which of the registers belong to it.  Then you can specify register classes
that are allowed as operands to particular instruction patterns.

@findex ALL_REGS
@findex NO_REGS
In general, each register will belong to several classes.  In fact, one
class must be named @code{ALL_REGS} and contain all the registers.  Another
class must be named @code{NO_REGS} and contain no registers.  Often the
union of two classes will be another class; however, this is not required.

@findex GENERAL_REGS
One of the classes must be named @code{GENERAL_REGS}.  There is nothing
terribly special about the name, but the operand constraint letters
@samp{r} and @samp{g} specify this class.  If @code{GENERAL_REGS} is
the same as @code{ALL_REGS}, just define it as a macro which expands
to @code{ALL_REGS}.

Order the classes so that if class @var{x} is contained in class @var{y}
then @var{x} has a lower class number than @var{y}.

The way classes other than @code{GENERAL_REGS} are specified in operand
constraints is through machine-dependent operand constraint letters.
You can define such letters to correspond to various classes, then use
them in operand constraints.

You must define the narrowest register classes for allocatable
registers, so that each class either has no subclasses, or that for
some mode, the move cost between registers within the class is
cheaper than moving a register in the class to or from memory
(@pxref{Costs}).

You should define a class for the union of two classes whenever some
instruction allows both classes.  For example, if an instruction allows
either a floating point (coprocessor) register or a general register for a
certain operand, you should define a class @code{FLOAT_OR_GENERAL_REGS}
which includes both of them.  Otherwise you will get suboptimal code,
or even internal compiler errors when reload cannot find a register in the
class computed via @code{reg_class_subunion}.

You must also specify certain redundant information about the register
classes: for each class, which classes contain it and which ones are
contained in it; for each pair of classes, the largest class contained
in their union.

When a value occupying several consecutive registers is expected in a
certain class, all the registers used must belong to that class.
Therefore, register classes cannot be used to enforce a requirement for
a register pair to start with an even-numbered register.  The way to
specify this requirement is with @code{TARGET_HARD_REGNO_MODE_OK}.

Register classes used for input-operands of bitwise-and or shift
instructions have a special requirement: each such class must have, for
each fixed-point machine mode, a subclass whose registers can transfer that
mode to or from memory.  For example, on some machines, the operations for
single-byte values (@code{QImode}) are limited to certain registers.  When
this is so, each register class that is used in a bitwise-and or shift
instruction must have a subclass consisting of registers from which
single-byte values can be loaded or stored.  This is so that
@code{PREFERRED_RELOAD_CLASS} can always have a possible value to return.

@deftp {Data type} {enum reg_class}
An enumerated type that must be defined with all the register class names
as enumerated values.  @code{NO_REGS} must be first.  @code{ALL_REGS}
must be the last register class, followed by one more enumerated value,
@code{LIM_REG_CLASSES}, which is not a register class but rather
tells how many classes there are.

Each register class has a number, which is the value of casting
the class name to type @code{int}.  The number serves as an index
in many of the tables described below.
@end deftp

@defmac N_REG_CLASSES
The number of distinct register classes, defined as follows:

@smallexample
#define N_REG_CLASSES (int) LIM_REG_CLASSES
@end smallexample
@end defmac

@defmac REG_CLASS_NAMES
An initializer containing the names of the register classes as C string
constants.  These names are used in writing some of the debugging dumps.
@end defmac

@defmac REG_CLASS_CONTENTS
An initializer containing the contents of the register classes, as integers
which are bit masks.  The @var{n}th integer specifies the contents of class
@var{n}.  The way the integer @var{mask} is interpreted is that
register @var{r} is in the class if @code{@var{mask} & (1 << @var{r})} is 1.

When the machine has more than 32 registers, an integer does not suffice.
Then the integers are replaced by sub-initializers, braced groupings containing
several integers.  Each sub-initializer must be suitable as an initializer
for the type @code{HARD_REG_SET} which is defined in @file{hard-reg-set.h}.
In this situation, the first integer in each sub-initializer corresponds to
registers 0 through 31, the second integer to registers 32 through 63, and
so on.
@end defmac

@defmac REGNO_REG_CLASS (@var{regno})
A C expression whose value is a register class containing hard register
@var{regno}.  In general there is more than one such class; choose a class
which is @dfn{minimal}, meaning that no smaller class also contains the
register.
@end defmac

@defmac BASE_REG_CLASS
A macro whose definition is the name of the class to which a valid
base register must belong.  A base register is one used in an address
which is the register value plus a displacement.
@end defmac

@defmac MODE_BASE_REG_CLASS (@var{mode})
This is a variation of the @code{BASE_REG_CLASS} macro which allows
the selection of a base register in a mode dependent manner.  If
@var{mode} is VOIDmode then it should return the same value as
@code{BASE_REG_CLASS}.
@end defmac

@defmac MODE_BASE_REG_REG_CLASS (@var{mode})
A C expression whose value is the register class to which a valid
base register must belong in order to be used in a base plus index
register address.  You should define this macro if base plus index
addresses have different requirements than other base register uses.
@end defmac

@defmac MODE_CODE_BASE_REG_CLASS (@var{mode}, @var{address_space}, @var{outer_code}, @var{index_code})
A C expression whose value is the register class to which a valid
base register for a memory reference in mode @var{mode} to address
space @var{address_space} must belong.  @var{outer_code} and @var{index_code}
define the context in which the base register occurs.  @var{outer_code} is
the code of the immediately enclosing expression (@code{MEM} for the top level
of an address, @code{ADDRESS} for something that occurs in an
@code{address_operand}).  @var{index_code} is the code of the corresponding
index expression if @var{outer_code} is @code{PLUS}; @code{SCRATCH} otherwise.
@end defmac

@defmac INDEX_REG_CLASS
A macro whose definition is the name of the class to which a valid
index register must belong.  An index register is one used in an
address where its value is either multiplied by a scale factor or
added to another register (as well as added to a displacement).
@end defmac

@defmac REGNO_OK_FOR_BASE_P (@var{num})
A C expression which is nonzero if register number @var{num} is
suitable for use as a base register in operand addresses.
@end defmac

@defmac REGNO_MODE_OK_FOR_BASE_P (@var{num}, @var{mode})
A C expression that is just like @code{REGNO_OK_FOR_BASE_P}, except that
that expression may examine the mode of the memory reference in
@var{mode}.  You should define this macro if the mode of the memory
reference affects whether a register may be used as a base register.  If
you define this macro, the compiler will use it instead of
@code{REGNO_OK_FOR_BASE_P}.  The mode may be @code{VOIDmode} for
addresses that appear outside a @code{MEM}, i.e., as an
@code{address_operand}.
@end defmac

@defmac REGNO_MODE_OK_FOR_REG_BASE_P (@var{num}, @var{mode})
A C expression which is nonzero if register number @var{num} is suitable for
use as a base register in base plus index operand addresses, accessing
memory in mode @var{mode}.  It may be either a suitable hard register or a
pseudo register that has been allocated such a hard register.  You should
define this macro if base plus index addresses have different requirements
than other base register uses.

Use of this macro is deprecated; please use the more general
@code{REGNO_MODE_CODE_OK_FOR_BASE_P}.
@end defmac

@defmac REGNO_MODE_CODE_OK_FOR_BASE_P (@var{num}, @var{mode}, @var{address_space}, @var{outer_code}, @var{index_code})
A C expression which is nonzero if register number @var{num} is
suitable for use as a base register in operand addresses, accessing
memory in mode @var{mode} in address space @var{address_space}.
This is similar to @code{REGNO_MODE_OK_FOR_BASE_P}, except
that that expression may examine the context in which the register
appears in the memory reference.  @var{outer_code} is the code of the
immediately enclosing expression (@code{MEM} if at the top level of the
address, @code{ADDRESS} for something that occurs in an
@code{address_operand}).  @var{index_code} is the code of the
corresponding index expression if @var{outer_code} is @code{PLUS};
@code{SCRATCH} otherwise.  The mode may be @code{VOIDmode} for addresses
that appear outside a @code{MEM}, i.e., as an @code{address_operand}.
@end defmac

@defmac REGNO_OK_FOR_INDEX_P (@var{num})
A C expression which is nonzero if register number @var{num} is
suitable for use as an index register in operand addresses.  It may be
either a suitable hard register or a pseudo register that has been
allocated such a hard register.

The difference between an index register and a base register is that
the index register may be scaled.  If an address involves the sum of
two registers, neither one of them scaled, then either one may be
labeled the ``base'' and the other the ``index''; but whichever
labeling is used must fit the machine's constraints of which registers
may serve in each capacity.  The compiler will try both labelings,
looking for one that is valid, and will reload one or both registers
only if neither labeling works.
@end defmac

@hook TARGET_PREFERRED_RENAME_CLASS

@hook TARGET_PREFERRED_RELOAD_CLASS

@defmac PREFERRED_RELOAD_CLASS (@var{x}, @var{class})
A C expression that places additional restrictions on the register class
to use when it is necessary to copy value @var{x} into a register in class
@var{class}.  The value is a register class; perhaps @var{class}, or perhaps
another, smaller class.  On many machines, the following definition is
safe:

@smallexample
#define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS
@end smallexample

Sometimes returning a more restrictive class makes better code.  For
example, on the 68000, when @var{x} is an integer constant that is in range
for a @samp{moveq} instruction, the value of this macro is always
@code{DATA_REGS} as long as @var{class} includes the data registers.
Requiring a data register guarantees that a @samp{moveq} will be used.

One case where @code{PREFERRED_RELOAD_CLASS} must not return
@var{class} is if @var{x} is a legitimate constant which cannot be
loaded into some register class.  By returning @code{NO_REGS} you can
force @var{x} into a memory location.  For example, rs6000 can load
immediate values into general-purpose registers, but does not have an
instruction for loading an immediate value into a floating-point
register, so @code{PREFERRED_RELOAD_CLASS} returns @code{NO_REGS} when
@var{x} is a floating-point constant.  If the constant cannot be loaded
into any kind of register, code generation will be better if
@code{TARGET_LEGITIMATE_CONSTANT_P} makes the constant illegitimate instead
of using @code{TARGET_PREFERRED_RELOAD_CLASS}.

If an insn has pseudos in it after register allocation, reload will go
through the alternatives and call repeatedly @code{PREFERRED_RELOAD_CLASS}
to find the best one.  Returning @code{NO_REGS}, in this case, makes
reload add a @code{!} in front of the constraint: the x86 back-end uses
this feature to discourage usage of 387 registers when math is done in
the SSE registers (and vice versa).
@end defmac

@hook TARGET_PREFERRED_OUTPUT_RELOAD_CLASS

@defmac LIMIT_RELOAD_CLASS (@var{mode}, @var{class})
A C expression that places additional restrictions on the register class
to use when it is necessary to be able to hold a value of mode
@var{mode} in a reload register for which class @var{class} would
ordinarily be used.

Unlike @code{PREFERRED_RELOAD_CLASS}, this macro should be used when
there are certain modes that simply cannot go in certain reload classes.

The value is a register class; perhaps @var{class}, or perhaps another,
smaller class.

Don't define this macro unless the target machine has limitations which
require the macro to do something nontrivial.
@end defmac

@hook TARGET_SECONDARY_RELOAD

@defmac SECONDARY_RELOAD_CLASS (@var{class}, @var{mode}, @var{x})
@defmacx SECONDARY_INPUT_RELOAD_CLASS (@var{class}, @var{mode}, @var{x})
@defmacx SECONDARY_OUTPUT_RELOAD_CLASS (@var{class}, @var{mode}, @var{x})
These macros are obsolete, new ports should use the target hook
@code{TARGET_SECONDARY_RELOAD} instead.

These are obsolete macros, replaced by the @code{TARGET_SECONDARY_RELOAD}
target hook.  Older ports still define these macros to indicate to the
reload phase that it may
need to allocate at least one register for a reload in addition to the
register to contain the data.  Specifically, if copying @var{x} to a
register @var{class} in @var{mode} requires an intermediate register,
you were supposed to define @code{SECONDARY_INPUT_RELOAD_CLASS} to return the
largest register class all of whose registers can be used as
intermediate registers or scratch registers.

If copying a register @var{class} in @var{mode} to @var{x} requires an
intermediate or scratch register, @code{SECONDARY_OUTPUT_RELOAD_CLASS}
was supposed to be defined to return the largest register
class required.  If the
requirements for input and output reloads were the same, the macro
@code{SECONDARY_RELOAD_CLASS} should have been used instead of defining both
macros identically.

The values returned by these macros are often @code{GENERAL_REGS}.
Return @code{NO_REGS} if no spare register is needed; i.e., if @var{x}
can be directly copied to or from a register of @var{class} in
@var{mode} without requiring a scratch register.  Do not define this
macro if it would always return @code{NO_REGS}.

If a scratch register is required (either with or without an
intermediate register), you were supposed to define patterns for
@samp{reload_in@var{m}} or @samp{reload_out@var{m}}, as required
(@pxref{Standard Names}.  These patterns, which were normally
implemented with a @code{define_expand}, should be similar to the
@samp{mov@var{m}} patterns, except that operand 2 is the scratch
register.

These patterns need constraints for the reload register and scratch
register that
contain a single register class.  If the original reload register (whose
class is @var{class}) can meet the constraint given in the pattern, the
value returned by these macros is used for the class of the scratch
register.  Otherwise, two additional reload registers are required.
Their classes are obtained from the constraints in the insn pattern.

@var{x} might be a pseudo-register or a @code{subreg} of a
pseudo-register, which could either be in a hard register or in memory.
Use @code{true_regnum} to find out; it will return @minus{}1 if the pseudo is
in memory and the hard register number if it is in a register.

These macros should not be used in the case where a particular class of
registers can only be copied to memory and not to another class of
registers.  In that case, secondary reload registers are not needed and
would not be helpful.  Instead, a stack location must be used to perform
the copy and the @code{mov@var{m}} pattern should use memory as an
intermediate storage.  This case often occurs between floating-point and
general registers.
@end defmac

@hook TARGET_SECONDARY_MEMORY_NEEDED

@defmac SECONDARY_MEMORY_NEEDED_RTX (@var{mode})
Normally when @code{TARGET_SECONDARY_MEMORY_NEEDED} is defined, the compiler
allocates a stack slot for a memory location needed for register copies.
If this macro is defined, the compiler instead uses the memory location
defined by this macro.

Do not define this macro if you do not define
@code{TARGET_SECONDARY_MEMORY_NEEDED}.
@end defmac

@hook TARGET_SECONDARY_MEMORY_NEEDED_MODE

@hook TARGET_SELECT_EARLY_REMAT_MODES

@hook TARGET_CLASS_LIKELY_SPILLED_P

@hook TARGET_CLASS_MAX_NREGS

@defmac CLASS_MAX_NREGS (@var{class}, @var{mode})
A C expression for the maximum number of consecutive registers
of class @var{class} needed to hold a value of mode @var{mode}.

This is closely related to the macro @code{TARGET_HARD_REGNO_NREGS}.  In fact,
the value of the macro @code{CLASS_MAX_NREGS (@var{class}, @var{mode})}
should be the maximum value of @code{TARGET_HARD_REGNO_NREGS (@var{regno},
@var{mode})} for all @var{regno} values in the class @var{class}.

This macro helps control the handling of multiple-word values
in the reload pass.
@end defmac

@hook TARGET_CAN_CHANGE_MODE_CLASS

@hook TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS

@hook TARGET_LRA_P

@hook TARGET_REGISTER_PRIORITY

@hook TARGET_REGISTER_USAGE_LEVELING_P

@hook TARGET_DIFFERENT_ADDR_DISPLACEMENT_P

@hook TARGET_CANNOT_SUBSTITUTE_MEM_EQUIV_P

@hook TARGET_LEGITIMIZE_ADDRESS_DISPLACEMENT

@hook TARGET_SPILL_CLASS

@hook TARGET_ADDITIONAL_ALLOCNO_CLASS_P

@hook TARGET_CSTORE_MODE

@hook TARGET_COMPUTE_PRESSURE_CLASSES

@node Stack and Calling
@section Stack Layout and Calling Conventions
@cindex calling conventions

@c prevent bad page break with this line
This describes the stack layout and calling conventions.

@menu
* Frame Layout::
* Exception Handling::
* Stack Checking::
* Frame Registers::
* Elimination::
* Stack Arguments::
* Register Arguments::
* Scalar Return::
* Aggregate Return::
* Caller Saves::
* Function Entry::
* Profiling::
* Tail Calls::
* Shrink-wrapping separate components::
* Stack Smashing Protection::
* Miscellaneous Register Hooks::
@end menu

@node Frame Layout
@subsection Basic Stack Layout
@cindex stack frame layout
@cindex frame layout

@c prevent bad page break with this line
Here is the basic stack layout.

@defmac STACK_GROWS_DOWNWARD
Define this macro to be true if pushing a word onto the stack moves the stack
pointer to a smaller address, and false otherwise.
@end defmac

@defmac STACK_PUSH_CODE
This macro defines the operation used when something is pushed
on the stack.  In RTL, a push operation will be
@code{(set (mem (STACK_PUSH_CODE (reg sp))) @dots{})}

The choices are @code{PRE_DEC}, @code{POST_DEC}, @code{PRE_INC},
and @code{POST_INC}.  Which of these is correct depends on
the stack direction and on whether the stack pointer points
to the last item on the stack or whether it points to the
space for the next item on the stack.

The default is @code{PRE_DEC} when @code{STACK_GROWS_DOWNWARD} is
true, which is almost always right, and @code{PRE_INC} otherwise,
which is often wrong.
@end defmac

@defmac FRAME_GROWS_DOWNWARD
Define this macro to nonzero value if the addresses of local variable slots
are at negative offsets from the frame pointer.
@end defmac

@defmac ARGS_GROW_DOWNWARD
Define this macro if successive arguments to a function occupy decreasing
addresses on the stack.
@end defmac

@hook TARGET_STARTING_FRAME_OFFSET

@defmac STACK_ALIGNMENT_NEEDED
Define to zero to disable final alignment of the stack during reload.
The nonzero default for this macro is suitable for most ports.

On ports where @code{TARGET_STARTING_FRAME_OFFSET} is nonzero or where there
is a register save block following the local block that doesn't require
alignment to @code{STACK_BOUNDARY}, it may be beneficial to disable
stack alignment and do it in the backend.
@end defmac

@defmac STACK_POINTER_OFFSET
Offset from the stack pointer register to the first location at which
outgoing arguments are placed.  If not specified, the default value of
zero is used.  This is the proper value for most machines.

If @code{ARGS_GROW_DOWNWARD}, this is the offset to the location above
the first location at which outgoing arguments are placed.
@end defmac

@defmac FIRST_PARM_OFFSET (@var{fundecl})
Offset from the argument pointer register to the first argument's
address.  On some machines it may depend on the data type of the
function.

If @code{ARGS_GROW_DOWNWARD}, this is the offset to the location above
the first argument's address.
@end defmac

@defmac STACK_DYNAMIC_OFFSET (@var{fundecl})
Offset from the stack pointer register to an item dynamically allocated
on the stack, e.g., by @code{alloca}.

The default value for this macro is @code{STACK_POINTER_OFFSET} plus the
length of the outgoing arguments.  The default is correct for most
machines.  See @file{function.cc} for details.
@end defmac

@defmac INITIAL_FRAME_ADDRESS_RTX
A C expression whose value is RTL representing the address of the initial
stack frame. This address is passed to @code{RETURN_ADDR_RTX} and
@code{DYNAMIC_CHAIN_ADDRESS}.  If you don't define this macro, a reasonable
default value will be used.  Define this macro in order to make frame pointer
elimination work in the presence of @code{__builtin_frame_address (count)} and
@code{__builtin_return_address (count)} for @code{count} not equal to zero.
@end defmac

@defmac DYNAMIC_CHAIN_ADDRESS (@var{frameaddr})
A C expression whose value is RTL representing the address in a stack
frame where the pointer to the caller's frame is stored.  Assume that
@var{frameaddr} is an RTL expression for the address of the stack frame
itself.

If you don't define this macro, the default is to return the value
of @var{frameaddr}---that is, the stack frame address is also the
address of the stack word that points to the previous frame.
@end defmac

@defmac SETUP_FRAME_ADDRESSES
A C expression that produces the machine-specific code to
setup the stack so that arbitrary frames can be accessed.  For example,
on the SPARC, we must flush all of the register windows to the stack
before we can access arbitrary stack frames.  You will seldom need to
define this macro.  The default is to do nothing.
@end defmac

@hook TARGET_BUILTIN_SETJMP_FRAME_VALUE

@defmac FRAME_ADDR_RTX (@var{frameaddr})
A C expression whose value is RTL representing the value of the frame
address for the current frame.  @var{frameaddr} is the frame pointer
of the current frame.  This is used for __builtin_frame_address.
You need only define this macro if the frame address is not the same
as the frame pointer.  Most machines do not need to define it.
@end defmac

@defmac RETURN_ADDR_RTX (@var{count}, @var{frameaddr})
A C expression whose value is RTL representing the value of the return
address for the frame @var{count} steps up from the current frame, after
the prologue.  @var{frameaddr} is the frame pointer of the @var{count}
frame, or the frame pointer of the @var{count} @minus{} 1 frame if
@code{RETURN_ADDR_IN_PREVIOUS_FRAME} is nonzero.

The value of the expression must always be the correct address when
@var{count} is zero, but may be @code{NULL_RTX} if there is no way to
determine the return address of other frames.
@end defmac

@defmac RETURN_ADDR_IN_PREVIOUS_FRAME
Define this macro to nonzero value if the return address of a particular
stack frame is accessed from the frame pointer of the previous stack
frame.  The zero default for this macro is suitable for most ports.
@end defmac

@defmac INCOMING_RETURN_ADDR_RTX
A C expression whose value is RTL representing the location of the
incoming return address at the beginning of any function, before the
prologue.  This RTL is either a @code{REG}, indicating that the return
value is saved in @samp{REG}, or a @code{MEM} representing a location in
the stack.

You only need to define this macro if you want to support call frame
debugging information like that provided by DWARF 2.

If this RTL is a @code{REG}, you should also define
@code{DWARF_FRAME_RETURN_COLUMN} to @code{DWARF_FRAME_REGNUM (REGNO)}.
@end defmac

@defmac DWARF_ALT_FRAME_RETURN_COLUMN
A C expression whose value is an integer giving a DWARF 2 column
number that may be used as an alternative return column.  The column
must not correspond to any gcc hard register (that is, it must not
be in the range of @code{DWARF_FRAME_REGNUM}).

This macro can be useful if @code{DWARF_FRAME_RETURN_COLUMN} is set to a
general register, but an alternative column needs to be used for signal
frames.  Some targets have also used different frame return columns
over time.
@end defmac

@defmac DWARF_ZERO_REG
A C expression whose value is an integer giving a DWARF 2 register
number that is considered to always have the value zero.  This should
only be defined if the target has an architected zero register, and
someone decided it was a good idea to use that register number to
terminate the stack backtrace.  New ports should avoid this.
@end defmac

@hook TARGET_DWARF_HANDLE_FRAME_UNSPEC

@hook TARGET_DWARF_POLY_INDETERMINATE_VALUE

@defmac INCOMING_FRAME_SP_OFFSET
A C expression whose value is an integer giving the offset, in bytes,
from the value of the stack pointer register to the top of the stack
frame at the beginning of any function, before the prologue.  The top of
the frame is defined to be the value of the stack pointer in the
previous frame, just before the call instruction.

You only need to define this macro if you want to support call frame
debugging information like that provided by DWARF 2.
@end defmac

@defmac DEFAULT_INCOMING_FRAME_SP_OFFSET
Like @code{INCOMING_FRAME_SP_OFFSET}, but must be the same for all
functions of the same ABI, and when using GAS @code{.cfi_*} directives
must also agree with the default CFI GAS emits.  Define this macro
only if @code{INCOMING_FRAME_SP_OFFSET} can have different values
between different functions of the same ABI or when
@code{INCOMING_FRAME_SP_OFFSET} does not agree with GAS default CFI.
@end defmac

@defmac ARG_POINTER_CFA_OFFSET (@var{fundecl})
A C expression whose value is an integer giving the offset, in bytes,
from the argument pointer to the canonical frame address (cfa).  The
final value should coincide with that calculated by
@code{INCOMING_FRAME_SP_OFFSET}.  Which is unfortunately not usable
during virtual register instantiation.

The default value for this macro is
@code{FIRST_PARM_OFFSET (fundecl) + crtl->args.pretend_args_size},
which is correct for most machines; in general, the arguments are found
immediately before the stack frame.  Note that this is not the case on
some targets that save registers into the caller's frame, such as SPARC
and rs6000, and so such targets need to define this macro.

You only need to define this macro if the default is incorrect, and you
want to support call frame debugging information like that provided by
DWARF 2.
@end defmac

@defmac FRAME_POINTER_CFA_OFFSET (@var{fundecl})
If defined, a C expression whose value is an integer giving the offset
in bytes from the frame pointer to the canonical frame address (cfa).
The final value should coincide with that calculated by
@code{INCOMING_FRAME_SP_OFFSET}.

Normally the CFA is calculated as an offset from the argument pointer,
via @code{ARG_POINTER_CFA_OFFSET}, but if the argument pointer is
variable due to the ABI, this may not be possible.  If this macro is
defined, it implies that the virtual register instantiation should be
based on the frame pointer instead of the argument pointer.  Only one
of @code{FRAME_POINTER_CFA_OFFSET} and @code{ARG_POINTER_CFA_OFFSET}
should be defined.
@end defmac

@defmac CFA_FRAME_BASE_OFFSET (@var{fundecl})
If defined, a C expression whose value is an integer giving the offset
in bytes from the canonical frame address (cfa) to the frame base used
in DWARF 2 debug information.  The default is zero.  A different value
may reduce the size of debug information on some ports.
@end defmac

@node Exception Handling
@subsection Exception Handling Support
@cindex exception handling

@defmac EH_RETURN_DATA_REGNO (@var{N})
A C expression whose value is the @var{N}th register number used for
data by exception handlers, or @code{INVALID_REGNUM} if fewer than
@var{N} registers are usable.

The exception handling library routines communicate with the exception
handlers via a set of agreed upon registers.  Ideally these registers
should be call-clobbered; it is possible to use call-saved registers,
but may negatively impact code size.  The target must support at least
2 data registers, but should define 4 if there are enough free registers.

You must define this macro if you want to support call frame exception
handling like that provided by DWARF 2.
@end defmac

@defmac EH_RETURN_STACKADJ_RTX
A C expression whose value is RTL representing a location in which
to store a stack adjustment to be applied before function return.
This is used to unwind the stack to an exception handler's call frame.
It will be assigned zero on code paths that return normally.

Typically this is a call-clobbered hard register that is otherwise
untouched by the epilogue, but could also be a stack slot.

Do not define this macro if the stack pointer is saved and restored
by the regular prolog and epilog code in the call frame itself; in
this case, the exception handling library routines will update the
stack location to be restored in place.  Otherwise, you must define
this macro if you want to support call frame exception handling like
that provided by DWARF 2.
@end defmac

@defmac EH_RETURN_HANDLER_RTX
A C expression whose value is RTL representing a location in which
to store the address of an exception handler to which we should
return.  It will not be assigned on code paths that return normally.

Typically this is the location in the call frame at which the normal
return address is stored.  For targets that return by popping an
address off the stack, this might be a memory address just below
the @emph{target} call frame rather than inside the current call
frame.  If defined, @code{EH_RETURN_STACKADJ_RTX} will have already
been assigned, so it may be used to calculate the location of the
target call frame.

Some targets have more complex requirements than storing to an
address calculable during initial code generation.  In that case
the @code{eh_return} instruction pattern should be used instead.

If you want to support call frame exception handling, you must
define either this macro or the @code{eh_return} instruction pattern.
@end defmac

@defmac RETURN_ADDR_OFFSET
If defined, an integer-valued C expression for which rtl will be generated
to add it to the exception handler address before it is searched in the
exception handling tables, and to subtract it again from the address before
using it to return to the exception handler.
@end defmac

@defmac ASM_PREFERRED_EH_DATA_FORMAT (@var{code}, @var{global})
This macro chooses the encoding of pointers embedded in the exception
handling sections.  If at all possible, this should be defined such
that the exception handling section will not require dynamic relocations,
and so may be read-only.

@var{code} is 0 for data, 1 for code labels, 2 for function pointers.
@var{global} is true if the symbol may be affected by dynamic relocations.
The macro should return a combination of the @code{DW_EH_PE_*} defines
as found in @file{dwarf2.h}.

If this macro is not defined, pointers will not be encoded but
represented directly.
@end defmac

@defmac ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX (@var{file}, @var{encoding}, @var{size}, @var{addr}, @var{done})
This macro allows the target to emit whatever special magic is required
to represent the encoding chosen by @code{ASM_PREFERRED_EH_DATA_FORMAT}.
Generic code takes care of pc-relative and indirect encodings; this must
be defined if the target uses text-relative or data-relative encodings.

This is a C statement that branches to @var{done} if the format was
handled.  @var{encoding} is the format chosen, @var{size} is the number
of bytes that the format occupies, @var{addr} is the @code{SYMBOL_REF}
to be emitted.
@end defmac

@defmac MD_FALLBACK_FRAME_STATE_FOR (@var{context}, @var{fs})
This macro allows the target to add CPU and operating system specific
code to the call-frame unwinder for use when there is no unwind data
available.  The most common reason to implement this macro is to unwind
through signal frames.

This macro is called from @code{uw_frame_state_for} in
@file{unwind-dw2.c}, @file{unwind-dw2-xtensa.c} and
@file{unwind-ia64.c}.  @var{context} is an @code{_Unwind_Context};
@var{fs} is an @code{_Unwind_FrameState}.  Examine @code{context->ra}
for the address of the code being executed and @code{context->cfa} for
the stack pointer value.  If the frame can be decoded, the register
save addresses should be updated in @var{fs} and the macro should
evaluate to @code{_URC_NO_REASON}.  If the frame cannot be decoded,
the macro should evaluate to @code{_URC_END_OF_STACK}.

For proper signal handling in Java this macro is accompanied by
@code{MAKE_THROW_FRAME}, defined in @file{libjava/include/*-signal.h} headers.
@end defmac

@defmac MD_HANDLE_UNWABI (@var{context}, @var{fs})
This macro allows the target to add operating system specific code to the
call-frame unwinder to handle the IA-64 @code{.unwabi} unwinding directive,
usually used for signal or interrupt frames.

This macro is called from @code{uw_update_context} in libgcc's
@file{unwind-ia64.c}.  @var{context} is an @code{_Unwind_Context};
@var{fs} is an @code{_Unwind_FrameState}.  Examine @code{fs->unwabi}
for the abi and context in the @code{.unwabi} directive.  If the
@code{.unwabi} directive can be handled, the register save addresses should
be updated in @var{fs}.
@end defmac

@defmac TARGET_USES_WEAK_UNWIND_INFO
A C expression that evaluates to true if the target requires unwind
info to be given comdat linkage.  Define it to be @code{1} if comdat
linkage is necessary.  The default is @code{0}.
@end defmac

@node Stack Checking
@subsection Specifying How Stack Checking is Done

GCC will check that stack references are within the boundaries of the
stack, if the option @option{-fstack-check} is specified, in one of
three ways:

@enumerate
@item
If the value of the @code{STACK_CHECK_BUILTIN} macro is nonzero, GCC
will assume that you have arranged for full stack checking to be done
at appropriate places in the configuration files.  GCC will not do
other special processing.

@item
If @code{STACK_CHECK_BUILTIN} is zero and the value of the
@code{STACK_CHECK_STATIC_BUILTIN} macro is nonzero, GCC will assume
that you have arranged for static stack checking (checking of the
static stack frame of functions) to be done at appropriate places
in the configuration files.  GCC will only emit code to do dynamic
stack checking (checking on dynamic stack allocations) using the third
approach below.

@item
If neither of the above are true, GCC will generate code to periodically
``probe'' the stack pointer using the values of the macros defined below.
@end enumerate

If neither STACK_CHECK_BUILTIN nor STACK_CHECK_STATIC_BUILTIN is defined,
GCC will change its allocation strategy for large objects if the option
@option{-fstack-check} is specified: they will always be allocated
dynamically if their size exceeds @code{STACK_CHECK_MAX_VAR_SIZE} bytes.

@defmac STACK_CHECK_BUILTIN
A nonzero value if stack checking is done by the configuration files in a
machine-dependent manner.  You should define this macro if stack checking
is required by the ABI of your machine or if you would like to do stack
checking in some more efficient way than the generic approach.  The default
value of this macro is zero.
@end defmac

@defmac STACK_CHECK_STATIC_BUILTIN
A nonzero value if static stack checking is done by the configuration files
in a machine-dependent manner.  You should define this macro if you would
like to do static stack checking in some more efficient way than the generic
approach.  The default value of this macro is zero.
@end defmac

@defmac STACK_CHECK_PROBE_INTERVAL_EXP
An integer specifying the interval at which GCC must generate stack probe
instructions, defined as 2 raised to this integer.  You will normally
define this macro so that the interval be no larger than the size of
the ``guard pages'' at the end of a stack area.  The default value
of 12 (4096-byte interval) is suitable for most systems.
@end defmac

@defmac STACK_CHECK_MOVING_SP
An integer which is nonzero if GCC should move the stack pointer page by page
when doing probes.  This can be necessary on systems where the stack pointer
contains the bottom address of the memory area accessible to the executing
thread at any point in time.  In this situation an alternate signal stack
is required in order to be able to recover from a stack overflow.  The
default value of this macro is zero.
@end defmac

@defmac STACK_CHECK_PROTECT
The number of bytes of stack needed to recover from a stack overflow, for
languages where such a recovery is supported.  The default value of 4KB/8KB
with the @code{setjmp}/@code{longjmp}-based exception handling mechanism and
8KB/12KB with other exception handling mechanisms should be adequate for most
architectures and operating systems.
@end defmac

The following macros are relevant only if neither STACK_CHECK_BUILTIN
nor STACK_CHECK_STATIC_BUILTIN is defined; you can omit them altogether
in the opposite case.

@defmac STACK_CHECK_MAX_FRAME_SIZE
The maximum size of a stack frame, in bytes.  GCC will generate probe
instructions in non-leaf functions to ensure at least this many bytes of
stack are available.  If a stack frame is larger than this size, stack
checking will not be reliable and GCC will issue a warning.  The
default is chosen so that GCC only generates one instruction on most
systems.  You should normally not change the default value of this macro.
@end defmac

@defmac STACK_CHECK_FIXED_FRAME_SIZE
GCC uses this value to generate the above warning message.  It
represents the amount of fixed frame used by a function, not including
space for any callee-saved registers, temporaries and user variables.
You need only specify an upper bound for this amount and will normally
use the default of four words.
@end defmac

@defmac STACK_CHECK_MAX_VAR_SIZE
The maximum size, in bytes, of an object that GCC will place in the
fixed area of the stack frame when the user specifies
@option{-fstack-check}.
GCC computed the default from the values of the above macros and you will
normally not need to override that default.
@end defmac

@hook TARGET_STACK_CLASH_PROTECTION_ALLOCA_PROBE_RANGE

@need 2000
@node Frame Registers
@subsection Registers That Address the Stack Frame

@c prevent bad page break with this line
This discusses registers that address the stack frame.

@defmac STACK_POINTER_REGNUM
The register number of the stack pointer register, which must also be a
fixed register according to @code{FIXED_REGISTERS}.  On most machines,
the hardware determines which register this is.
@end defmac

@defmac FRAME_POINTER_REGNUM
The register number of the frame pointer register, which is used to
access automatic variables in the stack frame.  On some machines, the
hardware determines which register this is.  On other machines, you can
choose any register you wish for this purpose.
@end defmac

@defmac HARD_FRAME_POINTER_REGNUM
On some machines the offset between the frame pointer and starting
offset of the automatic variables is not known until after register
allocation has been done (for example, because the saved registers are
between these two locations).  On those machines, define
@code{FRAME_POINTER_REGNUM} the number of a special, fixed register to
be used internally until the offset is known, and define
@code{HARD_FRAME_POINTER_REGNUM} to be the actual hard register number
used for the frame pointer.

You should define this macro only in the very rare circumstances when it
is not possible to calculate the offset between the frame pointer and
the automatic variables until after register allocation has been
completed.  When this macro is defined, you must also indicate in your
definition of @code{ELIMINABLE_REGS} how to eliminate
@code{FRAME_POINTER_REGNUM} into either @code{HARD_FRAME_POINTER_REGNUM}
or @code{STACK_POINTER_REGNUM}.

Do not define this macro if it would be the same as
@code{FRAME_POINTER_REGNUM}.
@end defmac

@defmac ARG_POINTER_REGNUM
The register number of the arg pointer register, which is used to access
the function's argument list.  On some machines, this is the same as the
frame pointer register.  On some machines, the hardware determines which
register this is.  On other machines, you can choose any register you
wish for this purpose.  If this is not the same register as the frame
pointer register, then you must mark it as a fixed register according to
@code{FIXED_REGISTERS}, or arrange to be able to eliminate it
(@pxref{Elimination}).
@end defmac

@defmac HARD_FRAME_POINTER_IS_FRAME_POINTER
Define this to a preprocessor constant that is nonzero if
@code{hard_frame_pointer_rtx} and @code{frame_pointer_rtx} should be
the same.  The default definition is @samp{(HARD_FRAME_POINTER_REGNUM
== FRAME_POINTER_REGNUM)}; you only need to define this macro if that
definition is not suitable for use in preprocessor conditionals.
@end defmac

@defmac HARD_FRAME_POINTER_IS_ARG_POINTER
Define this to a preprocessor constant that is nonzero if
@code{hard_frame_pointer_rtx} and @code{arg_pointer_rtx} should be the
same.  The default definition is @samp{(HARD_FRAME_POINTER_REGNUM ==
ARG_POINTER_REGNUM)}; you only need to define this macro if that
definition is not suitable for use in preprocessor conditionals.
@end defmac

@defmac RETURN_ADDRESS_POINTER_REGNUM
The register number of the return address pointer register, which is used to
access the current function's return address from the stack.  On some
machines, the return address is not at a fixed offset from the frame
pointer or stack pointer or argument pointer.  This register can be defined
to point to the return address on the stack, and then be converted by
@code{ELIMINABLE_REGS} into either the frame pointer or stack pointer.

Do not define this macro unless there is no other way to get the return
address from the stack.
@end defmac

@defmac STATIC_CHAIN_REGNUM
@defmacx STATIC_CHAIN_INCOMING_REGNUM
Register numbers used for passing a function's static chain pointer.  If
register windows are used, the register number as seen by the called
function is @code{STATIC_CHAIN_INCOMING_REGNUM}, while the register
number as seen by the calling function is @code{STATIC_CHAIN_REGNUM}.  If
these registers are the same, @code{STATIC_CHAIN_INCOMING_REGNUM} need
not be defined.

The static chain register need not be a fixed register.

If the static chain is passed in memory, these macros should not be
defined; instead, the @code{TARGET_STATIC_CHAIN} hook should be used.
@end defmac

@hook TARGET_STATIC_CHAIN

@defmac DWARF_FRAME_REGISTERS
This macro specifies the maximum number of hard registers that can be
saved in a call frame.  This is used to size data structures used in
DWARF2 exception handling.

Prior to GCC 3.0, this macro was needed in order to establish a stable
exception handling ABI in the face of adding new hard registers for ISA
extensions.  In GCC 3.0 and later, the EH ABI is insulated from changes
in the number of hard registers.  Nevertheless, this macro can still be
used to reduce the runtime memory requirements of the exception handling
routines, which can be substantial if the ISA contains a lot of
registers that are not call-saved.

If this macro is not defined, it defaults to
@code{FIRST_PSEUDO_REGISTER}.
@end defmac

@defmac PRE_GCC3_DWARF_FRAME_REGISTERS

This macro is similar to @code{DWARF_FRAME_REGISTERS}, but is provided
for backward compatibility in pre GCC 3.0 compiled code.

If this macro is not defined, it defaults to
@code{DWARF_FRAME_REGISTERS}.
@end defmac

@defmac DWARF_REG_TO_UNWIND_COLUMN (@var{regno})

Define this macro if the target's representation for dwarf registers
is different than the internal representation for unwind column.
Given a dwarf register, this macro should return the internal unwind
column number to use instead.
@end defmac

@defmac DWARF_FRAME_REGNUM (@var{regno})

Define this macro if the target's representation for dwarf registers
used in .eh_frame or .debug_frame is different from that used in other
debug info sections.  Given a GCC hard register number, this macro
should return the .eh_frame register number.  The default is
@code{DEBUGGER_REGNO (@var{regno})}.

@end defmac

@defmac DWARF2_FRAME_REG_OUT (@var{regno}, @var{for_eh})

Define this macro to map register numbers held in the call frame info
that GCC has collected using @code{DWARF_FRAME_REGNUM} to those that
should be output in .debug_frame (@code{@var{for_eh}} is zero) and
.eh_frame (@code{@var{for_eh}} is nonzero).  The default is to
return @code{@var{regno}}.

@end defmac

@defmac REG_VALUE_IN_UNWIND_CONTEXT

Define this macro if the target stores register values as
@code{_Unwind_Word} type in unwind context.  It should be defined if
target register size is larger than the size of @code{void *}.  The
default is to store register values as @code{void *} type.

@end defmac

@defmac ASSUME_EXTENDED_UNWIND_CONTEXT

Define this macro to be 1 if the target always uses extended unwind
context with version, args_size and by_value fields.  If it is undefined,
it will be defined to 1 when @code{REG_VALUE_IN_UNWIND_CONTEXT} is
defined and 0 otherwise.

@end defmac

@defmac DWARF_LAZY_REGISTER_VALUE (@var{regno}, @var{value})
Define this macro if the target has pseudo DWARF registers whose
values need to be computed lazily on demand by the unwinder (such as when
referenced in a CFA expression).  The macro returns true if @var{regno}
is such a register and stores its value in @samp{*@var{value}} if so.
@end defmac

@node Elimination
@subsection Eliminating Frame Pointer and Arg Pointer

@c prevent bad page break with this line
This is about eliminating the frame pointer and arg pointer.

@hook TARGET_FRAME_POINTER_REQUIRED

@defmac ELIMINABLE_REGS
This macro specifies a table of register pairs used to eliminate
unneeded registers that point into the stack frame.

The definition of this macro is a list of structure initializations, each
of which specifies an original and replacement register.

On some machines, the position of the argument pointer is not known until
the compilation is completed.  In such a case, a separate hard register
must be used for the argument pointer.  This register can be eliminated by
replacing it with either the frame pointer or the argument pointer,
depending on whether or not the frame pointer has been eliminated.

In this case, you might specify:
@smallexample
#define ELIMINABLE_REGS  \
@{@{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM@}, \
 @{ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM@}, \
 @{FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM@}@}
@end smallexample

Note that the elimination of the argument pointer with the stack pointer is
specified first since that is the preferred elimination.
@end defmac

@hook TARGET_CAN_ELIMINATE

@defmac INITIAL_ELIMINATION_OFFSET (@var{from-reg}, @var{to-reg}, @var{offset-var})
This macro returns the initial difference between the specified pair
of registers.  The value would be computed from information
such as the result of @code{get_frame_size ()} and the tables of
registers @code{df_regs_ever_live_p} and @code{call_used_regs}.
@end defmac

@hook TARGET_COMPUTE_FRAME_LAYOUT

@node Stack Arguments
@subsection Passing Function Arguments on the Stack
@cindex arguments on stack
@cindex stack arguments

The macros in this section control how arguments are passed
on the stack.  See the following section for other macros that
control passing certain arguments in registers.

@hook TARGET_PROMOTE_PROTOTYPES

@hook TARGET_PUSH_ARGUMENT

@defmac PUSH_ARGS_REVERSED
A C expression.  If nonzero, function arguments will be evaluated from
last to first, rather than from first to last.  If this macro is not
defined, it defaults to @code{PUSH_ARGS} on targets where the stack
and args grow in opposite directions, and 0 otherwise.
@end defmac

@defmac PUSH_ROUNDING (@var{npushed})
A C expression that is the number of bytes actually pushed onto the
stack when an instruction attempts to push @var{npushed} bytes.

On some machines, the definition

@smallexample
#define PUSH_ROUNDING(BYTES) (BYTES)
@end smallexample

@noindent
will suffice.  But on other machines, instructions that appear
to push one byte actually push two bytes in an attempt to maintain
alignment.  Then the definition should be

@smallexample
#define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1)
@end smallexample

If the value of this macro has a type, it should be an unsigned type.
@end defmac

@findex outgoing_args_size
@findex crtl->outgoing_args_size
@defmac ACCUMULATE_OUTGOING_ARGS
A C expression.  If nonzero, the maximum amount of space required for outgoing arguments
will be computed and placed into
@code{crtl->outgoing_args_size}.  No space will be pushed
onto the stack for each call; instead, the function prologue should
increase the stack frame size by this amount.

Setting both @code{PUSH_ARGS} and @code{ACCUMULATE_OUTGOING_ARGS}
is not proper.
@end defmac

@defmac REG_PARM_STACK_SPACE (@var{fndecl})
Define this macro if functions should assume that stack space has been
allocated for arguments even when their values are passed in
registers.

The value of this macro is the size, in bytes, of the area reserved for
arguments passed in registers for the function represented by @var{fndecl},
which can be zero if GCC is calling a library function.
The argument @var{fndecl} can be the FUNCTION_DECL, or the type itself
of the function.

This space can be allocated by the caller, or be a part of the
machine-dependent stack frame: @code{OUTGOING_REG_PARM_STACK_SPACE} says
which.
@end defmac
@c above is overfull.  not sure what to do.  --mew 5feb93  did
@c something, not sure if it looks good.  --mew 10feb93

@defmac INCOMING_REG_PARM_STACK_SPACE (@var{fndecl})
Like @code{REG_PARM_STACK_SPACE}, but for incoming register arguments.
Define this macro if space guaranteed when compiling a function body
is different to space required when making a call, a situation that
can arise with K&R style function definitions.
@end defmac

@defmac OUTGOING_REG_PARM_STACK_SPACE (@var{fntype})
Define this to a nonzero value if it is the responsibility of the
caller to allocate the area reserved for arguments passed in registers
when calling a function of @var{fntype}.  @var{fntype} may be NULL
if the function called is a library function.

If @code{ACCUMULATE_OUTGOING_ARGS} is defined, this macro controls
whether the space for these arguments counts in the value of
@code{crtl->outgoing_args_size}.
@end defmac

@defmac STACK_PARMS_IN_REG_PARM_AREA
Define this macro if @code{REG_PARM_STACK_SPACE} is defined, but the
stack parameters don't skip the area specified by it.
@c i changed this, makes more sens and it should have taken care of the
@c overfull.. not as specific, tho.  --mew 5feb93

Normally, when a parameter is not passed in registers, it is placed on the
stack beyond the @code{REG_PARM_STACK_SPACE} area.  Defining this macro
suppresses this behavior and causes the parameter to be passed on the
stack in its natural location.
@end defmac

@hook TARGET_RETURN_POPS_ARGS

@defmac CALL_POPS_ARGS (@var{cum})
A C expression that should indicate the number of bytes a call sequence
pops off the stack.  It is added to the value of @code{RETURN_POPS_ARGS}
when compiling a function call.

@var{cum} is the variable in which all arguments to the called function
have been accumulated.

On certain architectures, such as the SH5, a call trampoline is used
that pops certain registers off the stack, depending on the arguments
that have been passed to the function.  Since this is a property of the
call site, not of the called function, @code{RETURN_POPS_ARGS} is not
appropriate.
@end defmac

@node Register Arguments
@subsection Passing Arguments in Registers
@cindex arguments in registers
@cindex registers arguments

This section describes the macros which let you control how various
types of arguments are passed in registers or how they are arranged in
the stack.

@hook TARGET_FUNCTION_ARG

@hook TARGET_MUST_PASS_IN_STACK

@hook TARGET_FUNCTION_INCOMING_ARG

@hook TARGET_USE_PSEUDO_PIC_REG

@hook TARGET_INIT_PIC_REG

@hook TARGET_ARG_PARTIAL_BYTES

@hook TARGET_PASS_BY_REFERENCE

@hook TARGET_CALLEE_COPIES

@defmac CUMULATIVE_ARGS
A C type for declaring a variable that is used as the first argument
of @code{TARGET_FUNCTION_ARG} and other related values.  For some
target machines, the type @code{int} suffices and can hold the number
of bytes of argument so far.

There is no need to record in @code{CUMULATIVE_ARGS} anything about the
arguments that have been passed on the stack.  The compiler has other
variables to keep track of that.  For target machines on which all
arguments are passed on the stack, there is no need to store anything in
@code{CUMULATIVE_ARGS}; however, the data structure must exist and
should not be empty, so use @code{int}.
@end defmac

@defmac OVERRIDE_ABI_FORMAT (@var{fndecl})
If defined, this macro is called before generating any code for a
function, but after the @var{cfun} descriptor for the function has been
created.  The back end may use this macro to update @var{cfun} to
reflect an ABI other than that which would normally be used by default.
If the compiler is generating code for a compiler-generated function,
@var{fndecl} may be @code{NULL}.
@end defmac

@defmac INIT_CUMULATIVE_ARGS (@var{cum}, @var{fntype}, @var{libname}, @var{fndecl}, @var{n_named_args})
A C statement (sans semicolon) for initializing the variable
@var{cum} for the state at the beginning of the argument list.  The
variable has type @code{CUMULATIVE_ARGS}.  The value of @var{fntype}
is the tree node for the data type of the function which will receive
the args, or 0 if the args are to a compiler support library function.
For direct calls that are not libcalls, @var{fndecl} contain the
declaration node of the function.  @var{fndecl} is also set when
@code{INIT_CUMULATIVE_ARGS} is used to find arguments for the function
being compiled.  @var{n_named_args} is set to the number of named
arguments, including a structure return address if it is passed as a
parameter, when making a call.  When processing incoming arguments,
@var{n_named_args} is set to @minus{}1.

When processing a call to a compiler support library function,
@var{libname} identifies which one.  It is a @code{symbol_ref} rtx which
contains the name of the function, as a string.  @var{libname} is 0 when
an ordinary C function call is being processed.  Thus, each time this
macro is called, either @var{libname} or @var{fntype} is nonzero, but
never both of them at once.
@end defmac

@defmac INIT_CUMULATIVE_LIBCALL_ARGS (@var{cum}, @var{mode}, @var{libname})
Like @code{INIT_CUMULATIVE_ARGS} but only used for outgoing libcalls,
it gets a @code{MODE} argument instead of @var{fntype}, that would be
@code{NULL}.  @var{indirect} would always be zero, too.  If this macro
is not defined, @code{INIT_CUMULATIVE_ARGS (cum, NULL_RTX, libname,
0)} is used instead.
@end defmac

@defmac INIT_CUMULATIVE_INCOMING_ARGS (@var{cum}, @var{fntype}, @var{libname})
Like @code{INIT_CUMULATIVE_ARGS} but overrides it for the purposes of
finding the arguments for the function being compiled.  If this macro is
undefined, @code{INIT_CUMULATIVE_ARGS} is used instead.

The value passed for @var{libname} is always 0, since library routines
with special calling conventions are never compiled with GCC@.  The
argument @var{libname} exists for symmetry with
@code{INIT_CUMULATIVE_ARGS}.
@c could use "this macro" in place of @code{INIT_CUMULATIVE_ARGS}, maybe.
@c --mew 5feb93   i switched the order of the sentences.  --mew 10feb93
@end defmac

@hook TARGET_FUNCTION_ARG_ADVANCE

@hook TARGET_FUNCTION_ARG_OFFSET

@hook TARGET_FUNCTION_ARG_PADDING

@defmac PAD_VARARGS_DOWN
If defined, a C expression which determines whether the default
implementation of va_arg will attempt to pad down before reading the
next argument, if that argument is smaller than its aligned space as
controlled by @code{PARM_BOUNDARY}.  If this macro is not defined, all such
arguments are padded down if @code{BYTES_BIG_ENDIAN} is true.
@end defmac

@defmac BLOCK_REG_PADDING (@var{mode}, @var{type}, @var{first})
Specify padding for the last element of a block move between registers and
memory.  @var{first} is nonzero if this is the only element.  Defining this
macro allows better control of register function parameters on big-endian
machines, without using @code{PARALLEL} rtl.  In particular,
@code{MUST_PASS_IN_STACK} need not test padding and mode of types in
registers, as there is no longer a "wrong" part of a register;  For example,
a three byte aggregate may be passed in the high part of a register if so
required.
@end defmac

@hook TARGET_FUNCTION_ARG_BOUNDARY

@hook TARGET_FUNCTION_ARG_ROUND_BOUNDARY

@defmac FUNCTION_ARG_REGNO_P (@var{regno})
A C expression that is nonzero if @var{regno} is the number of a hard
register in which function arguments are sometimes passed.  This does
@emph{not} include implicit arguments such as the static chain and
the structure-value address.  On many machines, no registers can be
used for this purpose since all function arguments are pushed on the
stack.
@end defmac

@hook TARGET_SPLIT_COMPLEX_ARG

@hook TARGET_BUILD_BUILTIN_VA_LIST

@hook TARGET_ENUM_VA_LIST_P

@hook TARGET_FN_ABI_VA_LIST

@hook TARGET_CANONICAL_VA_LIST_TYPE

@hook TARGET_GIMPLIFY_VA_ARG_EXPR

@hook TARGET_VALID_POINTER_MODE

@hook TARGET_REF_MAY_ALIAS_ERRNO

@hook TARGET_TRANSLATE_MODE_ATTRIBUTE

@hook TARGET_SCALAR_MODE_SUPPORTED_P

@hook TARGET_VECTOR_MODE_SUPPORTED_P

@hook TARGET_COMPATIBLE_VECTOR_TYPES_P

@hook TARGET_ARRAY_MODE

@hook TARGET_ARRAY_MODE_SUPPORTED_P

@hook TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P

@hook TARGET_FLOATN_MODE

@hook TARGET_FLOATN_BUILTIN_P

@hook TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P

@node Scalar Return
@subsection How Scalar Function Values Are Returned
@cindex return values in registers
@cindex values, returned by functions
@cindex scalars, returned as values

This section discusses the macros that control returning scalars as
values---values that can fit in registers.

@hook TARGET_FUNCTION_VALUE

@defmac FUNCTION_VALUE (@var{valtype}, @var{func})
This macro has been deprecated.  Use @code{TARGET_FUNCTION_VALUE} for
a new target instead.
@end defmac

@defmac LIBCALL_VALUE (@var{mode})
A C expression to create an RTX representing the place where a library
function returns a value of mode @var{mode}.

Note that ``library function'' in this context means a compiler
support routine, used to perform arithmetic, whose name is known
specially by the compiler and was not mentioned in the C code being
compiled.
@end defmac

@hook TARGET_LIBCALL_VALUE

@defmac FUNCTION_VALUE_REGNO_P (@var{regno})
A C expression that is nonzero if @var{regno} is the number of a hard
register in which the values of called function may come back.

A register whose use for returning values is limited to serving as the
second of a pair (for a value of type @code{double}, say) need not be
recognized by this macro.  So for most machines, this definition
suffices:

@smallexample
#define FUNCTION_VALUE_REGNO_P(N) ((N) == 0)
@end smallexample

If the machine has register windows, so that the caller and the called
function use different registers for the return value, this macro
should recognize only the caller's register numbers.

This macro has been deprecated.  Use @code{TARGET_FUNCTION_VALUE_REGNO_P}
for a new target instead.
@end defmac

@hook TARGET_FUNCTION_VALUE_REGNO_P

@defmac APPLY_RESULT_SIZE
Define this macro if @samp{untyped_call} and @samp{untyped_return}
need more space than is implied by @code{FUNCTION_VALUE_REGNO_P} for
saving and restoring an arbitrary return value.
@end defmac

@hook TARGET_OMIT_STRUCT_RETURN_REG

@hook TARGET_RETURN_IN_MSB

@node Aggregate Return
@subsection How Large Values Are Returned
@cindex aggregates as return values
@cindex large return values
@cindex returning aggregate values
@cindex structure value address

When a function value's mode is @code{BLKmode} (and in some other
cases), the value is not returned according to
@code{TARGET_FUNCTION_VALUE} (@pxref{Scalar Return}).  Instead, the
caller passes the address of a block of memory in which the value
should be stored.  This address is called the @dfn{structure value
address}.

This section describes how to control returning structure values in
memory.

@hook TARGET_RETURN_IN_MEMORY

@defmac DEFAULT_PCC_STRUCT_RETURN
Define this macro to be 1 if all structure and union return values must be
in memory.  Since this results in slower code, this should be defined
only if needed for compatibility with other compilers or with an ABI@.
If you define this macro to be 0, then the conventions used for structure
and union return values are decided by the @code{TARGET_RETURN_IN_MEMORY}
target hook.

If not defined, this defaults to the value 1.
@end defmac

@hook TARGET_STRUCT_VALUE_RTX

@defmac PCC_STATIC_STRUCT_RETURN
Define this macro if the usual system convention on the target machine
for returning structures and unions is for the called function to return
the address of a static variable containing the value.

Do not define this if the usual system convention is for the caller to
pass an address to the subroutine.

This macro has effect in @option{-fpcc-struct-return} mode, but it does
nothing when you use @option{-freg-struct-return} mode.
@end defmac

@hook TARGET_GET_RAW_RESULT_MODE

@hook TARGET_GET_RAW_ARG_MODE

@hook TARGET_EMPTY_RECORD_P

@hook TARGET_WARN_PARAMETER_PASSING_ABI

@node Caller Saves
@subsection Caller-Saves Register Allocation

If you enable it, GCC can save registers around function calls.  This
makes it possible to use call-clobbered registers to hold variables that
must live across calls.

@defmac HARD_REGNO_CALLER_SAVE_MODE (@var{regno}, @var{nregs})
A C expression specifying which mode is required for saving @var{nregs}
of a pseudo-register in call-clobbered hard register @var{regno}.  If
@var{regno} is unsuitable for caller save, @code{VOIDmode} should be
returned.  For most machines this macro need not be defined since GCC
will select the smallest suitable mode.
@end defmac

@node Function Entry
@subsection Function Entry and Exit
@cindex function entry and exit
@cindex prologue
@cindex epilogue

This section describes the macros that output function entry
(@dfn{prologue}) and exit (@dfn{epilogue}) code.

@hook TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY

@hook TARGET_ASM_FUNCTION_PROLOGUE

@hook TARGET_ASM_FUNCTION_END_PROLOGUE

@hook TARGET_ASM_FUNCTION_BEGIN_EPILOGUE

@hook TARGET_ASM_FUNCTION_EPILOGUE

@itemize @bullet
@item
@findex pretend_args_size
@findex crtl->args.pretend_args_size
A region of @code{crtl->args.pretend_args_size} bytes of
uninitialized space just underneath the first argument arriving on the
stack.  (This may not be at the very start of the allocated stack region
if the calling sequence has pushed anything else since pushing the stack
arguments.  But usually, on such machines, nothing else has been pushed
yet, because the function prologue itself does all the pushing.)  This
region is used on machines where an argument may be passed partly in
registers and partly in memory, and, in some cases to support the
features in @code{<stdarg.h>}.

@item
An area of memory used to save certain registers used by the function.
The size of this area, which may also include space for such things as
the return address and pointers to previous stack frames, is
machine-specific and usually depends on which registers have been used
in the function.  Machines with register windows often do not require
a save area.

@item
A region of at least @var{size} bytes, possibly rounded up to an allocation
boundary, to contain the local variables of the function.  On some machines,
this region and the save area may occur in the opposite order, with the
save area closer to the top of the stack.

@item
@cindex @code{ACCUMULATE_OUTGOING_ARGS} and stack frames
Optionally, when @code{ACCUMULATE_OUTGOING_ARGS} is defined, a region of
@code{crtl->outgoing_args_size} bytes to be used for outgoing
argument lists of the function.  @xref{Stack Arguments}.
@end itemize

@defmac EXIT_IGNORE_STACK
Define this macro as a C expression that is nonzero if the return
instruction or the function epilogue ignores the value of the stack
pointer; in other words, if it is safe to delete an instruction to
adjust the stack pointer before a return from the function.  The
default is 0.

Note that this macro's value is relevant only for functions for which
frame pointers are maintained.  It is never safe to delete a final
stack adjustment in a function that has no frame pointer, and the
compiler knows this regardless of @code{EXIT_IGNORE_STACK}.
@end defmac

@defmac EPILOGUE_USES (@var{regno})
Define this macro as a C expression that is nonzero for registers that are
used by the epilogue or the @samp{return} pattern.  The stack and frame
pointer registers are already assumed to be used as needed.
@end defmac

@defmac EH_USES (@var{regno})
Define this macro as a C expression that is nonzero for registers that are
used by the exception handling mechanism, and so should be considered live
on entry to an exception edge.
@end defmac

@hook TARGET_ASM_OUTPUT_MI_THUNK

@hook TARGET_ASM_CAN_OUTPUT_MI_THUNK

@node Profiling
@subsection Generating Code for Profiling
@cindex profiling, code generation

These macros will help you generate code for profiling.

@defmac FUNCTION_PROFILER (@var{file}, @var{labelno})
A C statement or compound statement to output to @var{file} some
assembler code to call the profiling subroutine @code{mcount}.

@findex mcount
The details of how @code{mcount} expects to be called are determined by
your operating system environment, not by GCC@.  To figure them out,
compile a small program for profiling using the system's installed C
compiler and look at the assembler code that results.

Older implementations of @code{mcount} expect the address of a counter
variable to be loaded into some register.  The name of this variable is
@samp{LP} followed by the number @var{labelno}, so you would generate
the name using @samp{LP%d} in a @code{fprintf}.
@end defmac

@defmac PROFILE_HOOK
A C statement or compound statement to output to @var{file} some assembly
code to call the profiling subroutine @code{mcount} even the target does
not support profiling.
@end defmac

@defmac NO_PROFILE_COUNTERS
Define this macro to be an expression with a nonzero value if the
@code{mcount} subroutine on your system does not need a counter variable
allocated for each function.  This is true for almost all modern
implementations.  If you define this macro, you must not use the
@var{labelno} argument to @code{FUNCTION_PROFILER}.
@end defmac

@defmac PROFILE_BEFORE_PROLOGUE
Define this macro if the code for function profiling should come before
the function prologue.  Normally, the profiling code comes after.
@end defmac

@hook TARGET_KEEP_LEAF_WHEN_PROFILED

@node Tail Calls
@subsection Permitting tail calls
@cindex tail calls

@hook TARGET_FUNCTION_OK_FOR_SIBCALL

@hook TARGET_EXTRA_LIVE_ON_ENTRY

@hook TARGET_SET_UP_BY_PROLOGUE

@hook TARGET_WARN_FUNC_RETURN

@node Shrink-wrapping separate components
@subsection Shrink-wrapping separate components
@cindex shrink-wrapping separate components

The prologue may perform a variety of target dependent tasks such as
saving callee-saved registers, saving the return address, aligning the
stack, creating a stack frame, initializing the PIC register, setting
up the static chain, etc.

On some targets some of these tasks may be independent of others and
thus may be shrink-wrapped separately.  These independent tasks are
referred to as components and are handled generically by the target
independent parts of GCC.

Using the following hooks those prologue or epilogue components can be
shrink-wrapped separately, so that the initialization (and possibly
teardown) those components do is not done as frequently on execution
paths where this would unnecessary.

What exactly those components are is up to the target code; the generic
code treats them abstractly, as a bit in an @code{sbitmap}.  These
@code{sbitmap}s are allocated by the @code{shrink_wrap.get_separate_components}
and @code{shrink_wrap.components_for_bb} hooks, and deallocated by the
generic code.

@hook TARGET_SHRINK_WRAP_GET_SEPARATE_COMPONENTS

@hook TARGET_SHRINK_WRAP_COMPONENTS_FOR_BB

@hook TARGET_SHRINK_WRAP_DISQUALIFY_COMPONENTS

@hook TARGET_SHRINK_WRAP_EMIT_PROLOGUE_COMPONENTS

@hook TARGET_SHRINK_WRAP_EMIT_EPILOGUE_COMPONENTS

@hook TARGET_SHRINK_WRAP_SET_HANDLED_COMPONENTS

@node Stack Smashing Protection
@subsection Stack smashing protection
@cindex stack smashing protection

@hook TARGET_STACK_PROTECT_GUARD

@hook TARGET_STACK_PROTECT_FAIL

@hook TARGET_STACK_PROTECT_RUNTIME_ENABLED_P

@hook TARGET_SUPPORTS_SPLIT_STACK

@hook TARGET_GET_VALID_OPTION_VALUES

@node Miscellaneous Register Hooks
@subsection Miscellaneous register hooks
@cindex miscellaneous register hooks

@hook TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS

@node Varargs
@section Implementing the Varargs Macros
@cindex varargs implementation

GCC comes with an implementation of @code{<varargs.h>} and
@code{<stdarg.h>} that work without change on machines that pass arguments
on the stack.  Other machines require their own implementations of
varargs, and the two machine independent header files must have
conditionals to include it.

ISO @code{<stdarg.h>} differs from traditional @code{<varargs.h>} mainly in
the calling convention for @code{va_start}.  The traditional
implementation takes just one argument, which is the variable in which
to store the argument pointer.  The ISO implementation of
@code{va_start} takes an additional second argument.  The user is
supposed to write the last named argument of the function here.

However, @code{va_start} should not use this argument.  The way to find
the end of the named arguments is with the built-in functions described
below.

@defmac __builtin_saveregs ()
Use this built-in function to save the argument registers in memory so
that the varargs mechanism can access them.  Both ISO and traditional
versions of @code{va_start} must use @code{__builtin_saveregs}, unless
you use @code{TARGET_SETUP_INCOMING_VARARGS} (see below) instead.

On some machines, @code{__builtin_saveregs} is open-coded under the
control of the target hook @code{TARGET_EXPAND_BUILTIN_SAVEREGS}.  On
other machines, it calls a routine written in assembler language,
found in @file{libgcc2.c}.

Code generated for the call to @code{__builtin_saveregs} appears at the
beginning of the function, as opposed to where the call to
@code{__builtin_saveregs} is written, regardless of what the code is.
This is because the registers must be saved before the function starts
to use them for its own purposes.
@c i rewrote the first sentence above to fix an overfull hbox. --mew
@c 10feb93
@end defmac

@defmac __builtin_next_arg (@var{lastarg})
This builtin returns the address of the first anonymous stack
argument, as type @code{void *}.  If @code{ARGS_GROW_DOWNWARD}, it
returns the address of the location above the first anonymous stack
argument.  Use it in @code{va_start} to initialize the pointer for
fetching arguments from the stack.  Also use it in @code{va_start} to
verify that the second parameter @var{lastarg} is the last named argument
of the current function.
@end defmac

@defmac __builtin_classify_type (@var{object})
Since each machine has its own conventions for which data types are
passed in which kind of register, your implementation of @code{va_arg}
has to embody these conventions.  The easiest way to categorize the
specified data type is to use @code{__builtin_classify_type} together
with @code{sizeof} and @code{__alignof__}.

@code{__builtin_classify_type} ignores the value of @var{object},
considering only its data type.  It returns an integer describing what
kind of type that is---integer, floating, pointer, structure, and so on.

The file @file{typeclass.h} defines an enumeration that you can use to
interpret the values of @code{__builtin_classify_type}.
@end defmac

These machine description macros help implement varargs:

@hook TARGET_EXPAND_BUILTIN_SAVEREGS

@hook TARGET_SETUP_INCOMING_VARARGS

@hook TARGET_STRICT_ARGUMENT_NAMING

@hook TARGET_CALL_ARGS

@hook TARGET_END_CALL_ARGS

@hook TARGET_PRETEND_OUTGOING_VARARGS_NAMED

@node Trampolines
@section Support for Nested Functions
@cindex support for nested functions
@cindex trampolines for nested functions
@cindex descriptors for nested functions
@cindex nested functions, support for

Taking the address of a nested function requires special compiler
handling to ensure that the static chain register is loaded when
the function is invoked via an indirect call.

GCC has traditionally supported nested functions by creating an
executable @dfn{trampoline} at run time when the address of a nested
function is taken.  This is a small piece of code which normally
resides on the stack, in the stack frame of the containing function.
The trampoline loads the static chain register and then jumps to the
real address of the nested function.

The use of trampolines requires an executable stack, which is a
security risk.  To avoid this problem, GCC also supports another
strategy: using descriptors for nested functions.  Under this model,
taking the address of a nested function results in a pointer to a
non-executable function descriptor object.  Initializing the static chain
from the descriptor is handled at indirect call sites.

On some targets, including HPPA and IA-64, function descriptors may be
mandated by the ABI or be otherwise handled in a target-specific way
by the back end in its code generation strategy for indirect calls.
GCC also provides its own generic descriptor implementation to support the
@option{-fno-trampolines} option.  In this case runtime detection of
function descriptors at indirect call sites relies on descriptor
pointers being tagged with a bit that is never set in bare function
addresses.  Since GCC's generic function descriptors are
not ABI-compliant, this option is typically used only on a
per-language basis (notably by Ada) or when it can otherwise be
applied to the whole program.

For languages other than Ada, the @code{-ftrampolines} and
@code{-fno-trampolines} options currently have no effect, and
trampolines are always generated on platforms that need them
for nested functions.

Define the following hook if your backend either implements ABI-specified
descriptor support, or can use GCC's generic descriptor implementation
for nested functions.

@hook TARGET_CUSTOM_FUNCTION_DESCRIPTORS

The following macros tell GCC how to generate code to allocate and
initialize an executable trampoline.  You can also use this interface
if your back end needs to create ABI-specified non-executable descriptors; in
this case the "trampoline" created is the descriptor containing data only.

The instructions in an executable trampoline must do two things: load
a constant address into the static chain register, and jump to the real
address of the nested function.  On CISC machines such as the m68k,
this requires two instructions, a move immediate and a jump.  Then the
two addresses exist in the trampoline as word-long immediate operands.
On RISC machines, it is often necessary to load each address into a
register in two parts.  Then pieces of each address form separate
immediate operands.

The code generated to initialize the trampoline must store the variable
parts---the static chain value and the function address---into the
immediate operands of the instructions.  On a CISC machine, this is
simply a matter of copying each address to a memory reference at the
proper offset from the start of the trampoline.  On a RISC machine, it
may be necessary to take out pieces of the address and store them
separately.

@hook TARGET_ASM_TRAMPOLINE_TEMPLATE

@defmac TRAMPOLINE_SECTION
Return the section into which the trampoline template is to be placed
(@pxref{Sections}).  The default value is @code{readonly_data_section}.
@end defmac

@defmac TRAMPOLINE_SIZE
A C expression for the size in bytes of the trampoline, as an integer.
@end defmac

@defmac TRAMPOLINE_ALIGNMENT
Alignment required for trampolines, in bits.

If you don't define this macro, the value of @code{FUNCTION_ALIGNMENT}
is used for aligning trampolines.
@end defmac

@hook TARGET_TRAMPOLINE_INIT

@hook TARGET_EMIT_CALL_BUILTIN___CLEAR_CACHE

@hook TARGET_TRAMPOLINE_ADJUST_ADDRESS

Implementing trampolines is difficult on many machines because they have
separate instruction and data caches.  Writing into a stack location
fails to clear the memory in the instruction cache, so when the program
jumps to that location, it executes the old contents.

Here are two possible solutions.  One is to clear the relevant parts of
the instruction cache whenever a trampoline is set up.  The other is to
make all trampolines identical, by having them jump to a standard
subroutine.  The former technique makes trampoline execution faster; the
latter makes initialization faster.

To clear the instruction cache when a trampoline is initialized, define
the following macro.

@defmac CLEAR_INSN_CACHE (@var{beg}, @var{end})
If defined, expands to a C expression clearing the @emph{instruction
cache} in the specified interval.  The definition of this macro would
typically be a series of @code{asm} statements.  Both @var{beg} and
@var{end} are pointer expressions.
@end defmac

To use a standard subroutine, define the following macro.  In addition,
you must make sure that the instructions in a trampoline fill an entire
cache line with identical instructions, or else ensure that the
beginning of the trampoline code is always aligned at the same point in
its cache line.  Look in @file{m68k.h} as a guide.

@defmac TRANSFER_FROM_TRAMPOLINE
Define this macro if trampolines need a special subroutine to do their
work.  The macro should expand to a series of @code{asm} statements
which will be compiled with GCC@.  They go in a library function named
@code{__transfer_from_trampoline}.

If you need to avoid executing the ordinary prologue code of a compiled
C function when you jump to the subroutine, you can do so by placing a
special label of your own in the assembler code.  Use one @code{asm}
statement to generate an assembler label, and another to make the label
global.  Then trampolines can use that label to jump directly to your
special assembler code.
@end defmac

@node Library Calls
@section Implicit Calls to Library Routines
@cindex library subroutine names
@cindex @file{libgcc.a}

@c prevent bad page break with this line
Here is an explanation of implicit calls to library routines.

@defmac DECLARE_LIBRARY_RENAMES
This macro, if defined, should expand to a piece of C code that will get
expanded when compiling functions for libgcc.a.  It can be used to
provide alternate names for GCC's internal library functions if there
are ABI-mandated names that the compiler should provide.
@end defmac

@findex set_optab_libfunc
@findex init_one_libfunc
@hook TARGET_INIT_LIBFUNCS

@hook TARGET_LIBFUNC_GNU_PREFIX

@defmac FLOAT_LIB_COMPARE_RETURNS_BOOL (@var{mode}, @var{comparison})
This macro should return @code{true} if the library routine that
implements the floating point comparison operator @var{comparison} in
mode @var{mode} will return a boolean, and @var{false} if it will
return a tristate.

GCC's own floating point libraries return tristates from the
comparison operators, so the default returns false always.  Most ports
don't need to define this macro.
@end defmac

@defmac TARGET_LIB_INT_CMP_BIASED
This macro should evaluate to @code{true} if the integer comparison
functions (like @code{__cmpdi2}) return 0 to indicate that the first
operand is smaller than the second, 1 to indicate that they are equal,
and 2 to indicate that the first operand is greater than the second.
If this macro evaluates to @code{false} the comparison functions return
@minus{}1, 0, and 1 instead of 0, 1, and 2.  If the target uses the routines
in @file{libgcc.a}, you do not need to define this macro.
@end defmac

@defmac TARGET_HAS_NO_HW_DIVIDE
This macro should be defined if the target has no hardware divide
instructions.  If this macro is defined, GCC will use an algorithm which
make use of simple logical and arithmetic operations for 64-bit
division.  If the macro is not defined, GCC will use an algorithm which
make use of a 64-bit by 32-bit divide primitive.
@end defmac

@cindex @code{EDOM}, implicit usage
@findex matherr
@defmac TARGET_EDOM
The value of @code{EDOM} on the target machine, as a C integer constant
expression.  If you don't define this macro, GCC does not attempt to
deposit the value of @code{EDOM} into @code{errno} directly.  Look in
@file{/usr/include/errno.h} to find the value of @code{EDOM} on your
system.

If you do not define @code{TARGET_EDOM}, then compiled code reports
domain errors by calling the library function and letting it report the
error.  If mathematical functions on your system use @code{matherr} when
there is an error, then you should leave @code{TARGET_EDOM} undefined so
that @code{matherr} is used normally.
@end defmac

@cindex @code{errno}, implicit usage
@defmac GEN_ERRNO_RTX
Define this macro as a C expression to create an rtl expression that
refers to the global ``variable'' @code{errno}.  (On certain systems,
@code{errno} may not actually be a variable.)  If you don't define this
macro, a reasonable default is used.
@end defmac

@hook TARGET_LIBC_HAS_FUNCTION

@hook TARGET_LIBC_HAS_FAST_FUNCTION

@defmac NEXT_OBJC_RUNTIME
Set this macro to 1 to use the "NeXT" Objective-C message sending conventions
by default.  This calling convention involves passing the object, the selector
and the method arguments all at once to the method-lookup library function.
This is the usual setting when targeting Darwin/Mac OS X systems, which have
the NeXT runtime installed.

If the macro is set to 0, the "GNU" Objective-C message sending convention
will be used by default.  This convention passes just the object and the
selector to the method-lookup function, which returns a pointer to the method.

In either case, it remains possible to select code-generation for the alternate
scheme, by means of compiler command line switches.
@end defmac

@node Addressing Modes
@section Addressing Modes
@cindex addressing modes

@c prevent bad page break with this line
This is about addressing modes.

@defmac HAVE_PRE_INCREMENT
@defmacx HAVE_PRE_DECREMENT
@defmacx HAVE_POST_INCREMENT
@defmacx HAVE_POST_DECREMENT
A C expression that is nonzero if the machine supports pre-increment,
pre-decrement, post-increment, or post-decrement addressing respectively.
@end defmac

@defmac HAVE_PRE_MODIFY_DISP
@defmacx HAVE_POST_MODIFY_DISP
A C expression that is nonzero if the machine supports pre- or
post-address side-effect generation involving constants other than
the size of the memory operand.
@end defmac

@defmac HAVE_PRE_MODIFY_REG
@defmacx HAVE_POST_MODIFY_REG
A C expression that is nonzero if the machine supports pre- or
post-address side-effect generation involving a register displacement.
@end defmac

@defmac CONSTANT_ADDRESS_P (@var{x})
A C expression that is 1 if the RTX @var{x} is a constant which
is a valid address.  On most machines the default definition of
@code{(CONSTANT_P (@var{x}) && GET_CODE (@var{x}) != CONST_DOUBLE)}
is acceptable, but a few machines are more restrictive as to which
constant addresses are supported.
@end defmac

@defmac CONSTANT_P (@var{x})
@code{CONSTANT_P}, which is defined by target-independent code,
accepts integer-values expressions whose values are not explicitly
known, such as @code{symbol_ref}, @code{label_ref}, and @code{high}
expressions and @code{const} arithmetic expressions, in addition to
@code{const_int} and @code{const_double} expressions.
@end defmac

@defmac MAX_REGS_PER_ADDRESS
A number, the maximum number of registers that can appear in a valid
memory address.  Note that it is up to you to specify a value equal to
the maximum number that @code{TARGET_LEGITIMATE_ADDRESS_P} would ever
accept.
@end defmac

@hook TARGET_LEGITIMATE_ADDRESS_P

@defmac TARGET_MEM_CONSTRAINT
A single character to be used instead of the default @code{'m'}
character for general memory addresses.  This defines the constraint
letter which matches the memory addresses accepted by
@code{TARGET_LEGITIMATE_ADDRESS_P}.  Define this macro if you want to
support new address formats in your back end without changing the
semantics of the @code{'m'} constraint.  This is necessary in order to
preserve functionality of inline assembly constructs using the
@code{'m'} constraint.
@end defmac

@defmac FIND_BASE_TERM (@var{x})
A C expression to determine the base term of address @var{x},
or to provide a simplified version of @var{x} from which @file{alias.cc}
can easily find the base term.  This macro is used in only two places:
@code{find_base_value} and @code{find_base_term} in @file{alias.cc}.

It is always safe for this macro to not be defined.  It exists so
that alias analysis can understand machine-dependent addresses.

The typical use of this macro is to handle addresses containing
a label_ref or symbol_ref within an UNSPEC@.
@end defmac

@hook TARGET_LEGITIMIZE_ADDRESS

@defmac LEGITIMIZE_RELOAD_ADDRESS (@var{x}, @var{mode}, @var{opnum}, @var{type}, @var{ind_levels}, @var{win})
A C compound statement that attempts to replace @var{x}, which is an address
that needs reloading, with a valid memory address for an operand of mode
@var{mode}.  @var{win} will be a C statement label elsewhere in the code.
It is not necessary to define this macro, but it might be useful for
performance reasons.

For example, on the i386, it is sometimes possible to use a single
reload register instead of two by reloading a sum of two pseudo
registers into a register.  On the other hand, for number of RISC
processors offsets are limited so that often an intermediate address
needs to be generated in order to address a stack slot.  By defining
@code{LEGITIMIZE_RELOAD_ADDRESS} appropriately, the intermediate addresses
generated for adjacent some stack slots can be made identical, and thus
be shared.

@emph{Note}: This macro should be used with caution.  It is necessary
to know something of how reload works in order to effectively use this,
and it is quite easy to produce macros that build in too much knowledge
of reload internals.

@emph{Note}: This macro must be able to reload an address created by a
previous invocation of this macro.  If it fails to handle such addresses
then the compiler may generate incorrect code or abort.

@findex push_reload
The macro definition should use @code{push_reload} to indicate parts that
need reloading; @var{opnum}, @var{type} and @var{ind_levels} are usually
suitable to be passed unaltered to @code{push_reload}.

The code generated by this macro must not alter the substructure of
@var{x}.  If it transforms @var{x} into a more legitimate form, it
should assign @var{x} (which will always be a C variable) a new value.
This also applies to parts that you change indirectly by calling
@code{push_reload}.

@findex strict_memory_address_p
The macro definition may use @code{strict_memory_address_p} to test if
the address has become legitimate.

@findex copy_rtx
If you want to change only a part of @var{x}, one standard way of doing
this is to use @code{copy_rtx}.  Note, however, that it unshares only a
single level of rtl.  Thus, if the part to be changed is not at the
top level, you'll need to replace first the top level.
It is not necessary for this macro to come up with a legitimate
address;  but often a machine-dependent strategy can generate better code.
@end defmac

@hook TARGET_MODE_DEPENDENT_ADDRESS_P

@hook TARGET_LEGITIMATE_CONSTANT_P

@hook TARGET_PRECOMPUTE_TLS_P

@hook TARGET_DELEGITIMIZE_ADDRESS

@hook TARGET_CONST_NOT_OK_FOR_DEBUG_P

@hook TARGET_CANNOT_FORCE_CONST_MEM

@hook TARGET_USE_BLOCKS_FOR_CONSTANT_P

@hook TARGET_USE_BLOCKS_FOR_DECL_P

@hook TARGET_BUILTIN_RECIPROCAL

@hook TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD

@hook TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST

@hook TARGET_VECTORIZE_PREFERRED_VECTOR_ALIGNMENT

@hook TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE

@hook TARGET_VECTORIZE_VEC_PERM_CONST

@hook TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION

@hook TARGET_VECTORIZE_BUILTIN_MD_VECTORIZED_FUNCTION

@hook TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT

@hook TARGET_VECTORIZE_PREFERRED_SIMD_MODE

@hook TARGET_VECTORIZE_SPLIT_REDUCTION

@hook TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_MODES

@hook TARGET_VECTORIZE_RELATED_MODE

@hook TARGET_VECTORIZE_GET_MASK_MODE

@hook TARGET_VECTORIZE_EMPTY_MASK_IS_EXPENSIVE

@hook TARGET_VECTORIZE_CREATE_COSTS

@hook TARGET_VECTORIZE_BUILTIN_GATHER

@hook TARGET_VECTORIZE_BUILTIN_SCATTER

@hook TARGET_SIMD_CLONE_COMPUTE_VECSIZE_AND_SIMDLEN

@hook TARGET_SIMD_CLONE_ADJUST

@hook TARGET_SIMD_CLONE_USABLE

@hook TARGET_SIMT_VF

@hook TARGET_OMP_DEVICE_KIND_ARCH_ISA

@hook TARGET_GOACC_VALIDATE_DIMS

@hook TARGET_GOACC_DIM_LIMIT

@hook TARGET_GOACC_FORK_JOIN

@hook TARGET_GOACC_REDUCTION

@hook TARGET_PREFERRED_ELSE_VALUE

@hook TARGET_GOACC_ADJUST_PRIVATE_DECL

@hook TARGET_GOACC_EXPAND_VAR_DECL

@hook TARGET_GOACC_CREATE_WORKER_BROADCAST_RECORD

@hook TARGET_GOACC_SHARED_MEM_LAYOUT

@node Anchored Addresses
@section Anchored Addresses
@cindex anchored addresses
@cindex @option{-fsection-anchors}

GCC usually addresses every static object as a separate entity.
For example, if we have:

@smallexample
static int a, b, c;
int foo (void) @{ return a + b + c; @}
@end smallexample

the code for @code{foo} will usually calculate three separate symbolic
addresses: those of @code{a}, @code{b} and @code{c}.  On some targets,
it would be better to calculate just one symbolic address and access
the three variables relative to it.  The equivalent pseudocode would
be something like:

@smallexample
int foo (void)
@{
  register int *xr = &x;
  return xr[&a - &x] + xr[&b - &x] + xr[&c - &x];
@}
@end smallexample

(which isn't valid C).  We refer to shared addresses like @code{x} as
``section anchors''.  Their use is controlled by @option{-fsection-anchors}.

The hooks below describe the target properties that GCC needs to know
in order to make effective use of section anchors.  It won't use
section anchors at all unless either @code{TARGET_MIN_ANCHOR_OFFSET}
or @code{TARGET_MAX_ANCHOR_OFFSET} is set to a nonzero value.

@hook TARGET_MIN_ANCHOR_OFFSET

@hook TARGET_MAX_ANCHOR_OFFSET

@hook TARGET_ASM_OUTPUT_ANCHOR

@hook TARGET_USE_ANCHORS_FOR_SYMBOL_P

@node Condition Code
@section Condition Code Status
@cindex condition code status

Condition codes in GCC are represented as registers,
which provides better schedulability for
architectures that do have a condition code register, but on which
most instructions do not affect it.  The latter category includes
most RISC machines.

Implicit clobbering would pose a strong restriction on the placement of
the definition and use of the condition code.  In the past the definition
and use were always adjacent.  However, recent changes to support trapping
arithmetic may result in the definition and user being in different blocks.
Thus, there may be a @code{NOTE_INSN_BASIC_BLOCK} between them.  Additionally,
the definition may be the source of exception handling edges.

These restrictions can prevent important
optimizations on some machines.  For example, on the IBM RS/6000, there
is a delay for taken branches unless the condition code register is set
three instructions earlier than the conditional branch.  The instruction
scheduler cannot perform this optimization if it is not permitted to
separate the definition and use of the condition code register.

If there is a specific
condition code register in the machine, use a hard register.  If the
condition code or comparison result can be placed in any general register,
or if there are multiple condition registers, use a pseudo register.
Registers used to store the condition code value will usually have a mode
that is in class @code{MODE_CC}.

Alternatively, you can use @code{BImode} if the comparison operator is
specified already in the compare instruction.  In this case, you are not
interested in most macros in this section.

@menu
* MODE_CC Condition Codes::  Modern representation of condition codes.
@end menu

@node MODE_CC Condition Codes
@subsection Representation of condition codes using registers
@findex CCmode
@findex MODE_CC

@defmac SELECT_CC_MODE (@var{op}, @var{x}, @var{y})
On many machines, the condition code may be produced by other instructions
than compares, for example the branch can use directly the condition
code set by a subtract instruction.  However, on some machines
when the condition code is set this way some bits (such as the overflow
bit) are not set in the same way as a test instruction, so that a different
branch instruction must be used for some conditional branches.  When
this happens, use the machine mode of the condition code register to
record different formats of the condition code register.  Modes can
also be used to record which compare instruction (e.g.@: a signed or an
unsigned comparison) produced the condition codes.

If other modes than @code{CCmode} are required, add them to
@file{@var{machine}-modes.def} and define @code{SELECT_CC_MODE} to choose
a mode given an operand of a compare.  This is needed because the modes
have to be chosen not only during RTL generation but also, for example,
by instruction combination.  The result of @code{SELECT_CC_MODE} should
be consistent with the mode used in the patterns; for example to support
the case of the add on the SPARC discussed above, we have the pattern

@smallexample
(define_insn ""
  [(set (reg:CCNZ 0)
        (compare:CCNZ
          (plus:SI (match_operand:SI 0 "register_operand" "%r")
                   (match_operand:SI 1 "arith_operand" "rI"))
          (const_int 0)))]
  ""
  "@dots{}")
@end smallexample

@noindent
together with a @code{SELECT_CC_MODE} that returns @code{CCNZmode}
for comparisons whose argument is a @code{plus}:

@smallexample
#define SELECT_CC_MODE(OP,X,Y) \
  (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT           \
   ? ((OP == LT || OP == LE || OP == GT || OP == GE)     \
      ? CCFPEmode : CCFPmode)                            \
   : ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS     \
       || GET_CODE (X) == NEG || GET_CODE (x) == ASHIFT) \
      ? CCNZmode : CCmode))
@end smallexample

Another reason to use modes is to retain information on which operands
were used by the comparison; see @code{REVERSIBLE_CC_MODE} later in
this section.

You should define this macro if and only if you define extra CC modes
in @file{@var{machine}-modes.def}.
@end defmac

@hook TARGET_CANONICALIZE_COMPARISON

@defmac REVERSIBLE_CC_MODE (@var{mode})
A C expression whose value is one if it is always safe to reverse a
comparison whose mode is @var{mode}.  If @code{SELECT_CC_MODE}
can ever return @var{mode} for a floating-point inequality comparison,
then @code{REVERSIBLE_CC_MODE (@var{mode})} must be zero.

You need not define this macro if it would always returns zero or if the
floating-point format is anything other than @code{IEEE_FLOAT_FORMAT}.
For example, here is the definition used on the SPARC, where floating-point
inequality comparisons are given either @code{CCFPEmode} or @code{CCFPmode}:

@smallexample
#define REVERSIBLE_CC_MODE(MODE) \
   ((MODE) != CCFPEmode && (MODE) != CCFPmode)
@end smallexample
@end defmac

@defmac REVERSE_CONDITION (@var{code}, @var{mode})
A C expression whose value is reversed condition code of the @var{code} for
comparison done in CC_MODE @var{mode}.  The macro is used only in case
@code{REVERSIBLE_CC_MODE (@var{mode})} is nonzero.  Define this macro in case
machine has some non-standard way how to reverse certain conditionals.  For
instance in case all floating point conditions are non-trapping, compiler may
freely convert unordered compares to ordered ones.  Then definition may look
like:

@smallexample
#define REVERSE_CONDITION(CODE, MODE) \
   ((MODE) != CCFPmode ? reverse_condition (CODE) \
    : reverse_condition_maybe_unordered (CODE))
@end smallexample
@end defmac

@hook TARGET_FIXED_CONDITION_CODE_REGS

@hook TARGET_CC_MODES_COMPATIBLE

@hook TARGET_FLAGS_REGNUM

@node Costs
@section Describing Relative Costs of Operations
@cindex costs of instructions
@cindex relative costs
@cindex speed of instructions

These macros let you describe the relative speed of various operations
on the target machine.

@defmac REGISTER_MOVE_COST (@var{mode}, @var{from}, @var{to})
A C expression for the cost of moving data of mode @var{mode} from a
register in class @var{from} to one in class @var{to}.  The classes are
expressed using the enumeration values such as @code{GENERAL_REGS}.  A
value of 2 is the default; other values are interpreted relative to
that.

It is not required that the cost always equal 2 when @var{from} is the
same as @var{to}; on some machines it is expensive to move between
registers if they are not general registers.

If reload sees an insn consisting of a single @code{set} between two
hard registers, and if @code{REGISTER_MOVE_COST} applied to their
classes returns a value of 2, reload does not check to ensure that the
constraints of the insn are met.  Setting a cost of other than 2 will
allow reload to verify that the constraints are met.  You should do this
if the @samp{mov@var{m}} pattern's constraints do not allow such copying.

These macros are obsolete, new ports should use the target hook
@code{TARGET_REGISTER_MOVE_COST} instead.
@end defmac

@hook TARGET_REGISTER_MOVE_COST

@defmac MEMORY_MOVE_COST (@var{mode}, @var{class}, @var{in})
A C expression for the cost of moving data of mode @var{mode} between a
register of class @var{class} and memory; @var{in} is zero if the value
is to be written to memory, nonzero if it is to be read in.  This cost
is relative to those in @code{REGISTER_MOVE_COST}.  If moving between
registers and memory is more expensive than between two registers, you
should define this macro to express the relative cost.

If you do not define this macro, GCC uses a default cost of 4 plus
the cost of copying via a secondary reload register, if one is
needed.  If your machine requires a secondary reload register to copy
between memory and a register of @var{class} but the reload mechanism is
more complex than copying via an intermediate, define this macro to
reflect the actual cost of the move.

GCC defines the function @code{memory_move_secondary_cost} if
secondary reloads are needed.  It computes the costs due to copying via
a secondary register.  If your machine copies from memory using a
secondary register in the conventional way but the default base value of
4 is not correct for your machine, define this macro to add some other
value to the result of that function.  The arguments to that function
are the same as to this macro.

These macros are obsolete, new ports should use the target hook
@code{TARGET_MEMORY_MOVE_COST} instead.
@end defmac

@hook TARGET_MEMORY_MOVE_COST

@defmac BRANCH_COST (@var{speed_p}, @var{predictable_p})
A C expression for the cost of a branch instruction.  A value of 1 is
the default; other values are interpreted relative to that. Parameter
@var{speed_p} is true when the branch in question should be optimized
for speed.  When it is false, @code{BRANCH_COST} should return a value
optimal for code size rather than performance.  @var{predictable_p} is
true for well-predicted branches. On many architectures the
@code{BRANCH_COST} can be reduced then.
@end defmac

Here are additional macros which do not specify precise relative costs,
but only that certain actions are more expensive than GCC would
ordinarily expect.

@defmac SLOW_BYTE_ACCESS
Define this macro as a C expression which is nonzero if accessing less
than a word of memory (i.e.@: a @code{char} or a @code{short}) is no
faster than accessing a word of memory, i.e., if such access
require more than one instruction or if there is no difference in cost
between byte and (aligned) word loads.

When this macro is not defined, the compiler will access a field by
finding the smallest containing object; when it is defined, a fullword
load will be used if alignment permits.  Unless bytes accesses are
faster than word accesses, using word accesses is preferable since it
may eliminate subsequent memory access if subsequent accesses occur to
other fields in the same word of the structure, but to different bytes.
@end defmac

@hook TARGET_SLOW_UNALIGNED_ACCESS

@defmac MOVE_RATIO (@var{speed})
The threshold of number of scalar memory-to-memory move insns, @emph{below}
which a sequence of insns should be generated instead of a
string move insn or a library call.  Increasing the value will always
make code faster, but eventually incurs high cost in increased code size.

Note that on machines where the corresponding move insn is a
@code{define_expand} that emits a sequence of insns, this macro counts
the number of such sequences.

The parameter @var{speed} is true if the code is currently being
optimized for speed rather than size.

If you don't define this, a reasonable default is used.
@end defmac

@hook TARGET_USE_BY_PIECES_INFRASTRUCTURE_P

@hook TARGET_OVERLAP_OP_BY_PIECES_P

@hook TARGET_COMPARE_BY_PIECES_BRANCH_RATIO

@defmac MOVE_MAX_PIECES
A C expression used by @code{move_by_pieces} to determine the largest unit
a load or store used to copy memory is.  Defaults to @code{MOVE_MAX}.
@end defmac

@defmac STORE_MAX_PIECES
A C expression used by @code{store_by_pieces} to determine the largest unit
a store used to memory is.  Defaults to @code{MOVE_MAX_PIECES}, or two times
the size of @code{HOST_WIDE_INT}, whichever is smaller.
@end defmac

@defmac COMPARE_MAX_PIECES
A C expression used by @code{compare_by_pieces} to determine the largest unit
a load or store used to compare memory is.  Defaults to
@code{MOVE_MAX_PIECES}.
@end defmac

@defmac CLEAR_RATIO (@var{speed})
The threshold of number of scalar move insns, @emph{below} which a sequence
of insns should be generated to clear memory instead of a string clear insn
or a library call.  Increasing the value will always make code faster, but
eventually incurs high cost in increased code size.

The parameter @var{speed} is true if the code is currently being
optimized for speed rather than size.

If you don't define this, a reasonable default is used.
@end defmac

@defmac SET_RATIO (@var{speed})
The threshold of number of scalar move insns, @emph{below} which a sequence
of insns should be generated to set memory to a constant value, instead of
a block set insn or a library call.
Increasing the value will always make code faster, but
eventually incurs high cost in increased code size.

The parameter @var{speed} is true if the code is currently being
optimized for speed rather than size.

If you don't define this, it defaults to the value of @code{MOVE_RATIO}.
@end defmac

@defmac USE_LOAD_POST_INCREMENT (@var{mode})
A C expression used to determine whether a load postincrement is a good
thing to use for a given mode.  Defaults to the value of
@code{HAVE_POST_INCREMENT}.
@end defmac

@defmac USE_LOAD_POST_DECREMENT (@var{mode})
A C expression used to determine whether a load postdecrement is a good
thing to use for a given mode.  Defaults to the value of
@code{HAVE_POST_DECREMENT}.
@end defmac

@defmac USE_LOAD_PRE_INCREMENT (@var{mode})
A C expression used to determine whether a load preincrement is a good
thing to use for a given mode.  Defaults to the value of
@code{HAVE_PRE_INCREMENT}.
@end defmac

@defmac USE_LOAD_PRE_DECREMENT (@var{mode})
A C expression used to determine whether a load predecrement is a good
thing to use for a given mode.  Defaults to the value of
@code{HAVE_PRE_DECREMENT}.
@end defmac

@defmac USE_STORE_POST_INCREMENT (@var{mode})
A C expression used to determine whether a store postincrement is a good
thing to use for a given mode.  Defaults to the value of
@code{HAVE_POST_INCREMENT}.
@end defmac

@defmac USE_STORE_POST_DECREMENT (@var{mode})
A C expression used to determine whether a store postdecrement is a good
thing to use for a given mode.  Defaults to the value of
@code{HAVE_POST_DECREMENT}.
@end defmac

@defmac USE_STORE_PRE_INCREMENT (@var{mode})
This macro is used to determine whether a store preincrement is a good
thing to use for a given mode.  Defaults to the value of
@code{HAVE_PRE_INCREMENT}.
@end defmac

@defmac USE_STORE_PRE_DECREMENT (@var{mode})
This macro is used to determine whether a store predecrement is a good
thing to use for a given mode.  Defaults to the value of
@code{HAVE_PRE_DECREMENT}.
@end defmac

@defmac NO_FUNCTION_CSE
Define this macro to be true if it is as good or better to call a constant
function address than to call an address kept in a register.
@end defmac

@defmac LOGICAL_OP_NON_SHORT_CIRCUIT
Define this macro if a non-short-circuit operation produced by
@samp{fold_range_test ()} is optimal.  This macro defaults to true if
@code{BRANCH_COST} is greater than or equal to the value 2.
@end defmac

@hook TARGET_OPTAB_SUPPORTED_P

@hook TARGET_RTX_COSTS

@hook TARGET_ADDRESS_COST

@hook TARGET_INSN_COST

@hook TARGET_MAX_NOCE_IFCVT_SEQ_COST

@hook TARGET_NOCE_CONVERSION_PROFITABLE_P

@hook TARGET_NEW_ADDRESS_PROFITABLE_P

@hook TARGET_NO_SPECULATION_IN_DELAY_SLOTS_P

@hook TARGET_ESTIMATED_POLY_VALUE

@node Scheduling
@section Adjusting the Instruction Scheduler

The instruction scheduler may need a fair amount of machine-specific
adjustment in order to produce good code.  GCC provides several target
hooks for this purpose.  It is usually enough to define just a few of
them: try the first ones in this list first.

@hook TARGET_SCHED_ISSUE_RATE

@hook TARGET_SCHED_VARIABLE_ISSUE

@hook TARGET_SCHED_ADJUST_COST

@hook TARGET_SCHED_ADJUST_PRIORITY

@hook TARGET_SCHED_REORDER

@hook TARGET_SCHED_REORDER2

@hook TARGET_SCHED_MACRO_FUSION_P

@hook TARGET_SCHED_MACRO_FUSION_PAIR_P

@hook TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK

@hook TARGET_SCHED_INIT

@hook TARGET_SCHED_FINISH

@hook TARGET_SCHED_INIT_GLOBAL

@hook TARGET_SCHED_FINISH_GLOBAL

@hook TARGET_SCHED_DFA_PRE_CYCLE_INSN

@hook TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN

@hook TARGET_SCHED_DFA_POST_CYCLE_INSN

@hook TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN

@hook TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE

@hook TARGET_SCHED_DFA_POST_ADVANCE_CYCLE

@hook TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD

@hook TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD

@hook TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BEGIN

@hook TARGET_SCHED_FIRST_CYCLE_MULTIPASS_ISSUE

@hook TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BACKTRACK

@hook TARGET_SCHED_FIRST_CYCLE_MULTIPASS_END

@hook TARGET_SCHED_FIRST_CYCLE_MULTIPASS_INIT

@hook TARGET_SCHED_FIRST_CYCLE_MULTIPASS_FINI

@hook TARGET_SCHED_DFA_NEW_CYCLE

@hook TARGET_SCHED_IS_COSTLY_DEPENDENCE

@hook TARGET_SCHED_H_I_D_EXTENDED

@hook TARGET_SCHED_ALLOC_SCHED_CONTEXT

@hook TARGET_SCHED_INIT_SCHED_CONTEXT

@hook TARGET_SCHED_SET_SCHED_CONTEXT

@hook TARGET_SCHED_CLEAR_SCHED_CONTEXT

@hook TARGET_SCHED_FREE_SCHED_CONTEXT

@hook TARGET_SCHED_SPECULATE_INSN

@hook TARGET_SCHED_NEEDS_BLOCK_P

@hook TARGET_SCHED_GEN_SPEC_CHECK

@hook TARGET_SCHED_SET_SCHED_FLAGS

@hook TARGET_SCHED_CAN_SPECULATE_INSN

@hook TARGET_SCHED_SMS_RES_MII

@hook TARGET_SCHED_DISPATCH

@hook TARGET_SCHED_DISPATCH_DO

@hook TARGET_SCHED_EXPOSED_PIPELINE

@hook TARGET_SCHED_REASSOCIATION_WIDTH

@hook TARGET_SCHED_FUSION_PRIORITY

@hook TARGET_EXPAND_DIVMOD_LIBFUNC

@node Sections
@section Dividing the Output into Sections (Texts, Data, @dots{})
@c the above section title is WAY too long.  maybe cut the part between
@c the (...)?  --mew 10feb93

An object file is divided into sections containing different types of
data.  In the most common case, there are three sections: the @dfn{text
section}, which holds instructions and read-only data; the @dfn{data
section}, which holds initialized writable data; and the @dfn{bss
section}, which holds uninitialized data.  Some systems have other kinds
of sections.

@file{varasm.cc} provides several well-known sections, such as
@code{text_section}, @code{data_section} and @code{bss_section}.
The normal way of controlling a @code{@var{foo}_section} variable
is to define the associated @code{@var{FOO}_SECTION_ASM_OP} macro,
as described below.  The macros are only read once, when @file{varasm.cc}
initializes itself, so their values must be run-time constants.
They may however depend on command-line flags.

@emph{Note:} Some run-time files, such @file{crtstuff.c}, also make
use of the @code{@var{FOO}_SECTION_ASM_OP} macros, and expect them
to be string literals.

Some assemblers require a different string to be written every time a
section is selected.  If your assembler falls into this category, you
should define the @code{TARGET_ASM_INIT_SECTIONS} hook and use
@code{get_unnamed_section} to set up the sections.

You must always create a @code{text_section}, either by defining
@code{TEXT_SECTION_ASM_OP} or by initializing @code{text_section}
in @code{TARGET_ASM_INIT_SECTIONS}.  The same is true of
@code{data_section} and @code{DATA_SECTION_ASM_OP}.  If you do not
create a distinct @code{readonly_data_section}, the default is to
reuse @code{text_section}.

All the other @file{varasm.cc} sections are optional, and are null
if the target does not provide them.

@defmac TEXT_SECTION_ASM_OP
A C expression whose value is a string, including spacing, containing the
assembler operation that should precede instructions and read-only data.
Normally @code{"\t.text"} is right.
@end defmac

@defmac HOT_TEXT_SECTION_NAME
If defined, a C string constant for the name of the section containing most
frequently executed functions of the program.  If not defined, GCC will provide
a default definition if the target supports named sections.
@end defmac

@defmac UNLIKELY_EXECUTED_TEXT_SECTION_NAME
If defined, a C string constant for the name of the section containing unlikely
executed functions in the program.
@end defmac

@defmac DATA_SECTION_ASM_OP
A C expression whose value is a string, including spacing, containing the
assembler operation to identify the following data as writable initialized
data.  Normally @code{"\t.data"} is right.
@end defmac

@defmac SDATA_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
containing the assembler operation to identify the following data as
initialized, writable small data.
@end defmac

@defmac READONLY_DATA_SECTION_ASM_OP
A C expression whose value is a string, including spacing, containing the
assembler operation to identify the following data as read-only initialized
data.
@end defmac

@defmac BSS_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
containing the assembler operation to identify the following data as
uninitialized global data.  If not defined, and
@code{ASM_OUTPUT_ALIGNED_BSS} not defined,
uninitialized global data will be output in the data section if
@option{-fno-common} is passed, otherwise @code{ASM_OUTPUT_COMMON} will be
used.
@end defmac

@defmac SBSS_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
containing the assembler operation to identify the following data as
uninitialized, writable small data.
@end defmac

@defmac TLS_COMMON_ASM_OP
If defined, a C expression whose value is a string containing the
assembler operation to identify the following data as thread-local
common data.  The default is @code{".tls_common"}.
@end defmac

@defmac TLS_SECTION_ASM_FLAG
If defined, a C expression whose value is a character constant
containing the flag used to mark a section as a TLS section.  The
default is @code{'T'}.
@end defmac

@defmac INIT_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
containing the assembler operation to identify the following data as
initialization code.  If not defined, GCC will assume such a section does
not exist.  This section has no corresponding @code{init_section}
variable; it is used entirely in runtime code.
@end defmac

@defmac FINI_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
containing the assembler operation to identify the following data as
finalization code.  If not defined, GCC will assume such a section does
not exist.  This section has no corresponding @code{fini_section}
variable; it is used entirely in runtime code.
@end defmac

@defmac INIT_ARRAY_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
containing the assembler operation to identify the following data as
part of the @code{.init_array} (or equivalent) section.  If not
defined, GCC will assume such a section does not exist.  Do not define
both this macro and @code{INIT_SECTION_ASM_OP}.
@end defmac

@defmac FINI_ARRAY_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
containing the assembler operation to identify the following data as
part of the @code{.fini_array} (or equivalent) section.  If not
defined, GCC will assume such a section does not exist.  Do not define
both this macro and @code{FINI_SECTION_ASM_OP}.
@end defmac

@defmac MACH_DEP_SECTION_ASM_FLAG
If defined, a C expression whose value is a character constant
containing the flag used to mark a machine-dependent section.  This
corresponds to the @code{SECTION_MACH_DEP} section flag.
@end defmac

@defmac CRT_CALL_STATIC_FUNCTION (@var{section_op}, @var{function})
If defined, an ASM statement that switches to a different section
via @var{section_op}, calls @var{function}, and switches back to
the text section.  This is used in @file{crtstuff.c} if
@code{INIT_SECTION_ASM_OP} or @code{FINI_SECTION_ASM_OP} to calls
to initialization and finalization functions from the init and fini
sections.  By default, this macro uses a simple function call.  Some
ports need hand-crafted assembly code to avoid dependencies on
registers initialized in the function prologue or to ensure that
constant pools don't end up too far way in the text section.
@end defmac

@defmac TARGET_LIBGCC_SDATA_SECTION
If defined, a string which names the section into which small
variables defined in crtstuff and libgcc should go.  This is useful
when the target has options for optimizing access to small data, and
you want the crtstuff and libgcc routines to be conservative in what
they expect of your application yet liberal in what your application
expects.  For example, for targets with a @code{.sdata} section (like
MIPS), you could compile crtstuff with @code{-G 0} so that it doesn't
require small data support from your application, but use this macro
to put small data into @code{.sdata} so that your application can
access these variables whether it uses small data or not.
@end defmac

@defmac FORCE_CODE_SECTION_ALIGN
If defined, an ASM statement that aligns a code section to some
arbitrary boundary.  This is used to force all fragments of the
@code{.init} and @code{.fini} sections to have to same alignment
and thus prevent the linker from having to add any padding.
@end defmac

@defmac JUMP_TABLES_IN_TEXT_SECTION
Define this macro to be an expression with a nonzero value if jump
tables (for @code{tablejump} insns) should be output in the text
section, along with the assembler instructions.  Otherwise, the
readonly data section is used.

This macro is irrelevant if there is no separate readonly data section.
@end defmac

@hook TARGET_ASM_INIT_SECTIONS

@hook TARGET_ASM_RELOC_RW_MASK

@hook TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC

@hook TARGET_ASM_SELECT_SECTION

@defmac USE_SELECT_SECTION_FOR_FUNCTIONS
Define this macro if you wish TARGET_ASM_SELECT_SECTION to be called
for @code{FUNCTION_DECL}s as well as for variables and constants.

In the case of a @code{FUNCTION_DECL}, @var{reloc} will be zero if the
function has been determined to be likely to be called, and nonzero if
it is unlikely to be called.
@end defmac

@hook TARGET_ASM_UNIQUE_SECTION

@hook TARGET_ASM_FUNCTION_RODATA_SECTION

@hook TARGET_ASM_MERGEABLE_RODATA_PREFIX

@hook TARGET_ASM_TM_CLONE_TABLE_SECTION

@hook TARGET_ASM_SELECT_RTX_SECTION

@hook TARGET_MANGLE_DECL_ASSEMBLER_NAME

@hook TARGET_ENCODE_SECTION_INFO

@hook TARGET_STRIP_NAME_ENCODING

@hook TARGET_IN_SMALL_DATA_P

@hook TARGET_HAVE_SRODATA_SECTION

@hook TARGET_PROFILE_BEFORE_PROLOGUE

@hook TARGET_BINDS_LOCAL_P

@hook TARGET_HAVE_TLS


@node PIC
@section Position Independent Code
@cindex position independent code
@cindex PIC

This section describes macros that help implement generation of position
independent code.  Simply defining these macros is not enough to
generate valid PIC; you must also add support to the hook
@code{TARGET_LEGITIMATE_ADDRESS_P} and to the macro
@code{PRINT_OPERAND_ADDRESS}, as well as @code{LEGITIMIZE_ADDRESS}.  You
must modify the definition of @samp{movsi} to do something appropriate
when the source operand contains a symbolic address.  You may also
need to alter the handling of switch statements so that they use
relative addresses.
@c i rearranged the order of the macros above to try to force one of
@c them to the next line, to eliminate an overfull hbox. --mew 10feb93

@defmac PIC_OFFSET_TABLE_REGNUM
The register number of the register used to address a table of static
data addresses in memory.  In some cases this register is defined by a
processor's ``application binary interface'' (ABI)@.  When this macro
is defined, RTL is generated for this register once, as with the stack
pointer and frame pointer registers.  If this macro is not defined, it
is up to the machine-dependent files to allocate such a register (if
necessary).  Note that this register must be fixed when in use (e.g.@:
when @code{flag_pic} is true).
@end defmac

@defmac PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
A C expression that is nonzero if the register defined by
@code{PIC_OFFSET_TABLE_REGNUM} is clobbered by calls.  If not defined,
the default is zero.  Do not define
this macro if @code{PIC_OFFSET_TABLE_REGNUM} is not defined.
@end defmac

@defmac LEGITIMATE_PIC_OPERAND_P (@var{x})
A C expression that is nonzero if @var{x} is a legitimate immediate
operand on the target machine when generating position independent code.
You can assume that @var{x} satisfies @code{CONSTANT_P}, so you need not
check this.  You can also assume @var{flag_pic} is true, so you need not
check it either.  You need not define this macro if all constants
(including @code{SYMBOL_REF}) can be immediate operands when generating
position independent code.
@end defmac

@node Assembler Format
@section Defining the Output Assembler Language

This section describes macros whose principal purpose is to describe how
to write instructions in assembler language---rather than what the
instructions do.

@menu
* File Framework::       Structural information for the assembler file.
* Data Output::          Output of constants (numbers, strings, addresses).
* Uninitialized Data::   Output of uninitialized variables.
* Label Output::         Output and generation of labels.
* Initialization::       General principles of initialization
                         and termination routines.
* Macros for Initialization::
                         Specific macros that control the handling of
                         initialization and termination routines.
* Instruction Output::   Output of actual instructions.
* Dispatch Tables::      Output of jump tables.
* Exception Region Output:: Output of exception region code.
* Alignment Output::     Pseudo ops for alignment and skipping data.
@end menu

@node File Framework
@subsection The Overall Framework of an Assembler File
@cindex assembler format
@cindex output of assembler code

@c prevent bad page break with this line
This describes the overall framework of an assembly file.

@findex default_file_start
@hook TARGET_ASM_FILE_START

@hook TARGET_ASM_FILE_START_APP_OFF

@hook TARGET_ASM_FILE_START_FILE_DIRECTIVE

@hook TARGET_ASM_FILE_END

@deftypefun void file_end_indicate_exec_stack ()
Some systems use a common convention, the @samp{.note.GNU-stack}
special section, to indicate whether or not an object file relies on
the stack being executable.  If your system uses this convention, you
should define @code{TARGET_ASM_FILE_END} to this function.  If you
need to do other things in that hook, have your hook function call
this function.
@end deftypefun

@hook TARGET_ASM_LTO_START

@hook TARGET_ASM_LTO_END

@hook TARGET_ASM_CODE_END

@defmac ASM_COMMENT_START
A C string constant describing how to begin a comment in the target
assembler language.  The compiler assumes that the comment will end at
the end of the line.
@end defmac

@defmac ASM_APP_ON
A C string constant for text to be output before each @code{asm}
statement or group of consecutive ones.  Normally this is
@code{"#APP"}, which is a comment that has no effect on most
assemblers but tells the GNU assembler that it must check the lines
that follow for all valid assembler constructs.
@end defmac

@defmac ASM_APP_OFF
A C string constant for text to be output after each @code{asm}
statement or group of consecutive ones.  Normally this is
@code{"#NO_APP"}, which tells the GNU assembler to resume making the
time-saving assumptions that are valid for ordinary compiler output.
@end defmac

@defmac ASM_OUTPUT_SOURCE_FILENAME (@var{stream}, @var{name})
A C statement to output COFF information or DWARF debugging information
which indicates that filename @var{name} is the current source file to
the stdio stream @var{stream}.

This macro need not be defined if the standard form of output
for the file format in use is appropriate.
@end defmac

@hook TARGET_ASM_OUTPUT_SOURCE_FILENAME

@hook TARGET_ASM_OUTPUT_IDENT

@defmac OUTPUT_QUOTED_STRING (@var{stream}, @var{string})
A C statement to output the string @var{string} to the stdio stream
@var{stream}.  If you do not call the function @code{output_quoted_string}
in your config files, GCC will only call it to output filenames to
the assembler source.  So you can use it to canonicalize the format
of the filename using this macro.
@end defmac

@hook TARGET_ASM_NAMED_SECTION

@hook TARGET_ASM_ELF_FLAGS_NUMERIC

@hook TARGET_ASM_FUNCTION_SECTION

@hook TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS

@hook TARGET_HAVE_NAMED_SECTIONS
This flag is true if the target supports @code{TARGET_ASM_NAMED_SECTION}.
It must not be modified by command-line option processing.
@end deftypevr

@anchor{TARGET_HAVE_SWITCHABLE_BSS_SECTIONS}
@hook TARGET_HAVE_SWITCHABLE_BSS_SECTIONS

@hook TARGET_SECTION_TYPE_FLAGS

@hook TARGET_ASM_RECORD_GCC_SWITCHES

@hook TARGET_ASM_RECORD_GCC_SWITCHES_SECTION

@need 2000
@node Data Output
@subsection Output of Data


@hook TARGET_ASM_BYTE_OP

@hook TARGET_ASM_INTEGER

@hook TARGET_ASM_DECL_END

@hook TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA

@defmac ASM_OUTPUT_ASCII (@var{stream}, @var{ptr}, @var{len})
A C statement to output to the stdio stream @var{stream} an assembler
instruction to assemble a string constant containing the @var{len}
bytes at @var{ptr}.  @var{ptr} will be a C expression of type
@code{char *} and @var{len} a C expression of type @code{int}.

If the assembler has a @code{.ascii} pseudo-op as found in the
Berkeley Unix assembler, do not define the macro
@code{ASM_OUTPUT_ASCII}.
@end defmac

@defmac ASM_OUTPUT_FDESC (@var{stream}, @var{decl}, @var{n})
A C statement to output word @var{n} of a function descriptor for
@var{decl}.  This must be defined if @code{TARGET_VTABLE_USES_DESCRIPTORS}
is defined, and is otherwise unused.
@end defmac

@defmac CONSTANT_POOL_BEFORE_FUNCTION
You may define this macro as a C expression.  You should define the
expression to have a nonzero value if GCC should output the constant
pool for a function before the code for the function, or a zero value if
GCC should output the constant pool after the function.  If you do
not define this macro, the usual case, GCC will output the constant
pool before the function.
@end defmac

@defmac ASM_OUTPUT_POOL_PROLOGUE (@var{file}, @var{funname}, @var{fundecl}, @var{size})
A C statement to output assembler commands to define the start of the
constant pool for a function.  @var{funname} is a string giving
the name of the function.  Should the return type of the function
be required, it can be obtained via @var{fundecl}.  @var{size}
is the size, in bytes, of the constant pool that will be written
immediately after this call.

If no constant-pool prefix is required, the usual case, this macro need
not be defined.
@end defmac

@defmac ASM_OUTPUT_SPECIAL_POOL_ENTRY (@var{file}, @var{x}, @var{mode}, @var{align}, @var{labelno}, @var{jumpto})
A C statement (with or without semicolon) to output a constant in the
constant pool, if it needs special treatment.  (This macro need not do
anything for RTL expressions that can be output normally.)

The argument @var{file} is the standard I/O stream to output the
assembler code on.  @var{x} is the RTL expression for the constant to
output, and @var{mode} is the machine mode (in case @var{x} is a
@samp{const_int}).  @var{align} is the required alignment for the value
@var{x}; you should output an assembler directive to force this much
alignment.

The argument @var{labelno} is a number to use in an internal label for
the address of this pool entry.  The definition of this macro is
responsible for outputting the label definition at the proper place.
Here is how to do this:

@smallexample
@code{(*targetm.asm_out.internal_label)} (@var{file}, "LC", @var{labelno});
@end smallexample

When you output a pool entry specially, you should end with a
@code{goto} to the label @var{jumpto}.  This will prevent the same pool
entry from being output a second time in the usual manner.

You need not define this macro if it would do nothing.
@end defmac

@defmac ASM_OUTPUT_POOL_EPILOGUE (@var{file} @var{funname} @var{fundecl} @var{size})
A C statement to output assembler commands to at the end of the constant
pool for a function.  @var{funname} is a string giving the name of the
function.  Should the return type of the function be required, you can
obtain it via @var{fundecl}.  @var{size} is the size, in bytes, of the
constant pool that GCC wrote immediately before this call.

If no constant-pool epilogue is required, the usual case, you need not
define this macro.
@end defmac

@defmac IS_ASM_LOGICAL_LINE_SEPARATOR (@var{C}, @var{STR})
Define this macro as a C expression which is nonzero if @var{C} is
used as a logical line separator by the assembler.  @var{STR} points
to the position in the string where @var{C} was found; this can be used if
a line separator uses multiple characters.

If you do not define this macro, the default is that only
the character @samp{;} is treated as a logical line separator.
@end defmac

@hook TARGET_ASM_OPEN_PAREN

These macros are provided by @file{real.h} for writing the definitions
of @code{ASM_OUTPUT_DOUBLE} and the like:

@defmac REAL_VALUE_TO_TARGET_SINGLE (@var{x}, @var{l})
@defmacx REAL_VALUE_TO_TARGET_DOUBLE (@var{x}, @var{l})
@defmacx REAL_VALUE_TO_TARGET_LONG_DOUBLE (@var{x}, @var{l})
@defmacx REAL_VALUE_TO_TARGET_DECIMAL32 (@var{x}, @var{l})
@defmacx REAL_VALUE_TO_TARGET_DECIMAL64 (@var{x}, @var{l})
@defmacx REAL_VALUE_TO_TARGET_DECIMAL128 (@var{x}, @var{l})
These translate @var{x}, of type @code{REAL_VALUE_TYPE}, to the
target's floating point representation, and store its bit pattern in
the variable @var{l}.  For @code{REAL_VALUE_TO_TARGET_SINGLE} and
@code{REAL_VALUE_TO_TARGET_DECIMAL32}, this variable should be a
simple @code{long int}.  For the others, it should be an array of
@code{long int}.  The number of elements in this array is determined
by the size of the desired target floating point data type: 32 bits of
it go in each @code{long int} array element.  Each array element holds
32 bits of the result, even if @code{long int} is wider than 32 bits
on the host machine.

The array element values are designed so that you can print them out
using @code{fprintf} in the order they should appear in the target
machine's memory.
@end defmac

@node Uninitialized Data
@subsection Output of Uninitialized Variables

Each of the macros in this section is used to do the whole job of
outputting a single uninitialized variable.

@defmac ASM_OUTPUT_COMMON (@var{stream}, @var{name}, @var{size}, @var{rounded})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} the assembler definition of a common-label named
@var{name} whose size is @var{size} bytes.  The variable @var{rounded}
is the size rounded up to whatever alignment the caller wants.  It is
possible that @var{size} may be zero, for instance if a struct with no
other member than a zero-length array is defined.  In this case, the
backend must output a symbol definition that allocates at least one
byte, both so that the address of the resulting object does not compare
equal to any other, and because some object formats cannot even express
the concept of a zero-sized common symbol, as that is how they represent
an ordinary undefined external.

Use the expression @code{assemble_name (@var{stream}, @var{name})} to
output the name itself; before and after that, output the additional
assembler syntax for defining the name, and a newline.

This macro controls how the assembler definitions of uninitialized
common global variables are output.
@end defmac

@defmac ASM_OUTPUT_ALIGNED_COMMON (@var{stream}, @var{name}, @var{size}, @var{alignment})
Like @code{ASM_OUTPUT_COMMON} except takes the required alignment as a
separate, explicit argument.  If you define this macro, it is used in
place of @code{ASM_OUTPUT_COMMON}, and gives you more flexibility in
handling the required alignment of the variable.  The alignment is specified
as the number of bits.
@end defmac

@defmac ASM_OUTPUT_ALIGNED_DECL_COMMON (@var{stream}, @var{decl}, @var{name}, @var{size}, @var{alignment})
Like @code{ASM_OUTPUT_ALIGNED_COMMON} except that @var{decl} of the
variable to be output, if there is one, or @code{NULL_TREE} if there
is no corresponding variable.  If you define this macro, GCC will use it
in place of both @code{ASM_OUTPUT_COMMON} and
@code{ASM_OUTPUT_ALIGNED_COMMON}.  Define this macro when you need to see
the variable's decl in order to chose what to output.
@end defmac

@defmac ASM_OUTPUT_ALIGNED_BSS (@var{stream}, @var{decl}, @var{name}, @var{size}, @var{alignment})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} the assembler definition of uninitialized global @var{decl} named
@var{name} whose size is @var{size} bytes.  The variable @var{alignment}
is the alignment specified as the number of bits.

Try to use function @code{asm_output_aligned_bss} defined in file
@file{varasm.cc} when defining this macro.  If unable, use the expression
@code{assemble_name (@var{stream}, @var{name})} to output the name itself;
before and after that, output the additional assembler syntax for defining
the name, and a newline.

There are two ways of handling global BSS@.  One is to define this macro.
The other is to have @code{TARGET_ASM_SELECT_SECTION} return a
switchable BSS section (@pxref{TARGET_HAVE_SWITCHABLE_BSS_SECTIONS}).
You do not need to do both.

Some languages do not have @code{common} data, and require a
non-common form of global BSS in order to handle uninitialized globals
efficiently.  C++ is one example of this.  However, if the target does
not support global BSS, the front end may choose to make globals
common in order to save space in the object file.
@end defmac

@defmac ASM_OUTPUT_LOCAL (@var{stream}, @var{name}, @var{size}, @var{rounded})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} the assembler definition of a local-common-label named
@var{name} whose size is @var{size} bytes.  The variable @var{rounded}
is the size rounded up to whatever alignment the caller wants.

Use the expression @code{assemble_name (@var{stream}, @var{name})} to
output the name itself; before and after that, output the additional
assembler syntax for defining the name, and a newline.

This macro controls how the assembler definitions of uninitialized
static variables are output.
@end defmac

@defmac ASM_OUTPUT_ALIGNED_LOCAL (@var{stream}, @var{name}, @var{size}, @var{alignment})
Like @code{ASM_OUTPUT_LOCAL} except takes the required alignment as a
separate, explicit argument.  If you define this macro, it is used in
place of @code{ASM_OUTPUT_LOCAL}, and gives you more flexibility in
handling the required alignment of the variable.  The alignment is specified
as the number of bits.
@end defmac

@defmac ASM_OUTPUT_ALIGNED_DECL_LOCAL (@var{stream}, @var{decl}, @var{name}, @var{size}, @var{alignment})
Like @code{ASM_OUTPUT_ALIGNED_LOCAL} except that @var{decl} of the
variable to be output, if there is one, or @code{NULL_TREE} if there
is no corresponding variable.  If you define this macro, GCC will use it
in place of both @code{ASM_OUTPUT_LOCAL} and
@code{ASM_OUTPUT_ALIGNED_LOCAL}.  Define this macro when you need to see
the variable's decl in order to chose what to output.
@end defmac

@node Label Output
@subsection Output and Generation of Labels

@c prevent bad page break with this line
This is about outputting labels.

@findex assemble_name
@defmac ASM_OUTPUT_LABEL (@var{stream}, @var{name})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} the assembler definition of a label named @var{name}.
Use the expression @code{assemble_name (@var{stream}, @var{name})} to
output the name itself; before and after that, output the additional
assembler syntax for defining the name, and a newline.  A default
definition of this macro is provided which is correct for most systems.
@end defmac

@defmac ASM_OUTPUT_FUNCTION_LABEL (@var{stream}, @var{name}, @var{decl})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} the assembler definition of a label named @var{name} of
a function.
Use the expression @code{assemble_name (@var{stream}, @var{name})} to
output the name itself; before and after that, output the additional
assembler syntax for defining the name, and a newline.  A default
definition of this macro is provided which is correct for most systems.

If this macro is not defined, then the function name is defined in the
usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
@end defmac

@findex assemble_name_raw
@defmac ASM_OUTPUT_INTERNAL_LABEL (@var{stream}, @var{name})
Identical to @code{ASM_OUTPUT_LABEL}, except that @var{name} is known
to refer to a compiler-generated label.  The default definition uses
@code{assemble_name_raw}, which is like @code{assemble_name} except
that it is more efficient.
@end defmac

@defmac SIZE_ASM_OP
A C string containing the appropriate assembler directive to specify the
size of a symbol, without any arguments.  On systems that use ELF, the
default (in @file{config/elfos.h}) is @samp{"\t.size\t"}; on other
systems, the default is not to define this macro.

Define this macro only if it is correct to use the default definitions
of @code{ASM_OUTPUT_SIZE_DIRECTIVE} and @code{ASM_OUTPUT_MEASURED_SIZE}
for your system.  If you need your own custom definitions of those
macros, or if you do not need explicit symbol sizes at all, do not
define this macro.
@end defmac

@defmac ASM_OUTPUT_SIZE_DIRECTIVE (@var{stream}, @var{name}, @var{size})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} a directive telling the assembler that the size of the
symbol @var{name} is @var{size}.  @var{size} is a @code{HOST_WIDE_INT}.
If you define @code{SIZE_ASM_OP}, a default definition of this macro is
provided.
@end defmac

@defmac ASM_OUTPUT_MEASURED_SIZE (@var{stream}, @var{name})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} a directive telling the assembler to calculate the size of
the symbol @var{name} by subtracting its address from the current
address.

If you define @code{SIZE_ASM_OP}, a default definition of this macro is
provided.  The default assumes that the assembler recognizes a special
@samp{.} symbol as referring to the current address, and can calculate
the difference between this and another symbol.  If your assembler does
not recognize @samp{.} or cannot do calculations with it, you will need
to redefine @code{ASM_OUTPUT_MEASURED_SIZE} to use some other technique.
@end defmac

@defmac NO_DOLLAR_IN_LABEL
Define this macro if the assembler does not accept the character
@samp{$} in label names.  By default constructors and destructors in
G++ have @samp{$} in the identifiers.  If this macro is defined,
@samp{.} is used instead.
@end defmac

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

@defmac TYPE_ASM_OP
A C string containing the appropriate assembler directive to specify the
type of a symbol, without any arguments.  On systems that use ELF, the
default (in @file{config/elfos.h}) is @samp{"\t.type\t"}; on other
systems, the default is not to define this macro.

Define this macro only if it is correct to use the default definition of
@code{ASM_OUTPUT_TYPE_DIRECTIVE} for your system.  If you need your own
custom definition of this macro, or if you do not need explicit symbol
types at all, do not define this macro.
@end defmac

@defmac TYPE_OPERAND_FMT
A C string which specifies (using @code{printf} syntax) the format of
the second operand to @code{TYPE_ASM_OP}.  On systems that use ELF, the
default (in @file{config/elfos.h}) is @samp{"@@%s"}; on other systems,
the default is not to define this macro.

Define this macro only if it is correct to use the default definition of
@code{ASM_OUTPUT_TYPE_DIRECTIVE} for your system.  If you need your own
custom definition of this macro, or if you do not need explicit symbol
types at all, do not define this macro.
@end defmac

@defmac ASM_OUTPUT_TYPE_DIRECTIVE (@var{stream}, @var{type})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} a directive telling the assembler that the type of the
symbol @var{name} is @var{type}.  @var{type} is a C string; currently,
that string is always either @samp{"function"} or @samp{"object"}, but
you should not count on this.

If you define @code{TYPE_ASM_OP} and @code{TYPE_OPERAND_FMT}, a default
definition of this macro is provided.
@end defmac

@defmac ASM_DECLARE_FUNCTION_NAME (@var{stream}, @var{name}, @var{decl})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} any text necessary for declaring the name @var{name} of a
function which is being defined.  This macro is responsible for
outputting the label definition (perhaps using
@code{ASM_OUTPUT_FUNCTION_LABEL}).  The argument @var{decl} is the
@code{FUNCTION_DECL} tree node representing the function.

If this macro is not defined, then the function name is defined in the
usual manner as a label (by means of @code{ASM_OUTPUT_FUNCTION_LABEL}).

You may wish to use @code{ASM_OUTPUT_TYPE_DIRECTIVE} in the definition
of this macro.
@end defmac

@defmac ASM_DECLARE_FUNCTION_SIZE (@var{stream}, @var{name}, @var{decl})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} any text necessary for declaring the size of a function
which is being defined.  The argument @var{name} is the name of the
function.  The argument @var{decl} is the @code{FUNCTION_DECL} tree node
representing the function.

If this macro is not defined, then the function size is not defined.

You may wish to use @code{ASM_OUTPUT_MEASURED_SIZE} in the definition
of this macro.
@end defmac

@defmac ASM_DECLARE_COLD_FUNCTION_NAME (@var{stream}, @var{name}, @var{decl})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} any text necessary for declaring the name @var{name} of a
cold function partition which is being defined.  This macro is responsible
for outputting the label definition (perhaps using
@code{ASM_OUTPUT_FUNCTION_LABEL}).  The argument @var{decl} is the
@code{FUNCTION_DECL} tree node representing the function.

If this macro is not defined, then the cold partition name is defined in the
usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).

You may wish to use @code{ASM_OUTPUT_TYPE_DIRECTIVE} in the definition
of this macro.
@end defmac

@defmac ASM_DECLARE_COLD_FUNCTION_SIZE (@var{stream}, @var{name}, @var{decl})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} any text necessary for declaring the size of a cold function
partition which is being defined.  The argument @var{name} is the name of the
cold partition of the function.  The argument @var{decl} is the
@code{FUNCTION_DECL} tree node representing the function.

If this macro is not defined, then the partition size is not defined.

You may wish to use @code{ASM_OUTPUT_MEASURED_SIZE} in the definition
of this macro.
@end defmac

@defmac ASM_DECLARE_OBJECT_NAME (@var{stream}, @var{name}, @var{decl})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} any text necessary for declaring the name @var{name} of an
initialized variable which is being defined.  This macro must output the
label definition (perhaps using @code{ASM_OUTPUT_LABEL}).  The argument
@var{decl} is the @code{VAR_DECL} tree node representing the variable.

If this macro is not defined, then the variable name is defined in the
usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).

You may wish to use @code{ASM_OUTPUT_TYPE_DIRECTIVE} and/or
@code{ASM_OUTPUT_SIZE_DIRECTIVE} in the definition of this macro.
@end defmac

@hook TARGET_ASM_DECLARE_CONSTANT_NAME

@defmac ASM_DECLARE_REGISTER_GLOBAL (@var{stream}, @var{decl}, @var{regno}, @var{name})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} any text necessary for claiming a register @var{regno}
for a global variable @var{decl} with name @var{name}.

If you don't define this macro, that is equivalent to defining it to do
nothing.
@end defmac

@defmac ASM_FINISH_DECLARE_OBJECT (@var{stream}, @var{decl}, @var{toplevel}, @var{atend})
A C statement (sans semicolon) to finish up declaring a variable name
once the compiler has processed its initializer fully and thus has had a
chance to determine the size of an array when controlled by an
initializer.  This is used on systems where it's necessary to declare
something about the size of the object.

If you don't define this macro, that is equivalent to defining it to do
nothing.

You may wish to use @code{ASM_OUTPUT_SIZE_DIRECTIVE} and/or
@code{ASM_OUTPUT_MEASURED_SIZE} in the definition of this macro.
@end defmac

@hook TARGET_ASM_GLOBALIZE_LABEL

@hook TARGET_ASM_GLOBALIZE_DECL_NAME

@hook TARGET_ASM_ASSEMBLE_UNDEFINED_DECL

@defmac ASM_WEAKEN_LABEL (@var{stream}, @var{name})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} some commands that will make the label @var{name} weak;
that is, available for reference from other files but only used if
no other definition is available.  Use the expression
@code{assemble_name (@var{stream}, @var{name})} to output the name
itself; before and after that, output the additional assembler syntax
for making that name weak, and a newline.

If you don't define this macro or @code{ASM_WEAKEN_DECL}, GCC will not
support weak symbols and you should not define the @code{SUPPORTS_WEAK}
macro.
@end defmac

@defmac ASM_WEAKEN_DECL (@var{stream}, @var{decl}, @var{name}, @var{value})
Combines (and replaces) the function of @code{ASM_WEAKEN_LABEL} and
@code{ASM_OUTPUT_WEAK_ALIAS}, allowing access to the associated function
or variable decl.  If @var{value} is not @code{NULL}, this C statement
should output to the stdio stream @var{stream} assembler code which
defines (equates) the weak symbol @var{name} to have the value
@var{value}.  If @var{value} is @code{NULL}, it should output commands
to make @var{name} weak.
@end defmac

@defmac ASM_OUTPUT_WEAKREF (@var{stream}, @var{decl}, @var{name}, @var{value})
Outputs a directive that enables @var{name} to be used to refer to
symbol @var{value} with weak-symbol semantics.  @code{decl} is the
declaration of @code{name}.
@end defmac

@defmac SUPPORTS_WEAK
A preprocessor constant expression which evaluates to true if the target
supports weak symbols.

If you don't define this macro, @file{defaults.h} provides a default
definition.  If either @code{ASM_WEAKEN_LABEL} or @code{ASM_WEAKEN_DECL}
is defined, the default definition is @samp{1}; otherwise, it is @samp{0}.
@end defmac

@defmac TARGET_SUPPORTS_WEAK
A C expression which evaluates to true if the target supports weak symbols.

If you don't define this macro, @file{defaults.h} provides a default
definition.  The default definition is @samp{(SUPPORTS_WEAK)}.  Define
this macro if you want to control weak symbol support with a compiler
flag such as @option{-melf}.
@end defmac

@defmac MAKE_DECL_ONE_ONLY (@var{decl})
A C statement (sans semicolon) to mark @var{decl} to be emitted as a
public symbol such that extra copies in multiple translation units will
be discarded by the linker.  Define this macro if your object file
format provides support for this concept, such as the @samp{COMDAT}
section flags in the Microsoft Windows PE/COFF format, and this support
requires changes to @var{decl}, such as putting it in a separate section.
@end defmac

@defmac SUPPORTS_ONE_ONLY
A C expression which evaluates to true if the target supports one-only
semantics.

If you don't define this macro, @file{varasm.cc} provides a default
definition.  If @code{MAKE_DECL_ONE_ONLY} is defined, the default
definition is @samp{1}; otherwise, it is @samp{0}.  Define this macro if
you want to control one-only symbol support with a compiler flag, or if
setting the @code{DECL_ONE_ONLY} flag is enough to mark a declaration to
be emitted as one-only.
@end defmac

@hook TARGET_ASM_ASSEMBLE_VISIBILITY

@defmac TARGET_WEAK_NOT_IN_ARCHIVE_TOC
A C expression that evaluates to true if the target's linker expects
that weak symbols do not appear in a static archive's table of contents.
The default is @code{0}.

Leaving weak symbols out of an archive's table of contents means that,
if a symbol will only have a definition in one translation unit and
will have undefined references from other translation units, that
symbol should not be weak.  Defining this macro to be nonzero will
thus have the effect that certain symbols that would normally be weak
(explicit template instantiations, and vtables for polymorphic classes
with noninline key methods) will instead be nonweak.

The C++ ABI requires this macro to be zero.  Define this macro for
targets where full C++ ABI compliance is impossible and where linker
restrictions require weak symbols to be left out of a static archive's
table of contents.
@end defmac

@defmac ASM_OUTPUT_EXTERNAL (@var{stream}, @var{decl}, @var{name})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} any text necessary for declaring the name of an external
symbol named @var{name} which is referenced in this compilation but
not defined.  The value of @var{decl} is the tree node for the
declaration.

This macro need not be defined if it does not need to output anything.
The GNU assembler and most Unix assemblers don't require anything.
@end defmac

@hook TARGET_ASM_EXTERNAL_LIBCALL

@hook TARGET_ASM_MARK_DECL_PRESERVED

@defmac ASM_OUTPUT_LABELREF (@var{stream}, @var{name})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} a reference in assembler syntax to a label named
@var{name}.  This should add @samp{_} to the front of the name, if that
is customary on your operating system, as it is in most Berkeley Unix
systems.  This macro is used in @code{assemble_name}.
@end defmac

@hook TARGET_MANGLE_ASSEMBLER_NAME

@defmac ASM_OUTPUT_SYMBOL_REF (@var{stream}, @var{sym})
A C statement (sans semicolon) to output a reference to
@code{SYMBOL_REF} @var{sym}.  If not defined, @code{assemble_name}
will be used to output the name of the symbol.  This macro may be used
to modify the way a symbol is referenced depending on information
encoded by @code{TARGET_ENCODE_SECTION_INFO}.
@end defmac

@defmac ASM_OUTPUT_LABEL_REF (@var{stream}, @var{buf})
A C statement (sans semicolon) to output a reference to @var{buf}, the
result of @code{ASM_GENERATE_INTERNAL_LABEL}.  If not defined,
@code{assemble_name} will be used to output the name of the symbol.
This macro is not used by @code{output_asm_label}, or the @code{%l}
specifier that calls it; the intention is that this macro should be set
when it is necessary to output a label differently when its address is
being taken.
@end defmac

@hook TARGET_ASM_INTERNAL_LABEL

@defmac ASM_OUTPUT_DEBUG_LABEL (@var{stream}, @var{prefix}, @var{num})
A C statement to output to the stdio stream @var{stream} a debug info
label whose name is made from the string @var{prefix} and the number
@var{num}.  This is useful for VLIW targets, where debug info labels
may need to be treated differently than branch target labels.  On some
systems, branch target labels must be at the beginning of instruction
bundles, but debug info labels can occur in the middle of instruction
bundles.

If this macro is not defined, then @code{(*targetm.asm_out.internal_label)} will be
used.
@end defmac

@defmac ASM_GENERATE_INTERNAL_LABEL (@var{string}, @var{prefix}, @var{num})
A C statement to store into the string @var{string} a label whose name
is made from the string @var{prefix} and the number @var{num}.

This string, when output subsequently by @code{assemble_name}, should
produce the output that @code{(*targetm.asm_out.internal_label)} would produce
with the same @var{prefix} and @var{num}.

If the string begins with @samp{*}, then @code{assemble_name} will
output the rest of the string unchanged.  It is often convenient for
@code{ASM_GENERATE_INTERNAL_LABEL} to use @samp{*} in this way.  If the
string doesn't start with @samp{*}, then @code{ASM_OUTPUT_LABELREF} gets
to output the string, and may change it.  (Of course,
@code{ASM_OUTPUT_LABELREF} is also part of your machine description, so
you should know what it does on your machine.)
@end defmac

@defmac ASM_FORMAT_PRIVATE_NAME (@var{outvar}, @var{name}, @var{number})
A C expression to assign to @var{outvar} (which is a variable of type
@code{char *}) a newly allocated string made from the string
@var{name} and the number @var{number}, with some suitable punctuation
added.  Use @code{alloca} to get space for the string.

The string will be used as an argument to @code{ASM_OUTPUT_LABELREF} to
produce an assembler label for an internal static variable whose name is
@var{name}.  Therefore, the string must be such as to result in valid
assembler code.  The argument @var{number} is different each time this
macro is executed; it prevents conflicts between similarly-named
internal static variables in different scopes.

Ideally this string should not be a valid C identifier, to prevent any
conflict with the user's own symbols.  Most assemblers allow periods
or percent signs in assembler symbols; putting at least one of these
between the name and the number will suffice.

If this macro is not defined, a default definition will be provided
which is correct for most systems.
@end defmac

@defmac ASM_OUTPUT_DEF (@var{stream}, @var{name}, @var{value})
A C statement to output to the stdio stream @var{stream} assembler code
which defines (equates) the symbol @var{name} to have the value @var{value}.

@findex SET_ASM_OP
If @code{SET_ASM_OP} is defined, a default definition is provided which is
correct for most systems.
@end defmac

@defmac ASM_OUTPUT_DEF_FROM_DECLS (@var{stream}, @var{decl_of_name}, @var{decl_of_value})
A C statement to output to the stdio stream @var{stream} assembler code
which defines (equates) the symbol whose tree node is @var{decl_of_name}
to have the value of the tree node @var{decl_of_value}.  This macro will
be used in preference to @samp{ASM_OUTPUT_DEF} if it is defined and if
the tree nodes are available.

@findex SET_ASM_OP
If @code{SET_ASM_OP} is defined, a default definition is provided which is
correct for most systems.
@end defmac

@defmac TARGET_DEFERRED_OUTPUT_DEFS (@var{decl_of_name}, @var{decl_of_value})
A C statement that evaluates to true if the assembler code which defines
(equates) the symbol whose tree node is @var{decl_of_name} to have the value
of the tree node @var{decl_of_value} should be emitted near the end of the
current compilation unit.  The default is to not defer output of defines.
This macro affects defines output by @samp{ASM_OUTPUT_DEF} and
@samp{ASM_OUTPUT_DEF_FROM_DECLS}.
@end defmac

@defmac ASM_OUTPUT_WEAK_ALIAS (@var{stream}, @var{name}, @var{value})
A C statement to output to the stdio stream @var{stream} assembler code
which defines (equates) the weak symbol @var{name} to have the value
@var{value}.  If @var{value} is @code{NULL}, it defines @var{name} as
an undefined weak symbol.

Define this macro if the target only supports weak aliases; define
@code{ASM_OUTPUT_DEF} instead if possible.
@end defmac

@defmac OBJC_GEN_METHOD_LABEL (@var{buf}, @var{is_inst}, @var{class_name}, @var{cat_name}, @var{sel_name})
Define this macro to override the default assembler names used for
Objective-C methods.

The default name is a unique method number followed by the name of the
class (e.g.@: @samp{_1_Foo}).  For methods in categories, the name of
the category is also included in the assembler name (e.g.@:
@samp{_1_Foo_Bar}).

These names are safe on most systems, but make debugging difficult since
the method's selector is not present in the name.  Therefore, particular
systems define other ways of computing names.

@var{buf} is an expression of type @code{char *} which gives you a
buffer in which to store the name; its length is as long as
@var{class_name}, @var{cat_name} and @var{sel_name} put together, plus
50 characters extra.

The argument @var{is_inst} specifies whether the method is an instance
method or a class method; @var{class_name} is the name of the class;
@var{cat_name} is the name of the category (or @code{NULL} if the method is not
in a category); and @var{sel_name} is the name of the selector.

On systems where the assembler can handle quoted names, you can use this
macro to provide more human-readable names.
@end defmac

@node Initialization
@subsection How Initialization Functions Are Handled
@cindex initialization routines
@cindex termination routines
@cindex constructors, output of
@cindex destructors, output of

The compiled code for certain languages includes @dfn{constructors}
(also called @dfn{initialization routines})---functions to initialize
data in the program when the program is started.  These functions need
to be called before the program is ``started''---that is to say, before
@code{main} is called.

Compiling some languages generates @dfn{destructors} (also called
@dfn{termination routines}) that should be called when the program
terminates.

To make the initialization and termination functions work, the compiler
must output something in the assembler code to cause those functions to
be called at the appropriate time.  When you port the compiler to a new
system, you need to specify how to do this.

There are two major ways that GCC currently supports the execution of
initialization and termination functions.  Each way has two variants.
Much of the structure is common to all four variations.

@findex __CTOR_LIST__
@findex __DTOR_LIST__
The linker must build two lists of these functions---a list of
initialization functions, called @code{__CTOR_LIST__}, and a list of
termination functions, called @code{__DTOR_LIST__}.

Each list always begins with an ignored function pointer (which may hold
0, @minus{}1, or a count of the function pointers after it, depending on
the environment).  This is followed by a series of zero or more function
pointers to constructors (or destructors), followed by a function
pointer containing zero.

Depending on the operating system and its executable file format, either
@file{crtstuff.c} or @file{libgcc2.c} traverses these lists at startup
time and exit time.  Constructors are called in reverse order of the
list; destructors in forward order.

The best way to handle static constructors works only for object file
formats which provide arbitrarily-named sections.  A section is set
aside for a list of constructors, and another for a list of destructors.
Traditionally these are called @samp{.ctors} and @samp{.dtors}.  Each
object file that defines an initialization function also puts a word in
the constructor section to point to that function.  The linker
accumulates all these words into one contiguous @samp{.ctors} section.
Termination functions are handled similarly.

This method will be chosen as the default by @file{target-def.h} if
@code{TARGET_ASM_NAMED_SECTION} is defined.  A target that does not
support arbitrary sections, but does support special designated
constructor and destructor sections may define @code{CTORS_SECTION_ASM_OP}
and @code{DTORS_SECTION_ASM_OP} to achieve the same effect.

When arbitrary sections are available, there are two variants, depending
upon how the code in @file{crtstuff.c} is called.  On systems that
support a @dfn{.init} section which is executed at program startup,
parts of @file{crtstuff.c} are compiled into that section.  The
program is linked by the @command{gcc} driver like this:

@smallexample
ld -o @var{output_file} crti.o crtbegin.o @dots{} -lgcc crtend.o crtn.o
@end smallexample

The prologue of a function (@code{__init}) appears in the @code{.init}
section of @file{crti.o}; the epilogue appears in @file{crtn.o}.  Likewise
for the function @code{__fini} in the @dfn{.fini} section.  Normally these
files are provided by the operating system or by the GNU C library, but
are provided by GCC for a few targets.

The objects @file{crtbegin.o} and @file{crtend.o} are (for most targets)
compiled from @file{crtstuff.c}.  They contain, among other things, code
fragments within the @code{.init} and @code{.fini} sections that branch
to routines in the @code{.text} section.  The linker will pull all parts
of a section together, which results in a complete @code{__init} function
that invokes the routines we need at startup.

To use this variant, you must define the @code{INIT_SECTION_ASM_OP}
macro properly.

If no init section is available, when GCC compiles any function called
@code{main} (or more accurately, any function designated as a program
entry point by the language front end calling @code{expand_main_function}),
it inserts a procedure call to @code{__main} as the first executable code
after the function prologue.  The @code{__main} function is defined
in @file{libgcc2.c} and runs the global constructors.

In file formats that don't support arbitrary sections, there are again
two variants.  In the simplest variant, the GNU linker (GNU @code{ld})
and an `a.out' format must be used.  In this case,
@code{TARGET_ASM_CONSTRUCTOR} is defined to produce a @code{.stabs}
entry of type @samp{N_SETT}, referencing the name @code{__CTOR_LIST__},
and with the address of the void function containing the initialization
code as its value.  The GNU linker recognizes this as a request to add
the value to a @dfn{set}; the values are accumulated, and are eventually
placed in the executable as a vector in the format described above, with
a leading (ignored) count and a trailing zero element.
@code{TARGET_ASM_DESTRUCTOR} is handled similarly.  Since no init
section is available, the absence of @code{INIT_SECTION_ASM_OP} causes
the compilation of @code{main} to call @code{__main} as above, starting
the initialization process.

The last variant uses neither arbitrary sections nor the GNU linker.
This is preferable when you want to do dynamic linking and when using
file formats which the GNU linker does not support, such as `ECOFF'@.  In
this case, @code{TARGET_HAVE_CTORS_DTORS} is false, initialization and
termination functions are recognized simply by their names.  This requires
an extra program in the linkage step, called @command{collect2}.  This program
pretends to be the linker, for use with GCC; it does its job by running
the ordinary linker, but also arranges to include the vectors of
initialization and termination functions.  These functions are called
via @code{__main} as described above.  In order to use this method,
@code{use_collect2} must be defined in the target in @file{config.gcc}.

@ifinfo
The following section describes the specific macros that control and
customize the handling of initialization and termination functions.
@end ifinfo

@node Macros for Initialization
@subsection Macros Controlling Initialization Routines

Here are the macros that control how the compiler handles initialization
and termination functions:

@defmac INIT_SECTION_ASM_OP
If defined, a C string constant, including spacing, for the assembler
operation to identify the following data as initialization code.  If not
defined, GCC will assume such a section does not exist.  When you are
using special sections for initialization and termination functions, this
macro also controls how @file{crtstuff.c} and @file{libgcc2.c} arrange to
run the initialization functions.
@end defmac

@defmac HAS_INIT_SECTION
If defined, @code{main} will not call @code{__main} as described above.
This macro should be defined for systems that control start-up code
on a symbol-by-symbol basis, such as OSF/1, and should not
be defined explicitly for systems that support @code{INIT_SECTION_ASM_OP}.
@end defmac

@defmac LD_INIT_SWITCH
If defined, a C string constant for a switch that tells the linker that
the following symbol is an initialization routine.
@end defmac

@defmac LD_FINI_SWITCH
If defined, a C string constant for a switch that tells the linker that
the following symbol is a finalization routine.
@end defmac

@defmac COLLECT_SHARED_INIT_FUNC (@var{stream}, @var{func})
If defined, a C statement that will write a function that can be
automatically called when a shared library is loaded.  The function
should call @var{func}, which takes no arguments.  If not defined, and
the object format requires an explicit initialization function, then a
function called @code{_GLOBAL__DI} will be generated.

This function and the following one are used by collect2 when linking a
shared library that needs constructors or destructors, or has DWARF2
exception tables embedded in the code.
@end defmac

@defmac COLLECT_SHARED_FINI_FUNC (@var{stream}, @var{func})
If defined, a C statement that will write a function that can be
automatically called when a shared library is unloaded.  The function
should call @var{func}, which takes no arguments.  If not defined, and
the object format requires an explicit finalization function, then a
function called @code{_GLOBAL__DD} will be generated.
@end defmac

@defmac INVOKE__main
If defined, @code{main} will call @code{__main} despite the presence of
@code{INIT_SECTION_ASM_OP}.  This macro should be defined for systems
where the init section is not actually run automatically, but is still
useful for collecting the lists of constructors and destructors.
@end defmac

@defmac SUPPORTS_INIT_PRIORITY
If nonzero, the C++ @code{init_priority} attribute is supported and the
compiler should emit instructions to control the order of initialization
of objects.  If zero, the compiler will issue an error message upon
encountering an @code{init_priority} attribute.
@end defmac

@hook TARGET_HAVE_CTORS_DTORS

@hook TARGET_DTORS_FROM_CXA_ATEXIT

@hook TARGET_ASM_CONSTRUCTOR

@hook TARGET_ASM_DESTRUCTOR

If @code{TARGET_HAVE_CTORS_DTORS} is true, the initialization routine
generated for the generated object file will have static linkage.

If your system uses @command{collect2} as the means of processing
constructors, then that program normally uses @command{nm} to scan
an object file for constructor functions to be called.

On certain kinds of systems, you can define this macro to make
@command{collect2} work faster (and, in some cases, make it work at all):

@defmac OBJECT_FORMAT_COFF
Define this macro if the system uses COFF (Common Object File Format)
object files, so that @command{collect2} can assume this format and scan
object files directly for dynamic constructor/destructor functions.

This macro is effective only in a native compiler; @command{collect2} as
part of a cross compiler always uses @command{nm} for the target machine.
@end defmac

@defmac REAL_NM_FILE_NAME
Define this macro as a C string constant containing the file name to use
to execute @command{nm}.  The default is to search the path normally for
@command{nm}.
@end defmac

@defmac NM_FLAGS
@command{collect2} calls @command{nm} to scan object files for static
constructors and destructors and LTO info.  By default, @option{-n} is
passed.  Define @code{NM_FLAGS} to a C string constant if other options
are needed to get the same output format as GNU @command{nm -n}
produces.
@end defmac

If your system supports shared libraries and has a program to list the
dynamic dependencies of a given library or executable, you can define
these macros to enable support for running initialization and
termination functions in shared libraries:

@defmac LDD_SUFFIX
Define this macro to a C string constant containing the name of the program
which lists dynamic dependencies, like @command{ldd} under SunOS 4.
@end defmac

@defmac PARSE_LDD_OUTPUT (@var{ptr})
Define this macro to be C code that extracts filenames from the output
of the program denoted by @code{LDD_SUFFIX}.  @var{ptr} is a variable
of type @code{char *} that points to the beginning of a line of output
from @code{LDD_SUFFIX}.  If the line lists a dynamic dependency, the
code must advance @var{ptr} to the beginning of the filename on that
line.  Otherwise, it must set @var{ptr} to @code{NULL}.
@end defmac

@defmac SHLIB_SUFFIX
Define this macro to a C string constant containing the default shared
library extension of the target (e.g., @samp{".so"}).  @command{collect2}
strips version information after this suffix when generating global
constructor and destructor names.  This define is only needed on targets
that use @command{collect2} to process constructors and destructors.
@end defmac

@node Instruction Output
@subsection Output of Assembler Instructions

@c prevent bad page break with this line
This describes assembler instruction output.

@defmac REGISTER_NAMES
A C initializer containing the assembler's names for the machine
registers, each one as a C string constant.  This is what translates
register numbers in the compiler into assembler language.
@end defmac

@defmac ADDITIONAL_REGISTER_NAMES
If defined, a C initializer for an array of structures containing a name
and a register number.  This macro defines additional names for hard
registers, thus allowing the @code{asm} option in declarations to refer
to registers using alternate names.
@end defmac

@defmac OVERLAPPING_REGISTER_NAMES
If defined, a C initializer for an array of structures containing a
name, a register number and a count of the number of consecutive
machine registers the name overlaps.  This macro defines additional
names for hard registers, thus allowing the @code{asm} option in
declarations to refer to registers using alternate names.  Unlike
@code{ADDITIONAL_REGISTER_NAMES}, this macro should be used when the
register name implies multiple underlying registers.

This macro should be used when it is important that a clobber in an
@code{asm} statement clobbers all the underlying values implied by the
register name.  For example, on ARM, clobbering the double-precision
VFP register ``d0'' implies clobbering both single-precision registers
``s0'' and ``s1''.
@end defmac

@defmac ASM_OUTPUT_OPCODE (@var{stream}, @var{ptr})
Define this macro if you are using an unusual assembler that
requires different names for the machine instructions.

The definition is a C statement or statements which output an
assembler instruction opcode to the stdio stream @var{stream}.  The
macro-operand @var{ptr} is a variable of type @code{char *} which
points to the opcode name in its ``internal'' form---the form that is
written in the machine description.  The definition should output the
opcode name to @var{stream}, performing any translation you desire, and
increment the variable @var{ptr} to point at the end of the opcode
so that it will not be output twice.

In fact, your macro definition may process less than the entire opcode
name, or more than the opcode name; but if you want to process text
that includes @samp{%}-sequences to substitute operands, you must take
care of the substitution yourself.  Just be sure to increment
@var{ptr} over whatever text should not be output normally.

@findex recog_data.operand
If you need to look at the operand values, they can be found as the
elements of @code{recog_data.operand}.

If the macro definition does nothing, the instruction is output
in the usual way.
@end defmac

@defmac FINAL_PRESCAN_INSN (@var{insn}, @var{opvec}, @var{noperands})
If defined, a C statement to be executed just prior to the output of
assembler code for @var{insn}, to modify the extracted operands so
they will be output differently.

Here the argument @var{opvec} is the vector containing the operands
extracted from @var{insn}, and @var{noperands} is the number of
elements of the vector which contain meaningful data for this insn.
The contents of this vector are what will be used to convert the insn
template into assembler code, so you can change the assembler output
by changing the contents of the vector.

This macro is useful when various assembler syntaxes share a single
file of instruction patterns; by defining this macro differently, you
can cause a large class of instructions to be output differently (such
as with rearranged operands).  Naturally, variations in assembler
syntax affecting individual insn patterns ought to be handled by
writing conditional output routines in those patterns.

If this macro is not defined, it is equivalent to a null statement.
@end defmac

@hook TARGET_ASM_FINAL_POSTSCAN_INSN

@defmac PRINT_OPERAND (@var{stream}, @var{x}, @var{code})
A C compound statement to output to stdio stream @var{stream} the
assembler syntax for an instruction operand @var{x}.  @var{x} is an
RTL expression.

@var{code} is a value that can be used to specify one of several ways
of printing the operand.  It is used when identical operands must be
printed differently depending on the context.  @var{code} comes from
the @samp{%} specification that was used to request printing of the
operand.  If the specification was just @samp{%@var{digit}} then
@var{code} is 0; if the specification was @samp{%@var{ltr}
@var{digit}} then @var{code} is the ASCII code for @var{ltr}.

@findex reg_names
If @var{x} is a register, this macro should print the register's name.
The names can be found in an array @code{reg_names} whose type is
@code{char *[]}.  @code{reg_names} is initialized from
@code{REGISTER_NAMES}.

When the machine description has a specification @samp{%@var{punct}}
(a @samp{%} followed by a punctuation character), this macro is called
with a null pointer for @var{x} and the punctuation character for
@var{code}.
@end defmac

@defmac PRINT_OPERAND_PUNCT_VALID_P (@var{code})
A C expression which evaluates to true if @var{code} is a valid
punctuation character for use in the @code{PRINT_OPERAND} macro.  If
@code{PRINT_OPERAND_PUNCT_VALID_P} is not defined, it means that no
punctuation characters (except for the standard one, @samp{%}) are used
in this way.
@end defmac

@defmac PRINT_OPERAND_ADDRESS (@var{stream}, @var{x})
A C compound statement to output to stdio stream @var{stream} the
assembler syntax for an instruction operand that is a memory reference
whose address is @var{x}.  @var{x} is an RTL expression.

@cindex @code{TARGET_ENCODE_SECTION_INFO} usage
On some machines, the syntax for a symbolic address depends on the
section that the address refers to.  On these machines, define the hook
@code{TARGET_ENCODE_SECTION_INFO} to store the information into the
@code{symbol_ref}, and then check for it here.  @xref{Assembler
Format}.
@end defmac

@findex dbr_sequence_length
@defmac DBR_OUTPUT_SEQEND (@var{file})
A C statement, to be executed after all slot-filler instructions have
been output.  If necessary, call @code{dbr_sequence_length} to
determine the number of slots filled in a sequence (zero if not
currently outputting a sequence), to decide how many no-ops to output,
or whatever.

Don't define this macro if it has nothing to do, but it is helpful in
reading assembly output if the extent of the delay sequence is made
explicit (e.g.@: with white space).
@end defmac

@findex final_sequence
Note that output routines for instructions with delay slots must be
prepared to deal with not being output as part of a sequence
(i.e.@: when the scheduling pass is not run, or when no slot fillers could be
found.)  The variable @code{final_sequence} is null when not
processing a sequence, otherwise it contains the @code{sequence} rtx
being output.

@findex asm_fprintf
@defmac REGISTER_PREFIX
@defmacx LOCAL_LABEL_PREFIX
@defmacx USER_LABEL_PREFIX
@defmacx IMMEDIATE_PREFIX
If defined, C string expressions to be used for the @samp{%R}, @samp{%L},
@samp{%U}, and @samp{%I} options of @code{asm_fprintf} (see
@file{final.cc}).  These are useful when a single @file{md} file must
support multiple assembler formats.  In that case, the various @file{tm.h}
files can define these macros differently.
@end defmac

@defmac ASM_FPRINTF_EXTENSIONS (@var{file}, @var{argptr}, @var{format})
If defined this macro should expand to a series of @code{case}
statements which will be parsed inside the @code{switch} statement of
the @code{asm_fprintf} function.  This allows targets to define extra
printf formats which may useful when generating their assembler
statements.  Note that uppercase letters are reserved for future
generic extensions to asm_fprintf, and so are not available to target
specific code.  The output file is given by the parameter @var{file}.
The varargs input pointer is @var{argptr} and the rest of the format
string, starting the character after the one that is being switched
upon, is pointed to by @var{format}.
@end defmac

@defmac ASSEMBLER_DIALECT
If your target supports multiple dialects of assembler language (such as
different opcodes), define this macro as a C expression that gives the
numeric index of the assembler language dialect to use, with zero as the
first variant.

If this macro is defined, you may use constructs of the form
@smallexample
@samp{@{option0|option1|option2@dots{}@}}
@end smallexample
@noindent
in the output templates of patterns (@pxref{Output Template}) or in the
first argument of @code{asm_fprintf}.  This construct outputs
@samp{option0}, @samp{option1}, @samp{option2}, etc., if the value of
@code{ASSEMBLER_DIALECT} is zero, one, two, etc.  Any special characters
within these strings retain their usual meaning.  If there are fewer
alternatives within the braces than the value of
@code{ASSEMBLER_DIALECT}, the construct outputs nothing. If it's needed
to print curly braces or @samp{|} character in assembler output directly,
@samp{%@{}, @samp{%@}} and @samp{%|} can be used.

If you do not define this macro, the characters @samp{@{}, @samp{|} and
@samp{@}} do not have any special meaning when used in templates or
operands to @code{asm_fprintf}.

Define the macros @code{REGISTER_PREFIX}, @code{LOCAL_LABEL_PREFIX},
@code{USER_LABEL_PREFIX} and @code{IMMEDIATE_PREFIX} if you can express
the variations in assembler language syntax with that mechanism.  Define
@code{ASSEMBLER_DIALECT} and use the @samp{@{option0|option1@}} syntax
if the syntax variant are larger and involve such things as different
opcodes or operand order.
@end defmac

@defmac ASM_OUTPUT_REG_PUSH (@var{stream}, @var{regno})
A C expression to output to @var{stream} some assembler code
which will push hard register number @var{regno} onto the stack.
The code need not be optimal, since this macro is used only when
profiling.
@end defmac

@defmac ASM_OUTPUT_REG_POP (@var{stream}, @var{regno})
A C expression to output to @var{stream} some assembler code
which will pop hard register number @var{regno} off of the stack.
The code need not be optimal, since this macro is used only when
profiling.
@end defmac

@node Dispatch Tables
@subsection Output of Dispatch Tables

@c prevent bad page break with this line
This concerns dispatch tables.

@cindex dispatch table
@defmac ASM_OUTPUT_ADDR_DIFF_ELT (@var{stream}, @var{body}, @var{value}, @var{rel})
A C statement to output to the stdio stream @var{stream} an assembler
pseudo-instruction to generate a difference between two labels.
@var{value} and @var{rel} are the numbers of two internal labels.  The
definitions of these labels are output using
@code{(*targetm.asm_out.internal_label)}, and they must be printed in the same
way here.  For example,

@smallexample
fprintf (@var{stream}, "\t.word L%d-L%d\n",
         @var{value}, @var{rel})
@end smallexample

You must provide this macro on machines where the addresses in a
dispatch table are relative to the table's own address.  If defined, GCC
will also use this macro on all machines when producing PIC@.
@var{body} is the body of the @code{ADDR_DIFF_VEC}; it is provided so that the
mode and flags can be read.
@end defmac

@defmac ASM_OUTPUT_ADDR_VEC_ELT (@var{stream}, @var{value})
This macro should be provided on machines where the addresses
in a dispatch table are absolute.

The definition should be a C statement to output to the stdio stream
@var{stream} an assembler pseudo-instruction to generate a reference to
a label.  @var{value} is the number of an internal label whose
definition is output using @code{(*targetm.asm_out.internal_label)}.
For example,

@smallexample
fprintf (@var{stream}, "\t.word L%d\n", @var{value})
@end smallexample
@end defmac

@defmac ASM_OUTPUT_CASE_LABEL (@var{stream}, @var{prefix}, @var{num}, @var{table})
Define this if the label before a jump-table needs to be output
specially.  The first three arguments are the same as for
@code{(*targetm.asm_out.internal_label)}; the fourth argument is the
jump-table which follows (a @code{jump_table_data} containing an
@code{addr_vec} or @code{addr_diff_vec}).

This feature is used on system V to output a @code{swbeg} statement
for the table.

If this macro is not defined, these labels are output with
@code{(*targetm.asm_out.internal_label)}.
@end defmac

@defmac ASM_OUTPUT_CASE_END (@var{stream}, @var{num}, @var{table})
Define this if something special must be output at the end of a
jump-table.  The definition should be a C statement to be executed
after the assembler code for the table is written.  It should write
the appropriate code to stdio stream @var{stream}.  The argument
@var{table} is the jump-table insn, and @var{num} is the label-number
of the preceding label.

If this macro is not defined, nothing special is output at the end of
the jump-table.
@end defmac

@hook TARGET_ASM_POST_CFI_STARTPROC

@hook TARGET_ASM_EMIT_UNWIND_LABEL

@hook TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL

@hook TARGET_ASM_EMIT_EXCEPT_PERSONALITY

@hook TARGET_ASM_UNWIND_EMIT

@hook TARGET_ASM_MAKE_EH_SYMBOL_INDIRECT

@hook TARGET_ASM_UNWIND_EMIT_BEFORE_INSN

@hook TARGET_ASM_SHOULD_RESTORE_CFA_STATE

@node Exception Region Output
@subsection Assembler Commands for Exception Regions

@c prevent bad page break with this line

This describes commands marking the start and the end of an exception
region.

@defmac EH_FRAME_SECTION_NAME
If defined, a C string constant for the name of the section containing
exception handling frame unwind information.  If not defined, GCC will
provide a default definition if the target supports named sections.
@file{crtstuff.c} uses this macro to switch to the appropriate section.

You should define this symbol if your target supports DWARF 2 frame
unwind information and the default definition does not work.
@end defmac

@defmac EH_FRAME_THROUGH_COLLECT2
If defined, DWARF 2 frame unwind information will identified by
specially named labels.  The collect2 process will locate these
labels and generate code to register the frames.

This might be necessary, for instance, if the system linker will not
place the eh_frames in-between the sentinals from @file{crtstuff.c},
or if the system linker does garbage collection and sections cannot
be marked as not to be collected.
@end defmac

@defmac EH_TABLES_CAN_BE_READ_ONLY
Define this macro to 1 if your target is such that no frame unwind
information encoding used with non-PIC code will ever require a
runtime relocation, but the linker may not support merging read-only
and read-write sections into a single read-write section.
@end defmac

@defmac MASK_RETURN_ADDR
An rtx used to mask the return address found via @code{RETURN_ADDR_RTX}, so
that it does not contain any extraneous set bits in it.
@end defmac

@defmac DWARF2_UNWIND_INFO
Define this macro to 0 if your target supports DWARF 2 frame unwind
information, but it does not yet work with exception handling.
Otherwise, if your target supports this information (if it defines
@code{INCOMING_RETURN_ADDR_RTX} and @code{OBJECT_FORMAT_ELF}),
GCC will provide a default definition of 1.
@end defmac

@hook TARGET_EXCEPT_UNWIND_INFO
This hook defines the mechanism that will be used for exception handling
by the target.  If the target has ABI specified unwind tables, the hook
should return @code{UI_TARGET}.  If the target is to use the
@code{setjmp}/@code{longjmp}-based exception handling scheme, the hook
should return @code{UI_SJLJ}.  If the target supports DWARF 2 frame unwind
information, the hook should return @code{UI_DWARF2}.

A target may, if exceptions are disabled, choose to return @code{UI_NONE}.
This may end up simplifying other parts of target-specific code.  The
default implementation of this hook never returns @code{UI_NONE}.

Note that the value returned by this hook should be constant.  It should
not depend on anything except the command-line switches described by
@var{opts}.  In particular, the
setting @code{UI_SJLJ} must be fixed at compiler start-up as C pre-processor
macros and builtin functions related to exception handling are set up
depending on this setting.

The default implementation of the hook first honors the
@option{--enable-sjlj-exceptions} configure option, then
@code{DWARF2_UNWIND_INFO}, and finally defaults to @code{UI_SJLJ}.  If
@code{DWARF2_UNWIND_INFO} depends on command-line options, the target
must define this hook so that @var{opts} is used correctly.
@end deftypefn

@hook TARGET_UNWIND_TABLES_DEFAULT
This variable should be set to @code{true} if the target ABI requires unwinding
tables even when exceptions are not used.  It must not be modified by
command-line option processing.
@end deftypevr

@defmac DONT_USE_BUILTIN_SETJMP
Define this macro to 1 if the @code{setjmp}/@code{longjmp}-based scheme
should use the @code{setjmp}/@code{longjmp} functions from the C library
instead of the @code{__builtin_setjmp}/@code{__builtin_longjmp} machinery.
@end defmac

@defmac JMP_BUF_SIZE
This macro has no effect unless @code{DONT_USE_BUILTIN_SETJMP} is also
defined.  Define this macro if the default size of @code{jmp_buf} buffer
for the @code{setjmp}/@code{longjmp}-based exception handling mechanism
is not large enough, or if it is much too large.
The default size is @code{FIRST_PSEUDO_REGISTER * sizeof(void *)}.
@end defmac

@defmac DWARF_CIE_DATA_ALIGNMENT
This macro need only be defined if the target might save registers in the
function prologue at an offset to the stack pointer that is not aligned to
@code{UNITS_PER_WORD}.  The definition should be the negative minimum
alignment if @code{STACK_GROWS_DOWNWARD} is true, and the positive
minimum alignment otherwise.  @xref{DWARF}.  Only applicable if
the target supports DWARF 2 frame unwind information.
@end defmac

@hook TARGET_TERMINATE_DW2_EH_FRAME_INFO

@hook TARGET_DWARF_REGISTER_SPAN

@hook TARGET_DWARF_FRAME_REG_MODE

@hook TARGET_INIT_DWARF_REG_SIZES_EXTRA

@hook TARGET_ASM_TTYPE

@hook TARGET_ARM_EABI_UNWINDER

@node Alignment Output
@subsection Assembler Commands for Alignment

@c prevent bad page break with this line
This describes commands for alignment.

@defmac JUMP_ALIGN (@var{label})
The alignment (log base 2) to put in front of @var{label}, which is
a common destination of jumps and has no fallthru incoming edge.

This macro need not be defined if you don't want any special alignment
to be done at such a time.  Most machine descriptions do not currently
define the macro.

Unless it's necessary to inspect the @var{label} parameter, it is better
to set the variable @var{align_jumps} in the target's
@code{TARGET_OPTION_OVERRIDE}.  Otherwise, you should try to honor the user's
selection in @var{align_jumps} in a @code{JUMP_ALIGN} implementation.
@end defmac

@defmac LABEL_ALIGN_AFTER_BARRIER (@var{label})
The alignment (log base 2) to put in front of @var{label}, which follows
a @code{BARRIER}.

This macro need not be defined if you don't want any special alignment
to be done at such a time.  Most machine descriptions do not currently
define the macro.
@end defmac

@defmac LOOP_ALIGN (@var{label})
The alignment (log base 2) to put in front of @var{label} that heads
a frequently executed basic block (usually the header of a loop).

This macro need not be defined if you don't want any special alignment
to be done at such a time.  Most machine descriptions do not currently
define the macro.

Unless it's necessary to inspect the @var{label} parameter, it is better
to set the variable @code{align_loops} in the target's
@code{TARGET_OPTION_OVERRIDE}.  Otherwise, you should try to honor the user's
selection in @code{align_loops} in a @code{LOOP_ALIGN} implementation.
@end defmac

@defmac LABEL_ALIGN (@var{label})
The alignment (log base 2) to put in front of @var{label}.
If @code{LABEL_ALIGN_AFTER_BARRIER} / @code{LOOP_ALIGN} specify a different alignment,
the maximum of the specified values is used.

Unless it's necessary to inspect the @var{label} parameter, it is better
to set the variable @code{align_labels} in the target's
@code{TARGET_OPTION_OVERRIDE}.  Otherwise, you should try to honor the user's
selection in @code{align_labels} in a @code{LABEL_ALIGN} implementation.
@end defmac

@defmac ASM_OUTPUT_SKIP (@var{stream}, @var{nbytes})
A C statement to output to the stdio stream @var{stream} an assembler
instruction to advance the location counter by @var{nbytes} bytes.
Those bytes should be zero when loaded.  @var{nbytes} will be a C
expression of type @code{unsigned HOST_WIDE_INT}.
@end defmac

@defmac ASM_NO_SKIP_IN_TEXT
Define this macro if @code{ASM_OUTPUT_SKIP} should not be used in the
text section because it fails to put zeros in the bytes that are skipped.
This is true on many Unix systems, where the pseudo--op to skip bytes
produces no-op instructions rather than zeros when used in the text
section.
@end defmac

@defmac ASM_OUTPUT_ALIGN (@var{stream}, @var{power})
A C statement to output to the stdio stream @var{stream} an assembler
command to advance the location counter to a multiple of 2 to the
@var{power} bytes.  @var{power} will be a C expression of type @code{int}.
@end defmac

@defmac ASM_OUTPUT_ALIGN_WITH_NOP (@var{stream}, @var{power})
Like @code{ASM_OUTPUT_ALIGN}, except that the ``nop'' instruction is used
for padding, if necessary.
@end defmac

@defmac ASM_OUTPUT_MAX_SKIP_ALIGN (@var{stream}, @var{power}, @var{max_skip})
A C statement to output to the stdio stream @var{stream} an assembler
command to advance the location counter to a multiple of 2 to the
@var{power} bytes, but only if @var{max_skip} or fewer bytes are needed to
satisfy the alignment request.  @var{power} and @var{max_skip} will be
a C expression of type @code{int}.
@end defmac

@need 3000
@node Debugging Info
@section Controlling Debugging Information Format

@c prevent bad page break with this line
This describes how to specify debugging information.

@menu
* All Debuggers::      Macros that affect all debugging formats uniformly.
* DWARF::              Macros for DWARF format.
* VMS Debug::          Macros for VMS debug format.
* CTF Debug::          Macros for CTF debug format.
* BTF Debug::          Macros for BTF debug format.
@end menu

@node All Debuggers
@subsection Macros Affecting All Debugging Formats

@c prevent bad page break with this line
These macros affect all debugging formats.

@defmac DEBUGGER_REGNO (@var{regno})
A C expression that returns the debugger register number for the compiler
register number @var{regno}.  In the default macro provided, the value
of this expression will be @var{regno} itself.  But sometimes there are
some registers that the compiler knows about and debugger does not, or vice
versa.  In such cases, some register may need to have one number in the
compiler and another for debugger@.

If two registers have consecutive numbers inside GCC, and they can be
used as a pair to hold a multiword value, then they @emph{must} have
consecutive numbers after renumbering with @code{DEBUGGER_REGNO}.
Otherwise, debuggers will be unable to access such a pair, because they
expect register pairs to be consecutive in their own numbering scheme.

If you find yourself defining @code{DEBUGGER_REGNO} in way that
does not preserve register pairs, then what you must do instead is
redefine the actual register numbering scheme.
@end defmac

@defmac DEBUGGER_AUTO_OFFSET (@var{x})
A C expression that returns the integer offset value for an automatic
variable having address @var{x} (an RTL expression).  The default
computation assumes that @var{x} is based on the frame-pointer and
gives the offset from the frame-pointer.  This is required for targets
that produce debugging output for debugger and allow the frame-pointer to be
eliminated when the @option{-g} option is used.
@end defmac

@defmac DEBUGGER_ARG_OFFSET (@var{offset}, @var{x})
A C expression that returns the integer offset value for an argument
having address @var{x} (an RTL expression).  The nominal offset is
@var{offset}.
@end defmac

@defmac PREFERRED_DEBUGGING_TYPE
A C expression that returns the type of debugging output GCC should
produce when the user specifies just @option{-g}.  Define
this if you have arranged for GCC to support more than one format of
debugging output.  Currently, the allowable values are
@code{DWARF2_DEBUG}, @code{VMS_DEBUG},
and @code{VMS_AND_DWARF2_DEBUG}.

When the user specifies @option{-ggdb}, GCC normally also uses the
value of this macro to select the debugging output format, but with two
exceptions.  If @code{DWARF2_DEBUGGING_INFO} is defined, GCC uses the
value @code{DWARF2_DEBUG}.

The value of this macro only affects the default debugging output; the
user can always get a specific type of output by using  @option{-gdwarf-2},
or @option{-gvms}.
@end defmac

@defmac DEFAULT_GDB_EXTENSIONS
Define this macro to control whether GCC should by default generate
GDB's extended version of debugging information.  If you don't define the
macro, the default is 1: always generate the extended information
if there is any occasion to.
@end defmac

@need 2000
@node DWARF
@subsection Macros for DWARF Output

@c prevent bad page break with this line
Here are macros for DWARF output.

@defmac DWARF2_DEBUGGING_INFO
Define this macro if GCC should produce dwarf version 2 format
debugging output in response to the @option{-g} option.

To support optional call frame debugging information, you must also
define @code{INCOMING_RETURN_ADDR_RTX} and either set
@code{RTX_FRAME_RELATED_P} on the prologue insns if you use RTL for the
prologue, or call @code{dwarf2out_def_cfa} and @code{dwarf2out_reg_save}
as appropriate from @code{TARGET_ASM_FUNCTION_PROLOGUE} if you don't.
@end defmac

@hook TARGET_DWARF_CALLING_CONVENTION

@defmac DWARF2_FRAME_INFO
Define this macro to a nonzero value if GCC should always output
Dwarf 2 frame information.  If @code{TARGET_EXCEPT_UNWIND_INFO}
(@pxref{Exception Region Output}) returns @code{UI_DWARF2}, and
exceptions are enabled, GCC will output this information not matter
how you define @code{DWARF2_FRAME_INFO}.
@end defmac

@hook TARGET_DEBUG_UNWIND_INFO

@defmac DWARF2_ASM_LINE_DEBUG_INFO
Define this macro to be a nonzero value if the assembler can generate Dwarf 2
line debug info sections.  This will result in much more compact line number
tables, and hence is desirable if it works.
@end defmac

@defmac DWARF2_ASM_VIEW_DEBUG_INFO
Define this macro to be a nonzero value if the assembler supports view
assignment and verification in @code{.loc}.  If it does not, but the
user enables location views, the compiler may have to fallback to
internal line number tables.
@end defmac

@hook TARGET_RESET_LOCATION_VIEW

@hook TARGET_WANT_DEBUG_PUB_SECTIONS

@hook TARGET_DELAY_SCHED2

@hook TARGET_DELAY_VARTRACK

@hook TARGET_NO_REGISTER_ALLOCATION

@defmac ASM_OUTPUT_DWARF_DELTA (@var{stream}, @var{size}, @var{label1}, @var{label2})
A C statement to issue assembly directives that create a difference
@var{lab1} minus @var{lab2}, using an integer of the given @var{size}.
@end defmac

@defmac ASM_OUTPUT_DWARF_VMS_DELTA (@var{stream}, @var{size}, @var{label1}, @var{label2})
A C statement to issue assembly directives that create a difference
between the two given labels in system defined units, e.g.@: instruction
slots on IA64 VMS, using an integer of the given size.
@end defmac

@defmac ASM_OUTPUT_DWARF_OFFSET (@var{stream}, @var{size}, @var{label}, @var{offset}, @var{section})
A C statement to issue assembly directives that create a
section-relative reference to the given @var{label} plus @var{offset}, using
an integer of the given @var{size}.  The label is known to be defined in the
given @var{section}.
@end defmac

@defmac ASM_OUTPUT_DWARF_PCREL (@var{stream}, @var{size}, @var{label})
A C statement to issue assembly directives that create a self-relative
reference to the given @var{label}, using an integer of the given @var{size}.
@end defmac

@defmac ASM_OUTPUT_DWARF_DATAREL (@var{stream}, @var{size}, @var{label})
A C statement to issue assembly directives that create a reference to the
given @var{label} relative to the dbase, using an integer of the given @var{size}.
@end defmac

@defmac ASM_OUTPUT_DWARF_TABLE_REF (@var{label})
A C statement to issue assembly directives that create a reference to
the DWARF table identifier @var{label} from the current section.  This
is used on some systems to avoid garbage collecting a DWARF table which
is referenced by a function.
@end defmac

@hook TARGET_ASM_OUTPUT_DWARF_DTPREL

@need 2000
@node VMS Debug
@subsection Macros for VMS Debug Format

@c prevent bad page break with this line
Here are macros for VMS debug format.

@defmac VMS_DEBUGGING_INFO
Define this macro if GCC should produce debugging output for VMS
in response to the @option{-g} option.  The default behavior for VMS
is to generate minimal debug info for a traceback in the absence of
@option{-g} unless explicitly overridden with @option{-g0}.  This
behavior is controlled by @code{TARGET_OPTION_OPTIMIZATION} and
@code{TARGET_OPTION_OVERRIDE}.
@end defmac

@need 2000
@node CTF Debug
@subsection Macros for CTF Debug Format

@c prevent bad page break with this line
Here are macros for CTF debug format.

@defmac CTF_DEBUGGING_INFO
Define this macro if GCC should produce debugging output in CTF debug
format in response to the @option{-gctf} option.
@end defmac

@need 2000
@node BTF Debug
@subsection Macros for BTF Debug Format

@c prevent bad page break with this line
Here are macros for BTF debug format.

@defmac BTF_DEBUGGING_INFO
Define this macro if GCC should produce debugging output in BTF debug
format in response to the @option{-gbtf} option.
@end defmac

@node Floating Point
@section Cross Compilation and Floating Point
@cindex cross compilation and floating point
@cindex floating point and cross compilation

While all modern machines use twos-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, all floating point constants must be represented in
the target machine's format.  Therefore, the cross compiler cannot
safely use the host machine's floating point arithmetic; it must emulate
the target's arithmetic.  To ensure consistency, GCC always uses
emulation to work with floating point values, even when the host and
target floating point formats are identical.

The following macros are provided by @file{real.h} for the compiler to
use.  All parts of the compiler which generate or optimize
floating-point calculations must use these macros.  They may evaluate
their operands more than once, so operands must not have side effects.

@defmac REAL_VALUE_TYPE
The C data type to be used to hold a floating point value in the target
machine's format.  Typically this is a @code{struct} containing an
array of @code{HOST_WIDE_INT}, but all code should treat it as an opaque
quantity.
@end defmac

@deftypefn Macro HOST_WIDE_INT REAL_VALUE_FIX (REAL_VALUE_TYPE @var{x})
Truncates @var{x} to a signed integer, rounding toward zero.
@end deftypefn

@deftypefn Macro {unsigned HOST_WIDE_INT} REAL_VALUE_UNSIGNED_FIX (REAL_VALUE_TYPE @var{x})
Truncates @var{x} to an unsigned integer, rounding toward zero.  If
@var{x} is negative, returns zero.
@end deftypefn

@deftypefn Macro REAL_VALUE_TYPE REAL_VALUE_ATOF (const char *@var{string}, machine_mode @var{mode})
Converts @var{string} into a floating point number in the target machine's
representation for mode @var{mode}.  This routine can handle both
decimal and hexadecimal floating point constants, using the syntax
defined by the C language for both.
@end deftypefn

@deftypefn Macro int REAL_VALUE_NEGATIVE (REAL_VALUE_TYPE @var{x})
Returns 1 if @var{x} is negative (including negative zero), 0 otherwise.
@end deftypefn

@deftypefn Macro int REAL_VALUE_ISINF (REAL_VALUE_TYPE @var{x})
Determines whether @var{x} represents infinity (positive or negative).
@end deftypefn

@deftypefn Macro int REAL_VALUE_ISNAN (REAL_VALUE_TYPE @var{x})
Determines whether @var{x} represents a ``NaN'' (not-a-number).
@end deftypefn

@deftypefn Macro REAL_VALUE_TYPE REAL_VALUE_NEGATE (REAL_VALUE_TYPE @var{x})
Returns the negative of the floating point value @var{x}.
@end deftypefn

@deftypefn Macro REAL_VALUE_TYPE REAL_VALUE_ABS (REAL_VALUE_TYPE @var{x})
Returns the absolute value of @var{x}.
@end deftypefn

@node Mode Switching
@section Mode Switching Instructions
@cindex mode switching
The following macros control mode switching optimizations:

@defmac OPTIMIZE_MODE_SWITCHING (@var{entity})
Define this macro if the port needs extra instructions inserted for mode
switching in an optimizing compilation.

For an example, the SH4 can perform both single and double precision
floating point operations, but to perform a single precision operation,
the FPSCR PR bit has to be cleared, while for a double precision
operation, this bit has to be set.  Changing the PR bit requires a general
purpose register as a scratch register, hence these FPSCR sets have to
be inserted before reload, i.e.@: you cannot put this into instruction emitting
or @code{TARGET_MACHINE_DEPENDENT_REORG}.

You can have multiple entities that are mode-switched, and select at run time
which entities actually need it.  @code{OPTIMIZE_MODE_SWITCHING} should
return nonzero for any @var{entity} that needs mode-switching.
If you define this macro, you also have to define
@code{NUM_MODES_FOR_MODE_SWITCHING}, @code{TARGET_MODE_NEEDED},
@code{TARGET_MODE_PRIORITY} and @code{TARGET_MODE_EMIT}.
@code{TARGET_MODE_AFTER}, @code{TARGET_MODE_ENTRY}, and @code{TARGET_MODE_EXIT}
are optional.
@end defmac

@defmac NUM_MODES_FOR_MODE_SWITCHING
If you define @code{OPTIMIZE_MODE_SWITCHING}, you have to define this as
initializer for an array of integers.  Each initializer element
N refers to an entity that needs mode switching, and specifies the number
of different modes that might need to be set for this entity.
The position of the initializer in the initializer---starting counting at
zero---determines the integer that is used to refer to the mode-switched
entity in question.
In macros that take mode arguments / yield a mode result, modes are
represented as numbers 0 @dots{} N @minus{} 1.  N is used to specify that no mode
switch is needed / supplied.
@end defmac

@hook TARGET_MODE_EMIT

@hook TARGET_MODE_NEEDED

@hook TARGET_MODE_AFTER

@hook TARGET_MODE_ENTRY

@hook TARGET_MODE_EXIT

@hook TARGET_MODE_PRIORITY

@node Target Attributes
@section Defining target-specific uses of @code{__attribute__}
@cindex target attributes
@cindex machine attributes
@cindex attributes, target-specific

Target-specific attributes may be defined for functions, data and types.
These are described using the following target hooks; they also need to
be documented in @file{extend.texi}.

@hook TARGET_ATTRIBUTE_TABLE

@hook TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P

@hook TARGET_COMP_TYPE_ATTRIBUTES

@hook TARGET_SET_DEFAULT_TYPE_ATTRIBUTES

@hook TARGET_MERGE_TYPE_ATTRIBUTES

@hook TARGET_MERGE_DECL_ATTRIBUTES

@hook TARGET_VALID_DLLIMPORT_ATTRIBUTE_P

@defmac TARGET_DECLSPEC
Define this macro to a nonzero value if you want to treat
@code{__declspec(X)} as equivalent to @code{__attribute((X))}.  By
default, this behavior is enabled only for targets that define
@code{TARGET_DLLIMPORT_DECL_ATTRIBUTES}.  The current implementation
of @code{__declspec} is via a built-in macro, but you should not rely
on this implementation detail.
@end defmac

@hook TARGET_INSERT_ATTRIBUTES

@hook TARGET_HANDLE_GENERIC_ATTRIBUTE

@hook TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P

@hook TARGET_OPTION_VALID_ATTRIBUTE_P

@hook TARGET_OPTION_SAVE

@hook TARGET_OPTION_RESTORE

@hook TARGET_OPTION_POST_STREAM_IN

@hook TARGET_OPTION_PRINT

@hook TARGET_OPTION_PRAGMA_PARSE

@hook TARGET_OPTION_OVERRIDE

@hook TARGET_OPTION_FUNCTION_VERSIONS

@hook TARGET_CAN_INLINE_P

@hook TARGET_UPDATE_IPA_FN_TARGET_INFO

@hook TARGET_NEED_IPA_FN_TARGET_INFO

@hook TARGET_RELAYOUT_FUNCTION

@node Emulated TLS
@section Emulating TLS
@cindex Emulated TLS

For targets whose psABI does not provide Thread Local Storage via
specific relocations and instruction sequences, an emulation layer is
used.  A set of target hooks allows this emulation layer to be
configured for the requirements of a particular target.  For instance
the psABI may in fact specify TLS support in terms of an emulation
layer.

The emulation layer works by creating a control object for every TLS
object.  To access the TLS object, a lookup function is provided
which, when given the address of the control object, will return the
address of the current thread's instance of the TLS object.

@hook TARGET_EMUTLS_GET_ADDRESS

@hook TARGET_EMUTLS_REGISTER_COMMON

@hook TARGET_EMUTLS_VAR_SECTION

@hook TARGET_EMUTLS_TMPL_SECTION

@hook TARGET_EMUTLS_VAR_PREFIX

@hook TARGET_EMUTLS_TMPL_PREFIX

@hook TARGET_EMUTLS_VAR_FIELDS

@hook TARGET_EMUTLS_VAR_INIT

@hook TARGET_EMUTLS_VAR_ALIGN_FIXED

@hook TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS

@node MIPS Coprocessors
@section Defining coprocessor specifics for MIPS targets.
@cindex MIPS coprocessor-definition macros

The MIPS specification allows MIPS implementations to have as many as 4
coprocessors, each with as many as 32 private registers.  GCC supports
accessing these registers and transferring values between the registers
and memory using asm-ized variables.  For example:

@smallexample
  register unsigned int cp0count asm ("c0r1");
  unsigned int d;

  d = cp0count + 3;
@end smallexample

(``c0r1'' is the default name of register 1 in coprocessor 0; alternate
names may be added as described below, or the default names may be
overridden entirely in @code{SUBTARGET_CONDITIONAL_REGISTER_USAGE}.)

Coprocessor registers are assumed to be epilogue-used; sets to them will
be preserved even if it does not appear that the register is used again
later in the function.

Another note: according to the MIPS spec, coprocessor 1 (if present) is
the FPU@.  One accesses COP1 registers through standard mips
floating-point support; they are not included in this mechanism.

@node PCH Target
@section Parameters for Precompiled Header Validity Checking
@cindex parameters, precompiled headers

@hook TARGET_GET_PCH_VALIDITY

@hook TARGET_PCH_VALID_P

@hook TARGET_CHECK_PCH_TARGET_FLAGS

@hook TARGET_PREPARE_PCH_SAVE

@node C++ ABI
@section C++ ABI parameters
@cindex parameters, c++ abi

@hook TARGET_CXX_GUARD_TYPE

@hook TARGET_CXX_GUARD_MASK_BIT

@hook TARGET_CXX_GET_COOKIE_SIZE

@hook TARGET_CXX_COOKIE_HAS_SIZE

@hook TARGET_CXX_IMPORT_EXPORT_CLASS

@hook TARGET_CXX_CDTOR_RETURNS_THIS

@hook TARGET_CXX_KEY_METHOD_MAY_BE_INLINE

@hook TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY

@hook TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT

@hook TARGET_CXX_LIBRARY_RTTI_COMDAT

@hook TARGET_CXX_USE_AEABI_ATEXIT

@hook TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT

@hook TARGET_CXX_ADJUST_CLASS_AT_DEFINITION

@hook TARGET_CXX_DECL_MANGLING_CONTEXT

@node D Language and ABI
@section D ABI parameters
@cindex parameters, d abi

@hook TARGET_D_CPU_VERSIONS

@hook TARGET_D_OS_VERSIONS

@hook TARGET_D_REGISTER_CPU_TARGET_INFO

@hook TARGET_D_REGISTER_OS_TARGET_INFO

@hook TARGET_D_MINFO_SECTION

@hook TARGET_D_MINFO_START_NAME

@hook TARGET_D_MINFO_END_NAME

@hook TARGET_D_HAS_STDCALL_CONVENTION

@hook TARGET_D_TEMPLATES_ALWAYS_COMDAT

@node Named Address Spaces
@section Adding support for named address spaces
@cindex named address spaces

The draft technical report of the ISO/IEC JTC1 S22 WG14 N1275
standards committee, @cite{Programming Languages - C - Extensions to
support embedded processors}, specifies a syntax for embedded
processors to specify alternate address spaces.  You can configure a
GCC port to support section 5.1 of the draft report to add support for
address spaces other than the default address space.  These address
spaces are new keywords that are similar to the @code{volatile} and
@code{const} type attributes.

Pointers to named address spaces can have a different size than
pointers to the generic address space.

For example, the SPU port uses the @code{__ea} address space to refer
to memory in the host processor, rather than memory local to the SPU
processor.  Access to memory in the @code{__ea} address space involves
issuing DMA operations to move data between the host processor and the
local processor memory address space.  Pointers in the @code{__ea}
address space are either 32 bits or 64 bits based on the
@option{-mea32} or @option{-mea64} switches (native SPU pointers are
always 32 bits).

Internally, address spaces are represented as a small integer in the
range 0 to 15 with address space 0 being reserved for the generic
address space.

To register a named address space qualifier keyword with the C front end,
the target may call the @code{c_register_addr_space} routine.  For example,
the SPU port uses the following to declare @code{__ea} as the keyword for
named address space #1:
@smallexample
#define ADDR_SPACE_EA 1
c_register_addr_space ("__ea", ADDR_SPACE_EA);
@end smallexample

@hook TARGET_ADDR_SPACE_POINTER_MODE

@hook TARGET_ADDR_SPACE_ADDRESS_MODE

@hook TARGET_ADDR_SPACE_VALID_POINTER_MODE

@hook TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P

@hook TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS

@hook TARGET_ADDR_SPACE_SUBSET_P

@hook TARGET_ADDR_SPACE_ZERO_ADDRESS_VALID

@hook TARGET_ADDR_SPACE_CONVERT

@hook TARGET_ADDR_SPACE_DEBUG

@hook TARGET_ADDR_SPACE_DIAGNOSE_USAGE

@node Misc
@section Miscellaneous Parameters
@cindex parameters, miscellaneous

@c prevent bad page break with this line
Here are several miscellaneous parameters.

@defmac HAS_LONG_COND_BRANCH
Define this boolean macro to indicate whether or not your architecture
has conditional branches that can span all of memory.  It is used in
conjunction with an optimization that partitions hot and cold basic
blocks into separate sections of the executable.  If this macro is
set to false, gcc will convert any conditional branches that attempt
to cross between sections into unconditional branches or indirect jumps.
@end defmac

@defmac HAS_LONG_UNCOND_BRANCH
Define this boolean macro to indicate whether or not your architecture
has unconditional branches that can span all of memory.  It is used in
conjunction with an optimization that partitions hot and cold basic
blocks into separate sections of the executable.  If this macro is
set to false, gcc will convert any unconditional branches that attempt
to cross between sections into indirect jumps.
@end defmac

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

@defmac CASE_VECTOR_SHORTEN_MODE (@var{min_offset}, @var{max_offset}, @var{body})
Optional: return the preferred mode for an @code{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 @code{addr_diff_vec}.
To make this work, you also have to define @code{INSN_ALIGN} and
make the alignment for @code{addr_diff_vec} explicit.
The @var{body} argument is provided so that the offset_unsigned and scale
flags can be updated.
@end defmac

@defmac CASE_VECTOR_PC_RELATIVE
Define this macro to be a C expression to indicate when jump-tables
should contain relative addresses.  You need not define this macro if
jump-tables never contain relative addresses, or jump-tables should
contain relative addresses only when @option{-fPIC} or @option{-fPIC}
is in effect.
@end defmac

@hook TARGET_CASE_VALUES_THRESHOLD

@defmac WORD_REGISTER_OPERATIONS
Define this macro to 1 if operations between registers with integral mode
smaller than a word are always performed on the entire register.  To be
more explicit, if you start with a pair of @code{word_mode} registers with
known values and you do a subword, for example @code{QImode}, addition on
the low part of the registers, then the compiler may consider that the
result has a known value in @code{word_mode} too if the macro is defined
to 1.  Most RISC machines have this property and most CISC machines do not.
@end defmac

@hook TARGET_MIN_ARITHMETIC_PRECISION

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

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

You may return a non-@code{UNKNOWN} value even if for some hard registers
the sign extension is not performed, if for the @code{REGNO_REG_CLASS}
of these hard registers @code{TARGET_CAN_CHANGE_MODE_CLASS} returns false
when the @var{from} mode is @var{mem_mode} and the @var{to} mode is any
integral mode larger than this but not larger than @code{word_mode}.

You must return @code{UNKNOWN} if for some hard registers that allow this
mode, @code{TARGET_CAN_CHANGE_MODE_CLASS} says that they cannot change to
@code{word_mode}, but that they can change to another integral mode that
is larger then @var{mem_mode} but still smaller than @code{word_mode}.
@end defmac

@defmac SHORT_IMMEDIATES_SIGN_EXTEND
Define this macro to 1 if loading short immediate values into registers sign
extends.
@end defmac

@hook TARGET_MIN_DIVISIONS_FOR_RECIP_MUL

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

@defmac 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 @code{MOVE_MAX}.  Otherwise, it is the
constant value that is the largest value that @code{MOVE_MAX} can have
at run-time.
@end defmac

@defmac 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 nonzero, 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 bit-fields at variable positions, which may
include `bit test' instructions, a nonzero @code{SHIFT_COUNT_TRUNCATED}
also enables deletion of truncations of the values that serve as
arguments to bit-field instructions.

If both types of instructions truncate the count (for shifts) and
position (for bit-field operations), or if no variable-position bit-field
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)
bit-field operations.  Define @code{SHIFT_COUNT_TRUNCATED} to be zero on
such machines.  Instead, add patterns to the @file{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.
@end defmac

@anchor{TARGET_SHIFT_TRUNCATION_MASK}
@hook TARGET_SHIFT_TRUNCATION_MASK

@hook TARGET_TRULY_NOOP_TRUNCATION

@hook TARGET_MODE_REP_EXTENDED

@hook TARGET_SETJMP_PRESERVES_NONVOLATILE_REGS_P

@defmac 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
(@samp{cstore@var{mode}4}) when the condition is true.  This description must
apply to @emph{all} the @samp{cstore@var{mode}4} patterns and all the
comparison operators whose results have a @code{MODE_INT} mode.

A value of 1 or @minus{}1 means that the instruction implementing the
comparison operator returns exactly 1 or @minus{}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
@samp{cstore@var{mode}4} pattern.  Either the low bit or the sign bit of
@code{STORE_FLAG_VALUE} be on.  Presently, only those bits are used by
the compiler.

If @code{STORE_FLAG_VALUE} is neither 1 or @minus{}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
@code{SImode} value and where @code{STORE_FLAG_VALUE} is defined as
@samp{0x80000000}, saying that just the sign bit is relevant, the
expression

@smallexample
(ne:SI (and:SI @var{x} (const_int @var{power-of-2})) (const_int 0))
@end smallexample

@noindent
can be converted to

@smallexample
(ashift:SI @var{x} (const_int @var{n}))
@end smallexample

@noindent
where @var{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 GCC 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 at @email{gcc@@gcc.gnu.org}.

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 @code{STORE_FLAG_VALUE}, and hence the instructions
to be used:

@itemize @bullet
@item
Use the shortest sequence that yields a valid definition for
@code{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.

@item
For equal-length sequences, use a value of 1 or @minus{}1, with @minus{}1 being
slightly preferred on machines with expensive jumps and 1 preferred on
other machines.

@item
As a second choice, choose a value of @samp{0x80000001} if instructions
exist that set both the sign and low-order bits but do not define the
others.

@item
Otherwise, use a value of @samp{0x80000000}.
@end itemize

Many machines can produce both the value chosen for
@code{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

@smallexample
(set @var{A} (neg:@var{m} (ne:@var{m} @var{B} @var{C})))
@end smallexample

Some machines can also perform @code{and} or @code{plus} operations on
condition code values with less instructions than the corresponding
@samp{cstore@var{mode}4} insn followed by @code{and} or @code{plus}.  On those
machines, define the appropriate patterns.  Use the names @code{incscc}
and @code{decscc}, respectively, for the patterns which perform
@code{plus} or @code{minus} operations on condition code values.  See
@file{rs6000.md} for some examples.  The GNU Superoptimizer can be used to
find such instruction sequences on other machines.

If this macro is not defined, the default value, 1, is used.  You need
not define @code{STORE_FLAG_VALUE} if the machine has no store-flag
instructions, or if the value generated by these instructions is 1.
@end defmac

@defmac FLOAT_STORE_FLAG_VALUE (@var{mode})
A C expression that gives a nonzero @code{REAL_VALUE_TYPE} value that is
returned when comparison operators with floating-point results are true.
Define this macro on machines that have comparison operations that return
floating-point values.  If there are no such operations, do not define
this macro.
@end defmac

@defmac VECTOR_STORE_FLAG_VALUE (@var{mode})
A C expression that gives an rtx representing the nonzero true element
for vector comparisons.  The returned rtx should be valid for the inner
mode of @var{mode} which is guaranteed to be a vector mode.  Define
this macro on machines that have vector comparison operations that
return a vector result.  If there are no such operations, do not define
this macro.  Typically, this macro is defined as @code{const1_rtx} or
@code{constm1_rtx}.  This macro may return @code{NULL_RTX} to prevent
the compiler optimizing such vector comparison operations for the
given mode.
@end defmac

@defmac CLZ_DEFINED_VALUE_AT_ZERO (@var{mode}, @var{value})
@defmacx CTZ_DEFINED_VALUE_AT_ZERO (@var{mode}, @var{value})
A C expression that indicates whether the architecture defines a value
for @code{clz} or @code{ctz} with a zero operand.
A result of @code{0} indicates the value is undefined.
If the value is defined for only the RTL expression, the macro should
evaluate to @code{1}; if the value applies also to the corresponding optab
entry (which is normally the case if it expands directly into
the corresponding RTL), then the macro should evaluate to @code{2}.
In the cases where the value is defined, @var{value} should be set to
this value.

If this macro is not defined, the value of @code{clz} or
@code{ctz} at zero is assumed to be undefined.

This macro must be defined if the target's expansion for @code{ffs}
relies on a particular value to get correct results.  Otherwise it
is not necessary, though it may be used to optimize some corner cases, and
to provide a default expansion for the @code{ffs} optab.

Note that regardless of this macro the ``definedness'' of @code{clz}
and @code{ctz} at zero do @emph{not} extend to the builtin functions
visible to the user.  Thus one may be free to adjust the value at will
to match the target expansion of these operations without fear of
breaking the API@.
@end defmac

@defmac 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; @code{SImode} on 32-bit machine or @code{DImode} on 64-bit machines.
On some machines you must define this to be one of the partial integer
modes, such as @code{PSImode}.

The width of @code{Pmode} must be at least as large as the value of
@code{POINTER_SIZE}.  If it is not equal, you must define the macro
@code{POINTERS_EXTEND_UNSIGNED} to specify how pointers are extended
to @code{Pmode}.
@end defmac

@defmac FUNCTION_MODE
An alias for the machine mode used for memory references to functions
being called, in @code{call} RTL expressions.  On most CISC machines,
where an instruction can begin at any byte address, this should be
@code{QImode}.  On most RISC machines, where all instructions have fixed
size and alignment, this should be a mode with the same size and alignment
as the machine instruction words - typically @code{SImode} or @code{HImode}.
@end defmac

@defmac STDC_0_IN_SYSTEM_HEADERS
In normal operation, the preprocessor expands @code{__STDC__} to the
constant 1, to signify that GCC conforms to ISO Standard C@.  On some
hosts, like Solaris, the system compiler uses a different convention,
where @code{__STDC__} is normally 0, but is 1 if the user specifies
strict conformance to the C Standard.

Defining @code{STDC_0_IN_SYSTEM_HEADERS} makes GNU CPP follows the host
convention when processing system header files, but when processing user
files @code{__STDC__} will always expand to 1.
@end defmac

@hook TARGET_C_PREINCLUDE

@hook TARGET_CXX_IMPLICIT_EXTERN_C

@defmac SYSTEM_IMPLICIT_EXTERN_C
Define this macro if the system header files do not support C++@.
This macro handles system header files by pretending that system
header files are enclosed in @samp{extern "C" @{@dots{}@}}.
@end defmac

@findex #pragma
@findex pragma
@defmac REGISTER_TARGET_PRAGMAS ()
Define this macro if you want to implement any target-specific pragmas.
If defined, it is a C expression which makes a series of calls to
@code{c_register_pragma} or @code{c_register_pragma_with_expansion}
for each pragma.  The macro may also do any
setup required for the pragmas.

The primary reason to define this macro is to provide compatibility with
other compilers for the same target.  In general, we discourage
definition of target-specific pragmas for GCC@.

If the pragma can be implemented by attributes then you should consider
defining the target hook @samp{TARGET_INSERT_ATTRIBUTES} as well.

Preprocessor macros that appear on pragma lines are not expanded.  All
@samp{#pragma} directives that do not match any registered pragma are
silently ignored, unless the user specifies @option{-Wunknown-pragmas}.
@end defmac

@deftypefun void c_register_pragma (const char *@var{space}, const char *@var{name}, void (*@var{callback}) (struct cpp_reader *))
@deftypefunx void c_register_pragma_with_expansion (const char *@var{space}, const char *@var{name}, void (*@var{callback}) (struct cpp_reader *))

Each call to @code{c_register_pragma} or
@code{c_register_pragma_with_expansion} establishes one pragma.  The
@var{callback} routine will be called when the preprocessor encounters a
pragma of the form

@smallexample
#pragma [@var{space}] @var{name} @dots{}
@end smallexample

@var{space} is the case-sensitive namespace of the pragma, or
@code{NULL} to put the pragma in the global namespace.  The callback
routine receives @var{pfile} as its first argument, which can be passed
on to cpplib's functions if necessary.  You can lex tokens after the
@var{name} by calling @code{pragma_lex}.  Tokens that are not read by the
callback will be silently ignored.  The end of the line is indicated by
a token of type @code{CPP_EOF}.  Macro expansion occurs on the
arguments of pragmas registered with
@code{c_register_pragma_with_expansion} but not on the arguments of
pragmas registered with @code{c_register_pragma}.

Note that the use of @code{pragma_lex} is specific to the C and C++
compilers.  It will not work in the Java or Fortran compilers, or any
other language compilers for that matter.  Thus if @code{pragma_lex} is going
to be called from target-specific code, it must only be done so when
building the C and C++ compilers.  This can be done by defining the
variables @code{c_target_objs} and @code{cxx_target_objs} in the
target entry in the @file{config.gcc} file.  These variables should name
the target-specific, language-specific object file which contains the
code that uses @code{pragma_lex}.  Note it will also be necessary to add a
rule to the makefile fragment pointed to by @code{tmake_file} that shows
how to build this object file.
@end deftypefun

@defmac HANDLE_PRAGMA_PACK_WITH_EXPANSION
Define this macro if macros should be expanded in the
arguments of @samp{#pragma pack}.
@end defmac

@defmac TARGET_DEFAULT_PACK_STRUCT
If your target requires a structure packing default other than 0 (meaning
the machine default), define this macro to the necessary value (in bytes).
This must be a value that would also be valid to use with
@samp{#pragma pack()} (that is, a small power of two).
@end defmac

@defmac DOLLARS_IN_IDENTIFIERS
Define this macro to control use of the character @samp{$} in
identifier names for the C family of languages.  0 means @samp{$} 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.
@end defmac

@defmac INSN_SETS_ARE_DELAYED (@var{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 @var{insn},
even if they appear to use a resource set or clobbered in @var{insn}.
@var{insn} is always a @code{jump_insn} or an @code{insn}; GCC knows that
every @code{call_insn} has this behavior.  On machines where some @code{insn}
or @code{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.
@end defmac

@defmac INSN_REFERENCES_ARE_DELAYED (@var{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 @var{insn},
even if they appear to set or clobber a resource referenced in @var{insn}.
@var{insn} is always a @code{jump_insn} or an @code{insn}.  On machines where
some @code{insn} or @code{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 @var{insn}.

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

@defmac MULTIPLE_SYMBOL_SPACES
Define this macro as a C expression that is nonzero 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).

You need not define this macro if it would always evaluate to zero.
@end defmac

@hook TARGET_MD_ASM_ADJUST

@defmac MATH_LIBRARY
Define this macro as a C string constant for the linker argument to link
in the system math library, minus the initial @samp{"-l"}, or
@samp{""} if the target does not have a
separate math library.

You need only define this macro if the default of @samp{"m"} is wrong.
@end defmac

@defmac LIBRARY_PATH_ENV
Define this macro as a C string constant for the environment variable that
specifies where the linker should look for libraries.

You need only define this macro if the default of @samp{"LIBRARY_PATH"}
is wrong.
@end defmac

@defmac TARGET_POSIX_IO
Define this macro if the target supports the following POSIX@ file
functions, access, mkdir and  file locking with fcntl / F_SETLKW@.
Defining @code{TARGET_POSIX_IO} will enable the test coverage code
to use file locking when exiting a program, which avoids race conditions
if the program has forked. It will also create directories at run-time
for cross-profiling.
@end defmac

@defmac MAX_CONDITIONAL_EXECUTE

A C expression for the maximum number of instructions to execute via
conditional execution instructions instead of a branch.  A value of
@code{BRANCH_COST}+1 is the default.
@end defmac

@defmac IFCVT_MODIFY_TESTS (@var{ce_info}, @var{true_expr}, @var{false_expr})
Used if the target needs to perform machine-dependent modifications on the
conditionals used for turning basic blocks into conditionally executed code.
@var{ce_info} points to a data structure, @code{struct ce_if_block}, which
contains information about the currently processed blocks.  @var{true_expr}
and @var{false_expr} are the tests that are used for converting the
then-block and the else-block, respectively.  Set either @var{true_expr} or
@var{false_expr} to a null pointer if the tests cannot be converted.
@end defmac

@defmac IFCVT_MODIFY_MULTIPLE_TESTS (@var{ce_info}, @var{bb}, @var{true_expr}, @var{false_expr})
Like @code{IFCVT_MODIFY_TESTS}, but used when converting more complicated
if-statements into conditions combined by @code{and} and @code{or} operations.
@var{bb} contains the basic block that contains the test that is currently
being processed and about to be turned into a condition.
@end defmac

@defmac IFCVT_MODIFY_INSN (@var{ce_info}, @var{pattern}, @var{insn})
A C expression to modify the @var{PATTERN} of an @var{INSN} that is to
be converted to conditional execution format.  @var{ce_info} points to
a data structure, @code{struct ce_if_block}, which contains information
about the currently processed blocks.
@end defmac

@defmac IFCVT_MODIFY_FINAL (@var{ce_info})
A C expression to perform any final machine dependent modifications in
converting code to conditional execution.  The involved basic blocks
can be found in the @code{struct ce_if_block} structure that is pointed
to by @var{ce_info}.
@end defmac

@defmac IFCVT_MODIFY_CANCEL (@var{ce_info})
A C expression to cancel any machine dependent modifications in
converting code to conditional execution.  The involved basic blocks
can be found in the @code{struct ce_if_block} structure that is pointed
to by @var{ce_info}.
@end defmac

@defmac IFCVT_MACHDEP_INIT (@var{ce_info})
A C expression to initialize any machine specific data for if-conversion
of the if-block in the @code{struct ce_if_block} structure that is pointed
to by @var{ce_info}.
@end defmac

@hook TARGET_MACHINE_DEPENDENT_REORG

@hook TARGET_INIT_BUILTINS

@hook TARGET_BUILTIN_DECL

@hook TARGET_EXPAND_BUILTIN

@hook TARGET_RESOLVE_OVERLOADED_BUILTIN

@hook TARGET_CHECK_BUILTIN_CALL

@hook TARGET_FOLD_BUILTIN

@hook TARGET_GIMPLE_FOLD_BUILTIN

@hook TARGET_COMPARE_VERSION_PRIORITY

@hook TARGET_GET_FUNCTION_VERSIONS_DISPATCHER

@hook TARGET_GENERATE_VERSION_DISPATCHER_BODY

@hook TARGET_PREDICT_DOLOOP_P

@hook TARGET_HAVE_COUNT_REG_DECR_P

@hook TARGET_DOLOOP_COST_FOR_GENERIC

@hook TARGET_DOLOOP_COST_FOR_ADDRESS

@hook TARGET_CAN_USE_DOLOOP_P

@hook TARGET_INVALID_WITHIN_DOLOOP

@hook TARGET_PREFERRED_DOLOOP_MODE

@hook TARGET_LEGITIMATE_COMBINED_INSN

@hook TARGET_CAN_FOLLOW_JUMP

@hook TARGET_COMMUTATIVE_P

@hook TARGET_ALLOCATE_INITIAL_VALUE

@hook TARGET_UNSPEC_MAY_TRAP_P

@hook TARGET_SET_CURRENT_FUNCTION

@defmac TARGET_OBJECT_SUFFIX
Define this macro to be a C string representing the suffix for object
files on your target machine.  If you do not define this macro, GCC will
use @samp{.o} as the suffix for object files.
@end defmac

@defmac TARGET_EXECUTABLE_SUFFIX
Define this macro to be a C string representing the suffix to be
automatically added to executable files on your target machine.  If you
do not define this macro, GCC will use the null string as the suffix for
executable files.
@end defmac

@defmac COLLECT_EXPORT_LIST
If defined, @code{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 @code{main} and uses export
lists.
@end defmac

@hook TARGET_CANNOT_MODIFY_JUMPS_P

@hook TARGET_HAVE_CONDITIONAL_EXECUTION

@hook TARGET_GEN_CCMP_FIRST

@hook TARGET_GEN_CCMP_NEXT

@hook TARGET_GEN_MEMSET_SCRATCH_RTX

@hook TARGET_LOOP_UNROLL_ADJUST

@defmac POWI_MAX_MULTS
If defined, this macro is interpreted as a signed integer C expression
that specifies the maximum number of floating point multiplications
that should be emitted when expanding exponentiation by an integer
constant inline.  When this value is defined, exponentiation requiring
more than this number of multiplications is implemented by calling the
system library's @code{pow}, @code{powf} or @code{powl} routines.
The default value places no upper bound on the multiplication count.
@end defmac

@deftypefn Macro void TARGET_EXTRA_INCLUDES (const char *@var{sysroot}, const char *@var{iprefix}, int @var{stdinc})
This target hook should register any extra include files for the
target.  The parameter @var{stdinc} indicates if normal include files
are present.  The parameter @var{sysroot} is the system root directory.
The parameter @var{iprefix} is the prefix for the gcc directory.
@end deftypefn

@deftypefn Macro void TARGET_EXTRA_PRE_INCLUDES (const char *@var{sysroot}, const char *@var{iprefix}, int @var{stdinc})
This target hook should register any extra include files for the
target before any standard headers.  The parameter @var{stdinc}
indicates if normal include files are present.  The parameter
@var{sysroot} is the system root directory.  The parameter
@var{iprefix} is the prefix for the gcc directory.
@end deftypefn

@deftypefn Macro void TARGET_OPTF (char *@var{path})
This target hook should register special include paths for the target.
The parameter @var{path} is the include to register.  On Darwin
systems, this is used for Framework includes, which have semantics
that are different from @option{-I}.
@end deftypefn

@defmac bool TARGET_USE_LOCAL_THUNK_ALIAS_P (tree @var{fndecl})
This target macro returns @code{true} if it is safe to use a local alias
for a virtual function @var{fndecl} when constructing thunks,
@code{false} otherwise.  By default, the macro returns @code{true} for all
functions, if a target supports aliases (i.e.@: defines
@code{ASM_OUTPUT_DEF}), @code{false} otherwise,
@end defmac

@defmac TARGET_FORMAT_TYPES
If defined, this macro is the name of a global variable containing
target-specific format checking information for the @option{-Wformat}
option.  The default is to have no target-specific format checks.
@end defmac

@defmac TARGET_N_FORMAT_TYPES
If defined, this macro is the number of entries in
@code{TARGET_FORMAT_TYPES}.
@end defmac

@defmac TARGET_OVERRIDES_FORMAT_ATTRIBUTES
If defined, this macro is the name of a global variable containing
target-specific format overrides for the @option{-Wformat} option. The
default is to have no target-specific format overrides. If defined,
@code{TARGET_FORMAT_TYPES} and @code{TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT}
must be defined, too.
@end defmac

@defmac TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT
If defined, this macro specifies the number of entries in
@code{TARGET_OVERRIDES_FORMAT_ATTRIBUTES}.
@end defmac

@defmac TARGET_OVERRIDES_FORMAT_INIT
If defined, this macro specifies the optional initialization
routine for target specific customizations of the system printf
and scanf formatter settings.
@end defmac

@hook TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN

@hook TARGET_INVALID_CONVERSION

@hook TARGET_INVALID_UNARY_OP

@hook TARGET_INVALID_BINARY_OP

@hook TARGET_PROMOTED_TYPE

@hook TARGET_CONVERT_TO_TYPE

@hook TARGET_VERIFY_TYPE_CONTEXT

@defmac OBJC_JBLEN
This macro determines the size of the objective C jump buffer for the
NeXT runtime. By default, OBJC_JBLEN is defined to an innocuous value.
@end defmac

@defmac LIBGCC2_UNWIND_ATTRIBUTE
Define this macro if any target-specific attributes need to be attached
to the functions in @file{libgcc} that provide low-level support for
call stack unwinding.  It is used in declarations in @file{unwind-generic.h}
and the associated definitions of those functions.
@end defmac

@hook TARGET_UPDATE_STACK_BOUNDARY

@hook TARGET_GET_DRAP_RTX

@hook TARGET_ZERO_CALL_USED_REGS

@hook TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS

@hook TARGET_CONST_ANCHOR

@hook TARGET_ASAN_SHADOW_OFFSET

@hook TARGET_MEMMODEL_CHECK

@hook TARGET_ATOMIC_TEST_AND_SET_TRUEVAL

@hook TARGET_HAS_IFUNC_P

@hook TARGET_IFUNC_REF_LOCAL_OK

@hook TARGET_ATOMIC_ALIGN_FOR_MODE

@hook TARGET_ATOMIC_ASSIGN_EXPAND_FENV

@hook TARGET_RECORD_OFFLOAD_SYMBOL

@hook TARGET_OFFLOAD_OPTIONS

@defmac TARGET_SUPPORTS_WIDE_INT

On older ports, large integers are stored in @code{CONST_DOUBLE} rtl
objects.  Newer ports define @code{TARGET_SUPPORTS_WIDE_INT} to be nonzero
to indicate that large integers are stored in
@code{CONST_WIDE_INT} rtl objects.  The @code{CONST_WIDE_INT} allows
very large integer constants to be represented.  @code{CONST_DOUBLE}
is limited to twice the size of the host's @code{HOST_WIDE_INT}
representation.

Converting a port mostly requires looking for the places where
@code{CONST_DOUBLE}s are used with @code{VOIDmode} and replacing that
code with code that accesses @code{CONST_WIDE_INT}s.  @samp{"grep -i
const_double"} at the port level gets you to 95% of the changes that
need to be made.  There are a few places that require a deeper look.

@itemize @bullet
@item
There is no equivalent to @code{hval} and @code{lval} for
@code{CONST_WIDE_INT}s.  This would be difficult to express in the md
language since there are a variable number of elements.

Most ports only check that @code{hval} is either 0 or -1 to see if the
value is small.  As mentioned above, this will no longer be necessary
since small constants are always @code{CONST_INT}.  Of course there
are still a few exceptions, the alpha's constraint used by the zap
instruction certainly requires careful examination by C code.
However, all the current code does is pass the hval and lval to C
code, so evolving the c code to look at the @code{CONST_WIDE_INT} is
not really a large change.

@item
Because there is no standard template that ports use to materialize
constants, there is likely to be some futzing that is unique to each
port in this code.

@item
The rtx costs may have to be adjusted to properly account for larger
constants that are represented as @code{CONST_WIDE_INT}.
@end itemize

All and all it does not take long to convert ports that the
maintainer is familiar with.

@end defmac

@hook TARGET_HAVE_SPECULATION_SAFE_VALUE

@hook TARGET_SPECULATION_SAFE_VALUE

@hook TARGET_RUN_TARGET_SELFTESTS

@hook TARGET_MEMTAG_CAN_TAG_ADDRESSES

@hook TARGET_MEMTAG_TAG_SIZE

@hook TARGET_MEMTAG_GRANULE_SIZE

@hook TARGET_MEMTAG_INSERT_RANDOM_TAG

@hook TARGET_MEMTAG_ADD_TAG

@hook TARGET_MEMTAG_SET_TAG

@hook TARGET_MEMTAG_EXTRACT_TAG

@hook TARGET_MEMTAG_UNTAGGED_POINTER

@hook TARGET_GCOV_TYPE_SIZE

@hook TARGET_HAVE_SHADOW_CALL_STACK
