@c Copyright (C) 1988-2021 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.c}.
@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.c}.
@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.c}.  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

@deftypevr {Common Target Hook} bool TARGET_ALWAYS_STRIP_DOTDOT
True if @file{..} components should always be removed from directory names
computed relative to GCC's internal directories, false (default) if such
components should be preserved and directory names containing them passed
to other tools such as the linker.
@end deftypevr

@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

@deftypevr {Common Target Hook} int 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

@deftypefn {Common Target Hook} bool TARGET_HANDLE_OPTION (struct gcc_options *@var{opts}, struct gcc_options *@var{opts_set}, const struct cl_decoded_option *@var{decoded}, location_t @var{loc})
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

@deftypefn {C Target Hook} bool TARGET_HANDLE_C_OPTION (size_t @var{code}, const char *@var{arg}, int @var{value})
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

@deftypefn {C Target Hook} tree TARGET_OBJC_CONSTRUCT_STRING_OBJECT (tree @var{string})
Targets may provide a string object type that can be used within
and between C, C++ and their respective Objective-C dialects.
A string object might, for example, embed encoding and length information.
These objects are considered opaque to the compiler and handled as references.
An ideal implementation makes the composition of the string object
match that of the Objective-C @code{NSString} (@code{NXString} for GNUStep),
allowing efficient interworking between C-only and Objective-C code.
If a target implements string objects then this hook should return a
reference to such an object constructed from the normal `C' string
representation provided in @var{string}.
At present, the hook is used by Objective-C only, to obtain a
 common-format string object when the target provides one.
@end deftypefn

@deftypefn {C Target Hook} void TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE (const char *@var{classname})
Declare that Objective C class @var{classname} is referenced
by the current TU.
@end deftypefn

@deftypefn {C Target Hook} void TARGET_OBJC_DECLARE_CLASS_DEFINITION (const char *@var{classname})
Declare that Objective C class @var{classname} is defined
by the current TU.
@end deftypefn

@deftypefn {C Target Hook} bool TARGET_STRING_OBJECT_REF_TYPE_P (const_tree @var{stringref})
If a target implements string objects then this hook should return
@code{true} if @var{stringref} is a valid reference to such an object.
@end deftypefn

@deftypefn {C Target Hook} void TARGET_CHECK_STRING_OBJECT_FORMAT_ARG (tree @var{format_arg}, tree @var{args_list})
If a target implements string objects then this hook should should
provide a facility to check the function arguments in @var{args_list}
against the format specifiers in @var{format_arg} where the type of
@var{format_arg} is one recognized as a valid string reference type.
@end deftypefn

@deftypefn {Target Hook} void TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE (void)
This target function is similar to the hook @code{TARGET_OPTION_OVERRIDE}
but is called when the optimize level is changed via an attribute or
pragma or when it is reset at the end of the code affected by the
attribute or pragma.  It is not called at the beginning of compilation
when @code{TARGET_OPTION_OVERRIDE} is called so if you want to perform these
actions then, you should have @code{TARGET_OPTION_OVERRIDE} call
@code{TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE}.
@end deftypefn

@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

@deftypevr {Common Target Hook} {const struct default_options *} 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

@deftypefn {Common Target Hook} void TARGET_OPTION_INIT_STRUCT (struct gcc_options *@var{opts})
Set target-dependent initial values of fields in @var{opts}.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_FLOAT_EXCEPTIONS_ROUNDING_SUPPORTED_P (void)
Returns true if the target supports IEEE 754 floating-point exceptions
and rounding modes, false otherwise.  This is intended to relate to the
@code{float} and @code{double} types, but not necessarily @code{long double}.
By default, returns true if the @code{adddf3} instruction pattern is
available and false otherwise, on the assumption that hardware floating
point supports exceptions and rounding modes but software floating point
does not.
@end deftypefn

@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

@deftypefn {Target Hook} {enum flt_eval_method} TARGET_C_EXCESS_PRECISION (enum excess_precision_type @var{type})
Return a value, with the same meaning as the C99 macro
@code{FLT_EVAL_METHOD} that describes which excess precision should be
applied.  @var{type} is either @code{EXCESS_PRECISION_TYPE_IMPLICIT},
@code{EXCESS_PRECISION_TYPE_FAST},
@code{EXCESS_PRECISION_TYPE_STANDARD}, or
@code{EXCESS_PRECISION_TYPE_FLOAT16}.  For
@code{EXCESS_PRECISION_TYPE_IMPLICIT}, the target should return which
precision and range operations will be implictly evaluated in regardless
of the excess precision explicitly added.  For
@code{EXCESS_PRECISION_TYPE_STANDARD}, 
@code{EXCESS_PRECISION_TYPE_FLOAT16}, and
@code{EXCESS_PRECISION_TYPE_FAST}, the target should return the
explicit excess precision that should be added depending on the
value set for @option{-fexcess-precision=@r{[}standard@r{|}fast@r{]}}.
Note that unpredictable explicit excess precision does not make sense,
so a target should never return @code{FLT_EVAL_METHOD_UNPREDICTABLE}
when @var{type} is @code{EXCESS_PRECISION_TYPE_STANDARD},
@code{EXCESS_PRECISION_TYPE_FLOAT16} or
@code{EXCESS_PRECISION_TYPE_FAST}.
@end deftypefn
Return a value, with the same meaning as the C99 macro
@code{FLT_EVAL_METHOD} that describes which excess precision should be
applied.

@deftypefn {Target Hook} machine_mode TARGET_PROMOTE_FUNCTION_MODE (const_tree @var{type}, machine_mode @var{mode}, int *@var{punsignedp}, const_tree @var{funtype}, int @var{for_return})
Like @code{PROMOTE_MODE}, but it is applied to outgoing function arguments or
function return values.  The target hook should return the new mode
and possibly change @code{*@var{punsignedp}} if the promotion should
change signedness.  This function is called only for scalar @emph{or
pointer} types.

@var{for_return} allows to distinguish the promotion of arguments and
return values.  If it is @code{1}, a return value is being promoted and
@code{TARGET_FUNCTION_VALUE} must perform the same promotions done here.
If it is @code{2}, the returned mode should be that of the register in
which an incoming parameter is copied, or the outgoing result is computed;
then the hook should return the same mode as @code{promote_mode}, though
the signedness may be different.

@var{type} can be NULL when promoting function arguments of libcalls.

The default is to not promote arguments and return values.  You can
also define the hook to @code{default_promote_function_mode_always_promote}
if you would like to apply the same rules given by @code{PROMOTE_MODE}.
@end deftypefn

@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

@deftypevr {Target Hook} HOST_WIDE_INT TARGET_ABSOLUTE_BIGGEST_ALIGNMENT
If defined, this target hook specifies the absolute biggest alignment
that a type or variable can have on this machine, otherwise,
@code{BIGGEST_ALIGNMENT} is used.
@end deftypevr

@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

@deftypefn {Target Hook} void TARGET_LOWER_LOCAL_DECL_ALIGNMENT (tree @var{decl})
Define this hook to lower alignment of local, parm or result
decl @samp{(@var{decl})}.
@end deftypefn

@deftypefn {Target Hook} HOST_WIDE_INT TARGET_STATIC_RTX_ALIGNMENT (machine_mode @var{mode})
This hook returns the preferred alignment in bits for a
statically-allocated rtx, such as a constant pool entry.  @var{mode}
is the mode of the rtx.  The default implementation returns
@samp{GET_MODE_ALIGNMENT (@var{mode})}.
@end deftypefn

@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

@deftypefn {Target Hook} HOST_WIDE_INT TARGET_CONSTANT_ALIGNMENT (const_tree @var{constant}, HOST_WIDE_INT @var{basic_align})
This hook returns the alignment in bits of a constant that is being
placed in memory.  @var{constant} is the constant and @var{basic_align}
is the alignment that the object would ordinarily have.

The default definition just returns @var{basic_align}.

The typical use of this hook is to increase alignment for string
constants to be word aligned so that @code{strcpy} calls that copy
constants can be done inline.  The function
@code{constant_alignment_word_strings} provides such a definition.
@end deftypefn

@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

@deftypefn {Target Hook} HOST_WIDE_INT TARGET_VECTOR_ALIGNMENT (const_tree @var{type})
This hook can be used to define the alignment for a vector of type
@var{type}, in order to comply with a platform ABI.  The default is to
require natural alignment for vector types.  The alignment returned by
this hook must be a power-of-two multiple of the default alignment of
the vector element type.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_ALIGN_ANON_BITFIELD (void)
When @code{PCC_BITFIELD_TYPE_MATTERS} is true this hook will determine
whether unnamed bitfields affect the alignment of the containing
structure.  The hook should return true if the structure should inherit
the alignment requirements of an unnamed bitfield's type.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_NARROW_VOLATILE_BITFIELD (void)
This target hook should return @code{true} if accesses to volatile bitfields
should use the narrowest mode possible.  It should return @code{false} if
these accesses should use the bitfield container type.

The default is @code{false}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_MEMBER_TYPE_FORCES_BLK (const_tree @var{field}, machine_mode @var{mode})
Return true if a structure, union or array containing @var{field} should
be accessed using @code{BLKMODE}.

If @var{field} is the only field in the structure, @var{mode} is its
mode, otherwise @var{mode} is VOIDmode.  @var{mode} is provided in the
case where structures of one field would require the structure's mode to
retain the field's mode.

Normally, this is not needed.
@end deftypefn

@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

@deftypefn {Target Hook} scalar_int_mode TARGET_LIBGCC_CMP_RETURN_MODE (void)
This target hook should return the mode to be used for the return value
of compare instructions expanded to libgcc calls.  If not defined
@code{word_mode} is returned which is the right choice for a majority of
targets.
@end deftypefn

@deftypefn {Target Hook} scalar_int_mode TARGET_LIBGCC_SHIFT_COUNT_MODE (void)
This target hook should return the mode to be used for the shift count operand
of shift instructions expanded to libgcc calls.  If not defined
@code{word_mode} is returned which is the right choice for a majority of
targets.
@end deftypefn

@deftypefn {Target Hook} scalar_int_mode TARGET_UNWIND_WORD_MODE (void)
Return machine mode to be used for @code{_Unwind_Word} type.
The default is to use @code{word_mode}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_MS_BITFIELD_LAYOUT_P (const_tree @var{record_type})
This target hook returns @code{true} if bit-fields in the given
@var{record_type} are to be laid out following the rules of Microsoft
Visual C/C++, namely: (i) a bit-field won't share the same storage
unit with the previous bit-field if their underlying types have
different sizes, and the bit-field will be aligned to the highest
alignment of the underlying types of itself and of the previous
bit-field; (ii) a zero-sized bit-field will affect the alignment of
the whole enclosing structure, even if it is unnamed; except that
(iii) a zero-sized bit-field will be disregarded unless it follows
another bit-field of nonzero size.  If this hook returns @code{true},
other macros that control bit-field layout are ignored.

When a bit-field is inserted into a packed record, the whole size
of the underlying type is used by one or more same-size adjacent
bit-fields (that is, if its long:3, 32 bits is used in the record,
and any additional adjacent long bit-fields are packed into the same
chunk of 32 bits.  However, if the size changes, a new field of that
size is allocated).  In an unpacked record, this is the same as using
alignment, but not equivalent when packing.

If both MS bit-fields and @samp{__attribute__((packed))} are used,
the latter will take precedence.  If @samp{__attribute__((packed))} is
used on a single field when MS bit-fields are in use, it will take
precedence for that field, but the alignment of the rest of the structure
may affect its placement.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_DECIMAL_FLOAT_SUPPORTED_P (void)
Returns true if the target supports decimal floating point.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_FIXED_POINT_SUPPORTED_P (void)
Returns true if the target supports fixed-point arithmetic.
@end deftypefn

@deftypefn {Target Hook} void TARGET_EXPAND_TO_RTL_HOOK (void)
This hook is called just before expansion into rtl, allowing the target
to perform additional initializations or analysis before the expansion.
For example, the rs6000 port uses it to allocate a scratch stack slot
for use in copying SDmode values between memory and floating point
registers whenever the function being expanded has any SDmode
usage.
@end deftypefn

@deftypefn {Target Hook} void TARGET_INSTANTIATE_DECLS (void)
This hook allows the backend to perform additional instantiations on rtl
that are not actually in any insns yet, but will be later.
@end deftypefn

@deftypefn {Target Hook} {const char *} TARGET_MANGLE_TYPE (const_tree @var{type})
If your target defines any fundamental types, or any types your target
uses should be mangled differently from the default, define this hook
to return the appropriate encoding for these types as part of a C++
mangled name.  The @var{type} argument is the tree structure representing
the type to be mangled.  The hook may be applied to trees which are
not target-specific fundamental types; it should return @code{NULL}
for all such types, as well as arguments it does not recognize.  If the
return value is not @code{NULL}, it must point to a statically-allocated
string constant.

Target-specific fundamental types might be new fundamental types or
qualified versions of ordinary fundamental types.  Encode new
fundamental types as @samp{@w{u @var{n} @var{name}}}, where @var{name}
is the name used for the type in source code, and @var{n} is the
length of @var{name} in decimal.  Encode qualified versions of
ordinary types as @samp{@w{U @var{n} @var{name} @var{code}}}, where
@var{name} is the name used for the type qualifier in source code,
@var{n} is the length of @var{name} as above, and @var{code} is the
code used to represent the unqualified version of this type.  (See
@code{write_builtin_type} in @file{cp/mangle.c} for the list of
codes.)  In both cases the spaces are for clarity; do not include any
spaces in your string.

This hook is applied to types prior to typedef resolution.  If the mangled
name for a particular type depends only on that type's main variant, you
can perform typedef resolution yourself using @code{TYPE_MAIN_VARIANT}
before mangling.

The default version of this hook always returns @code{NULL}, which is
appropriate for a target that does not define any new fundamental
types.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_DEFAULT_SHORT_ENUMS (void)
This target hook should return true if the compiler should give an
@code{enum} type only as many bytes as it takes to represent the range
of possible values of that type.  It should return false if all
@code{enum} types should be allocated like @code{int}.

The default is to return false.
@end deftypefn

@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.c}.
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
@deftypefn {Target Hook} {const predefined_function_abi &} TARGET_FNTYPE_ABI (const_tree @var{type})
Return the ABI used by a function with type @var{type}; see the
definition of @code{predefined_function_abi} for details of the ABI
descriptor.  Targets only need to define this hook if they support
interoperability between several ABIs in the same translation unit.
@end deftypefn

@deftypefn {Target Hook} {const predefined_function_abi &} TARGET_INSN_CALLEE_ABI (const rtx_insn *@var{insn})
This hook returns a description of the ABI used by the target of
call instruction @var{insn}; see the definition of
@code{predefined_function_abi} for details of the ABI descriptor.
Only the global function @code{insn_callee_abi} should call this hook
directly.

Targets only need to define this hook if they support
interoperability between several ABIs in the same translation unit.
@end deftypefn

@cindex call-used register
@cindex call-clobbered register
@cindex call-saved register
@deftypefn {Target Hook} bool TARGET_HARD_REGNO_CALL_PART_CLOBBERED (unsigned int @var{abi_id}, unsigned int @var{regno}, machine_mode @var{mode})
ABIs usually specify that calls must preserve the full contents
of a particular register, or that calls can alter any part of a
particular register.  This information is captured by the target macro
@code{CALL_REALLY_USED_REGISTERS}.  However, some ABIs specify that calls
must preserve certain bits of a particular register but can alter others.
This hook should return true if this applies to at least one of the
registers in @samp{(reg:@var{mode} @var{regno})}, and if as a result the
call would alter part of the @var{mode} value.  For example, if a call
preserves the low 32 bits of a 64-bit hard register @var{regno} but can
clobber the upper 32 bits, this hook should return true for a 64-bit mode
but false for a 32-bit mode.

The value of @var{abi_id} comes from the @code{predefined_function_abi}
structure that describes the ABI of the call; see the definition of the
structure for more details.  If (as is usual) the target uses the same ABI
for all functions in a translation unit, @var{abi_id} is always 0.

The default implementation returns false, which is correct
for targets that don't have partly call-clobbered registers.
@end deftypefn

@deftypefn {Target Hook} {const char *} TARGET_GET_MULTILIB_ABI_NAME (void)
This hook returns name of multilib ABI name.
@end deftypefn

@findex fixed_regs
@findex call_used_regs
@findex global_regs
@findex reg_names
@findex reg_class_contents
@deftypefn {Target Hook} void TARGET_CONDITIONAL_REGISTER_USAGE (void)
This hook may conditionally modify five variables
@code{fixed_regs}, @code{call_used_regs}, @code{global_regs},
@code{reg_names}, and @code{reg_class_contents}, to take into account
any dependence of these register sets on target flags.  The first three
of these are of type @code{char []} (interpreted as boolean vectors).
@code{global_regs} is a @code{const char *[]}, and
@code{reg_class_contents} is a @code{HARD_REG_SET}.  Before the macro is
called, @code{fixed_regs}, @code{call_used_regs},
@code{reg_class_contents}, and @code{reg_names} have been initialized
from @code{FIXED_REGISTERS}, @code{CALL_USED_REGISTERS},
@code{REG_CLASS_CONTENTS}, and @code{REGISTER_NAMES}, respectively.
@code{global_regs} has been cleared, and any @option{-ffixed-@var{reg}},
@option{-fcall-used-@var{reg}} and @option{-fcall-saved-@var{reg}}
command options have been applied.

@cindex disabling certain registers
@cindex controlling register usage
If the usage of an entire class of registers depends on the target
flags, you may indicate this to GCC by using this macro to modify
@code{fixed_regs} and @code{call_used_regs} to 1 for each of the
registers in the classes which should not be used by GCC@.  Also make
@code{define_register_constraint}s return @code{NO_REGS} for constraints
that shouldn't be used.

(However, if this class is not included in @code{GENERAL_REGS} and all
of the insn patterns whose constraints permit this class are
controlled by target switches, then GCC will automatically avoid using
these registers when the target switches are opposed to them.)
@end deftypefn

@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.

@deftypefn {Target Hook} {unsigned int} TARGET_HARD_REGNO_NREGS (unsigned int @var{regno}, machine_mode @var{mode})
This hook returns the number of consecutive hard registers, starting
at register number @var{regno}, required to hold a value of mode
@var{mode}.  This hook must never return zero, even if a register
cannot hold the requested mode - indicate that with
@code{TARGET_HARD_REGNO_MODE_OK} and/or
@code{TARGET_CAN_CHANGE_MODE_CLASS} instead.

The default definition returns the number of words in @var{mode}.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_HARD_REGNO_MODE_OK (unsigned int @var{regno}, machine_mode @var{mode})
This hook returns true if it is permissible to store a value
of mode @var{mode} in hard register number @var{regno} (or in several
registers starting with that one).  The default definition returns true
unconditionally.

You need not include code to check for the numbers of fixed registers,
because the allocation mechanism considers them to be always occupied.

@cindex register pairs
On some machines, double-precision values must be kept in even/odd
register pairs.  You can implement that by defining this hook to reject
odd register numbers for such modes.

The minimum requirement for a mode to be OK in a register is that the
@samp{mov@var{mode}} instruction pattern support moves between the
register and other hard register in the same class and that moving a
value into the register and back out not alter it.

Since the same instruction used to move @code{word_mode} will work for
all narrower integer modes, it is not necessary on any machine for
this hook to distinguish between these modes, provided you define
patterns @samp{movhi}, etc., to take advantage of this.  This is
useful because of the interaction between @code{TARGET_HARD_REGNO_MODE_OK}
and @code{TARGET_MODES_TIEABLE_P}; it is very desirable for all integer
modes to be tieable.

Many machines have special registers for floating point arithmetic.
Often people assume that floating point machine modes are allowed only
in floating point registers.  This is not true.  Any registers that
can hold integers can safely @emph{hold} a floating point machine
mode, whether or not floating arithmetic can be done on it in those
registers.  Integer move instructions can be used to move the values.

On some machines, though, the converse is true: fixed-point machine
modes may not go in floating registers.  This is true if the floating
registers normalize any value stored in them, because storing a
non-floating value there would garble it.  In this case,
@code{TARGET_HARD_REGNO_MODE_OK} should reject fixed-point machine modes in
floating registers.  But if the floating registers do not automatically
normalize, if you can store any bit pattern in one and retrieve it
unchanged without a trap, then any machine mode may go in a floating
register, so you can define this hook to say so.

The primary significance of special floating registers is rather that
they are the registers acceptable in floating point arithmetic
instructions.  However, this is of no concern to
@code{TARGET_HARD_REGNO_MODE_OK}.  You handle it by writing the proper
constraints for those instructions.

On some machines, the floating registers are especially slow to access,
so that it is better to store a value in a stack frame than in such a
register if floating point arithmetic is not being done.  As long as the
floating registers are not in class @code{GENERAL_REGS}, they will not
be used unless some pattern's constraint asks for one.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_MODES_TIEABLE_P (machine_mode @var{mode1}, machine_mode @var{mode2})
This hook returns true if a value of mode @var{mode1} is accessible
in mode @var{mode2} without copying.

If @code{TARGET_HARD_REGNO_MODE_OK (@var{r}, @var{mode1})} and
@code{TARGET_HARD_REGNO_MODE_OK (@var{r}, @var{mode2})} are always
the same for any @var{r}, then
@code{TARGET_MODES_TIEABLE_P (@var{mode1}, @var{mode2})}
should be true.  If they differ for any @var{r}, you should define
this hook to return false unless some other mechanism ensures the
accessibility of the value in a narrower mode.

You should define this hook to return true in as many cases as
possible since doing so will allow GCC to perform better register
allocation.  The default definition returns true unconditionally.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_HARD_REGNO_SCRATCH_OK (unsigned int @var{regno})
This target hook should return @code{true} if it is OK to use a hard register
@var{regno} as scratch reg in peephole2.

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

The default version of this hook always returns @code{true}.
@end deftypefn

@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.c} 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

@deftypefn {Target Hook} reg_class_t TARGET_PREFERRED_RENAME_CLASS (reg_class_t @var{rclass})
A target hook that places additional preference on the register
class to use when it is necessary to rename a register in class
@var{rclass} to another class, or perhaps @var{NO_REGS}, if no
preferred register class is found or hook @code{preferred_rename_class}
is not implemented.
Sometimes returning a more restrictive class makes better code.  For
example, on ARM, thumb-2 instructions using @code{LO_REGS} may be
smaller than instructions using @code{GENERIC_REGS}.  By returning
@code{LO_REGS} from @code{preferred_rename_class}, code size can
be reduced.
@end deftypefn

@deftypefn {Target Hook} reg_class_t TARGET_PREFERRED_RELOAD_CLASS (rtx @var{x}, reg_class_t @var{rclass})
A target hook 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{rclass}.  The value is a register class; perhaps @var{rclass}, or perhaps
another, smaller class.

The default version of this hook always returns value of @code{rclass} argument.

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{rclass} includes the data registers.
Requiring a data register guarantees that a @samp{moveq} will be used.

One case where @code{TARGET_PREFERRED_RELOAD_CLASS} must not return
@var{rclass} 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{TARGET_PREFERRED_RELOAD_CLASS} returns @code{NO_REGS} when
@var{x} is a floating-point constant.  If the constant can't 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{TARGET_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 deftypefn

@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

@deftypefn {Target Hook} reg_class_t TARGET_PREFERRED_OUTPUT_RELOAD_CLASS (rtx @var{x}, reg_class_t @var{rclass})
Like @code{TARGET_PREFERRED_RELOAD_CLASS}, but for output reloads instead of
input reloads.

The default version of this hook always returns value of @code{rclass}
argument.

You can also use @code{TARGET_PREFERRED_OUTPUT_RELOAD_CLASS} to discourage
reload from using some alternatives, like @code{TARGET_PREFERRED_RELOAD_CLASS}.
@end deftypefn

@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

@deftypefn {Target Hook} reg_class_t TARGET_SECONDARY_RELOAD (bool @var{in_p}, rtx @var{x}, reg_class_t @var{reload_class}, machine_mode @var{reload_mode}, secondary_reload_info *@var{sri})
Many machines have some registers that cannot be copied directly to or
from memory or even from other types of registers.  An example is the
@samp{MQ} register, which on most machines, can only be copied to or
from general registers, but not memory.  Below, we shall be using the
term 'intermediate register' when a move operation cannot be performed
directly, but has to be done by copying the source into the intermediate
register first, and then copying the intermediate register to the
destination.  An intermediate register always has the same mode as
source and destination.  Since it holds the actual value being copied,
reload might apply optimizations to re-use an intermediate register
and eliding the copy from the source when it can determine that the
intermediate register still holds the required value.

Another kind of secondary reload is required on some machines which
allow copying all registers to and from memory, but require a scratch
register for stores to some memory locations (e.g., those with symbolic
address on the RT, and those with certain symbolic address on the SPARC
when compiling PIC)@.  Scratch registers need not have the same mode
as the value being copied, and usually hold a different value than
that being copied.  Special patterns in the md file are needed to
describe how the copy is performed with the help of the scratch register;
these patterns also describe the number, register class(es) and mode(s)
of the scratch register(s).

In some cases, both an intermediate and a scratch register are required.

For input reloads, this target hook is called with nonzero @var{in_p},
and @var{x} is an rtx that needs to be copied to a register of class
@var{reload_class} in @var{reload_mode}.  For output reloads, this target
hook is called with zero @var{in_p}, and a register of class @var{reload_class}
needs to be copied to rtx @var{x} in @var{reload_mode}.

If copying a register of @var{reload_class} from/to @var{x} requires
an intermediate register, the hook @code{secondary_reload} should
return the register class required for this intermediate register.
If no intermediate register is required, it should return NO_REGS.
If more than one intermediate register is required, describe the one
that is closest in the copy chain to the reload register.

If scratch registers are needed, you also have to describe how to
perform the copy from/to the reload register to/from this
closest intermediate register.  Or if no intermediate register is
required, but still a scratch register is needed, describe the
copy  from/to the reload register to/from the reload operand @var{x}.

You do this by setting @code{sri->icode} to the instruction code of a pattern
in the md file which performs the move.  Operands 0 and 1 are the output
and input of this copy, respectively.  Operands from operand 2 onward are
for scratch operands.  These scratch operands must have a mode, and a
single-register-class
@c [later: or memory]
output constraint.

When an intermediate register is used, the @code{secondary_reload}
hook will be called again to determine how to copy the intermediate
register to/from the reload operand @var{x}, so your hook must also
have code to handle the register class of the intermediate operand.

@c [For later: maybe we'll allow multi-alternative reload patterns -
@c   the port maintainer could name a mov<mode> pattern that has clobbers -
@c   and match the constraints of input and output to determine the required
@c   alternative.  A restriction would be that constraints used to match
@c   against reloads registers would have to be written as register class
@c   constraints, or we need a new target macro / hook that tells us if an
@c   arbitrary constraint can match an unknown register of a given class.
@c   Such a macro / hook would also be useful in other places.]


@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.

Scratch operands in memory (constraint @code{"=m"} / @code{"=&m"}) are
currently not supported.  For the time being, you will have to continue
to use @code{TARGET_SECONDARY_MEMORY_NEEDED} for that purpose.

@code{copy_cost} also uses this target hook to find out how values are
copied.  If you want it to include some extra cost for the need to allocate
(a) scratch register(s), set @code{sri->extra_cost} to the additional cost.
Or if two dependent moves are supposed to have a lower cost than the sum
of the individual moves due to expected fortuitous scheduling and/or special
forwarding logic, you can set @code{sri->extra_cost} to a negative amount.
@end deftypefn

@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 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

@deftypefn {Target Hook} bool TARGET_SECONDARY_MEMORY_NEEDED (machine_mode @var{mode}, reg_class_t @var{class1}, reg_class_t @var{class2})
Certain machines have the property that some registers cannot be copied
to some other registers without using memory.  Define this hook on
those machines to return true if objects of mode @var{m} in registers
of @var{class1} can only be copied to registers of class @var{class2} by
 storing a register of @var{class1} into memory and loading that memory
location into a register of @var{class2}.  The default definition returns
false for all inputs.
@end deftypefn

@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

@deftypefn {Target Hook} machine_mode TARGET_SECONDARY_MEMORY_NEEDED_MODE (machine_mode @var{mode})
If @code{TARGET_SECONDARY_MEMORY_NEEDED} tells the compiler to use memory
when moving between two particular registers of mode @var{mode},
this hook specifies the mode that the memory should have.

The default depends on @code{TARGET_LRA_P}.  Without LRA, the default
is to use a word-sized mode for integral modes that are smaller than a
a word.  This is right thing to do on most machines because it ensures
that all bits of the register are copied and prevents accesses to the
registers in a narrower mode, which some machines prohibit for
floating-point registers.

However, this default behavior is not correct on some machines, such as
the DEC Alpha, that store short integers in floating-point registers
differently than in integer registers.  On those machines, the default
widening will not work correctly and you must define this hook to
suppress that widening in some cases.  See the file @file{alpha.c} for
details.

With LRA, the default is to use @var{mode} unmodified.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SELECT_EARLY_REMAT_MODES (sbitmap @var{modes})
On some targets, certain modes cannot be held in registers around a
standard ABI call and are relatively expensive to spill to the stack.
The early rematerialization pass can help in such cases by aggressively
recomputing values after calls, so that they don't need to be spilled.

This hook returns the set of such modes by setting the associated bits
in @var{modes}.  The default implementation selects no modes, which has
the effect of disabling the early rematerialization pass.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CLASS_LIKELY_SPILLED_P (reg_class_t @var{rclass})
A target hook which returns @code{true} if pseudos that have been assigned
to registers of class @var{rclass} would likely be spilled because
registers of @var{rclass} are needed for spill registers.

The default version of this target hook returns @code{true} if @var{rclass}
has exactly one register and @code{false} otherwise.  On most machines, this
default should be used.  For generally register-starved machines, such as
i386, or machines with right register constraints, such as SH, this hook
can be used to avoid excessive spilling.

This hook is also used by some of the global intra-procedural code
transformations to throtle code motion, to avoid increasing register
pressure.
@end deftypefn

@deftypefn {Target Hook} {unsigned char} TARGET_CLASS_MAX_NREGS (reg_class_t @var{rclass}, machine_mode @var{mode})
A target hook returns the maximum number of consecutive registers
of class @var{rclass} 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 returned by @code{TARGET_CLASS_MAX_NREGS (@var{rclass},
@var{mode})} target hook should be the maximum value of
@code{TARGET_HARD_REGNO_NREGS (@var{regno}, @var{mode})} for all @var{regno}
values in the class @var{rclass}.

This target hook helps control the handling of multiple-word values
in the reload pass.

The default version of this target hook returns the size of @var{mode}
in words.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_CAN_CHANGE_MODE_CLASS (machine_mode @var{from}, machine_mode @var{to}, reg_class_t @var{rclass})
This hook returns true if it is possible to bitcast values held in
registers of class @var{rclass} from mode @var{from} to mode @var{to}
and if doing so preserves the low-order bits that are common to both modes.
The result is only meaningful if @var{rclass} has registers that can hold
both @code{from} and @code{to}.  The default implementation returns true.

As an example of when such bitcasting is invalid, loading 32-bit integer or
floating-point objects into floating-point registers on Alpha extends them
to 64 bits.  Therefore loading a 64-bit object and then storing it as a
32-bit object does not store the low-order 32 bits, as would be the case
for a normal register.  Therefore, @file{alpha.h} defines
@code{TARGET_CAN_CHANGE_MODE_CLASS} to return:

@smallexample
(GET_MODE_SIZE (from) == GET_MODE_SIZE (to)
 || !reg_classes_intersect_p (FLOAT_REGS, rclass))
@end smallexample

Even if storing from a register in mode @var{to} would be valid,
if both @var{from} and @code{raw_reg_mode} for @var{rclass} are wider
than @code{word_mode}, then we must prevent @var{to} narrowing the
mode.  This happens when the middle-end assumes that it can load
or store pieces of an @var{N}-word pseudo, and that the pseudo will
eventually be allocated to @var{N} @code{word_mode} hard registers.
Failure to prevent this kind of mode change will result in the
entire @code{raw_reg_mode} being modified instead of the partial
value that the middle-end intended.
@end deftypefn

@deftypefn {Target Hook} reg_class_t TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS (int, @var{reg_class_t}, @var{reg_class_t})
A target hook which can change allocno class for given pseudo from
  allocno and best class calculated by IRA.
  
  The default version of this target hook always returns given class.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_LRA_P (void)
A target hook which returns true if we use LRA instead of reload pass.

The default version of this target hook returns true.  New ports
should use LRA, and existing ports are encouraged to convert.
@end deftypefn

@deftypefn {Target Hook} int TARGET_REGISTER_PRIORITY (int)
A target hook which returns the register priority number to which the
register @var{hard_regno} belongs to.  The bigger the number, the
more preferable the hard register usage (when all other conditions are
the same).  This hook can be used to prefer some hard register over
others in LRA.  For example, some x86-64 register usage needs
additional prefix which makes instructions longer.  The hook can
return lower priority number for such registers make them less favorable
and as result making the generated code smaller.

The default version of this target hook returns always zero.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_REGISTER_USAGE_LEVELING_P (void)
A target hook which returns true if we need register usage leveling.
That means if a few hard registers are equally good for the
assignment, we choose the least used hard register.  The register
usage leveling may be profitable for some targets.  Don't use the
usage leveling for targets with conditional execution or targets
with big register files as it hurts if-conversion and cross-jumping
optimizations.

The default version of this target hook returns always false.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_DIFFERENT_ADDR_DISPLACEMENT_P (void)
A target hook which returns true if an address with the same structure
can have different maximal legitimate displacement.  For example, the
displacement can depend on memory mode or on operand combinations in
the insn.

The default version of this target hook returns always false.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CANNOT_SUBSTITUTE_MEM_EQUIV_P (rtx @var{subst})
A target hook which returns @code{true} if @var{subst} can't
substitute safely pseudos with equivalent memory values during
register allocation.
The default version of this target hook returns @code{false}.
On most machines, this default should be used.  For generally
machines with non orthogonal register usage for addressing, such
as SH, this hook can be used to avoid excessive spilling.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_LEGITIMIZE_ADDRESS_DISPLACEMENT (rtx *@var{offset1}, rtx *@var{offset2}, poly_int64 @var{orig_offset}, machine_mode @var{mode})
This hook tries to split address offset @var{orig_offset} into
two parts: one that should be added to the base address to create
a local anchor point, and an additional offset that can be applied
to the anchor to address a value of mode @var{mode}.  The idea is that
the local anchor could be shared by other accesses to nearby locations.

The hook returns true if it succeeds, storing the offset of the
anchor from the base in @var{offset1} and the offset of the final address
from the anchor in @var{offset2}.  The default implementation returns false.
@end deftypefn

@deftypefn {Target Hook} reg_class_t TARGET_SPILL_CLASS (reg_class_t, @var{machine_mode})
This hook defines a class of registers which could be used for spilling
pseudos of the given mode and class, or @code{NO_REGS} if only memory
should be used.  Not defining this hook is equivalent to returning
@code{NO_REGS} for all inputs.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ADDITIONAL_ALLOCNO_CLASS_P (reg_class_t)
This hook should return @code{true} if given class of registers should
be an allocno class in any way.  Usually RA uses only one register
class from all classes containing the same register set.  In some
complicated cases, you need to have two or more such classes as
allocno ones for RA correct work.  Not defining this hook is
equivalent to returning @code{false} for all inputs.
@end deftypefn

@deftypefn {Target Hook} scalar_int_mode TARGET_CSTORE_MODE (enum insn_code @var{icode})
This hook defines the machine mode to use for the boolean result of
conditional store patterns.  The ICODE argument is the instruction code
for the cstore being performed.  Not definiting this hook is the same
as accepting the mode encoded into operand 0 of the cstore expander
patterns.
@end deftypefn

@deftypefn {Target Hook} int TARGET_COMPUTE_PRESSURE_CLASSES (enum reg_class *@var{pressure_classes})
A target hook which lets a backend compute the set of pressure classes to
be used by those optimization passes which take register pressure into
account, as opposed to letting IRA compute them.  It returns the number of
register classes stored in the array @var{pressure_classes}.
@end deftypefn

@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

@deftypefn {Target Hook} HOST_WIDE_INT TARGET_STARTING_FRAME_OFFSET (void)
This hook returns the offset from the frame pointer to the first local
variable slot to be allocated.  If @code{FRAME_GROWS_DOWNWARD}, it is the
offset to @emph{end} of the first slot allocated, otherwise it is the
offset to @emph{beginning} of the first slot allocated.  The default
implementation returns 0.
@end deftypefn

@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.c} 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

@deftypefn {Target Hook} rtx TARGET_BUILTIN_SETJMP_FRAME_VALUE (void)
This target hook should return an rtx that is used to store
the address of the current frame into the built in @code{setjmp} buffer.
The default value, @code{virtual_stack_vars_rtx}, is correct for most
machines.  One reason you may need to define this target hook is if
@code{hard_frame_pointer_rtx} is the appropriate value on your machine.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_DWARF_HANDLE_FRAME_UNSPEC (const char *@var{label}, rtx @var{pattern}, int @var{index})
This target hook allows the backend to emit frame-related insns that
contain UNSPECs or UNSPEC_VOLATILEs.  The DWARF 2 call frame debugging
info engine will invoke it on insns of the form
@smallexample
(set (reg) (unspec [@dots{}] UNSPEC_INDEX))
@end smallexample
and
@smallexample
(set (reg) (unspec_volatile [@dots{}] UNSPECV_INDEX)).
@end smallexample
to let the backend emit the call frame instructions.  @var{label} is
the CFI label attached to the insn, @var{pattern} is the pattern of
the insn and @var{index} is @code{UNSPEC_INDEX} or @code{UNSPECV_INDEX}.
@end deftypefn

@deftypefn {Target Hook} {unsigned int} TARGET_DWARF_POLY_INDETERMINATE_VALUE (unsigned int @var{i}, unsigned int *@var{factor}, int *@var{offset})
Express the value of @code{poly_int} indeterminate @var{i} as a DWARF
expression, with @var{i} counting from 1.  Return the number of a DWARF
register @var{R} and set @samp{*@var{factor}} and @samp{*@var{offset}} such
that the value of the indeterminate is:
@smallexample
value_of(@var{R}) / @var{factor} - @var{offset}
@end smallexample

A target only needs to define this hook if it sets
@samp{NUM_POLY_INT_COEFFS} to a value greater than 1.
@end deftypefn

@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

@deftypefn {Target Hook} HOST_WIDE_INT TARGET_STACK_CLASH_PROTECTION_ALLOCA_PROBE_RANGE (void)
Some targets have an ABI defined interval for which no probing needs to be done.
When a probe does need to be done this same interval is used as the probe distance
up when doing stack clash protection for alloca.
On such targets this value can be set to override the default probing up interval.
Define this variable to return nonzero if such a probe range is required or zero otherwise.
Defining this hook also requires your functions which make use of alloca to have at least 8 byes
of outgoing arguments.  If this is not the case the stack will be corrupted.
You need not define this macro if it would always have the value zero.
@end deftypefn

@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

@deftypefn {Target Hook} rtx TARGET_STATIC_CHAIN (const_tree @var{fndecl_or_type}, bool @var{incoming_p})
This hook replaces the use of @code{STATIC_CHAIN_REGNUM} et al for
targets that may use different static chain locations for different
nested functions.  This may be required if the target has function
attributes that affect the calling conventions of the function and
those calling conventions use different static chain locations.

The default version of this hook uses @code{STATIC_CHAIN_REGNUM} et al.

If the static chain is passed in memory, this hook should be used to
provide rtx giving @code{mem} expressions that denote where they are stored.
Often the @code{mem} expression as seen by the caller will be at an offset
from the stack pointer and the @code{mem} expression as seen by the callee
will be at an offset from the frame pointer.
@findex stack_pointer_rtx
@findex frame_pointer_rtx
@findex arg_pointer_rtx
The variables @code{stack_pointer_rtx}, @code{frame_pointer_rtx}, and
@code{arg_pointer_rtx} will have been initialized and should be used
to refer to those items.
@end deftypefn

@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{DBX_REGISTER_NUMBER (@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.

@deftypefn {Target Hook} bool TARGET_FRAME_POINTER_REQUIRED (void)
This target hook should return @code{true} if a function must have and use
a frame pointer.  This target hook is called in the reload pass.  If its return
value is @code{true} the function will have a frame pointer.

This target hook can in principle examine the current function and decide
according to the facts, but on most machines the constant @code{false} or the
constant @code{true} suffices.  Use @code{false} when the machine allows code
to be generated with no frame pointer, and doing so saves some time or space.
Use @code{true} when there is no possible advantage to avoiding a frame
pointer.

In certain cases, the compiler does not know how to produce valid code
without a frame pointer.  The compiler recognizes those cases and
automatically gives the function a frame pointer regardless of what
@code{targetm.frame_pointer_required} returns.  You don't need to worry about
them.

In a function that does not require a frame pointer, the frame pointer
register can be allocated for ordinary usage, unless you mark it as a
fixed register.  See @code{FIXED_REGISTERS} for more information.

Default return value is @code{false}.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_CAN_ELIMINATE (const int @var{from_reg}, const int @var{to_reg})
This target hook should return @code{true} if the compiler is allowed to
try to replace register number @var{from_reg} with register number
@var{to_reg}.  This target hook will usually be @code{true}, since most of the
cases preventing register elimination are things that the compiler already
knows about.

Default return value is @code{true}.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_COMPUTE_FRAME_LAYOUT (void)
This target hook is called once each time the frame layout needs to be
recalculated.  The calculations can be cached by the target and can then
be used by @code{INITIAL_ELIMINATION_OFFSET} instead of re-computing the
layout on every invocation of that hook.  This is particularly useful
for targets that have an expensive frame layout function.  Implementing
this callback is optional.
@end deftypefn

@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.

@deftypefn {Target Hook} bool TARGET_PROMOTE_PROTOTYPES (const_tree @var{fntype})
This target hook returns @code{true} if an argument declared in a
prototype as an integral type smaller than @code{int} should actually be
passed as an @code{int}.  In addition to avoiding errors in certain
cases of mismatch, it also makes for better code on certain machines.
The default is to not promote prototypes.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_PUSH_ARGUMENT (unsigned int @var{npush})
This target hook returns @code{true} if push instructions will be
used to pass outgoing arguments.  When the push instruction usage is
optional, @var{npush} is nonzero to indicate the number of bytes to
push.  Otherwise, @var{npush} is zero.  If the target machine does not
have a push instruction or push instruction should be avoided,
@code{false} should be returned.  That directs GCC to use an alternate
strategy: to allocate the entire argument block and then store the
arguments into it.  If this target hook may return @code{true},
@code{PUSH_ROUNDING} must be defined.
@end deftypefn

@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

@deftypefn {Target Hook} poly_int64 TARGET_RETURN_POPS_ARGS (tree @var{fundecl}, tree @var{funtype}, poly_int64 @var{size})
This target hook returns the number of bytes of its own arguments that
a function pops on returning, or 0 if the function pops no arguments
and the caller must therefore pop them all after the function returns.

@var{fundecl} is a C variable whose value is a tree node that describes
the function in question.  Normally it is a node of type
@code{FUNCTION_DECL} that describes the declaration of the function.
From this you can obtain the @code{DECL_ATTRIBUTES} of the function.

@var{funtype} is a C variable whose value is a tree node that
describes the function in question.  Normally it is a node of type
@code{FUNCTION_TYPE} that describes the data type of the function.
From this it is possible to obtain the data types of the value and
arguments (if known).

When a call to a library function is being considered, @var{fundecl}
will contain an identifier node for the library function.  Thus, if
you need to distinguish among various library functions, you can do so
by their names.  Note that ``library function'' in this context means
a function used to perform arithmetic, whose name is known specially
in the compiler and was not mentioned in the C code being compiled.

@var{size} is the number of bytes of arguments passed on the
stack.  If a variable number of bytes is passed, it is zero, and
argument popping will always be the responsibility of the calling function.

On the VAX, all functions always pop their arguments, so the definition
of this macro is @var{size}.  On the 68000, using the standard
calling convention, no functions pop their arguments, so the value of
the macro is always 0 in this case.  But an alternative calling
convention is available in which functions that take a fixed number of
arguments pop them but other functions (such as @code{printf}) pop
nothing (the caller pops all).  When this convention is in use,
@var{funtype} is examined to determine whether a function takes a fixed
number of arguments.
@end deftypefn

@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.

@deftypefn {Target Hook} rtx TARGET_FUNCTION_ARG (cumulative_args_t @var{ca}, const function_arg_info @var{&arg})
Return an RTX indicating whether function argument @var{arg} is passed
in a register and if so, which register.  Argument @var{ca} summarizes all
the previous arguments.

The return value is usually either a @code{reg} RTX for the hard
register in which to pass the argument, or zero to pass the argument
on the stack.

The return value can be a @code{const_int} which means argument is
passed in a target specific slot with specified number.  Target hooks
should be used to store or load argument in such case.  See
@code{TARGET_STORE_BOUNDS_FOR_ARG} and @code{TARGET_LOAD_BOUNDS_FOR_ARG}
for more information.

The value of the expression can also be a @code{parallel} RTX@.  This is
used when an argument is passed in multiple locations.  The mode of the
@code{parallel} should be the mode of the entire argument.  The
@code{parallel} holds any number of @code{expr_list} pairs; each one
describes where part of the argument is passed.  In each
@code{expr_list} the first operand must be a @code{reg} RTX for the hard
register in which to pass this part of the argument, and the mode of the
register RTX indicates how large this part of the argument is.  The
second operand of the @code{expr_list} is a @code{const_int} which gives
the offset in bytes into the entire argument of where this part starts.
As a special exception the first @code{expr_list} in the @code{parallel}
RTX may have a first operand of zero.  This indicates that the entire
argument is also stored on the stack.

The last time this hook is called, it is called with @code{MODE ==
VOIDmode}, and its result is passed to the @code{call} or @code{call_value}
pattern as operands 2 and 3 respectively.

@cindex @file{stdarg.h} and register arguments
The usual way to make the ISO library @file{stdarg.h} work on a
machine where some arguments are usually passed in registers, is to
cause nameless arguments to be passed on the stack instead.  This is
done by making @code{TARGET_FUNCTION_ARG} return 0 whenever
@var{named} is @code{false}.

@cindex @code{TARGET_MUST_PASS_IN_STACK}, and @code{TARGET_FUNCTION_ARG}
@cindex @code{REG_PARM_STACK_SPACE}, and @code{TARGET_FUNCTION_ARG}
You may use the hook @code{targetm.calls.must_pass_in_stack}
in the definition of this macro to determine if this argument is of a
type that must be passed in the stack.  If @code{REG_PARM_STACK_SPACE}
is not defined and @code{TARGET_FUNCTION_ARG} returns nonzero for such an
argument, the compiler will abort.  If @code{REG_PARM_STACK_SPACE} is
defined, the argument will be computed in the stack and then loaded into
a register.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_MUST_PASS_IN_STACK (const function_arg_info @var{&arg})
This target hook should return @code{true} if we should not pass @var{arg}
solely in registers.  The file @file{expr.h} defines a
definition that is usually appropriate, refer to @file{expr.h} for additional
documentation.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_FUNCTION_INCOMING_ARG (cumulative_args_t @var{ca}, const function_arg_info @var{&arg})
Define this hook if the caller and callee on the target have different
views of where arguments are passed.  Also define this hook if there are
functions that are never directly called, but are invoked by the hardware
and which have nonstandard calling conventions.

In this case @code{TARGET_FUNCTION_ARG} computes the register in
which the caller passes the value, and
@code{TARGET_FUNCTION_INCOMING_ARG} should be defined in a similar
fashion to tell the function being called where the arguments will
arrive.

@code{TARGET_FUNCTION_INCOMING_ARG} can also return arbitrary address
computation using hard register, which can be forced into a register,
so that it can be used to pass special arguments.

If @code{TARGET_FUNCTION_INCOMING_ARG} is not defined,
@code{TARGET_FUNCTION_ARG} serves both purposes.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_USE_PSEUDO_PIC_REG (void)
This hook should return 1 in case pseudo register should be created
for pic_offset_table_rtx during function expand.
@end deftypefn

@deftypefn {Target Hook} void TARGET_INIT_PIC_REG (void)
Perform a target dependent initialization of pic_offset_table_rtx.
This hook is called at the start of register allocation.
@end deftypefn

@deftypefn {Target Hook} int TARGET_ARG_PARTIAL_BYTES (cumulative_args_t @var{cum}, const function_arg_info @var{&arg})
This target hook returns the number of bytes at the beginning of an
argument that must be put in registers.  The value must be zero for
arguments that are passed entirely in registers or that are entirely
pushed on the stack.

On some machines, certain arguments must be passed partially in
registers and partially in memory.  On these machines, typically the
first few words of arguments are passed in registers, and the rest
on the stack.  If a multi-word argument (a @code{double} or a
structure) crosses that boundary, its first few words must be passed
in registers and the rest must be pushed.  This macro tells the
compiler when this occurs, and how many bytes should go in registers.

@code{TARGET_FUNCTION_ARG} for these arguments should return the first
register to be used by the caller for this argument; likewise
@code{TARGET_FUNCTION_INCOMING_ARG}, for the called function.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_PASS_BY_REFERENCE (cumulative_args_t @var{cum}, const function_arg_info @var{&arg})
This target hook should return @code{true} if argument @var{arg} at the
position indicated by @var{cum} should be passed by reference.  This
predicate is queried after target independent reasons for being
passed by reference, such as @code{TREE_ADDRESSABLE (@var{arg}.type)}.

If the hook returns true, a copy of that argument is made in memory and a
pointer to the argument is passed instead of the argument itself.
The pointer is passed in whatever way is appropriate for passing a pointer
to that type.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CALLEE_COPIES (cumulative_args_t @var{cum}, const function_arg_info @var{&arg})
The function argument described by the parameters to this hook is
known to be passed by reference.  The hook should return true if the
function argument should be copied by the callee instead of copied
by the caller.

For any argument for which the hook returns true, if it can be
determined that the argument is not modified, then a copy need
not be generated.

The default version of this hook always returns false.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_FUNCTION_ARG_ADVANCE (cumulative_args_t @var{ca}, const function_arg_info @var{&arg})
This hook updates the summarizer variable pointed to by @var{ca} to
advance past argument @var{arg} in the argument list.  Once this is done,
the variable @var{cum} is suitable for analyzing the @emph{following}
argument with @code{TARGET_FUNCTION_ARG}, etc.

This hook need not do anything if the argument in question was passed
on the stack.  The compiler knows how to track the amount of stack space
used for arguments without any special help.
@end deftypefn

@deftypefn {Target Hook} HOST_WIDE_INT TARGET_FUNCTION_ARG_OFFSET (machine_mode @var{mode}, const_tree @var{type})
This hook returns the number of bytes to add to the offset of an
argument of type @var{type} and mode @var{mode} when passed in memory.
This is needed for the SPU, which passes @code{char} and @code{short}
arguments in the preferred slot that is in the middle of the quad word
instead of starting at the top.  The default implementation returns 0.
@end deftypefn

@deftypefn {Target Hook} pad_direction TARGET_FUNCTION_ARG_PADDING (machine_mode @var{mode}, const_tree @var{type})
This hook determines whether, and in which direction, to pad out
an argument of mode @var{mode} and type @var{type}.  It returns
@code{PAD_UPWARD} to insert padding above the argument, @code{PAD_DOWNWARD}
to insert padding below the argument, or @code{PAD_NONE} to inhibit padding.

The @emph{amount} of padding is not controlled by this hook, but by
@code{TARGET_FUNCTION_ARG_ROUND_BOUNDARY}.  It is always just enough
to reach the next multiple of that boundary.

This hook has a default definition that is right for most systems.
For little-endian machines, the default is to pad upward.  For
big-endian machines, the default is to pad downward for an argument of
constant size shorter than an @code{int}, and upward otherwise.
@end deftypefn

@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

@deftypefn {Target Hook} {unsigned int} TARGET_FUNCTION_ARG_BOUNDARY (machine_mode @var{mode}, const_tree @var{type})
This hook returns the alignment boundary, in bits, of an argument
with the specified mode and type.  The default hook returns
@code{PARM_BOUNDARY} for all arguments.
@end deftypefn

@deftypefn {Target Hook} {unsigned int} TARGET_FUNCTION_ARG_ROUND_BOUNDARY (machine_mode @var{mode}, const_tree @var{type})
Normally, the size of an argument is rounded up to @code{PARM_BOUNDARY},
which is the default value for this hook.  You can define this hook to
return a different value if an argument size must be rounded to a larger
value.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_SPLIT_COMPLEX_ARG (const_tree @var{type})
This hook should return true if parameter of type @var{type} are passed
as two scalar parameters.  By default, GCC will attempt to pack complex
arguments into the target's word size.  Some ABIs require complex arguments
to be split and treated as their individual components.  For example, on
AIX64, complex floats should be passed in a pair of floating point
registers, even though a complex float would fit in one 64-bit floating
point register.

The default value of this hook is @code{NULL}, which is treated as always
false.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_BUILD_BUILTIN_VA_LIST (void)
This hook returns a type node for @code{va_list} for the target.
The default version of the hook returns @code{void*}.
@end deftypefn

@deftypefn {Target Hook} int TARGET_ENUM_VA_LIST_P (int @var{idx}, const char **@var{pname}, tree *@var{ptree})
This target hook is used in function @code{c_common_nodes_and_builtins}
to iterate through the target specific builtin types for va_list. The
variable @var{idx} is used as iterator. @var{pname} has to be a pointer
to a @code{const char *} and @var{ptree} a pointer to a @code{tree} typed
variable.
The arguments @var{pname} and @var{ptree} are used to store the result of
this macro and are set to the name of the va_list builtin type and its
internal type.
If the return value of this macro is zero, then there is no more element.
Otherwise the @var{IDX} should be increased for the next call of this
macro to iterate through all types.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_FN_ABI_VA_LIST (tree @var{fndecl})
This hook returns the va_list type of the calling convention specified by
@var{fndecl}.
The default version of this hook returns @code{va_list_type_node}.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_CANONICAL_VA_LIST_TYPE (tree @var{type})
This hook returns the va_list type of the calling convention specified by the
type of @var{type}. If @var{type} is not a valid va_list type, it returns
@code{NULL_TREE}.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_GIMPLIFY_VA_ARG_EXPR (tree @var{valist}, tree @var{type}, gimple_seq *@var{pre_p}, gimple_seq *@var{post_p})
This hook performs target-specific gimplification of
@code{VA_ARG_EXPR}.  The first two parameters correspond to the
arguments to @code{va_arg}; the latter two are as in
@code{gimplify.c:gimplify_expr}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_VALID_POINTER_MODE (scalar_int_mode @var{mode})
Define this to return nonzero if the port can handle pointers
with machine mode @var{mode}.  The default version of this
hook returns true for both @code{ptr_mode} and @code{Pmode}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_REF_MAY_ALIAS_ERRNO (ao_ref *@var{ref})
Define this to return nonzero if the memory reference @var{ref}
may alias with the system C library errno location.  The default
version of this hook assumes the system C library errno location
is either a declaration of type int or accessed by dereferencing
a pointer to int.
@end deftypefn

@deftypefn {Target Hook} machine_mode TARGET_TRANSLATE_MODE_ATTRIBUTE (machine_mode @var{mode})
Define this hook if during mode attribute processing, the port should
translate machine_mode @var{mode} to another mode.  For example, rs6000's
@code{KFmode}, when it is the same as @code{TFmode}.

The default version of the hook returns that mode that was passed in.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_SCALAR_MODE_SUPPORTED_P (scalar_mode @var{mode})
Define this to return nonzero if the port is prepared to handle
insns involving scalar mode @var{mode}.  For a scalar mode to be
considered supported, all the basic arithmetic and comparisons
must work.

The default version of this hook returns true for any mode
required to handle the basic C types (as defined by the port).
Included here are the double-word arithmetic supported by the
code in @file{optabs.c}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_VECTOR_MODE_SUPPORTED_P (machine_mode @var{mode})
Define this to return nonzero if the port is prepared to handle
insns involving vector mode @var{mode}.  At the very least, it
must have move patterns for this mode.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_COMPATIBLE_VECTOR_TYPES_P (const_tree @var{type1}, const_tree @var{type2})
Return true if there is no target-specific reason for treating
vector types @var{type1} and @var{type2} as distinct types.  The caller
has already checked for target-independent reasons, meaning that the
types are known to have the same mode, to have the same number of elements,
and to have what the caller considers to be compatible element types.

The main reason for defining this hook is to reject pairs of types
that are handled differently by the target's calling convention.
For example, when a new @var{N}-bit vector architecture is added
to a target, the target may want to handle normal @var{N}-bit
@code{VECTOR_TYPE} arguments and return values in the same way as
before, to maintain backwards compatibility.  However, it may also
provide new, architecture-specific @code{VECTOR_TYPE}s that are passed
and returned in a more efficient way.  It is then important to maintain
a distinction between the ``normal'' @code{VECTOR_TYPE}s and the new
architecture-specific ones.

The default implementation returns true, which is correct for most targets.
@end deftypefn

@deftypefn {Target Hook} opt_machine_mode TARGET_ARRAY_MODE (machine_mode @var{mode}, unsigned HOST_WIDE_INT @var{nelems})
Return the mode that GCC should use for an array that has
@var{nelems} elements, with each element having mode @var{mode}.
Return no mode if the target has no special requirements.  In the
latter case, GCC looks for an integer mode of the appropriate size
if available and uses BLKmode otherwise.  Usually the search for the
integer mode is limited to @code{MAX_FIXED_MODE_SIZE}, but the
@code{TARGET_ARRAY_MODE_SUPPORTED_P} hook allows a larger mode to be
used in specific cases.

The main use of this hook is to specify that an array of vectors should
also have a vector mode.  The default implementation returns no mode.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ARRAY_MODE_SUPPORTED_P (machine_mode @var{mode}, unsigned HOST_WIDE_INT @var{nelems})
Return true if GCC should try to use a scalar mode to store an array
of @var{nelems} elements, given that each element has mode @var{mode}.
Returning true here overrides the usual @code{MAX_FIXED_MODE} limit
and allows GCC to use any defined integer mode.

One use of this hook is to support vector load and store operations
that operate on several homogeneous vectors.  For example, ARM NEON
has operations like:

@smallexample
int8x8x3_t vld3_s8 (const int8_t *)
@end smallexample

where the return type is defined as:

@smallexample
typedef struct int8x8x3_t
@{
  int8x8_t val[3];
@} int8x8x3_t;
@end smallexample

If this hook allows @code{val} to have a scalar mode, then
@code{int8x8x3_t} can have the same mode.  GCC can then store
@code{int8x8x3_t}s in registers rather than forcing them onto the stack.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P (scalar_float_mode @var{mode})
Define this to return nonzero if libgcc provides support for the 
floating-point mode @var{mode}, which is known to pass 
@code{TARGET_SCALAR_MODE_SUPPORTED_P}.  The default version of this 
hook returns true for all of @code{SFmode}, @code{DFmode}, 
@code{XFmode} and @code{TFmode}, if such modes exist.
@end deftypefn

@deftypefn {Target Hook} opt_scalar_float_mode TARGET_FLOATN_MODE (int @var{n}, bool @var{extended})
Define this to return the machine mode to use for the type 
@code{_Float@var{n}}, if @var{extended} is false, or the type 
@code{_Float@var{n}x}, if @var{extended} is true.  If such a type is not
supported, return @code{opt_scalar_float_mode ()}.  The default version of
this hook returns @code{SFmode} for @code{_Float32}, @code{DFmode} for
@code{_Float64} and @code{_Float32x} and @code{TFmode} for 
@code{_Float128}, if those modes exist and satisfy the requirements for 
those types and pass @code{TARGET_SCALAR_MODE_SUPPORTED_P} and 
@code{TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P}; for @code{_Float64x}, it 
returns the first of @code{XFmode} and @code{TFmode} that exists and 
satisfies the same requirements; for other types, it returns 
@code{opt_scalar_float_mode ()}.  The hook is only called for values
of @var{n} and @var{extended} that are valid according to
ISO/IEC TS 18661-3:2015; that is, @var{n} is one of 32, 64, 128, or,
if @var{extended} is false, 16 or greater than 128 and a multiple of 32.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_FLOATN_BUILTIN_P (int @var{func})
Define this to return true if the @code{_Float@var{n}} and
@code{_Float@var{n}x} built-in functions should implicitly enable the
built-in function without the @code{__builtin_} prefix in addition to the
normal built-in function with the @code{__builtin_} prefix.  The default is
to only enable built-in functions without the @code{__builtin_} prefix for
the GNU C langauge.  In strict ANSI/ISO mode, the built-in function without
the @code{__builtin_} prefix is not enabled.  The argument @code{FUNC} is the
@code{enum built_in_function} id of the function to be enabled.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P (machine_mode @var{mode})
Define this to return nonzero for machine modes for which the port has
small register classes.  If this target hook returns nonzero for a given
@var{mode}, the compiler will try to minimize the lifetime of registers
in @var{mode}.  The hook may be called with @code{VOIDmode} as argument.
In this case, the hook is expected to return nonzero if it returns nonzero
for any mode.

On some machines, it is risky to let hard registers live across arbitrary
insns.  Typically, these machines have instructions that require values
to be in specific registers (like an accumulator), and reload will fail
if the required hard register is used for another purpose across such an
insn.

Passes before reload do not know which hard registers will be used
in an instruction, but the machine modes of the registers set or used in
the instruction are already known.  And for some machines, register
classes are small for, say, integer registers but not for floating point
registers.  For example, the AMD x86-64 architecture requires specific
registers for the legacy x86 integer instructions, but there are many
SSE registers for floating point operations.  On such targets, a good
strategy may be to return nonzero from this hook for @code{INTEGRAL_MODE_P}
machine modes but zero for the SSE register classes.

The default version of this hook returns false for any mode.  It is always
safe to redefine this hook to return with a nonzero value.  But if you
unnecessarily define it, you will reduce the amount of optimizations
that can be performed in some cases.  If you do not define this hook
to return a nonzero value when it is required, the compiler will run out
of spill registers and print a fatal error message.
@end deftypefn

@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.

@deftypefn {Target Hook} rtx TARGET_FUNCTION_VALUE (const_tree @var{ret_type}, const_tree @var{fn_decl_or_type}, bool @var{outgoing})

Define this to return an RTX representing the place where a function
returns or receives a value of data type @var{ret_type}, a tree node
representing a data type.  @var{fn_decl_or_type} is a tree node
representing @code{FUNCTION_DECL} or @code{FUNCTION_TYPE} of a
function being called.  If @var{outgoing} is false, the hook should
compute the register in which the caller will see the return value.
Otherwise, the hook should return an RTX representing the place where
a function returns a value.

On many machines, only @code{TYPE_MODE (@var{ret_type})} is relevant.
(Actually, on most machines, scalar values are returned in the same
place regardless of mode.)  The value of the expression is usually a
@code{reg} RTX for the hard register where the return value is stored.
The value can also be a @code{parallel} RTX, if the return value is in
multiple places.  See @code{TARGET_FUNCTION_ARG} for an explanation of the
@code{parallel} form.   Note that the callee will populate every
location specified in the @code{parallel}, but if the first element of
the @code{parallel} contains the whole return value, callers will use
that element as the canonical location and ignore the others.  The m68k
port uses this type of @code{parallel} to return pointers in both
@samp{%a0} (the canonical location) and @samp{%d0}.

If @code{TARGET_PROMOTE_FUNCTION_RETURN} returns true, you must apply
the same promotion rules specified in @code{PROMOTE_MODE} if
@var{valtype} is a scalar type.

If the precise function being called is known, @var{func} is a tree
node (@code{FUNCTION_DECL}) for it; otherwise, @var{func} is a null
pointer.  This makes it possible to use a different value-returning
convention for specific functions when all their calls are
known.

Some target machines have ``register windows'' so that the register in
which a function returns its value is not the same as the one in which
the caller sees the value.  For such machines, you should return
different RTX depending on @var{outgoing}.

@code{TARGET_FUNCTION_VALUE} is not used for return values with
aggregate data types, because these are returned in another way.  See
@code{TARGET_STRUCT_VALUE_RTX} and related macros, below.
@end deftypefn

@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

@deftypefn {Target Hook} rtx TARGET_LIBCALL_VALUE (machine_mode @var{mode}, const_rtx @var{fun})
Define this hook if the back-end needs to know the name of the libcall
function in order to determine where the result should be returned.

The mode of the result is given by @var{mode} and the name of the called
library function is given by @var{fun}.  The hook should return an RTX
representing the place where the library function result will be returned.

If this hook is not defined, then LIBCALL_VALUE will be used.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_FUNCTION_VALUE_REGNO_P (const unsigned int @var{regno})
A target hook that return @code{true} 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 target hook.

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

If this hook is not defined, then FUNCTION_VALUE_REGNO_P will be used.
@end deftypefn

@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

@deftypevr {Target Hook} bool TARGET_OMIT_STRUCT_RETURN_REG
Normally, when a function returns a structure by memory, the address
is passed as an invisible pointer argument, but the compiler also
arranges to return the address from the function like it would a normal
pointer return value.  Define this to true if that behavior is
undesirable on your target.
@end deftypevr

@deftypefn {Target Hook} bool TARGET_RETURN_IN_MSB (const_tree @var{type})
This hook should return true if values of type @var{type} are returned
at the most significant end of a register (in other words, if they are
padded at the least significant end).  You can assume that @var{type}
is returned in a register; the caller is required to check this.

Note that the register provided by @code{TARGET_FUNCTION_VALUE} must
be able to hold the complete return value.  For example, if a 1-, 2-
or 3-byte structure is returned at the most significant end of a
4-byte register, @code{TARGET_FUNCTION_VALUE} should provide an
@code{SImode} rtx.
@end deftypefn

@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.

@deftypefn {Target Hook} bool TARGET_RETURN_IN_MEMORY (const_tree @var{type}, const_tree @var{fntype})
This target hook should return a nonzero value to say to return the
function value in memory, just as large structures are always returned.
Here @var{type} will be the data type of the value, and @var{fntype}
will be the type of the function doing the returning, or @code{NULL} for
libcalls.

Note that values of mode @code{BLKmode} must be explicitly handled
by this function.  Also, the option @option{-fpcc-struct-return}
takes effect regardless of this macro.  On most systems, it is
possible to leave the hook undefined; this causes a default
definition to be used, whose value is the constant 1 for @code{BLKmode}
values, and 0 otherwise.

Do not use this hook to indicate that structures and unions should always
be returned in memory.  You should instead use @code{DEFAULT_PCC_STRUCT_RETURN}
to indicate this.
@end deftypefn

@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

@deftypefn {Target Hook} rtx TARGET_STRUCT_VALUE_RTX (tree @var{fndecl}, int @var{incoming})
This target hook should return the location of the structure value
address (normally a @code{mem} or @code{reg}), or 0 if the address is
passed as an ``invisible'' first argument.  Note that @var{fndecl} may
be @code{NULL}, for libcalls.  You do not need to define this target
hook if the address is always passed as an ``invisible'' first
argument.

On some architectures the place where the structure value address
is found by the called function is not the same place that the
caller put it.  This can be due to register windows, or it could
be because the function prologue moves it to a different place.
@var{incoming} is @code{1} or @code{2} when the location is needed in
the context of the called function, and @code{0} in the context of
the caller.

If @var{incoming} is nonzero and the address is to be found on the
stack, return a @code{mem} which refers to the frame pointer. If
@var{incoming} is @code{2}, the result is being used to fetch the
structure value address at the beginning of a function.  If you need
to emit adjusting code, you should do it at this point.
@end deftypefn

@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

@deftypefn {Target Hook} fixed_size_mode TARGET_GET_RAW_RESULT_MODE (int @var{regno})
This target hook returns the mode to be used when accessing raw return
registers in @code{__builtin_return}.  Define this macro if the value
in @var{reg_raw_mode} is not correct.
@end deftypefn

@deftypefn {Target Hook} fixed_size_mode TARGET_GET_RAW_ARG_MODE (int @var{regno})
This target hook returns the mode to be used when accessing raw argument
registers in @code{__builtin_apply_args}.  Define this macro if the value
in @var{reg_raw_mode} is not correct.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_EMPTY_RECORD_P (const_tree @var{type})
This target hook returns true if the type is an empty record.  The default
is to return @code{false}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_WARN_PARAMETER_PASSING_ABI (cumulative_args_t @var{ca}, tree @var{type})
This target hook warns about the change in empty class parameter passing
ABI.
@end deftypefn

@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.

@deftypefn {Target Hook} void TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY (FILE *@var{file}, unsigned HOST_WIDE_INT @var{patch_area_size}, bool @var{record_p})
Generate a patchable area at the function start, consisting of
@var{patch_area_size} NOP instructions.  If the target supports named
sections and if @var{record_p} is true, insert a pointer to the current
location in the table of patchable functions.  The default implementation
of the hook places the table of pointers in the special section named
@code{__patchable_function_entries}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_FUNCTION_PROLOGUE (FILE *@var{file})
If defined, a function that outputs the assembler code for entry to a
function.  The prologue is responsible for setting up the stack frame,
initializing the frame pointer register, saving registers that must be
saved, and allocating @var{size} additional bytes of storage for the
local variables.  @var{file} is a stdio stream to which the assembler
code should be output.

The label for the beginning of the function need not be output by this
macro.  That has already been done when the macro is run.

@findex regs_ever_live
To determine which registers to save, the macro can refer to the array
@code{regs_ever_live}: element @var{r} is nonzero if hard register
@var{r} is used anywhere within the function.  This implies the function
prologue should save register @var{r}, provided it is not one of the
call-used registers.  (@code{TARGET_ASM_FUNCTION_EPILOGUE} must likewise use
@code{regs_ever_live}.)

On machines that have ``register windows'', the function entry code does
not save on the stack the registers that are in the windows, even if
they are supposed to be preserved by function calls; instead it takes
appropriate steps to ``push'' the register stack, if any non-call-used
registers are used in the function.

@findex frame_pointer_needed
On machines where functions may or may not have frame-pointers, the
function entry code must vary accordingly; it must set up the frame
pointer if one is wanted, and not otherwise.  To determine whether a
frame pointer is in wanted, the macro can refer to the variable
@code{frame_pointer_needed}.  The variable's value will be 1 at run
time in a function that needs a frame pointer.  @xref{Elimination}.

The function entry code is responsible for allocating any stack space
required for the function.  This stack space consists of the regions
listed below.  In most cases, these regions are allocated in the
order listed, with the last listed region closest to the top of the
stack (the lowest address if @code{STACK_GROWS_DOWNWARD} is defined, and
the highest address if it is not defined).  You can use a different order
for a machine if doing so is more convenient or required for
compatibility reasons.  Except in cases where required by standard
or by a debugger, there is no reason why the stack layout used by GCC
need agree with that used by other compilers for a machine.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_FUNCTION_END_PROLOGUE (FILE *@var{file})
If defined, a function that outputs assembler code at the end of a
prologue.  This should be used when the function prologue is being
emitted as RTL, and you have some extra assembler that needs to be
emitted.  @xref{prologue instruction pattern}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_FUNCTION_BEGIN_EPILOGUE (FILE *@var{file})
If defined, a function that outputs assembler code at the start of an
epilogue.  This should be used when the function epilogue is being
emitted as RTL, and you have some extra assembler that needs to be
emitted.  @xref{epilogue instruction pattern}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_FUNCTION_EPILOGUE (FILE *@var{file})
If defined, a function that outputs the assembler code for exit from a
function.  The epilogue is responsible for restoring the saved
registers and stack pointer to their values when the function was
called, and returning control to the caller.  This macro takes the
same argument as the macro @code{TARGET_ASM_FUNCTION_PROLOGUE}, and the
registers to restore are determined from @code{regs_ever_live} and
@code{CALL_USED_REGISTERS} in the same way.

On some machines, there is a single instruction that does all the work
of returning from the function.  On these machines, give that
instruction the name @samp{return} and do not define the macro
@code{TARGET_ASM_FUNCTION_EPILOGUE} at all.

Do not define a pattern named @samp{return} if you want the
@code{TARGET_ASM_FUNCTION_EPILOGUE} to be used.  If you want the target
switches to control whether return instructions or epilogues are used,
define a @samp{return} pattern with a validity condition that tests the
target switches appropriately.  If the @samp{return} pattern's validity
condition is false, epilogues will be used.

On machines where functions may or may not have frame-pointers, the
function exit code must vary accordingly.  Sometimes the code for these
two cases is completely different.  To determine whether a frame pointer
is wanted, the macro can refer to the variable
@code{frame_pointer_needed}.  The variable's value will be 1 when compiling
a function that needs a frame pointer.

Normally, @code{TARGET_ASM_FUNCTION_PROLOGUE} and
@code{TARGET_ASM_FUNCTION_EPILOGUE} must treat leaf functions specially.
The C variable @code{current_function_is_leaf} is nonzero for such a
function.  @xref{Leaf Functions}.

On some machines, some functions pop their arguments on exit while
others leave that for the caller to do.  For example, the 68020 when
given @option{-mrtd} pops arguments in functions that take a fixed
number of arguments.

@findex pops_args
@findex crtl->args.pops_args
Your definition of the macro @code{RETURN_POPS_ARGS} decides which
functions pop their own arguments.  @code{TARGET_ASM_FUNCTION_EPILOGUE}
needs to know what was decided.  The number of bytes of the current
function's arguments that this function should pop is available in
@code{crtl->args.pops_args}.  @xref{Scalar Return}.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_MI_THUNK (FILE *@var{file}, tree @var{thunk_fndecl}, HOST_WIDE_INT @var{delta}, HOST_WIDE_INT @var{vcall_offset}, tree @var{function})
A function that outputs the assembler code for a thunk
function, used to implement C++ virtual function calls with multiple
inheritance.  The thunk acts as a wrapper around a virtual function,
adjusting the implicit object parameter before handing control off to
the real function.

First, emit code to add the integer @var{delta} to the location that
contains the incoming first argument.  Assume that this argument
contains a pointer, and is the one used to pass the @code{this} pointer
in C++.  This is the incoming argument @emph{before} the function prologue,
e.g.@: @samp{%o0} on a sparc.  The addition must preserve the values of
all other incoming arguments.

Then, if @var{vcall_offset} is nonzero, an additional adjustment should be
made after adding @code{delta}.  In particular, if @var{p} is the
adjusted pointer, the following adjustment should be made:

@smallexample
p += (*((ptrdiff_t **)p))[vcall_offset/sizeof(ptrdiff_t)]
@end smallexample

After the additions, emit code to jump to @var{function}, which is a
@code{FUNCTION_DECL}.  This is a direct pure jump, not a call, and does
not touch the return address.  Hence returning from @var{FUNCTION} will
return to whoever called the current @samp{thunk}.

The effect must be as if @var{function} had been called directly with
the adjusted first argument.  This macro is responsible for emitting all
of the code for a thunk function; @code{TARGET_ASM_FUNCTION_PROLOGUE}
and @code{TARGET_ASM_FUNCTION_EPILOGUE} are not invoked.

The @var{thunk_fndecl} is redundant.  (@var{delta} and @var{function}
have already been extracted from it.)  It might possibly be useful on
some targets, but probably not.

If you do not define this macro, the target-independent code in the C++
front end will generate a less efficient heavyweight thunk that calls
@var{function} instead of jumping to it.  The generic approach does
not support varargs.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ASM_CAN_OUTPUT_MI_THUNK (const_tree @var{thunk_fndecl}, HOST_WIDE_INT @var{delta}, HOST_WIDE_INT @var{vcall_offset}, const_tree @var{function})
A function that returns true if TARGET_ASM_OUTPUT_MI_THUNK would be able
to output the assembler code for the thunk function specified by the
arguments it is passed, and false otherwise.  In the latter case, the
generic approach will be used by the C++ front end, with the limitations
previously exposed.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_KEEP_LEAF_WHEN_PROFILED (void)
This target hook returns true if the target wants the leaf flag for
the current function to stay true even if it calls mcount.  This might
make sense for targets using the leaf flag only to determine whether a
stack frame needs to be generated or not and for which the call to
mcount is generated before the function prologue.
@end deftypefn

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

@deftypefn {Target Hook} bool TARGET_FUNCTION_OK_FOR_SIBCALL (tree @var{decl}, tree @var{exp})
True if it is OK to do sibling call optimization for the specified
call expression @var{exp}.  @var{decl} will be the called function,
or @code{NULL} if this is an indirect call.

It is not uncommon for limitations of calling conventions to prevent
tail calls to functions outside the current unit of translation, or
during PIC compilation.  The hook is used to enforce these restrictions,
as the @code{sibcall} md pattern cannot fail, or fall over to a
``normal'' call.  The criteria for successful sibling call optimization
may vary greatly between different architectures.
@end deftypefn

@deftypefn {Target Hook} void TARGET_EXTRA_LIVE_ON_ENTRY (bitmap @var{regs})
Add any hard registers to @var{regs} that are live on entry to the
function.  This hook only needs to be defined to provide registers that
cannot be found by examination of FUNCTION_ARG_REGNO_P, the callee saved
registers, STATIC_CHAIN_INCOMING_REGNUM, STATIC_CHAIN_REGNUM,
TARGET_STRUCT_VALUE_RTX, FRAME_POINTER_REGNUM, EH_USES,
FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, and the PIC_OFFSET_TABLE_REGNUM.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SET_UP_BY_PROLOGUE (struct hard_reg_set_container *@var{})
This hook should add additional registers that are computed by the prologue
to the hard regset for shrink-wrapping optimization purposes.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_WARN_FUNC_RETURN (tree)
True if a function's return statements should be checked for matching
the function's return type.  This includes checking for falling off the end
of a non-void function.  Return false if no such check should be made.
@end deftypefn

@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.

@deftypefn {Target Hook} sbitmap TARGET_SHRINK_WRAP_GET_SEPARATE_COMPONENTS (void)
This hook should return an @code{sbitmap} with the bits set for those
components that can be separately shrink-wrapped in the current function.
Return @code{NULL} if the current function should not get any separate
shrink-wrapping.
Don't define this hook if it would always return @code{NULL}.
If it is defined, the other hooks in this group have to be defined as well.
@end deftypefn

@deftypefn {Target Hook} sbitmap TARGET_SHRINK_WRAP_COMPONENTS_FOR_BB (basic_block)
This hook should return an @code{sbitmap} with the bits set for those
components where either the prologue component has to be executed before
the @code{basic_block}, or the epilogue component after it, or both.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SHRINK_WRAP_DISQUALIFY_COMPONENTS (sbitmap @var{components}, edge @var{e}, sbitmap @var{edge_components}, bool @var{is_prologue})
This hook should clear the bits in the @var{components} bitmap for those
components in @var{edge_components} that the target cannot handle on edge
@var{e}, where @var{is_prologue} says if this is for a prologue or an
epilogue instead.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SHRINK_WRAP_EMIT_PROLOGUE_COMPONENTS (sbitmap)
Emit prologue insns for the components indicated by the parameter.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SHRINK_WRAP_EMIT_EPILOGUE_COMPONENTS (sbitmap)
Emit epilogue insns for the components indicated by the parameter.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SHRINK_WRAP_SET_HANDLED_COMPONENTS (sbitmap)
Mark the components in the parameter as handled, so that the
@code{prologue} and @code{epilogue} named patterns know to ignore those
components.  The target code should not hang on to the @code{sbitmap}, it
will be deleted after this call.
@end deftypefn

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

@deftypefn {Target Hook} tree TARGET_STACK_PROTECT_GUARD (void)
This hook returns a @code{DECL} node for the external variable to use
for the stack protection guard.  This variable is initialized by the
runtime to some random value and is used to initialize the guard value
that is placed at the top of the local stack frame.  The type of this
variable must be @code{ptr_type_node}.

The default version of this hook creates a variable called
@samp{__stack_chk_guard}, which is normally defined in @file{libgcc2.c}.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_STACK_PROTECT_FAIL (void)
This hook returns a @code{CALL_EXPR} that alerts the runtime that the
stack protect guard variable has been modified.  This expression should
involve a call to a @code{noreturn} function.

The default version of this hook invokes a function called
@samp{__stack_chk_fail}, taking no arguments.  This function is
normally defined in @file{libgcc2.c}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_STACK_PROTECT_RUNTIME_ENABLED_P (void)
Returns true if the target wants GCC's default stack protect runtime support,
otherwise return false.  The default implementation always returns true.
@end deftypefn

@deftypefn {Common Target Hook} bool TARGET_SUPPORTS_SPLIT_STACK (bool @var{report}, struct gcc_options *@var{opts})
Whether this target supports splitting the stack when the options
described in @var{opts} have been passed.  This is called
after options have been parsed, so the target may reject splitting
the stack in some configurations.  The default version of this hook
returns false.  If @var{report} is true, this function may issue a warning
or error; if @var{report} is false, it must simply return a value
@end deftypefn

@deftypefn {Common Target Hook} {vec<const char *>} TARGET_GET_VALID_OPTION_VALUES (int @var{option_code}, const char *@var{prefix})
The hook is used for options that have a non-trivial list of
possible option values.  OPTION_CODE is option code of opt_code
enum type.  PREFIX is used for bash completion and allows an implementation
to return more specific completion based on the prefix.  All string values
should be allocated from heap memory and consumers should release them.
The result will be pruned to cases with PREFIX if not NULL.
@end deftypefn

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

@deftypevr {Target Hook} bool TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS
Set to true if each call that binds to a local definition explicitly
clobbers or sets all non-fixed registers modified by performing the call.
That is, by the call pattern itself, or by code that might be inserted by the
linker (e.g.@: stubs, veneers, branch islands), but not including those
modifiable by the callee.  The affected registers may be mentioned explicitly
in the call pattern, or included as clobbers in CALL_INSN_FUNCTION_USAGE.
The default version of this hook is set to false.  The purpose of this hook
is to enable the fipa-ra optimization.
@end deftypevr

@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:

@deftypefn {Target Hook} rtx TARGET_EXPAND_BUILTIN_SAVEREGS (void)
If defined, this hook produces the machine-specific code for a call to
@code{__builtin_saveregs}.  This code will be moved to the very
beginning of the function, before any parameter access are made.  The
return value of this function should be an RTX that contains the value
to use as the return of @code{__builtin_saveregs}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SETUP_INCOMING_VARARGS (cumulative_args_t @var{args_so_far}, const function_arg_info @var{&arg}, int *@var{pretend_args_size}, int @var{second_time})
This target hook offers an alternative to using
@code{__builtin_saveregs} and defining the hook
@code{TARGET_EXPAND_BUILTIN_SAVEREGS}.  Use it to store the anonymous
register arguments into the stack so that all the arguments appear to
have been passed consecutively on the stack.  Once this is done, you can
use the standard implementation of varargs that works for machines that
pass all their arguments on the stack.

The argument @var{args_so_far} points to the @code{CUMULATIVE_ARGS} data
structure, containing the values that are obtained after processing the
named arguments.  The argument @var{arg} describes the last of these named
arguments.

The target hook should do two things: first, push onto the stack all the
argument registers @emph{not} used for the named arguments, and second,
store the size of the data thus pushed into the @code{int}-valued
variable pointed to by @var{pretend_args_size}.  The value that you
store here will serve as additional offset for setting up the stack
frame.

Because you must generate code to push the anonymous arguments at
compile time without knowing their data types,
@code{TARGET_SETUP_INCOMING_VARARGS} is only useful on machines that
have just a single category of argument register and use it uniformly
for all data types.

If the argument @var{second_time} is nonzero, it means that the
arguments of the function are being analyzed for the second time.  This
happens for an inline function, which is not actually compiled until the
end of the source file.  The hook @code{TARGET_SETUP_INCOMING_VARARGS} should
not generate any instructions in this case.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_STRICT_ARGUMENT_NAMING (cumulative_args_t @var{ca})
Define this hook to return @code{true} if the location where a function
argument is passed depends on whether or not it is a named argument.

This hook controls how the @var{named} argument to @code{TARGET_FUNCTION_ARG}
is set for varargs and stdarg functions.  If this hook returns
@code{true}, the @var{named} argument is always true for named
arguments, and false for unnamed arguments.  If it returns @code{false},
but @code{TARGET_PRETEND_OUTGOING_VARARGS_NAMED} returns @code{true},
then all arguments are treated as named.  Otherwise, all named arguments
except the last are treated as named.

You need not define this hook if it always returns @code{false}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_CALL_ARGS (rtx, @var{tree})
While generating RTL for a function call, this target hook is invoked once
for each argument passed to the function, either a register returned by
@code{TARGET_FUNCTION_ARG} or a memory location.  It is called just
before the point where argument registers are stored.  The type of the
function to be called is also passed as the second argument; it is
@code{NULL_TREE} for libcalls.  The @code{TARGET_END_CALL_ARGS} hook is
invoked just after the code to copy the return reg has been emitted.
This functionality can be used to perform special setup of call argument
registers if a target needs it.
For functions without arguments, the hook is called once with @code{pc_rtx}
passed instead of an argument register.
Most ports do not need to implement anything for this hook.
@end deftypefn

@deftypefn {Target Hook} void TARGET_END_CALL_ARGS (void)
This target hook is invoked while generating RTL for a function call,
just after the point where the return reg is copied into a pseudo.  It
signals that all the call argument and return registers for the just
emitted call are now no longer in use.
Most ports do not need to implement anything for this hook.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_PRETEND_OUTGOING_VARARGS_NAMED (cumulative_args_t @var{ca})
If you need to conditionally change ABIs so that one works with
@code{TARGET_SETUP_INCOMING_VARARGS}, but the other works like neither
@code{TARGET_SETUP_INCOMING_VARARGS} nor @code{TARGET_STRICT_ARGUMENT_NAMING} was
defined, then define this hook to return @code{true} if
@code{TARGET_SETUP_INCOMING_VARARGS} is used, @code{false} otherwise.
Otherwise, you should not define this hook.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_LOAD_BOUNDS_FOR_ARG (rtx @var{slot}, rtx @var{arg}, rtx @var{slot_no})
This hook is used by expand pass to emit insn to load bounds of
@var{arg} passed in @var{slot}.  Expand pass uses this hook in case
bounds of @var{arg} are not passed in register.  If @var{slot} is a
memory, then bounds are loaded as for regular pointer loaded from
memory.  If @var{slot} is not a memory then @var{slot_no} is an integer
constant holding number of the target dependent special slot which
should be used to obtain bounds.  Hook returns RTX holding loaded bounds.
@end deftypefn

@deftypefn {Target Hook} void TARGET_STORE_BOUNDS_FOR_ARG (rtx @var{arg}, rtx @var{slot}, rtx @var{bounds}, rtx @var{slot_no})
This hook is used by expand pass to emit insns to store @var{bounds} of
@var{arg} passed in @var{slot}.  Expand pass uses this hook in case
@var{bounds} of @var{arg} are not passed in register.  If @var{slot} is a
memory, then @var{bounds} are stored as for regular pointer stored in
memory.  If @var{slot} is not a memory then @var{slot_no} is an integer
constant holding number of the target dependent special slot which
should be used to store @var{bounds}.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_LOAD_RETURNED_BOUNDS (rtx @var{slot})
This hook is used by expand pass to emit insn to load bounds
returned by function call in @var{slot}.  Hook returns RTX holding
loaded bounds.
@end deftypefn

@deftypefn {Target Hook} void TARGET_STORE_RETURNED_BOUNDS (rtx @var{slot}, rtx @var{bounds})
This hook is used by expand pass to emit insn to store @var{bounds}
returned by function call into @var{slot}.
@end deftypefn

@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.

@deftypevr {Target Hook} int TARGET_CUSTOM_FUNCTION_DESCRIPTORS
If the target can use GCC's generic descriptor mechanism for nested
functions, define this hook to a power of 2 representing an unused bit
in function pointers which can be used to differentiate descriptors at
run time.  This value gives the number of bytes by which descriptor
pointers are misaligned compared to function pointers.  For example, on
targets that require functions to be aligned to a 4-byte boundary, a
value of either 1 or 2 is appropriate unless the architecture already
reserves the bit for another purpose, such as on ARM.

Define this hook to 0 if the target implements ABI support for
function descriptors in its standard calling sequence, like for example
HPPA or IA-64.

Using descriptors for nested functions
eliminates the need for trampolines that reside on the stack and require
it to be made executable.
@end deftypevr

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.

@deftypefn {Target Hook} void TARGET_ASM_TRAMPOLINE_TEMPLATE (FILE *@var{f})
This hook is called by @code{assemble_trampoline_template} to output,
on the stream @var{f}, assembler code for a block of data that contains
the constant parts of a trampoline.  This code should not include a
label---the label is taken care of automatically.

If you do not define this hook, it means no template is needed
for the target.  Do not define this hook on systems where the block move
code to copy the trampoline into place would be larger than the code
to generate it on the spot.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_TRAMPOLINE_INIT (rtx @var{m_tramp}, tree @var{fndecl}, rtx @var{static_chain})
This hook is called to initialize a trampoline.
@var{m_tramp} is an RTX for the memory block for the trampoline; @var{fndecl}
is the @code{FUNCTION_DECL} for the nested function; @var{static_chain} is an
RTX for the static chain value that should be passed to the function
when it is called.

If the target defines @code{TARGET_ASM_TRAMPOLINE_TEMPLATE}, then the
first thing this hook should do is emit a block move into @var{m_tramp}
from the memory block returned by @code{assemble_trampoline_template}.
Note that the block move need only cover the constant parts of the
trampoline.  If the target isolates the variable parts of the trampoline
to the end, not all @code{TRAMPOLINE_SIZE} bytes need be copied.

If the target requires any other actions, such as flushing caches
(possibly calling function maybe_emit_call_builtin___clear_cache) or
enabling stack execution, these actions should be performed after
initializing the trampoline proper.
@end deftypefn

@deftypefn {Target Hook} void TARGET_EMIT_CALL_BUILTIN___CLEAR_CACHE (rtx @var{begin}, rtx @var{end})
On targets that do not define a @code{clear_cache} insn expander,
but that define the @code{CLEAR_CACHE_INSN} macro,
maybe_emit_call_builtin___clear_cache relies on this target hook
to clear an address range in the instruction cache.

The default implementation calls the @code{__clear_cache} builtin,
taking the assembler name from the builtin declaration.  Overriding
definitions may call alternate functions, with alternate calling
conventions, or emit alternate RTX to perform the job.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_TRAMPOLINE_ADJUST_ADDRESS (rtx @var{addr})
This hook should perform any machine-specific adjustment in
the address of the trampoline.  Its argument contains the address of the
memory block that was passed to @code{TARGET_TRAMPOLINE_INIT}.  In case
the address to be used for a function call should be different from the
address at which the template was stored, the different address should
be returned; otherwise @var{addr} should be returned unchanged.
If this hook is not defined, @var{addr} will be used for function calls.
@end deftypefn

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
@deftypefn {Target Hook} void TARGET_INIT_LIBFUNCS (void)
This hook should declare additional library routines or rename
existing ones, using the functions @code{set_optab_libfunc} and
@code{init_one_libfunc} defined in @file{optabs.c}.
@code{init_optabs} calls this macro after initializing all the normal
library routines.

The default is to do nothing.  Most ports don't need to define this hook.
@end deftypefn

@deftypevr {Target Hook} bool TARGET_LIBFUNC_GNU_PREFIX
If false (the default), internal library routines start with two
underscores.  If set to true, these routines start with @code{__gnu_}
instead.  E.g., @code{__muldi3} changes to @code{__gnu_muldi3}.  This
currently only affects functions defined in @file{libgcc2.c}.  If this
is set to true, the @file{tm.h} file must also
@code{#define LIBGCC2_GNU_PREFIX}.
@end deftypevr

@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

@deftypefn {Target Hook} bool TARGET_LIBC_HAS_FUNCTION (enum function_class @var{fn_class}, tree @var{type})
This hook determines whether a function from a class of functions
@var{fn_class} is present in the target C library.  If @var{type} is NULL,
the caller asks for support for all standard (float, double, long double)
types.  If @var{type} is non-NULL, the caller asks for support for a
specific type.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_LIBC_HAS_FAST_FUNCTION (int @var{fcode})
This hook determines whether a function from a class of functions
@code{(enum function_class)}@var{fcode} has a fast implementation.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_LEGITIMATE_ADDRESS_P (machine_mode @var{mode}, rtx @var{x}, bool @var{strict})
A function that returns whether @var{x} (an RTX) is a legitimate memory
address on the target machine for a memory operand of mode @var{mode}.

Legitimate addresses are defined in two variants: a strict variant and a
non-strict one.  The @var{strict} parameter chooses which variant is
desired by the caller.

The strict variant is used in the reload pass.  It must be defined so
that any pseudo-register that has not been allocated a hard register is
considered a memory reference.  This is because in contexts where some
kind of register is required, a pseudo-register with no hard register
must be rejected.  For non-hard registers, the strict variant should look
up the @code{reg_renumber} array; it should then proceed using the hard
register number in the array, or treat the pseudo as a memory reference
if the array holds @code{-1}.

The non-strict variant is used in other passes.  It must be defined to
accept all pseudo-registers in every context where some kind of
register is required.

Normally, constant addresses which are the sum of a @code{symbol_ref}
and an integer are stored inside a @code{const} RTX to mark them as
constant.  Therefore, there is no need to recognize such sums
specifically as legitimate addresses.  Normally you would simply
recognize any @code{const} as legitimate.

Usually @code{PRINT_OPERAND_ADDRESS} is not prepared to handle constant
sums that are not marked with  @code{const}.  It assumes that a naked
@code{plus} indicates indexing.  If so, then you @emph{must} reject such
naked constant sums as illegitimate addresses, so that none of them will
be given to @code{PRINT_OPERAND_ADDRESS}.

@cindex @code{TARGET_ENCODE_SECTION_INFO} and address validation
On some machines, whether a symbolic address is legitimate depends on
the section that the address refers to.  On these machines, define the
target hook @code{TARGET_ENCODE_SECTION_INFO} to store the information
into the @code{symbol_ref}, and then check for it here.  When you see a
@code{const}, you will have to look inside it to find the
@code{symbol_ref} in order to determine the section.  @xref{Assembler
Format}.

@cindex @code{GO_IF_LEGITIMATE_ADDRESS}
Some ports are still using a deprecated legacy substitute for
this hook, the @code{GO_IF_LEGITIMATE_ADDRESS} macro.  This macro
has this syntax:

@example
#define GO_IF_LEGITIMATE_ADDRESS (@var{mode}, @var{x}, @var{label})
@end example

@noindent
and should @code{goto @var{label}} if the address @var{x} is a valid
address on the target machine for a memory operand of mode @var{mode}.

@findex REG_OK_STRICT
Compiler source files that want to use the strict variant of this
macro define the macro @code{REG_OK_STRICT}.  You should use an
@code{#ifdef REG_OK_STRICT} conditional to define the strict variant in
that case and the non-strict variant otherwise.

Using the hook is usually simpler because it limits the number of
files that are recompiled when changes are made.
@end deftypefn

@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.c}
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.c}.

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

@deftypefn {Target Hook} rtx TARGET_LEGITIMIZE_ADDRESS (rtx @var{x}, rtx @var{oldx}, machine_mode @var{mode})
This hook is given an invalid memory address @var{x} for an
operand of mode @var{mode} and should try to return a valid memory
address.

@findex break_out_memory_refs
@var{x} will always be the result of a call to @code{break_out_memory_refs},
and @var{oldx} will be the operand that was given to that function to produce
@var{x}.

The code of the hook should not alter the substructure of
@var{x}.  If it transforms @var{x} into a more legitimate form, it
should return the new @var{x}.

It is not necessary for this hook to come up with a legitimate address,
with the exception of native TLS addresses (@pxref{Emulated TLS}).
The compiler has standard ways of doing so in all cases.  In fact, if
the target supports only emulated TLS, it
is safe to omit this hook or make it return @var{x} if it cannot find
a valid way to legitimize the address.  But often a machine-dependent
strategy can generate better code.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_MODE_DEPENDENT_ADDRESS_P (const_rtx @var{addr}, addr_space_t @var{addrspace})
This hook returns @code{true} if memory address @var{addr} in address
space @var{addrspace} can have
different meanings depending on the machine mode of the memory
reference it is used for or if the address is valid for some modes
but not others.

Autoincrement and autodecrement addresses typically have mode-dependent
effects because the amount of the increment or decrement is the size
of the operand being addressed.  Some machines have other mode-dependent
addresses.  Many RISC machines have no mode-dependent addresses.

You may assume that @var{addr} is a valid address for the machine.

The default version of this hook returns @code{false}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_LEGITIMATE_CONSTANT_P (machine_mode @var{mode}, rtx @var{x})
This hook returns true if @var{x} is a legitimate constant for a
@var{mode}-mode immediate operand on the target machine.  You can assume that
@var{x} satisfies @code{CONSTANT_P}, so you need not check this.

The default definition returns true.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_PRECOMPUTE_TLS_P (machine_mode @var{mode}, rtx @var{x})
This hook returns true if @var{x} is a TLS operand on the target
machine that should be pre-computed when used as the argument in a call.
You can assume that @var{x} satisfies @code{CONSTANT_P}, so you need not 
check this.

The default definition returns false.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_DELEGITIMIZE_ADDRESS (rtx @var{x})
This hook is used to undo the possibly obfuscating effects of the
@code{LEGITIMIZE_ADDRESS} and @code{LEGITIMIZE_RELOAD_ADDRESS} target
macros.  Some backend implementations of these macros wrap symbol
references inside an @code{UNSPEC} rtx to represent PIC or similar
addressing modes.  This target hook allows GCC's optimizers to understand
the semantics of these opaque @code{UNSPEC}s by converting them back
into their original form.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CONST_NOT_OK_FOR_DEBUG_P (rtx @var{x})
This hook should return true if @var{x} should not be emitted into
debug sections.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CANNOT_FORCE_CONST_MEM (machine_mode @var{mode}, rtx @var{x})
This hook should return true if @var{x} is of a form that cannot (or
should not) be spilled to the constant pool.  @var{mode} is the mode
of @var{x}.

The default version of this hook returns false.

The primary reason to define this hook is to prevent reload from
deciding that a non-legitimate constant would be better reloaded
from the constant pool instead of spilling and reloading a register
holding the constant.  This restriction is often true of addresses
of TLS symbols for various targets.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_USE_BLOCKS_FOR_CONSTANT_P (machine_mode @var{mode}, const_rtx @var{x})
This hook should return true if pool entries for constant @var{x} can
be placed in an @code{object_block} structure.  @var{mode} is the mode
of @var{x}.

The default version returns false for all constants.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_USE_BLOCKS_FOR_DECL_P (const_tree @var{decl})
This hook should return true if pool entries for @var{decl} should
be placed in an @code{object_block} structure.

The default version returns true for all decls.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_BUILTIN_RECIPROCAL (tree @var{fndecl})
This hook should return the DECL of a function that implements the
reciprocal of the machine-specific builtin function @var{fndecl}, or
@code{NULL_TREE} if such a function is not available.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD (void)
This hook should return the DECL of a function @var{f} that given an
address @var{addr} as an argument returns a mask @var{m} that can be
used to extract from two vectors the relevant data that resides in
@var{addr} in case @var{addr} is not properly aligned.

The autovectorizer, when vectorizing a load operation from an address
@var{addr} that may be unaligned, will generate two vector loads from
the two aligned addresses around @var{addr}. It then generates a
@code{REALIGN_LOAD} operation to extract the relevant data from the
two loaded vectors. The first two arguments to @code{REALIGN_LOAD},
@var{v1} and @var{v2}, are the two vectors, each of size @var{VS}, and
the third argument, @var{OFF}, defines how the data will be extracted
from these two vectors: if @var{OFF} is 0, then the returned vector is
@var{v2}; otherwise, the returned vector is composed from the last
@var{VS}-@var{OFF} elements of @var{v1} concatenated to the first
@var{OFF} elements of @var{v2}.

If this hook is defined, the autovectorizer will generate a call
to @var{f} (using the DECL tree that this hook returns) and will
use the return value of @var{f} as the argument @var{OFF} to
@code{REALIGN_LOAD}. Therefore, the mask @var{m} returned by @var{f}
should comply with the semantics expected by @code{REALIGN_LOAD}
described above.
If this hook is not defined, then @var{addr} will be used as
the argument @var{OFF} to @code{REALIGN_LOAD}, in which case the low
log2(@var{VS}) @minus{} 1 bits of @var{addr} will be considered.
@end deftypefn

@deftypefn {Target Hook} int TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST (enum vect_cost_for_stmt @var{type_of_cost}, tree @var{vectype}, int @var{misalign})
Returns cost of different scalar or vector statements for vectorization cost model.
For vector memory operations the cost may depend on type (@var{vectype}) and
misalignment value (@var{misalign}).
@end deftypefn

@deftypefn {Target Hook} poly_uint64 TARGET_VECTORIZE_PREFERRED_VECTOR_ALIGNMENT (const_tree @var{type})
This hook returns the preferred alignment in bits for accesses to
vectors of type @var{type} in vectorized code.  This might be less than
or greater than the ABI-defined value returned by
@code{TARGET_VECTOR_ALIGNMENT}.  It can be equal to the alignment of
a single element, in which case the vectorizer will not try to optimize
for alignment.

The default hook returns @code{TYPE_ALIGN (@var{type})}, which is
correct for most targets.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE (const_tree @var{type}, bool @var{is_packed})
Return true if vector alignment is reachable (by peeling N iterations)
for the given scalar type @var{type}.  @var{is_packed} is false if the scalar
access using @var{type} is known to be naturally aligned.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_VECTORIZE_VEC_PERM_CONST (machine_mode @var{mode}, rtx @var{output}, rtx @var{in0}, rtx @var{in1}, const vec_perm_indices @var{&sel})
This hook is used to test whether the target can permute up to two
vectors of mode @var{mode} using the permutation vector @code{sel}, and
also to emit such a permutation.  In the former case @var{in0}, @var{in1}
and @var{out} are all null.  In the latter case @var{in0} and @var{in1} are
the source vectors and @var{out} is the destination vector; all three are
operands of mode @var{mode}.  @var{in1} is the same as @var{in0} if
@var{sel} describes a permutation on one vector instead of two.

Return true if the operation is possible, emitting instructions for it
if rtxes are provided.

@cindex @code{vec_perm@var{m}} instruction pattern
If the hook returns false for a mode with multibyte elements, GCC will
try the equivalent byte operation.  If that also fails, it will try forcing
the selector into a register and using the @var{vec_perm@var{mode}}
instruction pattern.  There is no need for the hook to handle these two
implementation approaches itself.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION (unsigned @var{code}, tree @var{vec_type_out}, tree @var{vec_type_in})
This hook should return the decl of a function that implements the
vectorized variant of the function with the @code{combined_fn} code
@var{code} or @code{NULL_TREE} if such a function is not available.
The return type of the vectorized function shall be of vector type
@var{vec_type_out} and the argument types should be @var{vec_type_in}.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_VECTORIZE_BUILTIN_MD_VECTORIZED_FUNCTION (tree @var{fndecl}, tree @var{vec_type_out}, tree @var{vec_type_in})
This hook should return the decl of a function that implements the
vectorized variant of target built-in function @code{fndecl}.  The
return type of the vectorized function shall be of vector type
@var{vec_type_out} and the argument types should be @var{vec_type_in}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT (machine_mode @var{mode}, const_tree @var{type}, int @var{misalignment}, bool @var{is_packed})
This hook should return true if the target supports misaligned vector
store/load of a specific factor denoted in the @var{misalignment}
parameter.  The vector store/load should be of machine mode @var{mode} and
the elements in the vectors should be of type @var{type}.  @var{is_packed}
parameter is true if the memory access is defined in a packed struct.
@end deftypefn

@deftypefn {Target Hook} machine_mode TARGET_VECTORIZE_PREFERRED_SIMD_MODE (scalar_mode @var{mode})
This hook should return the preferred mode for vectorizing scalar
mode @var{mode}.  The default is
equal to @code{word_mode}, because the vectorizer can do some
transformations even in absence of specialized @acronym{SIMD} hardware.
@end deftypefn

@deftypefn {Target Hook} machine_mode TARGET_VECTORIZE_SPLIT_REDUCTION (machine_mode)
This hook should return the preferred mode to split the final reduction
step on @var{mode} to.  The reduction is then carried out reducing upper
against lower halves of vectors recursively until the specified mode is
reached.  The default is @var{mode} which means no splitting.
@end deftypefn

@deftypefn {Target Hook} {unsigned int} TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_MODES (vector_modes *@var{modes}, bool @var{all})
If using the mode returned by @code{TARGET_VECTORIZE_PREFERRED_SIMD_MODE}
is not the only approach worth considering, this hook should add one mode to
@var{modes} for each useful alternative approach.  These modes are then
passed to @code{TARGET_VECTORIZE_RELATED_MODE} to obtain the vector mode
for a given element mode.

The modes returned in @var{modes} should use the smallest element mode
possible for the vectorization approach that they represent, preferring
integer modes over floating-poing modes in the event of a tie.  The first
mode should be the @code{TARGET_VECTORIZE_PREFERRED_SIMD_MODE} for its
element mode.

If @var{all} is true, add suitable vector modes even when they are generally
not expected to be worthwhile.

The hook returns a bitmask of flags that control how the modes in
@var{modes} are used.  The flags are:
@table @code
@item VECT_COMPARE_COSTS
Tells the loop vectorizer to try all the provided modes and pick the one
with the lowest cost.  By default the vectorizer will choose the first
mode that works.
@end table

The hook does not need to do anything if the vector returned by
@code{TARGET_VECTORIZE_PREFERRED_SIMD_MODE} is the only one relevant
for autovectorization.  The default implementation adds no modes and
returns 0.
@end deftypefn

@deftypefn {Target Hook} opt_machine_mode TARGET_VECTORIZE_RELATED_MODE (machine_mode @var{vector_mode}, scalar_mode @var{element_mode}, poly_uint64 @var{nunits})
If a piece of code is using vector mode @var{vector_mode} and also wants
to operate on elements of mode @var{element_mode}, return the vector mode
it should use for those elements.  If @var{nunits} is nonzero, ensure that
the mode has exactly @var{nunits} elements, otherwise pick whichever vector
size pairs the most naturally with @var{vector_mode}.  Return an empty
@code{opt_machine_mode} if there is no supported vector mode with the
required properties.

There is no prescribed way of handling the case in which @var{nunits}
is zero.  One common choice is to pick a vector mode with the same size
as @var{vector_mode}; this is the natural choice if the target has a
fixed vector size.  Another option is to choose a vector mode with the
same number of elements as @var{vector_mode}; this is the natural choice
if the target has a fixed number of elements.  Alternatively, the hook
might choose a middle ground, such as trying to keep the number of
elements as similar as possible while applying maximum and minimum
vector sizes.

The default implementation uses @code{mode_for_vector} to find the
requested mode, returning a mode with the same size as @var{vector_mode}
when @var{nunits} is zero.  This is the correct behavior for most targets.
@end deftypefn

@deftypefn {Target Hook} opt_machine_mode TARGET_VECTORIZE_GET_MASK_MODE (machine_mode @var{mode})
Return the mode to use for a vector mask that holds one boolean
result for each element of vector mode @var{mode}.  The returned mask mode
can be a vector of integers (class @code{MODE_VECTOR_INT}), a vector of
booleans (class @code{MODE_VECTOR_BOOL}) or a scalar integer (class
@code{MODE_INT}).  Return an empty @code{opt_machine_mode} if no such
mask mode exists.

The default implementation returns a @code{MODE_VECTOR_INT} with the
same size and number of elements as @var{mode}, if such a mode exists.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_VECTORIZE_EMPTY_MASK_IS_EXPENSIVE (unsigned @var{ifn})
This hook returns true if masked internal function @var{ifn} (really of
type @code{internal_fn}) should be considered expensive when the mask is
all zeros.  GCC can then try to branch around the instruction instead.
@end deftypefn

@deftypefn {Target Hook} {void *} TARGET_VECTORIZE_INIT_COST (class loop *@var{loop_info}, bool @var{costing_for_scalar})
This hook should initialize target-specific data structures in preparation
for modeling the costs of vectorizing a loop or basic block.  The default
allocates three unsigned integers for accumulating costs for the prologue,
body, and epilogue of the loop or basic block.  If @var{loop_info} is
non-NULL, it identifies the loop being vectorized; otherwise a single block
is being vectorized.  If @var{costing_for_scalar} is true, it indicates the
current cost model is for the scalar version of a loop or block; otherwise
it is for the vector version.
@end deftypefn

@deftypefn {Target Hook} unsigned TARGET_VECTORIZE_ADD_STMT_COST (class vec_info *@var{}, void *@var{data}, int @var{count}, enum vect_cost_for_stmt @var{kind}, class _stmt_vec_info *@var{stmt_info}, tree @var{vectype}, int @var{misalign}, enum vect_cost_model_location @var{where})
This hook should update the target-specific @var{data} in response to
adding @var{count} copies of the given @var{kind} of statement to a
loop or basic block.  The default adds the builtin vectorizer cost for
the copies of the statement to the accumulator specified by @var{where},
(the prologue, body, or epilogue) and returns the amount added.  The
return value should be viewed as a tentative cost that may later be
revised.
@end deftypefn

@deftypefn {Target Hook} void TARGET_VECTORIZE_FINISH_COST (void *@var{data}, unsigned *@var{prologue_cost}, unsigned *@var{body_cost}, unsigned *@var{epilogue_cost})
This hook should complete calculations of the cost of vectorizing a loop
or basic block based on @var{data}, and return the prologue, body, and
epilogue costs as unsigned integers.  The default returns the value of
the three accumulators.
@end deftypefn

@deftypefn {Target Hook} void TARGET_VECTORIZE_DESTROY_COST_DATA (void *@var{data})
This hook should release @var{data} and any related data structures
allocated by TARGET_VECTORIZE_INIT_COST.  The default releases the
accumulator.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_VECTORIZE_BUILTIN_GATHER (const_tree @var{mem_vectype}, const_tree @var{index_type}, int @var{scale})
Target builtin that implements vector gather operation.  @var{mem_vectype}
is the vector type of the load and @var{index_type} is scalar type of
the index, scaled by @var{scale}.
The default is @code{NULL_TREE} which means to not vectorize gather
loads.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_VECTORIZE_BUILTIN_SCATTER (const_tree @var{vectype}, const_tree @var{index_type}, int @var{scale})
Target builtin that implements vector scatter operation.  @var{vectype}
is the vector type of the store and @var{index_type} is scalar type of
the index, scaled by @var{scale}.
The default is @code{NULL_TREE} which means to not vectorize scatter
stores.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SIMD_CLONE_COMPUTE_VECSIZE_AND_SIMDLEN (struct cgraph_node *@var{}, struct cgraph_simd_clone *@var{}, @var{tree}, @var{int})
This hook should set @var{vecsize_mangle}, @var{vecsize_int}, @var{vecsize_float}
fields in @var{simd_clone} structure pointed by @var{clone_info} argument and also
@var{simdlen} field if it was previously 0.
The hook should return 0 if SIMD clones shouldn't be emitted,
or number of @var{vecsize_mangle} variants that should be emitted.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SIMD_CLONE_ADJUST (struct cgraph_node *@var{})
This hook should add implicit @code{attribute(target("..."))} attribute
to SIMD clone @var{node} if needed.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SIMD_CLONE_USABLE (struct cgraph_node *@var{})
This hook should return -1 if SIMD clone @var{node} shouldn't be used
in vectorized loops in current function, or non-negative number if it is
usable.  In that case, the smaller the number is, the more desirable it is
to use it.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SIMT_VF (void)
Return number of threads in SIMT thread group on the target.
@end deftypefn

@deftypefn {Target Hook} int TARGET_OMP_DEVICE_KIND_ARCH_ISA (enum omp_device_kind_arch_isa @var{trait}, const char *@var{name})
Return 1 if @var{trait} @var{name} is present in the OpenMP context's
device trait set, return 0 if not present in any OpenMP context in the
whole translation unit, or -1 if not present in the current OpenMP context
but might be present in another OpenMP context in the same TU.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_GOACC_VALIDATE_DIMS (tree @var{decl}, int *@var{dims}, int @var{fn_level}, unsigned @var{used})
This hook should check the launch dimensions provided for an OpenACC
compute region, or routine.  Defaulted values are represented as -1
and non-constant values as 0.  The @var{fn_level} is negative for the
function corresponding to the compute region.  For a routine it is the
outermost level at which partitioned execution may be spawned.  The hook
should verify non-default values.  If DECL is NULL, global defaults
are being validated and unspecified defaults should be filled in.
Diagnostics should be issued as appropriate.  Return
true, if changes have been made.  You must override this hook to
provide dimensions larger than 1.
@end deftypefn

@deftypefn {Target Hook} int TARGET_GOACC_DIM_LIMIT (int @var{axis})
This hook should return the maximum size of a particular dimension,
or zero if unbounded.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_GOACC_FORK_JOIN (gcall *@var{call}, const int *@var{dims}, bool @var{is_fork})
This hook can be used to convert IFN_GOACC_FORK and IFN_GOACC_JOIN
function calls to target-specific gimple, or indicate whether they
should be retained.  It is executed during the oacc_device_lower pass.
It should return true, if the call should be retained.  It should
return false, if it is to be deleted (either because target-specific
gimple has been inserted before it, or there is no need for it).
The default hook returns false, if there are no RTL expanders for them.
@end deftypefn

@deftypefn {Target Hook} void TARGET_GOACC_REDUCTION (gcall *@var{call})
This hook is used by the oacc_transform pass to expand calls to the
@var{GOACC_REDUCTION} internal function, into a sequence of gimple
instructions.  @var{call} is gimple statement containing the call to
the function.  This hook removes statement @var{call} after the
expanded sequence has been inserted.  This hook is also responsible
for allocating any storage for reductions when necessary.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_PREFERRED_ELSE_VALUE (unsigned @var{ifn}, tree @var{type}, unsigned @var{nops}, tree *@var{ops})
This hook returns the target's preferred final argument for a call
to conditional internal function @var{ifn} (really of type
@code{internal_fn}).  @var{type} specifies the return type of the
function and @var{ops} are the operands to the conditional operation,
of which there are @var{nops}.

For example, if @var{ifn} is @code{IFN_COND_ADD}, the hook returns
a value of type @var{type} that should be used when @samp{@var{ops}[0]}
and @samp{@var{ops}[1]} are conditionally added together.

This hook is only relevant if the target supports conditional patterns
like @code{cond_add@var{m}}.  The default implementation returns a zero
constant of type @var{type}.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_GOACC_ADJUST_PRIVATE_DECL (location_t @var{loc}, tree @var{var}, int @var{level})
This hook, if defined, is used by accelerator target back-ends to adjust
OpenACC variable declarations that should be made private to the given
parallelism level (i.e. @code{GOMP_DIM_GANG}, @code{GOMP_DIM_WORKER} or
@code{GOMP_DIM_VECTOR}).  A typical use for this hook is to force variable
declarations at the @code{gang} level to reside in GPU shared memory.
@var{loc} may be used for diagnostic purposes.

You may also use the @code{TARGET_GOACC_EXPAND_VAR_DECL} hook if the
adjusted variable declaration needs to be expanded to RTL in a non-standard
way.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_GOACC_EXPAND_VAR_DECL (tree @var{var})
This hook, if defined, is used by accelerator target back-ends to expand
specially handled kinds of @code{VAR_DECL} expressions.  A particular use is
to place variables with specific attributes inside special accelarator
memories.  A return value of @code{NULL} indicates that the target does not
handle this @code{VAR_DECL}, and normal RTL expanding is resumed.

Only define this hook if your accelerator target needs to expand certain
@code{VAR_DECL} nodes in a way that differs from the default.  You can also adjust
private variables at OpenACC device-lowering time using the
@code{TARGET_GOACC_ADJUST_PRIVATE_DECL} target hook.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_GOACC_CREATE_WORKER_BROADCAST_RECORD (tree @var{rec}, bool @var{sender}, const char *@var{name})
Create a record used to propagate local-variable state from an active
worker to other workers.  A possible implementation might adjust the type
of REC to place the new variable in shared GPU memory.

Presence of this target hook indicates that middle end neutering/broadcasting
be used.
@end deftypefn

@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.

@deftypevr {Target Hook} HOST_WIDE_INT TARGET_MIN_ANCHOR_OFFSET
The minimum offset that should be applied to a section anchor.
On most targets, it should be the smallest offset that can be
applied to a base register while still giving a legitimate address
for every mode.  The default value is 0.
@end deftypevr

@deftypevr {Target Hook} HOST_WIDE_INT TARGET_MAX_ANCHOR_OFFSET
Like @code{TARGET_MIN_ANCHOR_OFFSET}, but the maximum (inclusive)
offset that should be applied to section anchors.  The default
value is 0.
@end deftypevr

@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_ANCHOR (rtx @var{x})
Write the assembly code to define section anchor @var{x}, which is a
@code{SYMBOL_REF} for which @samp{SYMBOL_REF_ANCHOR_P (@var{x})} is true.
The hook is called with the assembly output position set to the beginning
of @code{SYMBOL_REF_BLOCK (@var{x})}.

If @code{ASM_OUTPUT_DEF} is available, the hook's default definition uses
it to define the symbol as @samp{. + SYMBOL_REF_BLOCK_OFFSET (@var{x})}.
If @code{ASM_OUTPUT_DEF} is not available, the hook's default definition
is @code{NULL}, which disables the use of section anchors altogether.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_USE_ANCHORS_FOR_SYMBOL_P (const_rtx @var{x})
Return true if GCC should attempt to use anchors to access @code{SYMBOL_REF}
@var{x}.  You can assume @samp{SYMBOL_REF_HAS_BLOCK_INFO_P (@var{x})} and
@samp{!SYMBOL_REF_ANCHOR_P (@var{x})}.

The default version is correct for most targets, but you might need to
intercept this hook to handle things like target-specific attributes
or target-specific sections.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_CANONICALIZE_COMPARISON (int *@var{code}, rtx *@var{op0}, rtx *@var{op1}, bool @var{op0_preserve_value})
On some machines not all possible comparisons are defined, but you can
convert an invalid comparison into a valid one.  For example, the Alpha
does not have a @code{GT} comparison, but you can use an @code{LT}
comparison instead and swap the order of the operands.

On such machines, implement this hook to do any required conversions.
@var{code} is the initial comparison code and @var{op0} and @var{op1}
are the left and right operands of the comparison, respectively.  If
@var{op0_preserve_value} is @code{true} the implementation is not
allowed to change the value of @var{op0} since the value might be used
in RTXs which aren't comparisons.  E.g. the implementation is not
allowed to swap operands in that case.

GCC will not assume that the comparison resulting from this macro is
valid but will see if the resulting insn matches a pattern in the
@file{md} file.

You need not to implement this hook if it would never change the
comparison code or operands.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_FIXED_CONDITION_CODE_REGS (unsigned int *@var{p1}, unsigned int *@var{p2})
On targets which use a hard
register rather than a pseudo-register to hold condition codes, the
regular CSE passes are often not able to identify cases in which the
hard register is set to a common value.  Use this hook to enable a
small pass which optimizes such cases.  This hook should return true
to enable this pass, and it should set the integers to which its
arguments point to the hard register numbers used for condition codes.
When there is only one such register, as is true on most systems, the
integer pointed to by @var{p2} should be set to
@code{INVALID_REGNUM}.

The default version of this hook returns false.
@end deftypefn

@deftypefn {Target Hook} machine_mode TARGET_CC_MODES_COMPATIBLE (machine_mode @var{m1}, machine_mode @var{m2})
On targets which use multiple condition code modes in class
@code{MODE_CC}, it is sometimes the case that a comparison can be
validly done in more than one mode.  On such a system, define this
target hook to take two mode arguments and to return a mode in which
both comparisons may be validly done.  If there is no such mode,
return @code{VOIDmode}.

The default version of this hook checks whether the modes are the
same.  If they are, it returns that mode.  If they are different, it
returns @code{VOIDmode}.
@end deftypefn

@deftypevr {Target Hook} {unsigned int} TARGET_FLAGS_REGNUM
If the target has a dedicated flags register, and it needs to use the
post-reload comparison elimination pass, or the delay slot filler pass,
then this value should be set appropriately.
@end deftypevr

@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

@deftypefn {Target Hook} int TARGET_REGISTER_MOVE_COST (machine_mode @var{mode}, reg_class_t @var{from}, reg_class_t @var{to})
This target hook should return 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{TARGET_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.

The default version of this function returns 2.
@end deftypefn

@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

@deftypefn {Target Hook} int TARGET_MEMORY_MOVE_COST (machine_mode @var{mode}, reg_class_t @var{rclass}, bool @var{in})
This target hook should return the cost of moving data of mode @var{mode}
between a register of class @var{rclass} and memory; @var{in} is @code{false}
if the value is to be written to memory, @code{true} if it is to be read in.
This cost is relative to those in @code{TARGET_REGISTER_MOVE_COST}.
If moving between registers and memory is more expensive than between two
registers, you should add this target hook to express the relative cost.

If you do not add this target hook, 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{rclass} but the reload mechanism is
more complex than copying via an intermediate, use this target hook 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, use this target hook to add some other
value to the result of that function.  The arguments to that function
are the same as to this target hook.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_SLOW_UNALIGNED_ACCESS (machine_mode @var{mode}, unsigned int @var{align})
This hook returns true if memory accesses described by the
@var{mode} and @var{alignment} parameters have a cost many times greater
than aligned accesses, for example if they are emulated in a trap handler.
This hook is invoked only for unaligned accesses, i.e.@: when
@code{@var{alignment} < GET_MODE_ALIGNMENT (@var{mode})}.

When this hook returns true, the compiler will act as if
@code{STRICT_ALIGNMENT} were true when generating code for block
moves.  This can cause significantly more instructions to be produced.
Therefore, do not make this hook return true if unaligned accesses only
add a cycle or two to the time for a memory access.

The hook must return true whenever @code{STRICT_ALIGNMENT} is true.
The default implementation returns @code{STRICT_ALIGNMENT}.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_USE_BY_PIECES_INFRASTRUCTURE_P (unsigned HOST_WIDE_INT @var{size}, unsigned int @var{alignment}, enum by_pieces_operation @var{op}, bool @var{speed_p})
GCC will attempt several strategies when asked to copy between
two areas of memory, or to set, clear or store to memory, for example
when copying a @code{struct}. The @code{by_pieces} infrastructure
implements such memory operations as a sequence of load, store or move
insns.  Alternate strategies are to expand the
@code{cpymem} or @code{setmem} optabs, to emit a library call, or to emit
unit-by-unit, loop-based operations.

This target hook should return true if, for a memory operation with a
given @var{size} and @var{alignment}, using the @code{by_pieces}
infrastructure is expected to result in better code generation.
Both @var{size} and @var{alignment} are measured in terms of storage
units.

The parameter @var{op} is one of: @code{CLEAR_BY_PIECES},
@code{MOVE_BY_PIECES}, @code{SET_BY_PIECES}, @code{STORE_BY_PIECES} or
@code{COMPARE_BY_PIECES}.  These describe the type of memory operation
under consideration.

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

Returning true for higher values of @var{size} can improve code generation
for speed if the target does not provide an implementation of the
@code{cpymem} or @code{setmem} standard names, if the @code{cpymem} or
@code{setmem} implementation would be more expensive than a sequence of
insns, or if the overhead of a library call would dominate that of
the body of the memory operation.

Returning true for higher values of @code{size} may also cause an increase
in code size, for example where the number of insns emitted to perform a
move would be greater than that of a library call.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_OVERLAP_OP_BY_PIECES_P (void)
This target hook should return true if when the @code{by_pieces}
infrastructure is used, an offset adjusted unaligned memory operation
in the smallest integer mode for the last piece operation of a memory
region can be generated to avoid doing more than one smaller operations.
@end deftypefn

@deftypefn {Target Hook} int TARGET_COMPARE_BY_PIECES_BRANCH_RATIO (machine_mode @var{mode})
When expanding a block comparison in MODE, gcc can try to reduce the
number of branches at the expense of more memory operations.  This hook
allows the target to override the default choice.  It should return the
factor by which branches should be reduced over the plain expansion with
one comparison per @var{mode}-sized piece.  A port can also prevent a
particular mode from being used for block comparisons by returning a
negative number from this hook.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_OPTAB_SUPPORTED_P (int @var{op}, machine_mode @var{mode1}, machine_mode @var{mode2}, optimization_type @var{opt_type})
Return true if the optimizers should use optab @var{op} with
modes @var{mode1} and @var{mode2} for optimization type @var{opt_type}.
The optab is known to have an associated @file{.md} instruction
whose C condition is true.  @var{mode2} is only meaningful for conversion
optabs; for direct optabs it is a copy of @var{mode1}.

For example, when called with @var{op} equal to @code{rint_optab} and
@var{mode1} equal to @code{DFmode}, the hook should say whether the
optimizers should use optab @code{rintdf2}.

The default hook returns true for all inputs.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_RTX_COSTS (rtx @var{x}, machine_mode @var{mode}, int @var{outer_code}, int @var{opno}, int *@var{total}, bool @var{speed})
This target hook describes the relative costs of RTL expressions.

The cost may depend on the precise form of the expression, which is
available for examination in @var{x}, and the fact that @var{x} appears
as operand @var{opno} of an expression with rtx code @var{outer_code}.
That is, the hook can assume that there is some rtx @var{y} such
that @samp{GET_CODE (@var{y}) == @var{outer_code}} and such that
either (a) @samp{XEXP (@var{y}, @var{opno}) == @var{x}} or
(b) @samp{XVEC (@var{y}, @var{opno})} contains @var{x}.

@var{mode} is @var{x}'s machine mode, or for cases like @code{const_int} that
do not have a mode, the mode in which @var{x} is used.

In implementing this hook, you can use the construct
@code{COSTS_N_INSNS (@var{n})} to specify a cost equal to @var{n} fast
instructions.

On entry to the hook, @code{*@var{total}} contains a default estimate
for the cost of the expression.  The hook should modify this value as
necessary.  Traditionally, the default costs are @code{COSTS_N_INSNS (5)}
for multiplications, @code{COSTS_N_INSNS (7)} for division and modulus
operations, and @code{COSTS_N_INSNS (1)} for all other operations.

When optimizing for code size, i.e.@: when @code{speed} is
false, this target hook should be used to estimate the relative
size cost of an expression, again relative to @code{COSTS_N_INSNS}.

The hook returns true when all subexpressions of @var{x} have been
processed, and false when @code{rtx_cost} should recurse.
@end deftypefn

@deftypefn {Target Hook} int TARGET_ADDRESS_COST (rtx @var{address}, machine_mode @var{mode}, addr_space_t @var{as}, bool @var{speed})
This hook computes the cost of an addressing mode that contains
@var{address}.  If not defined, the cost is computed from
the @var{address} expression and the @code{TARGET_RTX_COST} hook.

For most CISC machines, the default cost is a good approximation of the
true cost of the addressing mode.  However, on RISC machines, all
instructions normally have the same length and execution time.  Hence
all addresses will have equal costs.

In cases where more than one form of an address is known, the form with
the lowest cost will be used.  If multiple forms have the same, lowest,
cost, the one that is the most complex will be used.

For example, suppose an address that is equal to the sum of a register
and a constant is used twice in the same basic block.  When this macro
is not defined, the address will be computed in a register and memory
references will be indirect through that register.  On machines where
the cost of the addressing mode containing the sum is no higher than
that of a simple indirect reference, this will produce an additional
instruction and possibly require an additional register.  Proper
specification of this macro eliminates this overhead for such machines.

This hook is never called with an invalid address.

On machines where an address involving more than one register is as
cheap as an address computation involving only one register, defining
@code{TARGET_ADDRESS_COST} to reflect this can cause two registers to
be live over a region of code where only one would have been if
@code{TARGET_ADDRESS_COST} were not defined in that manner.  This effect
should be considered in the definition of this macro.  Equivalent costs
should probably only be given to addresses with different numbers of
registers on machines with lots of registers.
@end deftypefn

@deftypefn {Target Hook} int TARGET_INSN_COST (rtx_insn *@var{insn}, bool @var{speed})
This target hook describes the relative costs of RTL instructions.

In implementing this hook, you can use the construct
@code{COSTS_N_INSNS (@var{n})} to specify a cost equal to @var{n} fast
instructions.

When optimizing for code size, i.e.@: when @code{speed} is
false, this target hook should be used to estimate the relative
size cost of an expression, again relative to @code{COSTS_N_INSNS}.
@end deftypefn

@deftypefn {Target Hook} {unsigned int} TARGET_MAX_NOCE_IFCVT_SEQ_COST (edge @var{e})
This hook returns a value in the same units as @code{TARGET_RTX_COSTS},
giving the maximum acceptable cost for a sequence generated by the RTL
if-conversion pass when conditional execution is not available.
The RTL if-conversion pass attempts to convert conditional operations
that would require a branch to a series of unconditional operations and
@code{mov@var{mode}cc} insns.  This hook returns the maximum cost of the
unconditional instructions and the @code{mov@var{mode}cc} insns.
RTL if-conversion is cancelled if the cost of the converted sequence
is greater than the value returned by this hook.

@code{e} is the edge between the basic block containing the conditional
branch to the basic block which would be executed if the condition
were true.

The default implementation of this hook uses the
@code{max-rtl-if-conversion-[un]predictable} parameters if they are set,
and uses a multiple of @code{BRANCH_COST} otherwise.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_NOCE_CONVERSION_PROFITABLE_P (rtx_insn *@var{seq}, struct noce_if_info *@var{if_info})
This hook returns true if the instruction sequence @code{seq} is a good
candidate as a replacement for the if-convertible sequence described in
@code{if_info}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_NEW_ADDRESS_PROFITABLE_P (rtx @var{memref}, rtx_insn * @var{insn}, rtx @var{new_addr})
Return @code{true} if it is profitable to replace the address in
@var{memref} with @var{new_addr}.  This allows targets to prevent the
scheduler from undoing address optimizations.  The instruction containing the
memref is @var{insn}.  The default implementation returns @code{true}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_NO_SPECULATION_IN_DELAY_SLOTS_P (void)
This predicate controls the use of the eager delay slot filler to disallow
speculatively executed instructions being placed in delay slots.  Targets
such as certain MIPS architectures possess both branches with and without
delay slots.  As the eager delay slot filler can decrease performance,
disabling it is beneficial when ordinary branches are available.  Use of
delay slot branches filled using the basic filler is often still desirable
as the delay slot can hide a pipeline bubble.
@end deftypefn

@deftypefn {Target Hook} HOST_WIDE_INT TARGET_ESTIMATED_POLY_VALUE (poly_int64 @var{val}, poly_value_estimate_kind @var{kind})
Return an estimate of the runtime value of @var{val}, for use in
things like cost calculations or profiling frequencies.  @var{kind} is used
to ask for the minimum, maximum, and likely estimates of the value through
the @code{POLY_VALUE_MIN}, @code{POLY_VALUE_MAX} and
@code{POLY_VALUE_LIKELY} values.  The default
implementation returns the lowest possible value of @var{val}.
@end deftypefn

@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.

@deftypefn {Target Hook} int TARGET_SCHED_ISSUE_RATE (void)
This hook returns the maximum number of instructions that can ever
issue at the same time on the target machine.  The default is one.
Although the insn scheduler can define itself the possibility of issue
an insn on the same cycle, the value can serve as an additional
constraint to issue insns on the same simulated processor cycle (see
hooks @samp{TARGET_SCHED_REORDER} and @samp{TARGET_SCHED_REORDER2}).
This value must be constant over the entire compilation.  If you need
it to vary depending on what the instructions are, you must use
@samp{TARGET_SCHED_VARIABLE_ISSUE}.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SCHED_VARIABLE_ISSUE (FILE *@var{file}, int @var{verbose}, rtx_insn *@var{insn}, int @var{more})
This hook is executed by the scheduler after it has scheduled an insn
from the ready list.  It should return the number of insns which can
still be issued in the current cycle.  The default is
@samp{@w{@var{more} - 1}} for insns other than @code{CLOBBER} and
@code{USE}, which normally are not counted against the issue rate.
You should define this hook if some insns take more machine resources
than others, so that fewer insns can follow them in the same cycle.
@var{file} is either a null pointer, or a stdio stream to write any
debug output to.  @var{verbose} is the verbose level provided by
@option{-fsched-verbose-@var{n}}.  @var{insn} is the instruction that
was scheduled.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SCHED_ADJUST_COST (rtx_insn *@var{insn}, int @var{dep_type1}, rtx_insn *@var{dep_insn}, int @var{cost}, unsigned int @var{dw})
This function corrects the value of @var{cost} based on the
relationship between @var{insn} and @var{dep_insn} through a
dependence of type dep_type, and strength @var{dw}.  It should return the new
value.  The default is to make no adjustment to @var{cost}.  This can be
used for example to specify to the scheduler using the traditional pipeline
description that an output- or anti-dependence does not incur the same cost
as a data-dependence.  If the scheduler using the automaton based pipeline
description, the cost of anti-dependence is zero and the cost of
output-dependence is maximum of one and the difference of latency
times of the first and the second insns.  If these values are not
acceptable, you could use the hook to modify them too.  See also
@pxref{Processor pipeline description}.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SCHED_ADJUST_PRIORITY (rtx_insn *@var{insn}, int @var{priority})
This hook adjusts the integer scheduling priority @var{priority} of
@var{insn}.  It should return the new priority.  Increase the priority to
execute @var{insn} earlier, reduce the priority to execute @var{insn}
later.  Do not define this hook if you do not need to adjust the
scheduling priorities of insns.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SCHED_REORDER (FILE *@var{file}, int @var{verbose}, rtx_insn **@var{ready}, int *@var{n_readyp}, int @var{clock})
This hook is executed by the scheduler after it has scheduled the ready
list, to allow the machine description to reorder it (for example to
combine two small instructions together on @samp{VLIW} machines).
@var{file} is either a null pointer, or a stdio stream to write any
debug output to.  @var{verbose} is the verbose level provided by
@option{-fsched-verbose-@var{n}}.  @var{ready} is a pointer to the ready
list of instructions that are ready to be scheduled.  @var{n_readyp} is
a pointer to the number of elements in the ready list.  The scheduler
reads the ready list in reverse order, starting with
@var{ready}[@var{*n_readyp} @minus{} 1] and going to @var{ready}[0].  @var{clock}
is the timer tick of the scheduler.  You may modify the ready list and
the number of ready insns.  The return value is the number of insns that
can issue this cycle; normally this is just @code{issue_rate}.  See also
@samp{TARGET_SCHED_REORDER2}.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SCHED_REORDER2 (FILE *@var{file}, int @var{verbose}, rtx_insn **@var{ready}, int *@var{n_readyp}, int @var{clock})
Like @samp{TARGET_SCHED_REORDER}, but called at a different time.  That
function is called whenever the scheduler starts a new cycle.  This one
is called once per iteration over a cycle, immediately after
@samp{TARGET_SCHED_VARIABLE_ISSUE}; it can reorder the ready list and
return the number of insns to be scheduled in the same cycle.  Defining
this hook can be useful if there are frequent situations where
scheduling one insn causes other insns to become ready in the same
cycle.  These other insns can then be taken into account properly.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_SCHED_MACRO_FUSION_P (void)
This hook is used to check whether target platform supports macro fusion.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_SCHED_MACRO_FUSION_PAIR_P (rtx_insn *@var{prev}, rtx_insn *@var{curr})
This hook is used to check whether two insns should be macro fused for
a target microarchitecture. If this hook returns true for the given insn pair
(@var{prev} and @var{curr}), the scheduler will put them into a sched
group, and they will not be scheduled apart.  The two insns will be either
two SET insns or a compare and a conditional jump and this hook should
validate any dependencies needed to fuse the two insns together.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK (rtx_insn *@var{head}, rtx_insn *@var{tail})
This hook is called after evaluation forward dependencies of insns in
chain given by two parameter values (@var{head} and @var{tail}
correspondingly) but before insns scheduling of the insn chain.  For
example, it can be used for better insn classification if it requires
analysis of dependencies.  This hook can use backward and forward
dependencies of the insn scheduler because they are already
calculated.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_INIT (FILE *@var{file}, int @var{verbose}, int @var{max_ready})
This hook is executed by the scheduler at the beginning of each block of
instructions that are to be scheduled.  @var{file} is either a null
pointer, or a stdio stream to write any debug output to.  @var{verbose}
is the verbose level provided by @option{-fsched-verbose-@var{n}}.
@var{max_ready} is the maximum number of insns in the current scheduling
region that can be live at the same time.  This can be used to allocate
scratch space if it is needed, e.g.@: by @samp{TARGET_SCHED_REORDER}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_FINISH (FILE *@var{file}, int @var{verbose})
This hook is executed by the scheduler at the end of each block of
instructions that are to be scheduled.  It can be used to perform
cleanup of any actions done by the other scheduling hooks.  @var{file}
is either a null pointer, or a stdio stream to write any debug output
to.  @var{verbose} is the verbose level provided by
@option{-fsched-verbose-@var{n}}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_INIT_GLOBAL (FILE *@var{file}, int @var{verbose}, int @var{old_max_uid})
This hook is executed by the scheduler after function level initializations.
@var{file} is either a null pointer, or a stdio stream to write any debug output to.
@var{verbose} is the verbose level provided by @option{-fsched-verbose-@var{n}}.
@var{old_max_uid} is the maximum insn uid when scheduling begins.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_FINISH_GLOBAL (FILE *@var{file}, int @var{verbose})
This is the cleanup hook corresponding to @code{TARGET_SCHED_INIT_GLOBAL}.
@var{file} is either a null pointer, or a stdio stream to write any debug output to.
@var{verbose} is the verbose level provided by @option{-fsched-verbose-@var{n}}.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_SCHED_DFA_PRE_CYCLE_INSN (void)
The hook returns an RTL insn.  The automaton state used in the
pipeline hazard recognizer is changed as if the insn were scheduled
when the new simulated processor cycle starts.  Usage of the hook may
simplify the automaton pipeline description for some @acronym{VLIW}
processors.  If the hook is defined, it is used only for the automaton
based pipeline description.  The default is not to change the state
when the new simulated processor cycle starts.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN (void)
The hook can be used to initialize data used by the previous hook.
@end deftypefn

@deftypefn {Target Hook} {rtx_insn *} TARGET_SCHED_DFA_POST_CYCLE_INSN (void)
The hook is analogous to @samp{TARGET_SCHED_DFA_PRE_CYCLE_INSN} but used
to changed the state as if the insn were scheduled when the new
simulated processor cycle finishes.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN (void)
The hook is analogous to @samp{TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN} but
used to initialize data used by the previous hook.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE (void)
The hook to notify target that the current simulated cycle is about to finish.
The hook is analogous to @samp{TARGET_SCHED_DFA_PRE_CYCLE_INSN} but used
to change the state in more complicated situations - e.g., when advancing
state on a single insn is not enough.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_DFA_POST_ADVANCE_CYCLE (void)
The hook to notify target that new simulated cycle has just started.
The hook is analogous to @samp{TARGET_SCHED_DFA_POST_CYCLE_INSN} but used
to change the state in more complicated situations - e.g., when advancing
state on a single insn is not enough.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD (void)
This hook controls better choosing an insn from the ready insn queue
for the @acronym{DFA}-based insn scheduler.  Usually the scheduler
chooses the first insn from the queue.  If the hook returns a positive
value, an additional scheduler code tries all permutations of
@samp{TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD ()}
subsequent ready insns to choose an insn whose issue will result in
maximal number of issued insns on the same cycle.  For the
@acronym{VLIW} processor, the code could actually solve the problem of
packing simple insns into the @acronym{VLIW} insn.  Of course, if the
rules of @acronym{VLIW} packing are described in the automaton.

This code also could be used for superscalar @acronym{RISC}
processors.  Let us consider a superscalar @acronym{RISC} processor
with 3 pipelines.  Some insns can be executed in pipelines @var{A} or
@var{B}, some insns can be executed only in pipelines @var{B} or
@var{C}, and one insn can be executed in pipeline @var{B}.  The
processor may issue the 1st insn into @var{A} and the 2nd one into
@var{B}.  In this case, the 3rd insn will wait for freeing @var{B}
until the next cycle.  If the scheduler issues the 3rd insn the first,
the processor could issue all 3 insns per cycle.

Actually this code demonstrates advantages of the automaton based
pipeline hazard recognizer.  We try quickly and easy many insn
schedules to choose the best one.

The default is no multipass scheduling.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD (rtx_insn *@var{insn}, int @var{ready_index})

This hook controls what insns from the ready insn queue will be
considered for the multipass insn scheduling.  If the hook returns
zero for @var{insn}, the insn will be considered in multipass scheduling.
Positive return values will remove @var{insn} from consideration on
the current round of multipass scheduling.
Negative return values will remove @var{insn} from consideration for given
number of cycles.
Backends should be careful about returning non-zero for highest priority
instruction at position 0 in the ready list.  @var{ready_index} is passed
to allow backends make correct judgements.

The default is that any ready insns can be chosen to be issued.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BEGIN (void *@var{data}, signed char *@var{ready_try}, int @var{n_ready}, bool @var{first_cycle_insn_p})
This hook prepares the target backend for a new round of multipass
scheduling.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_ISSUE (void *@var{data}, signed char *@var{ready_try}, int @var{n_ready}, rtx_insn *@var{insn}, const void *@var{prev_data})
This hook is called when multipass scheduling evaluates instruction INSN.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BACKTRACK (const void *@var{data}, signed char *@var{ready_try}, int @var{n_ready})
This is called when multipass scheduling backtracks from evaluation of
an instruction.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_END (const void *@var{data})
This hook notifies the target about the result of the concluded current
round of multipass scheduling.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_INIT (void *@var{data})
This hook initializes target-specific data used in multipass scheduling.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_FINI (void *@var{data})
This hook finalizes target-specific data used in multipass scheduling.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SCHED_DFA_NEW_CYCLE (FILE *@var{dump}, int @var{verbose}, rtx_insn *@var{insn}, int @var{last_clock}, int @var{clock}, int *@var{sort_p})
This hook is called by the insn scheduler before issuing @var{insn}
on cycle @var{clock}.  If the hook returns nonzero,
@var{insn} is not issued on this processor cycle.  Instead,
the processor cycle is advanced.  If *@var{sort_p}
is zero, the insn ready queue is not sorted on the new cycle
start as usually.  @var{dump} and @var{verbose} specify the file and
verbosity level to use for debugging output.
@var{last_clock} and @var{clock} are, respectively, the
processor cycle on which the previous insn has been issued,
and the current processor cycle.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_SCHED_IS_COSTLY_DEPENDENCE (struct _dep *@var{_dep}, int @var{cost}, int @var{distance})
This hook is used to define which dependences are considered costly by
the target, so costly that it is not advisable to schedule the insns that
are involved in the dependence too close to one another.  The parameters
to this hook are as follows:  The first parameter @var{_dep} is the dependence
being evaluated.  The second parameter @var{cost} is the cost of the
dependence as estimated by the scheduler, and the third
parameter @var{distance} is the distance in cycles between the two insns.
The hook returns @code{true} if considering the distance between the two
insns the dependence between them is considered costly by the target,
and @code{false} otherwise.

Defining this hook can be useful in multiple-issue out-of-order machines,
where (a) it's practically hopeless to predict the actual data/resource
delays, however: (b) there's a better chance to predict the actual grouping
that will be formed, and (c) correctly emulating the grouping can be very
important.  In such targets one may want to allow issuing dependent insns
closer to one another---i.e., closer than the dependence distance;  however,
not in cases of ``costly dependences'', which this hooks allows to define.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_H_I_D_EXTENDED (void)
This hook is called by the insn scheduler after emitting a new instruction to
the instruction stream.  The hook notifies a target backend to extend its
per instruction data structures.
@end deftypefn

@deftypefn {Target Hook} {void *} TARGET_SCHED_ALLOC_SCHED_CONTEXT (void)
Return a pointer to a store large enough to hold target scheduling context.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_INIT_SCHED_CONTEXT (void *@var{tc}, bool @var{clean_p})
Initialize store pointed to by @var{tc} to hold target scheduling context.
It @var{clean_p} is true then initialize @var{tc} as if scheduler is at the
beginning of the block.  Otherwise, copy the current context into @var{tc}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_SET_SCHED_CONTEXT (void *@var{tc})
Copy target scheduling context pointed to by @var{tc} to the current context.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_CLEAR_SCHED_CONTEXT (void *@var{tc})
Deallocate internal data in target scheduling context pointed to by @var{tc}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_FREE_SCHED_CONTEXT (void *@var{tc})
Deallocate a store for target scheduling context pointed to by @var{tc}.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SCHED_SPECULATE_INSN (rtx_insn *@var{insn}, unsigned int @var{dep_status}, rtx *@var{new_pat})
This hook is called by the insn scheduler when @var{insn} has only
speculative dependencies and therefore can be scheduled speculatively.
The hook is used to check if the pattern of @var{insn} has a speculative
version and, in case of successful check, to generate that speculative
pattern.  The hook should return 1, if the instruction has a speculative form,
or @minus{}1, if it doesn't.  @var{request} describes the type of requested
speculation.  If the return value equals 1 then @var{new_pat} is assigned
the generated speculative pattern.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_SCHED_NEEDS_BLOCK_P (unsigned int @var{dep_status})
This hook is called by the insn scheduler during generation of recovery code
for @var{insn}.  It should return @code{true}, if the corresponding check
instruction should branch to recovery code, or @code{false} otherwise.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_SCHED_GEN_SPEC_CHECK (rtx_insn *@var{insn}, rtx_insn *@var{label}, unsigned int @var{ds})
This hook is called by the insn scheduler to generate a pattern for recovery
check instruction.  If @var{mutate_p} is zero, then @var{insn} is a
speculative instruction for which the check should be generated.
@var{label} is either a label of a basic block, where recovery code should
be emitted, or a null pointer, when requested check doesn't branch to
recovery code (a simple check).  If @var{mutate_p} is nonzero, then
a pattern for a branchy check corresponding to a simple check denoted by
@var{insn} should be generated.  In this case @var{label} can't be null.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_SET_SCHED_FLAGS (struct spec_info_def *@var{spec_info})
This hook is used by the insn scheduler to find out what features should be
enabled/used.
The structure *@var{spec_info} should be filled in by the target.
The structure describes speculation types that can be used in the scheduler.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_SCHED_CAN_SPECULATE_INSN (rtx_insn *@var{insn})
Some instructions should never be speculated by the schedulers, usually
 because the instruction is too expensive to get this wrong.  Often such
 instructions have long latency, and often they are not fully modeled in the
 pipeline descriptions.  This hook should return @code{false} if @var{insn}
 should not be speculated.
@end deftypefn

@deftypefn {Target Hook} int TARGET_SCHED_SMS_RES_MII (struct ddg *@var{g})
This hook is called by the swing modulo scheduler to calculate a
resource-based lower bound which is based on the resources available in
the machine and the resources required by each instruction.  The target
backend can use @var{g} to calculate such bound.  A very simple lower
bound will be used in case this hook is not implemented: the total number
of instructions divided by the issue rate.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_SCHED_DISPATCH (rtx_insn *@var{insn}, int @var{x})
This hook is called by Haifa Scheduler.  It returns true if dispatch scheduling
is supported in hardware and the condition specified in the parameter is true.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_DISPATCH_DO (rtx_insn *@var{insn}, int @var{x})
This hook is called by Haifa Scheduler.  It performs the operation specified
in its second parameter.
@end deftypefn

@deftypevr {Target Hook} bool TARGET_SCHED_EXPOSED_PIPELINE
True if the processor has an exposed pipeline, which means that not just
the order of instructions is important for correctness when scheduling, but
also the latencies of operations.
@end deftypevr

@deftypefn {Target Hook} int TARGET_SCHED_REASSOCIATION_WIDTH (unsigned int @var{opc}, machine_mode @var{mode})
This hook is called by tree reassociator to determine a level of
parallelism required in output calculations chain.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SCHED_FUSION_PRIORITY (rtx_insn *@var{insn}, int @var{max_pri}, int *@var{fusion_pri}, int *@var{pri})
This hook is called by scheduling fusion pass.  It calculates fusion
priorities for each instruction passed in by parameter.  The priorities
are returned via pointer parameters.

@var{insn} is the instruction whose priorities need to be calculated.
@var{max_pri} is the maximum priority can be returned in any cases.
@var{fusion_pri} is the pointer parameter through which @var{insn}'s
fusion priority should be calculated and returned.
@var{pri} is the pointer parameter through which @var{insn}'s priority
should be calculated and returned.

Same @var{fusion_pri} should be returned for instructions which should
be scheduled together.  Different @var{pri} should be returned for
instructions with same @var{fusion_pri}.  @var{fusion_pri} is the major
sort key, @var{pri} is the minor sort key.  All instructions will be
scheduled according to the two priorities.  All priorities calculated
should be between 0 (exclusive) and @var{max_pri} (inclusive).  To avoid
false dependencies, @var{fusion_pri} of instructions which need to be
scheduled together should be smaller than @var{fusion_pri} of irrelevant
instructions.

Given below example:

@smallexample
    ldr r10, [r1, 4]
    add r4, r4, r10
    ldr r15, [r2, 8]
    sub r5, r5, r15
    ldr r11, [r1, 0]
    add r4, r4, r11
    ldr r16, [r2, 12]
    sub r5, r5, r16
@end smallexample

On targets like ARM/AArch64, the two pairs of consecutive loads should be
merged.  Since peephole2 pass can't help in this case unless consecutive
loads are actually next to each other in instruction flow.  That's where
this scheduling fusion pass works.  This hook calculates priority for each
instruction based on its fustion type, like:

@smallexample
    ldr r10, [r1, 4]  ; fusion_pri=99,  pri=96
    add r4, r4, r10   ; fusion_pri=100, pri=100
    ldr r15, [r2, 8]  ; fusion_pri=98,  pri=92
    sub r5, r5, r15   ; fusion_pri=100, pri=100
    ldr r11, [r1, 0]  ; fusion_pri=99,  pri=100
    add r4, r4, r11   ; fusion_pri=100, pri=100
    ldr r16, [r2, 12] ; fusion_pri=98,  pri=88
    sub r5, r5, r16   ; fusion_pri=100, pri=100
@end smallexample

Scheduling fusion pass then sorts all ready to issue instructions according
to the priorities.  As a result, instructions of same fusion type will be
pushed together in instruction flow, like:

@smallexample
    ldr r11, [r1, 0]
    ldr r10, [r1, 4]
    ldr r15, [r2, 8]
    ldr r16, [r2, 12]
    add r4, r4, r10
    sub r5, r5, r15
    add r4, r4, r11
    sub r5, r5, r16
@end smallexample

Now peephole2 pass can simply merge the two pairs of loads.

Since scheduling fusion pass relies on peephole2 to do real fusion
work, it is only enabled by default when peephole2 is in effect.

This is firstly introduced on ARM/AArch64 targets, please refer to
the hook implementation for how different fusion types are supported.
@end deftypefn

@deftypefn {Target Hook} void TARGET_EXPAND_DIVMOD_LIBFUNC (rtx @var{libfunc}, machine_mode @var{mode}, rtx @var{op0}, rtx @var{op1}, rtx *@var{quot}, rtx *@var{rem})
Define this hook for enabling divmod transform if the port does not have
hardware divmod insn but defines target-specific divmod libfuncs.
@end deftypefn

@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.c} 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.c}
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.c} 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

@deftypefn {Target Hook} void TARGET_ASM_INIT_SECTIONS (void)
Define this hook if you need to do something special to set up the
@file{varasm.c} sections, or if your target has some special sections
of its own that you need to create.

GCC calls this hook after processing the command line, but before writing
any assembly code, and before calling any of the section-returning hooks
described below.
@end deftypefn

@deftypefn {Target Hook} int TARGET_ASM_RELOC_RW_MASK (void)
Return a mask describing how relocations should be treated when
selecting sections.  Bit 1 should be set if global relocations
should be placed in a read-write section; bit 0 should be set if
local relocations should be placed in a read-write section.

The default version of this function returns 3 when @option{-fpic}
is in effect, and 0 otherwise.  The hook is typically redefined
when the target cannot support (some kinds of) dynamic relocations
in read-only sections even in executables.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC (void)
Return true to generate ADDR_DIF_VEC table
or false to generate ADDR_VEC table for jumps in case of -fPIC.

The default version of this function returns true if flag_pic
equals true and false otherwise
@end deftypefn

@deftypefn {Target Hook} {section *} TARGET_ASM_SELECT_SECTION (tree @var{exp}, int @var{reloc}, unsigned HOST_WIDE_INT @var{align})
Return the section into which @var{exp} should be placed.  You can
assume that @var{exp} is either a @code{VAR_DECL} node or a constant of
some sort.  @var{reloc} indicates whether the initial value of @var{exp}
requires link-time relocations.  Bit 0 is set when variable contains
local relocations only, while bit 1 is set for global relocations.
@var{align} is the constant alignment in bits.

The default version of this function takes care of putting read-only
variables in @code{readonly_data_section}.

See also @var{USE_SELECT_SECTION_FOR_FUNCTIONS}.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_ASM_UNIQUE_SECTION (tree @var{decl}, int @var{reloc})
Build up a unique section name, expressed as a @code{STRING_CST} node,
and assign it to @samp{DECL_SECTION_NAME (@var{decl})}.
As with @code{TARGET_ASM_SELECT_SECTION}, @var{reloc} indicates whether
the initial value of @var{exp} requires link-time relocations.

The default version of this function appends the symbol name to the
ELF section name that would normally be used for the symbol.  For
example, the function @code{foo} would be placed in @code{.text.foo}.
Whatever the actual target object format, this is often good enough.
@end deftypefn

@deftypefn {Target Hook} {section *} TARGET_ASM_FUNCTION_RODATA_SECTION (tree @var{decl}, bool @var{relocatable})
Return the readonly data or reloc readonly data section associated with
@samp{DECL_SECTION_NAME (@var{decl})}. @var{relocatable} selects the latter
over the former.
The default version of this function selects @code{.gnu.linkonce.r.name} if
the function's section is @code{.gnu.linkonce.t.name}, @code{.rodata.name}
or @code{.data.rel.ro.name} if function is in @code{.text.name}, and
the normal readonly-data or reloc readonly data section otherwise.
@end deftypefn

@deftypevr {Target Hook} {const char *} TARGET_ASM_MERGEABLE_RODATA_PREFIX
Usually, the compiler uses the prefix @code{".rodata"} to construct
section names for mergeable constant data.  Define this macro to override
the string if a different section name should be used.
@end deftypevr

@deftypefn {Target Hook} {section *} TARGET_ASM_TM_CLONE_TABLE_SECTION (void)
Return the section that should be used for transactional memory clone
tables.
@end deftypefn

@deftypefn {Target Hook} {section *} TARGET_ASM_SELECT_RTX_SECTION (machine_mode @var{mode}, rtx @var{x}, unsigned HOST_WIDE_INT @var{align})
Return the section into which a constant @var{x}, of mode @var{mode},
should be placed.  You can assume that @var{x} is some kind of
constant in RTL@.  The argument @var{mode} is redundant except in the
case of a @code{const_int} rtx.  @var{align} is the constant alignment
in bits.

The default version of this function takes care of putting symbolic
constants in @code{flag_pic} mode in @code{data_section} and everything
else in @code{readonly_data_section}.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_MANGLE_DECL_ASSEMBLER_NAME (tree @var{decl}, tree @var{id})
Define this hook if you need to postprocess the assembler name generated
by target-independent code.  The @var{id} provided to this hook will be
the computed name (e.g., the macro @code{DECL_NAME} of the @var{decl} in C,
or the mangled name of the @var{decl} in C++).  The return value of the
hook is an @code{IDENTIFIER_NODE} for the appropriate mangled name on
your target system.  The default implementation of this hook just
returns the @var{id} provided.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ENCODE_SECTION_INFO (tree @var{decl}, rtx @var{rtl}, int @var{new_decl_p})
Define this hook if references to a symbol or a constant must be
treated differently depending on something about the variable or
function named by the symbol (such as what section it is in).

The hook is executed immediately after rtl has been created for
@var{decl}, which may be a variable or function declaration or
an entry in the constant pool.  In either case, @var{rtl} is the
rtl in question.  Do @emph{not} use @code{DECL_RTL (@var{decl})}
in this hook; that field may not have been initialized yet.

In the case of a constant, it is safe to assume that the rtl is
a @code{mem} whose address is a @code{symbol_ref}.  Most decls
will also have this form, but that is not guaranteed.  Global
register variables, for instance, will have a @code{reg} for their
rtl.  (Normally the right thing to do with such unusual rtl is
leave it alone.)

The @var{new_decl_p} argument will be true if this is the first time
that @code{TARGET_ENCODE_SECTION_INFO} has been invoked on this decl.  It will
be false for subsequent invocations, which will happen for duplicate
declarations.  Whether or not anything must be done for the duplicate
declaration depends on whether the hook examines @code{DECL_ATTRIBUTES}.
@var{new_decl_p} is always true when the hook is called for a constant.

@cindex @code{SYMBOL_REF_FLAG}, in @code{TARGET_ENCODE_SECTION_INFO}
The usual thing for this hook to do is to record flags in the
@code{symbol_ref}, using @code{SYMBOL_REF_FLAG} or @code{SYMBOL_REF_FLAGS}.
Historically, the name string was modified if it was necessary to
encode more than one bit of information, but this practice is now
discouraged; use @code{SYMBOL_REF_FLAGS}.

The default definition of this hook, @code{default_encode_section_info}
in @file{varasm.c}, sets a number of commonly-useful bits in
@code{SYMBOL_REF_FLAGS}.  Check whether the default does what you need
before overriding it.
@end deftypefn

@deftypefn {Target Hook} {const char *} TARGET_STRIP_NAME_ENCODING (const char *@var{name})
Decode @var{name} and return the real name part, sans
the characters that @code{TARGET_ENCODE_SECTION_INFO}
may have added.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_IN_SMALL_DATA_P (const_tree @var{exp})
Returns true if @var{exp} should be placed into a ``small data'' section.
The default version of this hook always returns false.
@end deftypefn

@deftypevr {Target Hook} bool TARGET_HAVE_SRODATA_SECTION
Contains the value true if the target places read-only
``small data'' into a separate section.  The default value is false.
@end deftypevr

@deftypefn {Target Hook} bool TARGET_PROFILE_BEFORE_PROLOGUE (void)
It returns true if target wants profile code emitted before prologue.

The default version of this hook use the target macro
@code{PROFILE_BEFORE_PROLOGUE}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_BINDS_LOCAL_P (const_tree @var{exp})
Returns true if @var{exp} names an object for which name resolution
rules must resolve to the current ``module'' (dynamic shared library
or executable image).

The default version of this hook implements the name resolution rules
for ELF, which has a looser model of global name binding than other
currently supported object file formats.
@end deftypefn

@deftypevr {Target Hook} bool TARGET_HAVE_TLS
Contains the value true if the target supports thread-local storage.
The default value is false.
@end deftypevr


@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
@deftypefn {Target Hook} void TARGET_ASM_FILE_START (void)
Output to @code{asm_out_file} any text which the assembler expects to
find at the beginning of a file.  The default behavior is controlled
by two flags, documented below.  Unless your target's assembler is
quite unusual, if you override the default, you should call
@code{default_file_start} at some point in your target hook.  This
lets other target files rely on these variables.
@end deftypefn

@deftypevr {Target Hook} bool TARGET_ASM_FILE_START_APP_OFF
If this flag is true, the text of the macro @code{ASM_APP_OFF} will be
printed as the very first line in the assembly file, unless
@option{-fverbose-asm} is in effect.  (If that macro has been defined
to the empty string, this variable has no effect.)  With the normal
definition of @code{ASM_APP_OFF}, the effect is to notify the GNU
assembler that it need not bother stripping comments or extra
whitespace from its input.  This allows it to work a bit faster.

The default is false.  You should not set it to true unless you have
verified that your port does not generate any extra whitespace or
comments that will cause GAS to issue errors in NO_APP mode.
@end deftypevr

@deftypevr {Target Hook} bool TARGET_ASM_FILE_START_FILE_DIRECTIVE
If this flag is true, @code{output_file_directive} will be called
for the primary source file, immediately after printing
@code{ASM_APP_OFF} (if that is enabled).  Most ELF assemblers expect
this to be done.  The default is false.
@end deftypevr

@deftypefn {Target Hook} void TARGET_ASM_FILE_END (void)
Output to @code{asm_out_file} any text which the assembler expects
to find at the end of a file.  The default is to output nothing.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_ASM_LTO_START (void)
Output to @code{asm_out_file} any text which the assembler expects
to find at the start of an LTO section.  The default is to output
nothing.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_LTO_END (void)
Output to @code{asm_out_file} any text which the assembler expects
to find at the end of an LTO section.  The default is to output
nothing.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_CODE_END (void)
Output to @code{asm_out_file} any text which is needed before emitting
unwind info and debug info at the end of a file.  Some targets emit
here PIC setup thunks that cannot be emitted at the end of file,
because they couldn't have unwind info then.  The default is to output
nothing.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_SOURCE_FILENAME (FILE *@var{file}, const char *@var{name})
Output DWARF debugging information which indicates that filename
@var{name} is the current source file to the stdio stream @var{file}.

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

@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_IDENT (const char *@var{name})
Output a string based on @var{name}, suitable for the @samp{#ident}
directive, or the equivalent directive or pragma in non-C-family languages.
If this hook is not defined, nothing is output for the @samp{#ident}
directive.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_ASM_NAMED_SECTION (const char *@var{name}, unsigned int @var{flags}, tree @var{decl})
Output assembly directives to switch to section @var{name}.  The section
should have attributes as specified by @var{flags}, which is a bit mask
of the @code{SECTION_*} flags defined in @file{output.h}.  If @var{decl}
is non-NULL, it is the @code{VAR_DECL} or @code{FUNCTION_DECL} with which
this section is associated.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ASM_ELF_FLAGS_NUMERIC (unsigned int @var{flags}, unsigned int *@var{num})
This hook can be used to encode ELF section flags for which no letter
code has been defined in the assembler.  It is called by
@code{default_asm_named_section} whenever the section flags need to be
emitted in the assembler output.  If the hook returns true, then the
numerical value for ELF section flags should be calculated from
@var{flags} and saved in @var{*num}; the value is printed out instead of the
normal sequence of letter codes.  If the hook is not defined, or if it
returns false, then @var{num} is ignored and the traditional letter sequence
is emitted.
@end deftypefn

@deftypefn {Target Hook} {section *} TARGET_ASM_FUNCTION_SECTION (tree @var{decl}, enum node_frequency @var{freq}, bool @var{startup}, bool @var{exit})
Return preferred text (sub)section for function @var{decl}.
Main purpose of this function is to separate cold, normal and hot
functions. @var{startup} is true when function is known to be used only
at startup (from static constructors or it is @code{main()}).
@var{exit} is true when function is known to be used only at exit
(from static destructors).
Return NULL if function should go to default text section.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS (FILE *@var{file}, tree @var{decl}, bool @var{new_is_cold})
Used by the target to emit any assembler directives or additional
labels needed when a function is partitioned between different
sections.  Output should be written to @var{file}.  The function
decl is available as @var{decl} and the new section is `cold' if
@var{new_is_cold} is @code{true}.
@end deftypefn

@deftypevr {Common Target Hook} bool 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}
@deftypevr {Target Hook} bool TARGET_HAVE_SWITCHABLE_BSS_SECTIONS
This flag is true if we can create zeroed data by switching to a BSS
section and then using @code{ASM_OUTPUT_SKIP} to allocate the space.
This is true on most ELF targets.
@end deftypevr

@deftypefn {Target Hook} {unsigned int} TARGET_SECTION_TYPE_FLAGS (tree @var{decl}, const char *@var{name}, int @var{reloc})
Choose a set of section attributes for use by @code{TARGET_ASM_NAMED_SECTION}
based on a variable or function decl, a section name, and whether or not the
declaration's initializer may contain runtime relocations.  @var{decl} may be
null, in which case read-write data should be assumed.

The default version of this function handles choosing code vs data,
read-only vs read-write data, and @code{flag_pic}.  You should only
need to override this if your target has special flags that might be
set via @code{__attribute__}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_RECORD_GCC_SWITCHES (const char *@var{})
Provides the target with the ability to record the gcc command line
switches provided as argument.

By default this hook is set to NULL, but an example implementation is
provided for ELF based targets.  Called @var{elf_record_gcc_switches},
it records the switches as ASCII text inside a new, string mergeable
section in the assembler output file.  The name of the new section is
provided by the @code{TARGET_ASM_RECORD_GCC_SWITCHES_SECTION} target
hook.
@end deftypefn

@deftypevr {Target Hook} {const char *} TARGET_ASM_RECORD_GCC_SWITCHES_SECTION
This is the name of the section that will be created by the example
ELF implementation of the @code{TARGET_ASM_RECORD_GCC_SWITCHES} target
hook.
@end deftypevr

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


@deftypevr {Target Hook} {const char *} TARGET_ASM_BYTE_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_HI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_PSI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_SI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_PDI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_DI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_PTI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_TI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_HI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_PSI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_SI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_PDI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_DI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_PTI_OP
@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_TI_OP
These hooks specify assembly directives for creating certain kinds
of integer object.  The @code{TARGET_ASM_BYTE_OP} directive creates a
byte-sized object, the @code{TARGET_ASM_ALIGNED_HI_OP} one creates an
aligned two-byte object, and so on.  Any of the hooks may be
@code{NULL}, indicating that no suitable directive is available.

The compiler will print these strings at the start of a new line,
followed immediately by the object's initial value.  In most cases,
the string should contain a tab, a pseudo-op, and then another tab.
@end deftypevr

@deftypefn {Target Hook} bool TARGET_ASM_INTEGER (rtx @var{x}, unsigned int @var{size}, int @var{aligned_p})
The @code{assemble_integer} function uses this hook to output an
integer object.  @var{x} is the object's value, @var{size} is its size
in bytes and @var{aligned_p} indicates whether it is aligned.  The
function should return @code{true} if it was able to output the
object.  If it returns false, @code{assemble_integer} will try to
split the object into smaller parts.

The default implementation of this hook will use the
@code{TARGET_ASM_BYTE_OP} family of strings, returning @code{false}
when the relevant string is @code{NULL}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_DECL_END (void)
Define this hook if the target assembler requires a special marker to
terminate an initialized variable declaration.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA (FILE *@var{file}, rtx @var{x})
A target hook to recognize @var{rtx} patterns that @code{output_addr_const}
can't deal with, and output assembly code to @var{file} corresponding to
the pattern @var{x}.  This may be used to allow machine-dependent
@code{UNSPEC}s to appear within constants.

If target hook fails to recognize a pattern, it must return @code{false},
so that a standard error message is printed.  If it prints an error message
itself, by calling, for example, @code{output_operand_lossage}, it may just
return @code{true}.
@end deftypefn

@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

@deftypevr {Target Hook} {const char *} TARGET_ASM_OPEN_PAREN
@deftypevrx {Target Hook} {const char *} TARGET_ASM_CLOSE_PAREN
These target hooks are C string constants, describing the syntax in the
assembler for grouping arithmetic expressions.  If not overridden, they
default to normal parentheses, which is correct for most assemblers.
@end deftypevr

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.c} 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

@deftypefn {Target Hook} void TARGET_ASM_DECLARE_CONSTANT_NAME (FILE *@var{file}, const char *@var{name}, const_tree @var{expr}, HOST_WIDE_INT @var{size})
A target hook to output to the stdio stream @var{file} any text necessary
for declaring the name @var{name} of a constant which is being defined.  This
target hook is responsible for outputting the label definition (perhaps using
@code{assemble_label}).  The argument @var{exp} is the value of the constant,
and @var{size} is the size of the constant in bytes.  The @var{name}
will be an internal label.

The default version of this target hook, define the @var{name} in the
usual manner as a label (by means of @code{assemble_label}).

You may wish to use @code{ASM_OUTPUT_TYPE_DIRECTIVE} in this target hook.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_ASM_GLOBALIZE_LABEL (FILE *@var{stream}, const char *@var{name})
This target hook is a function to output to the stdio stream
@var{stream} some commands that will make the label @var{name} global;
that is, available for reference from other files.

The default implementation relies on a proper definition of
@code{GLOBAL_ASM_OP}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_GLOBALIZE_DECL_NAME (FILE *@var{stream}, tree @var{decl})
This target hook is a function to output to the stdio stream
@var{stream} some commands that will make the name associated with @var{decl}
global; that is, available for reference from other files.

The default implementation uses the TARGET_ASM_GLOBALIZE_LABEL target hook.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_ASSEMBLE_UNDEFINED_DECL (FILE *@var{stream}, const char *@var{name}, const_tree @var{decl})
This target hook is a function to output to the stdio stream
@var{stream} some commands that will declare the name associated with
@var{decl} which is not defined in the current translation unit.  Most
assemblers do not require anything to be output in this case.
@end deftypefn

@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.c} 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

@deftypefn {Target Hook} void TARGET_ASM_ASSEMBLE_VISIBILITY (tree @var{decl}, int @var{visibility})
This target hook is a function to output to @var{asm_out_file} some
commands that will make the symbol(s) associated with @var{decl} have
hidden, protected or internal visibility as specified by @var{visibility}.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_ASM_EXTERNAL_LIBCALL (rtx @var{symref})
This target hook is a function to output to @var{asm_out_file} an assembler
pseudo-op to declare a library function name external.  The name of the
library function is given by @var{symref}, which is a @code{symbol_ref}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_MARK_DECL_PRESERVED (const char *@var{symbol})
This target hook is a function to output to @var{asm_out_file} an assembler
directive to annotate @var{symbol} as used.  The Darwin target uses the
.no_dead_code_strip directive.
@end deftypefn

@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

@deftypefn {Target Hook} tree TARGET_MANGLE_ASSEMBLER_NAME (const char *@var{name})
Given a symbol @var{name}, perform same mangling as @code{varasm.c}'s
@code{assemble_name}, but in memory rather than to a file stream, returning
result as an @code{IDENTIFIER_NODE}.  Required for correct LTO symtabs.  The
default implementation calls the @code{TARGET_STRIP_NAME_ENCODING} hook and
then prepends the @code{USER_LABEL_PREFIX}, if any.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_ASM_INTERNAL_LABEL (FILE *@var{stream}, const char *@var{prefix}, unsigned long @var{labelno})
A function to output to the stdio stream @var{stream} a label whose
name is made from the string @var{prefix} and the number @var{labelno}.

It is absolutely essential that these labels be distinct from the labels
used for user-level functions and variables.  Otherwise, certain programs
will have name conflicts with internal labels.

It is desirable to exclude internal labels from the symbol table of the
object file.  Most assemblers have a naming convention for labels that
should be excluded; on many systems, the letter @samp{L} at the
beginning of a label has this effect.  You should find out what
convention your system uses, and follow it.

The default version of this function utilizes @code{ASM_GENERATE_INTERNAL_LABEL}.
@end deftypefn

@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

@deftypevr {Target Hook} bool TARGET_HAVE_CTORS_DTORS
This value is true if the target supports some ``native'' method of
collecting constructors and destructors to be run at startup and exit.
It is false if we must use @command{collect2}.
@end deftypevr

@deftypefn {Target Hook} void TARGET_ASM_CONSTRUCTOR (rtx @var{symbol}, int @var{priority})
If defined, a function that outputs assembler code to arrange to call
the function referenced by @var{symbol} at initialization time.

Assume that @var{symbol} is a @code{SYMBOL_REF} for a function taking
no arguments and with no return value.  If the target supports initialization
priorities, @var{priority} is a value between 0 and @code{MAX_INIT_PRIORITY};
otherwise it must be @code{DEFAULT_INIT_PRIORITY}.

If this macro is not defined by the target, a suitable default will
be chosen if (1) the target supports arbitrary section names, (2) the
target defines @code{CTORS_SECTION_ASM_OP}, or (3) @code{USE_COLLECT2}
is not defined.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_DESTRUCTOR (rtx @var{symbol}, int @var{priority})
This is like @code{TARGET_ASM_CONSTRUCTOR} but used for termination
functions rather than initialization functions.
@end deftypefn

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

@deftypefn {Target Hook} void TARGET_ASM_FINAL_POSTSCAN_INSN (FILE *@var{file}, rtx_insn *@var{insn}, rtx *@var{opvec}, int @var{noperands})
If defined, this target hook is a function which is executed just after the
output of assembler code for @var{insn}, to change the mode of the assembler
if necessary.

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 was used to convert the insn
template into assembler code, so you can change the assembler mode
by checking the contents of the vector.
@end deftypefn

@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.c}).  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

@deftypefn {Target Hook} void TARGET_ASM_POST_CFI_STARTPROC (FILE *@var{}, @var{tree})
This target hook is used to emit assembly strings required by the target
after the .cfi_startproc directive.  The first argument is the file stream to
write the strings to and the second argument is the function's declaration.  The
expected use is to add more .cfi_* directives.

The default is to not output any assembly strings.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_EMIT_UNWIND_LABEL (FILE *@var{stream}, tree @var{decl}, int @var{for_eh}, int @var{empty})
This target hook emits a label at the beginning of each FDE@.  It
should be defined on targets where FDEs need special labels, and it
should write the appropriate label, for the FDE associated with the
function declaration @var{decl}, to the stdio stream @var{stream}.
The third argument, @var{for_eh}, is a boolean: true if this is for an
exception table.  The fourth argument, @var{empty}, is a boolean:
true if this is a placeholder label for an omitted FDE@.

The default is that FDEs are not given nonlocal labels.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL (FILE *@var{stream})
This target hook emits a label at the beginning of the exception table.
It should be defined on targets where it is desirable for the table
to be broken up according to function.

The default is that no label is emitted.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_EMIT_EXCEPT_PERSONALITY (rtx @var{personality})
If the target implements @code{TARGET_ASM_UNWIND_EMIT}, this hook may be
used to emit a directive to install a personality hook into the unwind
info.  This hook should not be used if dwarf2 unwind info is used.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ASM_UNWIND_EMIT (FILE *@var{stream}, rtx_insn *@var{insn})
This target hook emits assembly directives required to unwind the
given instruction.  This is only used when @code{TARGET_EXCEPT_UNWIND_INFO}
returns @code{UI_TARGET}.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_ASM_MAKE_EH_SYMBOL_INDIRECT (rtx @var{origsymbol}, bool @var{pubvis})
If necessary, modify personality and LSDA references to handle indirection.
The original symbol is in @code{origsymbol} and if @code{pubvis} is true
the symbol is visible outside the TU.
@end deftypefn

@deftypevr {Target Hook} bool TARGET_ASM_UNWIND_EMIT_BEFORE_INSN
True if the @code{TARGET_ASM_UNWIND_EMIT} hook should be called before
the assembly for @var{insn} has been emitted, false if the hook should
be called afterward.
@end deftypevr

@deftypefn {Target Hook} bool TARGET_ASM_SHOULD_RESTORE_CFA_STATE (void)
For DWARF-based unwind frames, two CFI instructions provide for save and
restore of register state.  GCC maintains the current frame address (CFA)
separately from the register bank but the unwinder in libgcc preserves this
state along with the registers (and this is expected by the code that writes
the unwind frames).  This hook allows the target to specify that the CFA data
is not saved/restored along with the registers by the target unwinder so that
suitable additional instructions should be emitted to restore it.
@end deftypefn

@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

@deftypefn {Common Target Hook} {enum unwind_info_type} TARGET_EXCEPT_UNWIND_INFO (struct gcc_options *@var{opts})
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

@deftypevr {Common Target Hook} bool 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

@deftypevr {Target Hook} bool TARGET_TERMINATE_DW2_EH_FRAME_INFO
Contains the value true if the target should add a zero word onto the
end of a Dwarf-2 frame info section when used for exception handling.
Default value is false if @code{EH_FRAME_SECTION_NAME} is defined, and
true otherwise.
@end deftypevr

@deftypefn {Target Hook} rtx TARGET_DWARF_REGISTER_SPAN (rtx @var{reg})
Given a register, this hook should return a parallel of registers to
represent where to find the register pieces.  Define this hook if the
register and its mode are represented in Dwarf in non-contiguous
locations, or if the register should be represented in more than one
register in Dwarf.  Otherwise, this hook should return @code{NULL_RTX}.
If not defined, the default is to return @code{NULL_RTX}.
@end deftypefn

@deftypefn {Target Hook} machine_mode TARGET_DWARF_FRAME_REG_MODE (int @var{regno})
Given a register, this hook should return the mode which the
corresponding Dwarf frame register should have.  This is normally
used to return a smaller mode than the raw mode to prevent call
clobbered parts of a register altering the frame register size
@end deftypefn

@deftypefn {Target Hook} void TARGET_INIT_DWARF_REG_SIZES_EXTRA (tree @var{address})
If some registers are represented in Dwarf-2 unwind information in
multiple pieces, define this hook to fill in information about the
sizes of those pieces in the table used by the unwinder at runtime.
It will be called by @code{expand_builtin_init_dwarf_reg_sizes} after
filling in a single size corresponding to each hard register;
@var{address} is the address of the table.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ASM_TTYPE (rtx @var{sym})
This hook is used to output a reference from a frame unwinding table to
the type_info object identified by @var{sym}.  It should return @code{true}
if the reference was output.  Returning @code{false} will cause the
reference to be output using the normal Dwarf2 routines.
@end deftypefn

@deftypevr {Target Hook} bool TARGET_ARM_EABI_UNWINDER
This flag should be set to @code{true} on targets that use an ARM EABI
based unwinding library, and @code{false} on other targets.  This effects
the format of unwinding tables, and how the unwinder in entered after
running a cleanup.  The default is @code{false}.
@end deftypevr

@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.
* DBX Options::        Macros enabling specific options in DBX format.
* DBX Hooks::          Hook macros for varying DBX format.
* File Names and DBX:: Macros controlling output of file names in DBX format.
* 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 DBX_REGISTER_NUMBER (@var{regno})
A C expression that returns the DBX 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 DBX does not, or vice
versa.  In such cases, some register may need to have one number in the
compiler and another for DBX@.

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{DBX_REGISTER_NUMBER}.
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{DBX_REGISTER_NUMBER} 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 DBX 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{DBX_DEBUG},
@code{DWARF2_DEBUG}, @code{XCOFF_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}.  Otherwise, if @code{DBX_DEBUGGING_INFO} is
defined, GCC uses @code{DBX_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{-gstabs},
@option{-gdwarf-2}, @option{-gxcoff}, or @option{-gvms}.
@end defmac

@node DBX Options
@subsection Specific Options for DBX Output

@c prevent bad page break with this line
These are specific options for DBX output.

@defmac DBX_DEBUGGING_INFO
Define this macro if GCC should produce debugging output for DBX
in response to the @option{-g} option.
@end defmac

@defmac XCOFF_DEBUGGING_INFO
Define this macro if GCC should produce XCOFF format debugging output
in response to the @option{-g} option.  This is a variant of DBX format.
@end defmac

@defmac DEFAULT_GDB_EXTENSIONS
Define this macro to control whether GCC should by default generate
GDB's extended version of DBX debugging information (assuming DBX-format
debugging information is enabled at all).  If you don't define the
macro, the default is 1: always generate the extended information
if there is any occasion to.
@end defmac

@defmac DEBUG_SYMS_TEXT
Define this macro if all @code{.stabs} commands should be output while
in the text section.
@end defmac

@defmac ASM_STABS_OP
A C string constant, including spacing, naming the assembler pseudo op to
use instead of @code{"\t.stabs\t"} to define an ordinary debugging symbol.
If you don't define this macro, @code{"\t.stabs\t"} is used.  This macro
applies only to DBX debugging information format.
@end defmac

@defmac ASM_STABD_OP
A C string constant, including spacing, naming the assembler pseudo op to
use instead of @code{"\t.stabd\t"} to define a debugging symbol whose
value is the current location.  If you don't define this macro,
@code{"\t.stabd\t"} is used.  This macro applies only to DBX debugging
information format.
@end defmac

@defmac ASM_STABN_OP
A C string constant, including spacing, naming the assembler pseudo op to
use instead of @code{"\t.stabn\t"} to define a debugging symbol with no
name.  If you don't define this macro, @code{"\t.stabn\t"} is used.  This
macro applies only to DBX debugging information format.
@end defmac

@defmac DBX_NO_XREFS
Define this macro if DBX on your system does not support the construct
@samp{xs@var{tagname}}.  On some systems, this construct is used to
describe a forward reference to a structure named @var{tagname}.
On other systems, this construct is not supported at all.
@end defmac

@defmac DBX_CONTIN_LENGTH
A symbol name in DBX-format debugging information is normally
continued (split into two separate @code{.stabs} directives) when it
exceeds a certain length (by default, 80 characters).  On some
operating systems, DBX requires this splitting; on others, splitting
must not be done.  You can inhibit splitting by defining this macro
with the value zero.  You can override the default splitting-length by
defining this macro as an expression for the length you desire.
@end defmac

@defmac DBX_CONTIN_CHAR
Normally continuation is indicated by adding a @samp{\} character to
the end of a @code{.stabs} string when a continuation follows.  To use
a different character instead, define this macro as a character
constant for the character you want to use.  Do not define this macro
if backslash is correct for your system.
@end defmac

@defmac DBX_STATIC_STAB_DATA_SECTION
Define this macro if it is necessary to go to the data section before
outputting the @samp{.stabs} pseudo-op for a non-global static
variable.
@end defmac

@defmac DBX_TYPE_DECL_STABS_CODE
The value to use in the ``code'' field of the @code{.stabs} directive
for a typedef.  The default is @code{N_LSYM}.
@end defmac

@defmac DBX_STATIC_CONST_VAR_CODE
The value to use in the ``code'' field of the @code{.stabs} directive
for a static variable located in the text section.  DBX format does not
provide any ``right'' way to do this.  The default is @code{N_FUN}.
@end defmac

@defmac DBX_REGPARM_STABS_CODE
The value to use in the ``code'' field of the @code{.stabs} directive
for a parameter passed in registers.  DBX format does not provide any
``right'' way to do this.  The default is @code{N_RSYM}.
@end defmac

@defmac DBX_REGPARM_STABS_LETTER
The letter to use in DBX symbol data to identify a symbol as a parameter
passed in registers.  DBX format does not customarily provide any way to
do this.  The default is @code{'P'}.
@end defmac

@defmac DBX_FUNCTION_FIRST
Define this macro if the DBX information for a function and its
arguments should precede the assembler code for the function.  Normally,
in DBX format, the debugging information entirely follows the assembler
code.
@end defmac

@defmac DBX_BLOCKS_FUNCTION_RELATIVE
Define this macro, with value 1, if the value of a symbol describing
the scope of a block (@code{N_LBRAC} or @code{N_RBRAC}) should be
relative to the start of the enclosing function.  Normally, GCC uses
an absolute address.
@end defmac

@defmac DBX_LINES_FUNCTION_RELATIVE
Define this macro, with value 1, if the value of a symbol indicating
the current line number (@code{N_SLINE}) should be relative to the
start of the enclosing function.  Normally, GCC uses an absolute address.
@end defmac

@defmac DBX_USE_BINCL
Define this macro if GCC should generate @code{N_BINCL} and
@code{N_EINCL} stabs for included header files, as on Sun systems.  This
macro also directs GCC to output a type number as a pair of a file
number and a type number within the file.  Normally, GCC does not
generate @code{N_BINCL} or @code{N_EINCL} stabs, and it outputs a single
number for a type number.
@end defmac

@node DBX Hooks
@subsection Open-Ended Hooks for DBX Format

@c prevent bad page break with this line
These are hooks for DBX format.

@defmac DBX_OUTPUT_SOURCE_LINE (@var{stream}, @var{line}, @var{counter})
A C statement to output DBX debugging information before code for line
number @var{line} of the current source file to the stdio stream
@var{stream}.  @var{counter} is the number of time the macro was
invoked, including the current invocation; it is intended to generate
unique labels in the assembly output.

This macro should not be defined if the default output is correct, or
if it can be made correct by defining @code{DBX_LINES_FUNCTION_RELATIVE}.
@end defmac

@defmac NO_DBX_FUNCTION_END
Some stabs encapsulation formats (in particular ECOFF), cannot handle the
@code{.stabs "",N_FUN,,0,0,Lscope-function-1} gdb dbx extension construct.
On those machines, define this macro to turn this feature off without
disturbing the rest of the gdb extensions.
@end defmac

@defmac NO_DBX_BNSYM_ENSYM
Some assemblers cannot handle the @code{.stabd BNSYM/ENSYM,0,0} gdb dbx
extension construct.  On those machines, define this macro to turn this
feature off without disturbing the rest of the gdb extensions.
@end defmac

@node File Names and DBX
@subsection File Names in DBX Format

@c prevent bad page break with this line
This describes file names in DBX format.

@defmac DBX_OUTPUT_MAIN_SOURCE_FILENAME (@var{stream}, @var{name})
A C statement to output DBX debugging information to the stdio stream
@var{stream}, which indicates that file @var{name} is the main source
file---the file specified as the input file for compilation.
This macro is called only once, at the beginning of compilation.

This macro need not be defined if the standard form of output
for DBX debugging information is appropriate.

It may be necessary to refer to a label equal to the beginning of the
text section.  You can use @samp{assemble_name (stream, ltext_label_name)}
to do so.  If you do this, you must also set the variable
@var{used_ltext_label_name} to @code{true}.
@end defmac

@defmac NO_DBX_MAIN_SOURCE_DIRECTORY
Define this macro, with value 1, if GCC should not emit an indication
of the current directory for compilation and current source language at
the beginning of the file.
@end defmac

@defmac NO_DBX_GCC_MARKER
Define this macro, with value 1, if GCC should not emit an indication
that this object file was compiled by GCC@.  The default is to emit
an @code{N_OPT} stab at the beginning of every source file, with
@samp{gcc2_compiled.} for the string and value 0.
@end defmac

@defmac DBX_OUTPUT_MAIN_SOURCE_FILE_END (@var{stream}, @var{name})
A C statement to output DBX debugging information at the end of
compilation of the main source file @var{name}.  Output should be
written to the stdio stream @var{stream}.

If you don't define this macro, nothing special is output at the end
of compilation, which is correct for most machines.
@end defmac

@defmac DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END
Define this macro @emph{instead of} defining
@code{DBX_OUTPUT_MAIN_SOURCE_FILE_END}, if what needs to be output at
the end of compilation is an @code{N_SO} stab with an empty string,
whose value is the highest absolute text address in the file.
@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.

@deftypefn {Target Hook} int TARGET_DWARF_CALLING_CONVENTION (const_tree @var{function})
Define this to enable the dwarf attribute @code{DW_AT_calling_convention} to
be emitted for each function.  Instead of an integer return the enum
value for the @code{DW_CC_} tag.
@end deftypefn

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

@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

@deftypefn {Target Hook} {enum unwind_info_type} TARGET_DEBUG_UNWIND_INFO (void)
This hook defines the mechanism that will be used for describing frame
unwind information to the debugger.  Normally the hook will return
@code{UI_DWARF2} if DWARF 2 debug information is enabled, and
return @code{UI_NONE} otherwise.

A target may return @code{UI_DWARF2} even when DWARF 2 debug information
is disabled in order to always output DWARF 2 frame information.

A target may return @code{UI_TARGET} if it has ABI specified unwind tables.
This will suppress generation of the normal debug frame unwind information.
@end deftypefn

@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

@deftypefn {Target Hook} int TARGET_RESET_LOCATION_VIEW (rtx_insn *@var{})
This hook, if defined, enables -ginternal-reset-location-views, and
uses its result to override cases in which the estimated min insn
length might be nonzero even when a PC advance (i.e., a view reset)
cannot be taken for granted.

If the hook is defined, it must return a positive value to indicate
the insn definitely advances the PC, and so the view number can be
safely assumed to be reset; a negative value to mean the insn
definitely does not advance the PC, and os the view number must not
be reset; or zero to decide based on the estimated insn length.

If insn length is to be regarded as reliable, set the hook to
@code{hook_int_rtx_insn_0}.
@end deftypefn

@deftypevr {Target Hook} bool TARGET_WANT_DEBUG_PUB_SECTIONS
True if the @code{.debug_pubtypes} and @code{.debug_pubnames} sections
should be emitted.  These sections are not used on most platforms, and
in particular GDB does not use them.
@end deftypevr

@deftypevr {Target Hook} bool TARGET_DELAY_SCHED2
True if sched2 is not to be run at its normal place.
This usually means it will be run as part of machine-specific reorg.
@end deftypevr

@deftypevr {Target Hook} bool TARGET_DELAY_VARTRACK
True if vartrack is not to be run at its normal place.
This usually means it will be run as part of machine-specific reorg.
@end deftypevr

@deftypevr {Target Hook} bool TARGET_NO_REGISTER_ALLOCATION
True if register allocation and the passes
following it should not be run.  Usually true only for virtual assembler
targets.
@end deftypevr

@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

@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_DWARF_DTPREL (FILE *@var{file}, int @var{size}, rtx @var{x})
If defined, this target hook is a function which outputs a DTP-relative
reference to the given TLS symbol of the specified size.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_MODE_EMIT (int @var{entity}, int @var{mode}, int @var{prev_mode}, HARD_REG_SET @var{regs_live})
Generate one or more insns to set @var{entity} to @var{mode}.
@var{hard_reg_live} is the set of hard registers live at the point where
the insn(s) are to be inserted. @var{prev_moxde} indicates the mode
to switch from. Sets of a lower numbered entity will be emitted before
sets of a higher numbered entity to a mode of the same or lower priority.
@end deftypefn

@deftypefn {Target Hook} int TARGET_MODE_NEEDED (int @var{entity}, rtx_insn *@var{insn})
@var{entity} is an integer specifying a mode-switched entity.
If @code{OPTIMIZE_MODE_SWITCHING} is defined, you must define this macro
to return an integer value not larger than the corresponding element
in @code{NUM_MODES_FOR_MODE_SWITCHING}, to denote the mode that @var{entity}
must be switched into prior to the execution of @var{insn}.
@end deftypefn

@deftypefn {Target Hook} int TARGET_MODE_AFTER (int @var{entity}, int @var{mode}, rtx_insn *@var{insn})
@var{entity} is an integer specifying a mode-switched entity.
If this macro is defined, it is evaluated for every @var{insn} during mode
switching.  It determines the mode that an insn results
in (if different from the incoming mode).
@end deftypefn

@deftypefn {Target Hook} int TARGET_MODE_ENTRY (int @var{entity})
If this macro is defined, it is evaluated for every @var{entity} that
needs mode switching.  It should evaluate to an integer, which is a mode
that @var{entity} is assumed to be switched to at function entry.
If @code{TARGET_MODE_ENTRY} is defined then @code{TARGET_MODE_EXIT}
must be defined.
@end deftypefn

@deftypefn {Target Hook} int TARGET_MODE_EXIT (int @var{entity})
If this macro is defined, it is evaluated for every @var{entity} that
needs mode switching.  It should evaluate to an integer, which is a mode
that @var{entity} is assumed to be switched to at function exit.
If @code{TARGET_MODE_EXIT} is defined then @code{TARGET_MODE_ENTRY}
must be defined.
@end deftypefn

@deftypefn {Target Hook} int TARGET_MODE_PRIORITY (int @var{entity}, int @var{n})
This macro specifies the order in which modes for @var{entity}
are processed. 0 is the highest priority,
@code{NUM_MODES_FOR_MODE_SWITCHING[@var{entity}] - 1} the lowest.
The value of the macro should be an integer designating a mode
for @var{entity}.  For any fixed @var{entity}, @code{mode_priority}
(@var{entity}, @var{n}) shall be a bijection in 0 @dots{}
@code{num_modes_for_mode_switching[@var{entity}] - 1}.
@end deftypefn

@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}.

@deftypevr {Target Hook} {const struct attribute_spec *} TARGET_ATTRIBUTE_TABLE
If defined, this target hook points to an array of @samp{struct
attribute_spec} (defined in @file{tree-core.h}) specifying the machine
specific attributes for this target and some of the restrictions on the
entities to which these attributes are applied and the arguments they
take.
@end deftypevr

@deftypefn {Target Hook} bool TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P (const_tree @var{name})
If defined, this target hook is a function which returns true if the
machine-specific attribute named @var{name} expects an identifier
given as its first argument to be passed on as a plain identifier, not
subjected to name lookup.  If this is not defined, the default is
false for all machine-specific attributes.
@end deftypefn

@deftypefn {Target Hook} int TARGET_COMP_TYPE_ATTRIBUTES (const_tree @var{type1}, const_tree @var{type2})
If defined, this target hook is a function which returns zero if the attributes on
@var{type1} and @var{type2} are incompatible, one if they are compatible,
and two if they are nearly compatible (which causes a warning to be
generated).  If this is not defined, machine-specific attributes are
supposed always to be compatible.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SET_DEFAULT_TYPE_ATTRIBUTES (tree @var{type})
If defined, this target hook is a function which assigns default attributes to
the newly defined @var{type}.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_MERGE_TYPE_ATTRIBUTES (tree @var{type1}, tree @var{type2})
Define this target hook if the merging of type attributes needs special
handling.  If defined, the result is a list of the combined
@code{TYPE_ATTRIBUTES} of @var{type1} and @var{type2}.  It is assumed
that @code{comptypes} has already been called and returned 1.  This
function may call @code{merge_attributes} to handle machine-independent
merging.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_MERGE_DECL_ATTRIBUTES (tree @var{olddecl}, tree @var{newdecl})
Define this target hook if the merging of decl attributes needs special
handling.  If defined, the result is a list of the combined
@code{DECL_ATTRIBUTES} of @var{olddecl} and @var{newdecl}.
@var{newdecl} is a duplicate declaration of @var{olddecl}.  Examples of
when this is needed are when one attribute overrides another, or when an
attribute is nullified by a subsequent definition.  This function may
call @code{merge_attributes} to handle machine-independent merging.

@findex TARGET_DLLIMPORT_DECL_ATTRIBUTES
If the only target-specific handling you require is @samp{dllimport}
for Microsoft Windows targets, you should define the macro
@code{TARGET_DLLIMPORT_DECL_ATTRIBUTES} to @code{1}.  The compiler
will then define a function called
@code{merge_dllimport_decl_attributes} which can then be defined as
the expansion of @code{TARGET_MERGE_DECL_ATTRIBUTES}.  You can also
add @code{handle_dll_attribute} in the attribute table for your port
to perform initial processing of the @samp{dllimport} and
@samp{dllexport} attributes.  This is done in @file{i386/cygwin.h} and
@file{i386/i386.c}, for example.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_VALID_DLLIMPORT_ATTRIBUTE_P (const_tree @var{decl})
@var{decl} is a variable or function with @code{__attribute__((dllimport))}
specified.  Use this hook if the target needs to add extra validation
checks to @code{handle_dll_attribute}.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_INSERT_ATTRIBUTES (tree @var{node}, tree *@var{attr_ptr})
Define this target hook if you want to be able to add attributes to a decl
when it is being created.  This is normally useful for back ends which
wish to implement a pragma by using the attributes which correspond to
the pragma's effect.  The @var{node} argument is the decl which is being
created.  The @var{attr_ptr} argument is a pointer to the attribute list
for this decl.  The list itself should not be modified, since it may be
shared with other decls, but attributes may be chained on the head of
the list and @code{*@var{attr_ptr}} modified to point to the new
attributes, or a copy of the list may be made if further changes are
needed.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_HANDLE_GENERIC_ATTRIBUTE (tree *@var{node}, tree @var{name}, tree @var{args}, int @var{flags}, bool *@var{no_add_attrs})
Define this target hook if you want to be able to perform additional
target-specific processing of an attribute which is handled generically
by a front end.  The arguments are the same as those which are passed to
attribute handlers.  So far this only affects the @var{noinit} and
@var{section} attribute.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P (const_tree @var{fndecl})
@cindex inlining
This target hook returns @code{true} if it is OK to inline @var{fndecl}
into the current function, despite its having target-specific
attributes, @code{false} otherwise.  By default, if a function has a
target specific attribute attached to it, it will not be inlined.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_OPTION_VALID_ATTRIBUTE_P (tree @var{fndecl}, tree @var{name}, tree @var{args}, int @var{flags})
This hook is called to parse @code{attribute(target("..."))}, which
allows setting target-specific options on individual functions.
These function-specific options may differ
from the options specified on the command line.  The hook should return
@code{true} if the options are valid.

The hook should set the @code{DECL_FUNCTION_SPECIFIC_TARGET} field in
the function declaration to hold a pointer to a target-specific
@code{struct cl_target_option} structure.
@end deftypefn

@deftypefn {Target Hook} void TARGET_OPTION_SAVE (struct cl_target_option *@var{ptr}, struct gcc_options *@var{opts}, struct gcc_options *@var{opts_set})
This hook is called to save any additional target-specific information
in the @code{struct cl_target_option} structure for function-specific
options from the @code{struct gcc_options} structure.
@xref{Option file format}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_OPTION_RESTORE (struct gcc_options *@var{opts}, struct gcc_options *@var{opts_set}, struct cl_target_option *@var{ptr})
This hook is called to restore any additional target-specific
information in the @code{struct cl_target_option} structure for
function-specific options to the @code{struct gcc_options} structure.
@end deftypefn

@deftypefn {Target Hook} void TARGET_OPTION_POST_STREAM_IN (struct cl_target_option *@var{ptr})
This hook is called to update target-specific information in the
@code{struct cl_target_option} structure after it is streamed in from
LTO bytecode.
@end deftypefn

@deftypefn {Target Hook} void TARGET_OPTION_PRINT (FILE *@var{file}, int @var{indent}, struct cl_target_option *@var{ptr})
This hook is called to print any additional target-specific
information in the @code{struct cl_target_option} structure for
function-specific options.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_OPTION_PRAGMA_PARSE (tree @var{args}, tree @var{pop_target})
This target hook parses the options for @code{#pragma GCC target}, which
sets the target-specific options for functions that occur later in the
input stream.  The options accepted should be the same as those handled by the
@code{TARGET_OPTION_VALID_ATTRIBUTE_P} hook.
@end deftypefn

@deftypefn {Target Hook} void TARGET_OPTION_OVERRIDE (void)
Sometimes certain combinations of command options do not make sense on
a particular target machine.  You can override the hook
@code{TARGET_OPTION_OVERRIDE} to take account of this.  This hooks is called
once just after all the command options have been parsed.

Don't use this hook to turn on various extra optimizations for
@option{-O}.  That is what @code{TARGET_OPTION_OPTIMIZATION} is for.

If you need to do something whenever the optimization level is
changed via the optimize attribute or pragma, see
@code{TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE}
@end deftypefn

@deftypefn {Target Hook} bool TARGET_OPTION_FUNCTION_VERSIONS (tree @var{decl1}, tree @var{decl2})
This target hook returns @code{true} if @var{DECL1} and @var{DECL2} are
versions of the same function.  @var{DECL1} and @var{DECL2} are function
versions if and only if they have the same function signature and
different target specific attributes, that is, they are compiled for
different target machines.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CAN_INLINE_P (tree @var{caller}, tree @var{callee})
This target hook returns @code{false} if the @var{caller} function
cannot inline @var{callee}, based on target specific information.  By
default, inlining is not allowed if the callee function has function
specific target options and the caller does not use the same options.
@end deftypefn

@deftypefn {Target Hook} void TARGET_RELAYOUT_FUNCTION (tree @var{fndecl})
This target hook fixes function @var{fndecl} after attributes are processed.
Default does nothing. On ARM, the default function's alignment is updated
with the attribute target.
@end deftypefn

@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.

@deftypevr {Target Hook} {const char *} TARGET_EMUTLS_GET_ADDRESS
Contains the name of the helper function that uses a TLS control
object to locate a TLS instance.  The default causes libgcc's
emulated TLS helper function to be used.
@end deftypevr

@deftypevr {Target Hook} {const char *} TARGET_EMUTLS_REGISTER_COMMON
Contains the name of the helper function that should be used at
program startup to register TLS objects that are implicitly
initialized to zero.  If this is @code{NULL}, all TLS objects will
have explicit initializers.  The default causes libgcc's emulated TLS
registration function to be used.
@end deftypevr

@deftypevr {Target Hook} {const char *} TARGET_EMUTLS_VAR_SECTION
Contains the name of the section in which TLS control variables should
be placed.  The default of @code{NULL} allows these to be placed in
any section.
@end deftypevr

@deftypevr {Target Hook} {const char *} TARGET_EMUTLS_TMPL_SECTION
Contains the name of the section in which TLS initializers should be
placed.  The default of @code{NULL} allows these to be placed in any
section.
@end deftypevr

@deftypevr {Target Hook} {const char *} TARGET_EMUTLS_VAR_PREFIX
Contains the prefix to be prepended to TLS control variable names.
The default of @code{NULL} uses a target-specific prefix.
@end deftypevr

@deftypevr {Target Hook} {const char *} TARGET_EMUTLS_TMPL_PREFIX
Contains the prefix to be prepended to TLS initializer objects.  The
default of @code{NULL} uses a target-specific prefix.
@end deftypevr

@deftypefn {Target Hook} tree TARGET_EMUTLS_VAR_FIELDS (tree @var{type}, tree *@var{name})
Specifies a function that generates the FIELD_DECLs for a TLS control
object type.  @var{type} is the RECORD_TYPE the fields are for and
@var{name} should be filled with the structure tag, if the default of
@code{__emutls_object} is unsuitable.  The default creates a type suitable
for libgcc's emulated TLS function.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_EMUTLS_VAR_INIT (tree @var{var}, tree @var{decl}, tree @var{tmpl_addr})
Specifies a function that generates the CONSTRUCTOR to initialize a
TLS control object.  @var{var} is the TLS control object, @var{decl}
is the TLS object and @var{tmpl_addr} is the address of the
initializer.  The default initializes libgcc's emulated TLS control object.
@end deftypefn

@deftypevr {Target Hook} bool TARGET_EMUTLS_VAR_ALIGN_FIXED
Specifies whether the alignment of TLS control variable objects is
fixed and should not be increased as some backends may do to optimize
single objects.  The default is false.
@end deftypevr

@deftypevr {Target Hook} bool TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS
Specifies whether a DWARF @code{DW_OP_form_tls_address} location descriptor
may be used to describe emulated TLS control objects.
@end deftypevr

@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

@deftypefn {Target Hook} {void *} TARGET_GET_PCH_VALIDITY (size_t *@var{sz})
This hook returns a pointer to the data needed by
@code{TARGET_PCH_VALID_P} and sets
@samp{*@var{sz}} to the size of the data in bytes.
@end deftypefn

@deftypefn {Target Hook} {const char *} TARGET_PCH_VALID_P (const void *@var{data}, size_t @var{sz})
This hook checks whether the options used to create a PCH file are
compatible with the current settings.  It returns @code{NULL}
if so and a suitable error message if not.  Error messages will
be presented to the user and must be localized using @samp{_(@var{msg})}.

@var{data} is the data that was returned by @code{TARGET_GET_PCH_VALIDITY}
when the PCH file was created and @var{sz} is the size of that data in bytes.
It's safe to assume that the data was created by the same version of the
compiler, so no format checking is needed.

The default definition of @code{default_pch_valid_p} should be
suitable for most targets.
@end deftypefn

@deftypefn {Target Hook} {const char *} TARGET_CHECK_PCH_TARGET_FLAGS (int @var{pch_flags})
If this hook is nonnull, the default implementation of
@code{TARGET_PCH_VALID_P} will use it to check for compatible values
of @code{target_flags}.  @var{pch_flags} specifies the value that
@code{target_flags} had when the PCH file was created.  The return
value is the same as for @code{TARGET_PCH_VALID_P}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_PREPARE_PCH_SAVE (void)
Called before writing out a PCH file.  If the target has some
garbage-collected data that needs to be in a particular state on PCH loads,
it can use this hook to enforce that state.  Very few targets need
to do anything here.
@end deftypefn

@node C++ ABI
@section C++ ABI parameters
@cindex parameters, c++ abi

@deftypefn {Target Hook} tree TARGET_CXX_GUARD_TYPE (void)
Define this hook to override the integer type used for guard variables.
These are used to implement one-time construction of static objects.  The
default is long_long_integer_type_node.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CXX_GUARD_MASK_BIT (void)
This hook determines how guard variables are used.  It should return
@code{false} (the default) if the first byte should be used.  A return value of
@code{true} indicates that only the least significant bit should be used.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_CXX_GET_COOKIE_SIZE (tree @var{type})
This hook returns the size of the cookie to use when allocating an array
whose elements have the indicated @var{type}.  Assumes that it is already
known that a cookie is needed.  The default is
@code{max(sizeof (size_t), alignof(type))}, as defined in section 2.7 of the
IA64/Generic C++ ABI@.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CXX_COOKIE_HAS_SIZE (void)
This hook should return @code{true} if the element size should be stored in
array cookies.  The default is to return @code{false}.
@end deftypefn

@deftypefn {Target Hook} int TARGET_CXX_IMPORT_EXPORT_CLASS (tree @var{type}, int @var{import_export})
If defined by a backend this hook allows the decision made to export
class @var{type} to be overruled.  Upon entry @var{import_export}
will contain 1 if the class is going to be exported, @minus{}1 if it is going
to be imported and 0 otherwise.  This function should return the
modified value and perform any other actions necessary to support the
backend's targeted operating system.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CXX_CDTOR_RETURNS_THIS (void)
This hook should return @code{true} if constructors and destructors return
the address of the object created/destroyed.  The default is to return
@code{false}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CXX_KEY_METHOD_MAY_BE_INLINE (void)
This hook returns true if the key method for a class (i.e., the method
which, if defined in the current translation unit, causes the virtual
table to be emitted) may be an inline function.  Under the standard
Itanium C++ ABI the key method may be an inline function so long as
the function is not declared inline in the class definition.  Under
some variants of the ABI, an inline function can never be the key
method.  The default is to return @code{true}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY (tree @var{decl})
@var{decl} is a virtual table, virtual table table, typeinfo object,
or other similar implicit class data object that will be emitted with
external linkage in this translation unit.  No ELF visibility has been
explicitly specified.  If the target needs to specify a visibility
other than that of the containing class, use this hook to set
@code{DECL_VISIBILITY} and @code{DECL_VISIBILITY_SPECIFIED}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT (void)
This hook returns true (the default) if virtual tables and other
similar implicit class data objects are always COMDAT if they have
external linkage.  If this hook returns false, then class data for
classes whose virtual table will be emitted in only one translation
unit will not be COMDAT.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CXX_LIBRARY_RTTI_COMDAT (void)
This hook returns true (the default) if the RTTI information for
the basic types which is defined in the C++ runtime should always
be COMDAT, false if it should not be COMDAT.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CXX_USE_AEABI_ATEXIT (void)
This hook returns true if @code{__aeabi_atexit} (as defined by the ARM EABI)
should be used to register static destructors when @option{-fuse-cxa-atexit}
is in effect.  The default is to return false to use @code{__cxa_atexit}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT (void)
This hook returns true if the target @code{atexit} function can be used
in the same manner as @code{__cxa_atexit} to register C++ static
destructors. This requires that @code{atexit}-registered functions in
shared libraries are run in the correct order when the libraries are
unloaded. The default is to return false.
@end deftypefn

@deftypefn {Target Hook} void TARGET_CXX_ADJUST_CLASS_AT_DEFINITION (tree @var{type})
@var{type} is a C++ class (i.e., RECORD_TYPE or UNION_TYPE) that has just
been defined.  Use this hook to make adjustments to the class (eg, tweak
visibility or perform any other required target modifications).
@end deftypefn

@deftypefn {Target Hook} tree TARGET_CXX_DECL_MANGLING_CONTEXT (const_tree @var{decl})
Return target-specific mangling context of @var{decl} or @code{NULL_TREE}.
@end deftypefn

@node D Language and ABI
@section D ABI parameters
@cindex parameters, d abi

@deftypefn {D Target Hook} void TARGET_D_CPU_VERSIONS (void)
Declare all environmental version identifiers relating to the target CPU
using the function @code{builtin_version}, which takes a string representing
the name of the version.  Version identifiers predefined by this hook apply
to all modules that are being compiled and imported.
@end deftypefn

@deftypefn {D Target Hook} void TARGET_D_OS_VERSIONS (void)
Similarly to @code{TARGET_D_CPU_VERSIONS}, but is used for versions
relating to the target operating system.
@end deftypefn

@deftypefn {D Target Hook} void TARGET_D_REGISTER_CPU_TARGET_INFO (void)
Register all target information keys relating to the target CPU using the
function @code{d_add_target_info_handlers}, which takes a
@samp{struct d_target_info_spec} (defined in @file{d/d-target.h}).  The keys
added by this hook are made available at compile time by the
@code{__traits(getTargetInfo)} extension, the result is an expression
describing the requested target information.
@end deftypefn

@deftypefn {D Target Hook} void TARGET_D_REGISTER_OS_TARGET_INFO (void)
Same as @code{TARGET_D_CPU_TARGET_INFO}, but is used for keys relating to
the target operating system.
@end deftypefn

@deftypevr {D Target Hook} {const char *} TARGET_D_MINFO_SECTION
Contains the name of the section in which module info references should be
placed.  This section is expected to be bracketed by two symbols to indicate
the start and end address of the section, so that the runtime library can
collect all modules for each loaded shared library and executable.  The
default value of @code{NULL} disables the use of sections altogether.
@end deftypevr

@deftypevr {D Target Hook} {const char *} TARGET_D_MINFO_START_NAME
If @code{TARGET_D_MINFO_SECTION} is defined, then this must also be defined
as the name of the symbol indicating the start address of the module info
section
@end deftypevr

@deftypevr {D Target Hook} {const char *} TARGET_D_MINFO_END_NAME
If @code{TARGET_D_MINFO_SECTION} is defined, then this must also be defined
as the name of the symbol indicating the end address of the module info
section
@end deftypevr

@deftypefn {D Target Hook} bool TARGET_D_HAS_STDCALL_CONVENTION (unsigned int *@var{link_system}, unsigned int *@var{link_windows})
Returns @code{true} if the target supports the stdcall calling convention.
The hook should also set @var{link_system} to @code{1} if the @code{stdcall}
attribute should be applied to functions with @code{extern(System)} linkage,
and @var{link_windows} to @code{1} to apply @code{stdcall} to functions with
@code{extern(Windows)} linkage.
@end deftypefn

@deftypevr {D Target Hook} bool TARGET_D_TEMPLATES_ALWAYS_COMDAT
This flag is true if instantiated functions and variables are always COMDAT
if they have external linkage.  If this flag is false, then instantiated
decls will be emitted as weak symbols.  The default is @code{false}.
@end deftypevr

@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

@deftypefn {Target Hook} scalar_int_mode TARGET_ADDR_SPACE_POINTER_MODE (addr_space_t @var{address_space})
Define this to return the machine mode to use for pointers to
@var{address_space} if the target supports named address spaces.
The default version of this hook returns @code{ptr_mode}.
@end deftypefn

@deftypefn {Target Hook} scalar_int_mode TARGET_ADDR_SPACE_ADDRESS_MODE (addr_space_t @var{address_space})
Define this to return the machine mode to use for addresses in
@var{address_space} if the target supports named address spaces.
The default version of this hook returns @code{Pmode}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ADDR_SPACE_VALID_POINTER_MODE (scalar_int_mode @var{mode}, addr_space_t @var{as})
Define this to return nonzero if the port can handle pointers
with machine mode @var{mode} to address space @var{as}.  This target
hook is the same as the @code{TARGET_VALID_POINTER_MODE} target hook,
except that it includes explicit named address space support.  The default
version of this hook returns true for the modes returned by either the
@code{TARGET_ADDR_SPACE_POINTER_MODE} or @code{TARGET_ADDR_SPACE_ADDRESS_MODE}
target hooks for the given address space.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P (machine_mode @var{mode}, rtx @var{exp}, bool @var{strict}, addr_space_t @var{as})
Define this to return true if @var{exp} is a valid address for mode
@var{mode} in the named address space @var{as}.  The @var{strict}
parameter says whether strict addressing is in effect after reload has
finished.  This target hook is the same as the
@code{TARGET_LEGITIMATE_ADDRESS_P} target hook, except that it includes
explicit named address space support.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS (rtx @var{x}, rtx @var{oldx}, machine_mode @var{mode}, addr_space_t @var{as})
Define this to modify an invalid address @var{x} to be a valid address
with mode @var{mode} in the named address space @var{as}.  This target
hook is the same as the @code{TARGET_LEGITIMIZE_ADDRESS} target hook,
except that it includes explicit named address space support.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ADDR_SPACE_SUBSET_P (addr_space_t @var{subset}, addr_space_t @var{superset})
Define this to return whether the @var{subset} named address space is
contained within the @var{superset} named address space.  Pointers to
a named address space that is a subset of another named address space
will be converted automatically without a cast if used together in
arithmetic operations.  Pointers to a superset address space can be
converted to pointers to a subset address space via explicit casts.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ADDR_SPACE_ZERO_ADDRESS_VALID (addr_space_t @var{as})
Define this to modify the default handling of address 0 for the
address space.  Return true if 0 should be considered a valid address.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_ADDR_SPACE_CONVERT (rtx @var{op}, tree @var{from_type}, tree @var{to_type})
Define this to convert the pointer expression represented by the RTL
@var{op} with type @var{from_type} that points to a named address
space to a new pointer expression with type @var{to_type} that points
to a different named address space.  When this hook it called, it is
guaranteed that one of the two address spaces is a subset of the other,
as determined by the @code{TARGET_ADDR_SPACE_SUBSET_P} target hook.
@end deftypefn

@deftypefn {Target Hook} int TARGET_ADDR_SPACE_DEBUG (addr_space_t @var{as})
Define this to define how the address space is encoded in dwarf.
The result is the value to be used with @code{DW_AT_address_class}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ADDR_SPACE_DIAGNOSE_USAGE (addr_space_t @var{as}, location_t @var{loc})
Define this hook if the availability of an address space depends on
command line options and some diagnostics should be printed when the
address space is used.  This hook is called during parsing and allows
to emit a better diagnostic compared to the case where the address space
was not registered with @code{c_register_addr_space}.  @var{as} is
the address space as registered with @code{c_register_addr_space}.
@var{loc} is the location of the address space qualifier token.
The default implementation does nothing.
@end deftypefn

@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

@deftypefn {Target Hook} {unsigned int} TARGET_CASE_VALUES_THRESHOLD (void)
This function return the smallest number of different values for which it
is best to use a jump-table instead of a tree of conditional branches.
The default is four for machines with a @code{casesi} instruction and
five otherwise.  This is best for most machines.
@end deftypefn

@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

@deftypefn {Target Hook} {unsigned int} TARGET_MIN_ARITHMETIC_PRECISION (void)
On some RISC architectures with 64-bit registers, the processor also
maintains 32-bit condition codes that make it possible to do real 32-bit
arithmetic, although the operations are performed on the full registers.

On such architectures, defining this hook to 32 tells the compiler to try
using 32-bit arithmetical operations setting the condition codes instead
of doing full 64-bit arithmetic.

More generally, define this hook on RISC architectures if you want the
compiler to try using arithmetical operations setting the condition codes
with a precision lower than the word precision.

You need not define this hook if @code{WORD_REGISTER_OPERATIONS} is not
defined to 1.
@end deftypefn

@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

@deftypefn {Target Hook} {unsigned int} TARGET_MIN_DIVISIONS_FOR_RECIP_MUL (machine_mode @var{mode})
When @option{-ffast-math} is in effect, GCC tries to optimize
divisions by the same divisor, by turning them into multiplications by
the reciprocal.  This target hook specifies the minimum number of divisions
that should be there for GCC to perform the optimization for a variable
of mode @var{mode}.  The default implementation returns 3 if the machine
has an instruction for the division, and 2 if it does not.
@end deftypefn

@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}
@deftypefn {Target Hook} {unsigned HOST_WIDE_INT} TARGET_SHIFT_TRUNCATION_MASK (machine_mode @var{mode})
This function describes how the standard shift patterns for @var{mode}
deal with shifts by negative amounts or by more than the width of the mode.
@xref{shift patterns}.

On many machines, the shift patterns will apply a mask @var{m} to the
shift count, meaning that a fixed-width shift of @var{x} by @var{y} is
equivalent to an arbitrary-width shift of @var{x} by @var{y & m}.  If
this is true for mode @var{mode}, the function should return @var{m},
otherwise it should return 0.  A return value of 0 indicates that no
particular behavior is guaranteed.

Note that, unlike @code{SHIFT_COUNT_TRUNCATED}, this function does
@emph{not} apply to general shift rtxes; it applies only to instructions
that are generated by the named shift patterns.

The default implementation of this function returns
@code{GET_MODE_BITSIZE (@var{mode}) - 1} if @code{SHIFT_COUNT_TRUNCATED}
and 0 otherwise.  This definition is always safe, but if
@code{SHIFT_COUNT_TRUNCATED} is false, and some shift patterns
nevertheless truncate the shift count, you may get better code
by overriding it.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_TRULY_NOOP_TRUNCATION (poly_uint64 @var{outprec}, poly_uint64 @var{inprec})
This hook returns true if it is safe to ``convert'' a value of
@var{inprec} bits to one of @var{outprec} bits (where @var{outprec} is
smaller than @var{inprec}) by merely operating on it as if it had only
@var{outprec} bits.  The default returns true unconditionally, which
is correct for most machines.  When @code{TARGET_TRULY_NOOP_TRUNCATION}
returns false, the machine description should provide a @code{trunc}
optab to specify the RTL that performs the required truncation.

If @code{TARGET_MODES_TIEABLE_P} returns false for a pair of modes,
suboptimal code can result if this hook returns true for the corresponding
mode sizes.  Making this hook return false in such cases may improve things.
@end deftypefn

@deftypefn {Target Hook} int TARGET_MODE_REP_EXTENDED (scalar_int_mode @var{mode}, scalar_int_mode @var{rep_mode})
The representation of an integral mode can be such that the values
are always extended to a wider integral mode.  Return
@code{SIGN_EXTEND} if values of @var{mode} are represented in
sign-extended form to @var{rep_mode}.  Return @code{UNKNOWN}
otherwise.  (Currently, none of the targets use zero-extended
representation this way so unlike @code{LOAD_EXTEND_OP},
@code{TARGET_MODE_REP_EXTENDED} is expected to return either
@code{SIGN_EXTEND} or @code{UNKNOWN}.  Also no target extends
@var{mode} to @var{rep_mode} so that @var{rep_mode} is not the next
widest integral mode and currently we take advantage of this fact.)

Similarly to @code{LOAD_EXTEND_OP} you may return a non-@code{UNKNOWN}
value even if the extension is not performed on certain hard registers
as long as for the @code{REGNO_REG_CLASS} of these hard registers
@code{TARGET_CAN_CHANGE_MODE_CLASS} returns false.

Note that @code{TARGET_MODE_REP_EXTENDED} and @code{LOAD_EXTEND_OP}
describe two related properties.  If you define
@code{TARGET_MODE_REP_EXTENDED (mode, word_mode)} you probably also want
to define @code{LOAD_EXTEND_OP (mode)} to return the same type of
extension.

In order to enforce the representation of @code{mode},
@code{TARGET_TRULY_NOOP_TRUNCATION} should return false when truncating to
@code{mode}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_SETJMP_PRESERVES_NONVOLATILE_REGS_P (void)
On some targets, it is assumed that the compiler will spill all pseudos
  that are live across a call to @code{setjmp}, while other targets treat
  @code{setjmp} calls as normal function calls.
  
  This hook returns false if @code{setjmp} calls do not preserve all
  non-volatile registers so that gcc that must spill all pseudos that are
  live across @code{setjmp} calls.  Define this to return true if the
  target does not need to spill all pseudos live across @code{setjmp} calls.
  The default implementation conservatively assumes all pseudos must be
  spilled across @code{setjmp} calls.
@end deftypefn

@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

@deftypefn {C Target Hook} {const char *} TARGET_C_PREINCLUDE (void)
Define this hook to return the name of a header file to be included at
the start of all compilations, as if it had been included with
@code{#include <@var{file}>}.  If this hook returns @code{NULL}, or is
not defined, or the header is not found, or if the user specifies
@option{-ffreestanding} or @option{-nostdinc}, no header is included.

This hook can be used together with a header provided by the system C
library to implement ISO C requirements for certain macros to be
predefined that describe properties of the whole implementation rather
than just the compiler.
@end deftypefn

@deftypefn {C Target Hook} bool TARGET_CXX_IMPLICIT_EXTERN_C (const char*@var{})
Define this hook to add target-specific C++ implicit extern C functions.
If this function returns true for the name of a file-scope function, that
function implicitly gets extern "C" linkage rather than whatever language
linkage the declaration would normally have.  An example of such function
is WinMain on Win32 targets.
@end deftypefn

@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

@deftypefn {Target Hook} {rtx_insn *} TARGET_MD_ASM_ADJUST (vec<rtx>& @var{outputs}, vec<rtx>& @var{inputs}, vec<machine_mode>& @var{input_modes}, vec<const char *>& @var{constraints}, vec<rtx>& @var{clobbers}, HARD_REG_SET& @var{clobbered_regs}, location_t @var{loc})
This target hook may add @dfn{clobbers} to @var{clobbers} and
@var{clobbered_regs} for any hard regs the port wishes to automatically
clobber for an asm.  The @var{outputs} and @var{inputs} may be inspected
to avoid clobbering a register that is already used by the asm.  @var{loc}
is the source location of the asm.

It may modify the @var{outputs}, @var{inputs}, @var{input_modes}, and
@var{constraints} as necessary for other pre-processing.  In this case the
return value is a sequence of insns to emit after the asm.  Note that
changes to @var{inputs} must be accompanied by the corresponding changes
to @var{input_modes}.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_MACHINE_DEPENDENT_REORG (void)
If non-null, this hook performs a target-specific pass over the
instruction stream.  The compiler will run it at all optimization levels,
just before the point at which it normally does delayed-branch scheduling.

The exact purpose of the hook varies from target to target.  Some use
it to do transformations that are necessary for correctness, such as
laying out in-function constant pools or avoiding hardware hazards.
Others use it as an opportunity to do some machine-dependent optimizations.

You need not implement the hook if it has nothing to do.  The default
definition is null.
@end deftypefn

@deftypefn {Target Hook} void TARGET_INIT_BUILTINS (void)
Define this hook if you have any machine-specific built-in functions
that need to be defined.  It should be a function that performs the
necessary setup.

Machine specific built-in functions can be useful to expand special machine
instructions that would otherwise not normally be generated because
they have no equivalent in the source language (for example, SIMD vector
instructions or prefetch instructions).

To create a built-in function, call the function
@code{lang_hooks.builtin_function}
which is defined by the language front end.  You can use any type nodes set
up by @code{build_common_tree_nodes};
only language front ends that use those two functions will call
@samp{TARGET_INIT_BUILTINS}.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_BUILTIN_DECL (unsigned @var{code}, bool @var{initialize_p})
Define this hook if you have any machine-specific built-in functions
that need to be defined.  It should be a function that returns the
builtin function declaration for the builtin function code @var{code}.
If there is no such builtin and it cannot be initialized at this time
if @var{initialize_p} is true the function should return @code{NULL_TREE}.
If @var{code} is out of range the function should return
@code{error_mark_node}.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_EXPAND_BUILTIN (tree @var{exp}, rtx @var{target}, rtx @var{subtarget}, machine_mode @var{mode}, int @var{ignore})

Expand a call to a machine specific built-in function that was set up by
@samp{TARGET_INIT_BUILTINS}.  @var{exp} is the expression for the
function call; the result should go to @var{target} if that is
convenient, and have mode @var{mode} if that is convenient.
@var{subtarget} may be used as the target for computing one of
@var{exp}'s operands.  @var{ignore} is nonzero if the value is to be
ignored.  This function should return the result of the call to the
built-in function.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_RESOLVE_OVERLOADED_BUILTIN (unsigned int @var{loc}, tree @var{fndecl}, void *@var{arglist})
Select a replacement for a machine specific built-in function that
was set up by @samp{TARGET_INIT_BUILTINS}.  This is done
@emph{before} regular type checking, and so allows the target to
implement a crude form of function overloading.  @var{fndecl} is the
declaration of the built-in function.  @var{arglist} is the list of
arguments passed to the built-in function.  The result is a
complete expression that implements the operation, usually
another @code{CALL_EXPR}.
@var{arglist} really has type @samp{VEC(tree,gc)*}
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CHECK_BUILTIN_CALL (location_t @var{loc}, vec<location_t> @var{arg_loc}, tree @var{fndecl}, tree @var{orig_fndecl}, unsigned int @var{nargs}, tree *@var{args})
Perform semantic checking on a call to a machine-specific built-in
function after its arguments have been constrained to the function
signature.  Return true if the call is valid, otherwise report an error
and return false.

This hook is called after @code{TARGET_RESOLVE_OVERLOADED_BUILTIN}.
The call was originally to built-in function @var{orig_fndecl},
but after the optional @code{TARGET_RESOLVE_OVERLOADED_BUILTIN}
step is now to built-in function @var{fndecl}.  @var{loc} is the
location of the call and @var{args} is an array of function arguments,
of which there are @var{nargs}.  @var{arg_loc} specifies the location
of each argument.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_FOLD_BUILTIN (tree @var{fndecl}, int @var{n_args}, tree *@var{argp}, bool @var{ignore})
Fold a call to a machine specific built-in function that was set up by
@samp{TARGET_INIT_BUILTINS}.  @var{fndecl} is the declaration of the
built-in function.  @var{n_args} is the number of arguments passed to
the function; the arguments themselves are pointed to by @var{argp}.
The result is another tree, valid for both GIMPLE and GENERIC,
containing a simplified expression for the call's result.  If
@var{ignore} is true the value will be ignored.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_GIMPLE_FOLD_BUILTIN (gimple_stmt_iterator *@var{gsi})
Fold a call to a machine specific built-in function that was set up
by @samp{TARGET_INIT_BUILTINS}.  @var{gsi} points to the gimple
statement holding the function call.  Returns true if any change
was made to the GIMPLE stream.
@end deftypefn

@deftypefn {Target Hook} int TARGET_COMPARE_VERSION_PRIORITY (tree @var{decl1}, tree @var{decl2})
This hook is used to compare the target attributes in two functions to
determine which function's features get higher priority.  This is used
during function multi-versioning to figure out the order in which two
versions must be dispatched.  A function version with a higher priority
is checked for dispatching earlier.  @var{decl1} and @var{decl2} are
 the two function decls that will be compared.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_GET_FUNCTION_VERSIONS_DISPATCHER (void *@var{decl})
This hook is used to get the dispatcher function for a set of function
versions.  The dispatcher function is called to invoke the right function
version at run-time. @var{decl} is one version from a set of semantically
identical versions.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_GENERATE_VERSION_DISPATCHER_BODY (void *@var{arg})
This hook is used to generate the dispatcher logic to invoke the right
function version at run-time for a given set of function versions.
@var{arg} points to the callgraph node of the dispatcher function whose
body must be generated.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_PREDICT_DOLOOP_P (class loop *@var{loop})
Return true if we can predict it is possible to use a low-overhead loop
for a particular loop.  The parameter @var{loop} is a pointer to the loop.
This target hook is required only when the target supports low-overhead
loops, and will help ivopts to make some decisions.
The default version of this hook returns false.
@end deftypefn

@deftypevr {Target Hook} bool TARGET_HAVE_COUNT_REG_DECR_P
Return true if the target supports hardware count register for decrement
and branch.
The default value is false.
@end deftypevr

@deftypevr {Target Hook} int64_t TARGET_DOLOOP_COST_FOR_GENERIC
One IV candidate dedicated for doloop is introduced in IVOPTs, we can
calculate the computation cost of adopting it to any generic IV use by
function get_computation_cost as before.  But for targets which have
hardware count register support for decrement and branch, it may have to
move IV value from hardware count register to general purpose register
while doloop IV candidate is used for generic IV uses.  It probably takes
expensive penalty.  This hook allows target owners to define the cost for
this especially for generic IV uses.
The default value is zero.
@end deftypevr

@deftypevr {Target Hook} int64_t TARGET_DOLOOP_COST_FOR_ADDRESS
One IV candidate dedicated for doloop is introduced in IVOPTs, we can
calculate the computation cost of adopting it to any address IV use by
function get_computation_cost as before.  But for targets which have
hardware count register support for decrement and branch, it may have to
move IV value from hardware count register to general purpose register
while doloop IV candidate is used for address IV uses.  It probably takes
expensive penalty.  This hook allows target owners to define the cost for
this escpecially for address IV uses.
The default value is zero.
@end deftypevr

@deftypefn {Target Hook} bool TARGET_CAN_USE_DOLOOP_P (const widest_int @var{&iterations}, const widest_int @var{&iterations_max}, unsigned int @var{loop_depth}, bool @var{entered_at_top})
Return true if it is possible to use low-overhead loops (@code{doloop_end}
and @code{doloop_begin}) for a particular loop.  @var{iterations} gives the
exact number of iterations, or 0 if not known.  @var{iterations_max} gives
the maximum number of iterations, or 0 if not known.  @var{loop_depth} is
the nesting depth of the loop, with 1 for innermost loops, 2 for loops that
contain innermost loops, and so on.  @var{entered_at_top} is true if the
loop is only entered from the top.

This hook is only used if @code{doloop_end} is available.  The default
implementation returns true.  You can use @code{can_use_doloop_if_innermost}
if the loop must be the innermost, and if there are no other restrictions.
@end deftypefn

@deftypefn {Target Hook} {const char *} TARGET_INVALID_WITHIN_DOLOOP (const rtx_insn *@var{insn})

Take an instruction in @var{insn} and return NULL if it is valid within a
low-overhead loop, otherwise return a string explaining why doloop
could not be applied.

Many targets use special registers for low-overhead looping. For any
instruction that clobbers these this function should return a string indicating
the reason why the doloop could not be applied.
By default, the RTL loop optimizer does not use a present doloop pattern for
loops containing function calls or branch on table instructions.
@end deftypefn

@deftypefn {Target Hook} machine_mode TARGET_PREFERRED_DOLOOP_MODE (machine_mode @var{mode})
This hook takes a @var{mode} for a doloop IV, where @code{mode} is the
original mode for the operation.  If the target prefers an alternate
@code{mode} for the operation, then this hook should return that mode;
otherwise the original @code{mode} should be returned.  For example, on a
64-bit target, @code{DImode} might be preferred over @code{SImode}.  Both the
original and the returned modes should be @code{MODE_INT}.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_LEGITIMATE_COMBINED_INSN (rtx_insn *@var{insn})
Take an instruction in @var{insn} and return @code{false} if the instruction
is not appropriate as a combination of two or more instructions.  The
default is to accept all instructions.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_CAN_FOLLOW_JUMP (const rtx_insn *@var{follower}, const rtx_insn *@var{followee})
FOLLOWER and FOLLOWEE are JUMP_INSN instructions;
return true if FOLLOWER may be modified to follow FOLLOWEE;
false, if it can't.
For example, on some targets, certain kinds of branches can't be made to
follow through a hot/cold partitioning.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_COMMUTATIVE_P (const_rtx @var{x}, int @var{outer_code})
This target hook returns @code{true} if @var{x} is considered to be commutative.
Usually, this is just COMMUTATIVE_P (@var{x}), but the HP PA doesn't consider
PLUS to be commutative inside a MEM@.  @var{outer_code} is the rtx code
of the enclosing rtl, if known, otherwise it is UNKNOWN.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_ALLOCATE_INITIAL_VALUE (rtx @var{hard_reg})

When the initial value of a hard register has been copied in a pseudo
register, it is often not necessary to actually allocate another register
to this pseudo register, because the original hard register or a stack slot
it has been saved into can be used.  @code{TARGET_ALLOCATE_INITIAL_VALUE}
is called at the start of register allocation once for each hard register
that had its initial value copied by using
@code{get_func_hard_reg_initial_val} or @code{get_hard_reg_initial_val}.
Possible values are @code{NULL_RTX}, if you don't want
to do any special allocation, a @code{REG} rtx---that would typically be
the hard register itself, if it is known not to be clobbered---or a
@code{MEM}.
If you are returning a @code{MEM}, this is only a hint for the allocator;
it might decide to use another register anyways.
You may use @code{current_function_is_leaf} or 
@code{REG_N_SETS} in the hook to determine if the hard
register in question will not be clobbered.
The default value of this hook is @code{NULL}, which disables any special
allocation.
@end deftypefn

@deftypefn {Target Hook} int TARGET_UNSPEC_MAY_TRAP_P (const_rtx @var{x}, unsigned @var{flags})
This target hook returns nonzero if @var{x}, an @code{unspec} or
@code{unspec_volatile} operation, might cause a trap.  Targets can use
this hook to enhance precision of analysis for @code{unspec} and
@code{unspec_volatile} operations.  You may call @code{may_trap_p_1}
to analyze inner elements of @var{x} in which case @var{flags} should be
passed along.
@end deftypefn

@deftypefn {Target Hook} void TARGET_SET_CURRENT_FUNCTION (tree @var{decl})
The compiler invokes this hook whenever it changes its current function
context (@code{cfun}).  You can define this function if
the back end needs to perform any initialization or reset actions on a
per-function basis.  For example, it may be used to implement function
attributes that affect register usage or code generation patterns.
The argument @var{decl} is the declaration for the new function context,
and may be null to indicate that the compiler has left a function context
and is returning to processing at the top level.
The default hook function does nothing.

GCC sets @code{cfun} to a dummy function context during initialization of
some parts of the back end.  The hook function is not invoked in this
situation; you need not worry about the hook being invoked recursively,
or when the back end is in a partially-initialized state.
@code{cfun} might be @code{NULL} to indicate processing at top level,
outside of any function scope.
@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_CANNOT_MODIFY_JUMPS_P (void)
This target hook returns @code{true} past the point in which new jump
instructions could be created.  On machines that require a register for
every jump such as the SHmedia ISA of SH5, this point would typically be
reload, so this target hook should be defined to a function such as:

@smallexample
static bool
cannot_modify_jumps_past_reload_p ()
@{
  return (reload_completed || reload_in_progress);
@}
@end smallexample
@end deftypefn

@deftypefn {Target Hook} bool TARGET_HAVE_CONDITIONAL_EXECUTION (void)
This target hook returns true if the target supports conditional execution.
This target hook is required only when the target has several different
modes and they have different conditional execution capability, such as ARM.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_GEN_CCMP_FIRST (rtx_insn **@var{prep_seq}, rtx_insn **@var{gen_seq}, int @var{code}, tree @var{op0}, tree @var{op1})
This function prepares to emit a comparison insn for the first compare in a
 sequence of conditional comparisions.  It returns an appropriate comparison
 with @code{CC} for passing to @code{gen_ccmp_next} or @code{cbranch_optab}.
 The insns to prepare the compare are saved in @var{prep_seq} and the compare
 insns are saved in @var{gen_seq}.  They will be emitted when all the
 compares in the conditional comparision are generated without error.
 @var{code} is the @code{rtx_code} of the compare for @var{op0} and @var{op1}.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_GEN_CCMP_NEXT (rtx_insn **@var{prep_seq}, rtx_insn **@var{gen_seq}, rtx @var{prev}, int @var{cmp_code}, tree @var{op0}, tree @var{op1}, int @var{bit_code})
This function prepares to emit a conditional comparison within a sequence
 of conditional comparisons.  It returns an appropriate comparison with
 @code{CC} for passing to @code{gen_ccmp_next} or @code{cbranch_optab}.
 The insns to prepare the compare are saved in @var{prep_seq} and the compare
 insns are saved in @var{gen_seq}.  They will be emitted when all the
 compares in the conditional comparision are generated without error.  The
 @var{prev} expression is the result of a prior call to @code{gen_ccmp_first}
 or @code{gen_ccmp_next}.  It may return @code{NULL} if the combination of
 @var{prev} and this comparison is not supported, otherwise the result must
 be appropriate for passing to @code{gen_ccmp_next} or @code{cbranch_optab}.
 @var{code} is the @code{rtx_code} of the compare for @var{op0} and @var{op1}.
 @var{bit_code} is @code{AND} or @code{IOR}, which is the op on the compares.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_GEN_MEMSET_SCRATCH_RTX (machine_mode @var{mode})
This hook should return an rtx for a scratch register in @var{mode} to
be used when expanding memset calls.  The backend can use a hard scratch
register to avoid stack realignment when expanding memset.  The default
is @code{gen_reg_rtx}.
@end deftypefn

@deftypefn {Target Hook} unsigned TARGET_LOOP_UNROLL_ADJUST (unsigned @var{nunroll}, class loop *@var{loop})
This target hook returns a new value for the number of times @var{loop}
should be unrolled. The parameter @var{nunroll} is the number of times
the loop is to be unrolled. The parameter @var{loop} is a pointer to
the loop, which is going to be checked for unrolling. This target hook
is required only when the target has special constraints like maximum
number of memory accesses.
@end deftypefn

@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} 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

@deftypefn {Target Hook} {const char *} TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN (const_tree @var{typelist}, const_tree @var{funcdecl}, const_tree @var{val})
If defined, this macro returns the diagnostic message when it is
illegal to pass argument @var{val} to function @var{funcdecl}
with prototype @var{typelist}.
@end deftypefn

@deftypefn {Target Hook} {const char *} TARGET_INVALID_CONVERSION (const_tree @var{fromtype}, const_tree @var{totype})
If defined, this macro returns the diagnostic message when it is
invalid to convert from @var{fromtype} to @var{totype}, or @code{NULL}
if validity should be determined by the front end.
@end deftypefn

@deftypefn {Target Hook} {const char *} TARGET_INVALID_UNARY_OP (int @var{op}, const_tree @var{type})
If defined, this macro returns the diagnostic message when it is
invalid to apply operation @var{op} (where unary plus is denoted by
@code{CONVERT_EXPR}) to an operand of type @var{type}, or @code{NULL}
if validity should be determined by the front end.
@end deftypefn

@deftypefn {Target Hook} {const char *} TARGET_INVALID_BINARY_OP (int @var{op}, const_tree @var{type1}, const_tree @var{type2})
If defined, this macro returns the diagnostic message when it is
invalid to apply operation @var{op} to operands of types @var{type1}
and @var{type2}, or @code{NULL} if validity should be determined by
the front end.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_PROMOTED_TYPE (const_tree @var{type})
If defined, this target hook returns the type to which values of
@var{type} should be promoted when they appear in expressions,
analogous to the integer promotions, or @code{NULL_TREE} to use the
front end's normal promotion rules.  This hook is useful when there are
target-specific types with special promotion rules.
This is currently used only by the C and C++ front ends.
@end deftypefn

@deftypefn {Target Hook} tree TARGET_CONVERT_TO_TYPE (tree @var{type}, tree @var{expr})
If defined, this hook returns the result of converting @var{expr} to
@var{type}.  It should return the converted expression,
or @code{NULL_TREE} to apply the front end's normal conversion rules.
This hook is useful when there are target-specific types with special
conversion rules.
This is currently used only by the C and C++ front ends.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_VERIFY_TYPE_CONTEXT (location_t @var{loc}, type_context_kind @var{context}, const_tree @var{type}, bool @var{silent_p})
If defined, this hook returns false if there is a target-specific reason
why type @var{type} cannot be used in the source language context described
by @var{context}.  When @var{silent_p} is false, the hook also reports an
error against @var{loc} for invalid uses of @var{type}.

Calls to this hook should be made through the global function
@code{verify_type_context}, which makes the @var{silent_p} parameter
default to false and also handles @code{error_mark_node}.

The default implementation always returns true.
@end deftypefn

@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

@deftypefn {Target Hook} void TARGET_UPDATE_STACK_BOUNDARY (void)
Define this macro to update the current function stack boundary if
necessary.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_GET_DRAP_RTX (void)
This hook should return an rtx for Dynamic Realign Argument Pointer (DRAP) if a
different argument pointer register is needed to access the function's
argument list due to stack realignment.  Return @code{NULL} if no DRAP
is needed.
@end deftypefn

@deftypefn {Target Hook} HARD_REG_SET TARGET_ZERO_CALL_USED_REGS (HARD_REG_SET @var{selected_regs})
This target hook emits instructions to zero the subset of @var{selected_regs}
that could conceivably contain values that are useful to an attacker.
Return the set of registers that were actually cleared.

The default implementation uses normal move instructions to zero
all the registers in @var{selected_regs}.  Define this hook if the
target has more efficient ways of zeroing certain registers,
or if you believe that certain registers would never contain
values that are useful to an attacker.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS (void)
When optimization is disabled, this hook indicates whether or not
arguments should be allocated to stack slots.  Normally, GCC allocates
stacks slots for arguments when not optimizing in order to make
debugging easier.  However, when a function is declared with
@code{__attribute__((naked))}, there is no stack frame, and the compiler
cannot safely move arguments from the registers in which they are passed
to the stack.  Therefore, this hook should return true in general, but
false for naked functions.  The default implementation always returns true.
@end deftypefn

@deftypevr {Target Hook} {unsigned HOST_WIDE_INT} TARGET_CONST_ANCHOR
On some architectures it can take multiple instructions to synthesize
a constant.  If there is another constant already in a register that
is close enough in value then it is preferable that the new constant
is computed from this register using immediate addition or
subtraction.  We accomplish this through CSE.  Besides the value of
the constant we also add a lower and an upper constant anchor to the
available expressions.  These are then queried when encountering new
constants.  The anchors are computed by rounding the constant up and
down to a multiple of the value of @code{TARGET_CONST_ANCHOR}.
@code{TARGET_CONST_ANCHOR} should be the maximum positive value
accepted by immediate-add plus one.  We currently assume that the
value of @code{TARGET_CONST_ANCHOR} is a power of 2.  For example, on
MIPS, where add-immediate takes a 16-bit signed value,
@code{TARGET_CONST_ANCHOR} is set to @samp{0x8000}.  The default value
is zero, which disables this optimization.
@end deftypevr

@deftypefn {Target Hook} {unsigned HOST_WIDE_INT} TARGET_ASAN_SHADOW_OFFSET (void)
Return the offset bitwise ored into shifted address to get corresponding
Address Sanitizer shadow memory address.  NULL if Address Sanitizer is not
supported by the target.  May return 0 if Address Sanitizer is not supported
by a subtarget.
@end deftypefn

@deftypefn {Target Hook} {unsigned HOST_WIDE_INT} TARGET_MEMMODEL_CHECK (unsigned HOST_WIDE_INT @var{val})
Validate target specific memory model mask bits. When NULL no target specific
memory model bits are allowed.
@end deftypefn

@deftypevr {Target Hook} {unsigned char} TARGET_ATOMIC_TEST_AND_SET_TRUEVAL
This value should be set if the result written by
@code{atomic_test_and_set} is not exactly 1, i.e.@: the
@code{bool} @code{true}.
@end deftypevr

@deftypefn {Target Hook} bool TARGET_HAS_IFUNC_P (void)
It returns true if the target supports GNU indirect functions.
The support includes the assembler, linker and dynamic linker.
The default value of this hook is based on target's libc.
@end deftypefn

@deftypefn {Target Hook} {unsigned int} TARGET_ATOMIC_ALIGN_FOR_MODE (machine_mode @var{mode})
If defined, this function returns an appropriate alignment in bits for an
atomic object of machine_mode @var{mode}.  If 0 is returned then the
default alignment for the specified mode is used.
@end deftypefn

@deftypefn {Target Hook} void TARGET_ATOMIC_ASSIGN_EXPAND_FENV (tree *@var{hold}, tree *@var{clear}, tree *@var{update})
ISO C11 requires atomic compound assignments that may raise floating-point
exceptions to raise exceptions corresponding to the arithmetic operation
whose result was successfully stored in a compare-and-exchange sequence.
This requires code equivalent to calls to @code{feholdexcept},
@code{feclearexcept} and @code{feupdateenv} to be generated at
appropriate points in the compare-and-exchange sequence.  This hook should
set @code{*@var{hold}} to an expression equivalent to the call to
@code{feholdexcept}, @code{*@var{clear}} to an expression equivalent to
the call to @code{feclearexcept} and @code{*@var{update}} to an expression
equivalent to the call to @code{feupdateenv}.  The three expressions are
@code{NULL_TREE} on entry to the hook and may be left as @code{NULL_TREE}
if no code is required in a particular place.  The default implementation
leaves all three expressions as @code{NULL_TREE}.  The
@code{__atomic_feraiseexcept} function from @code{libatomic} may be of use
as part of the code generated in @code{*@var{update}}.
@end deftypefn

@deftypefn {Target Hook} void TARGET_RECORD_OFFLOAD_SYMBOL (tree)
Used when offloaded functions are seen in the compilation unit and no named
sections are available.  It is called once for each symbol that must be
recorded in the offload function and variable table.
@end deftypefn

@deftypefn {Target Hook} {char *} TARGET_OFFLOAD_OPTIONS (void)
Used when writing out the list of options into an LTO file.  It should
translate any relevant target-specific options (such as the ABI in use)
into one of the @option{-foffload} options that exist as a common interface
to express such options.  It should return a string containing these options,
separated by spaces, which the caller will free.

@end deftypefn

@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

@deftypefn {Target Hook} bool TARGET_HAVE_SPECULATION_SAFE_VALUE (bool @var{active})
This hook is used to determine the level of target support for
 @code{__builtin_speculation_safe_value}.  If called with an argument
 of false, it returns true if the target has been modified to support
 this builtin.  If called with an argument of true, it returns true
 if the target requires active mitigation execution might be speculative.
 
 The default implementation returns false if the target does not define
 a pattern named @code{speculation_barrier}.  Else it returns true
 for the first case and whether the pattern is enabled for the current
 compilation for the second case.
 
 For targets that have no processors that can execute instructions
 speculatively an alternative implemenation of this hook is available:
 simply redefine this hook to @code{speculation_safe_value_not_needed}
 along with your other target hooks.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_SPECULATION_SAFE_VALUE (machine_mode @var{mode}, rtx @var{result}, rtx @var{val}, rtx @var{failval})
This target hook can be used to generate a target-specific code
 sequence that implements the @code{__builtin_speculation_safe_value}
 built-in function.  The function must always return @var{val} in
 @var{result} in mode @var{mode} when the cpu is not executing
 speculatively, but must never return that when speculating until it
 is known that the speculation will not be unwound.  The hook supports
 two primary mechanisms for implementing the requirements.  The first
 is to emit a speculation barrier which forces the processor to wait
 until all prior speculative operations have been resolved; the second
 is to use a target-specific mechanism that can track the speculation
 state and to return @var{failval} if it can determine that
 speculation must be unwound at a later time.
 
 The default implementation simply copies @var{val} to @var{result} and
 emits a @code{speculation_barrier} instruction if that is defined.
@end deftypefn

@deftypefn {Target Hook} void TARGET_RUN_TARGET_SELFTESTS (void)
If selftests are enabled, run any selftests for this target.
@end deftypefn

@deftypefn {Target Hook} bool TARGET_MEMTAG_CAN_TAG_ADDRESSES ()
True if the backend architecture naturally supports ignoring some region
of pointers.  This feature means that @option{-fsanitize=hwaddress} can
work.

At preset, this feature does not support address spaces.  It also requires
@code{Pmode} to be the same as @code{ptr_mode}.
@end deftypefn

@deftypefn {Target Hook} uint8_t TARGET_MEMTAG_TAG_SIZE ()
Return the size of a tag (in bits) for this platform.

The default returns 8.
@end deftypefn

@deftypefn {Target Hook} uint8_t TARGET_MEMTAG_GRANULE_SIZE ()
Return the size in real memory that each byte in shadow memory refers to.
I.e. if a variable is @var{X} bytes long in memory, then this hook should
return the value @var{Y} such that the tag in shadow memory spans
@var{X}/@var{Y} bytes.

Most variables will need to be aligned to this amount since two variables
that are neighbors in memory and share a tag granule would need to share
the same tag.

The default returns 16.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_MEMTAG_INSERT_RANDOM_TAG (rtx @var{untagged}, rtx @var{target})
Return an RTX representing the value of @var{untagged} but with a
(possibly) random tag in it.
Put that value into @var{target} if it is convenient to do so.
This function is used to generate a tagged base for the current stack frame.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_MEMTAG_ADD_TAG (rtx @var{base}, poly_int64 @var{addr_offset}, uint8_t @var{tag_offset})
Return an RTX that represents the result of adding @var{addr_offset} to
the address in pointer @var{base} and @var{tag_offset} to the tag in pointer
@var{base}.
The resulting RTX must either be a valid memory address or be able to get
put into an operand with @code{force_operand}.

Unlike other memtag hooks, this must return an expression and not emit any
RTL.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_MEMTAG_SET_TAG (rtx @var{untagged_base}, rtx @var{tag}, rtx @var{target})
Return an RTX representing @var{untagged_base} but with the tag @var{tag}.
Try and store this in @var{target} if convenient.
@var{untagged_base} is required to have a zero tag when this hook is called.
The default of this hook is to set the top byte of @var{untagged_base} to
@var{tag}.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_MEMTAG_EXTRACT_TAG (rtx @var{tagged_pointer}, rtx @var{target})
Return an RTX representing the tag stored in @var{tagged_pointer}.
Store the result in @var{target} if it is convenient.
The default represents the top byte of the original pointer.
@end deftypefn

@deftypefn {Target Hook} rtx TARGET_MEMTAG_UNTAGGED_POINTER (rtx @var{tagged_pointer}, rtx @var{target})
Return an RTX representing @var{tagged_pointer} with its tag set to zero.
Store the result in @var{target} if convenient.
The default clears the top byte of the original pointer.
@end deftypefn

@deftypefn {Target Hook} HOST_WIDE_INT TARGET_GCOV_TYPE_SIZE (void)
Returns the gcov type size in bits.  This type is used for example for
counters incremented by profiling and code-coverage events.  The default
value is 64, if the type size of long long is greater than 32, otherwise the
default value is 32.  A 64-bit type is recommended to avoid overflows of the
counters.  If the @option{-fprofile-update=atomic} is used, then the
counters are incremented using atomic operations.  Targets not supporting
64-bit atomic operations may override the default value and request a 32-bit
type.
@end deftypefn
