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

@node Host Config
@chapter Host Configuration
@cindex host configuration

Most details about the machine and system on which the compiler is
actually running are detected by the @command{configure} script.  Some
things are impossible for @command{configure} to detect; these are
described in two ways, either by macros defined in a file named
@file{xm-@var{machine}.h} or by hook functions in the file specified
by the @var{out_host_hook_obj} variable in @file{config.gcc}.  (The
intention is that very few hosts will need a header file but nearly
every fully supported host will need to override some hooks.)

If you need to define only a few macros, and they have simple
definitions, consider using the @code{xm_defines} variable in your
@file{config.gcc} entry instead of creating a host configuration
header.  @xref{System Config}.

@menu
* Host Common::         Things every host probably needs implemented.
* Filesystem::          Your host cannot have the letter `a' in filenames?
* Host Misc::           Rare configuration options for hosts.
@end menu

@node Host Common
@section Host Common
@cindex host hooks
@cindex host functions

Some things are just not portable, even between similar operating systems,
and are too difficult for autoconf to detect.  They get implemented using
hook functions in the file specified by the @var{host_hook_obj}
variable in @file{config.gcc}.

@deftypefn {Host Hook} void HOST_HOOKS_EXTRA_SIGNALS (void)
This host hook is used to set up handling for extra signals.  The most
common thing to do in this hook is to detect stack overflow.
@end deftypefn

@deftypefn {Host Hook} {void *} HOST_HOOKS_GT_PCH_GET_ADDRESS (size_t @
  @var{size}, int @var{fd})
This host hook returns the address of some space that is likely to be
free in some subsequent invocation of the compiler.  We intend to load
the PCH data at this address such that the data need not be relocated.
The area should be able to hold @var{size} bytes.  If the host uses
@code{mmap}, @var{fd} is an open file descriptor that can be used for
probing.
@end deftypefn

@deftypefn {Host Hook} int HOST_HOOKS_GT_PCH_USE_ADDRESS (void * @var{address}, @
  size_t @var{size}, int @var{fd}, size_t @var{offset})
This host hook is called when a PCH file is about to be loaded.
We want to load @var{size} bytes from @var{fd} at @var{offset}
into memory at @var{address}.  The given address will be the result of
a previous invocation of @code{HOST_HOOKS_GT_PCH_GET_ADDRESS}.
Return @minus{}1 if we couldn't allocate @var{size} bytes at @var{address}.
Return 0 if the memory is allocated but the data is not loaded.  Return 1
if the hook has performed everything.

If the implementation uses reserved address space, free any reserved
space beyond @var{size}, regardless of the return value.  If no PCH will
be loaded, this hook may be called with @var{size} zero, in which case
all reserved address space should be freed.

Do not try to handle values of @var{address} that could not have been
returned by this executable; just return @minus{}1.  Such values usually
indicate an out-of-date PCH file (built by some other GCC executable),
and such a PCH file won't work.
@end deftypefn

@deftypefn {Host Hook} size_t HOST_HOOKS_GT_PCH_ALLOC_GRANULARITY (void);
This host hook returns the alignment required for allocating virtual
memory.  Usually this is the same as getpagesize, but on some hosts the
alignment for reserving memory differs from the pagesize for committing
memory.
@end deftypefn

@node Filesystem
@section Host Filesystem
@cindex configuration file
@cindex @file{xm-@var{machine}.h}

GCC needs to know a number of things about the semantics of the host
machine's filesystem.  Filesystems with Unix and MS-DOS semantics are
automatically detected.  For other systems, you can define the
following macros in @file{xm-@var{machine}.h}.

@ftable @code
@item HAVE_DOS_BASED_FILE_SYSTEM
This macro is automatically defined by @file{system.h} if the host
file system obeys the semantics defined by MS-DOS instead of Unix.
DOS file systems are case insensitive, file specifications may begin
with a drive letter, and both forward slash and backslash (@samp{/}
and @samp{\}) are directory separators.

@item DIR_SEPARATOR
@itemx DIR_SEPARATOR_2
If defined, these macros expand to character constants specifying
separators for directory names within a file specification.
@file{system.h} will automatically give them appropriate values on
Unix and MS-DOS file systems.  If your file system is neither of
these, define one or both appropriately in @file{xm-@var{machine}.h}.

However, operating systems like VMS, where constructing a pathname is
more complicated than just stringing together directory names
separated by a special character, should not define either of these
macros.

@item PATH_SEPARATOR
If defined, this macro should expand to a character constant
specifying the separator for elements of search paths.  The default
value is a colon (@samp{:}).  DOS-based systems usually, but not
always, use semicolon (@samp{;}).

@item VMS
Define this macro if the host system is VMS@.

@item HOST_OBJECT_SUFFIX
Define this macro to be a C string representing the suffix for object
files on your host machine.  If you do not define this macro, GCC will
use @samp{.o} as the suffix for object files.

@item HOST_EXECUTABLE_SUFFIX
Define this macro to be a C string representing the suffix for
executable files on your host machine.  If you do not define this macro,
GCC will use the null string as the suffix for executable files.

@item HOST_BIT_BUCKET
A pathname defined by the host operating system, which can be opened as
a file and written to, but all the information written is discarded.
This is commonly known as a @dfn{bit bucket} or @dfn{null device}.  If
you do not define this macro, GCC will use @samp{/dev/null} as the bit
bucket.  If the host does not support a bit bucket, define this macro to
an invalid filename.

@item UPDATE_PATH_HOST_CANONICALIZE (@var{path})
If defined, a C statement (sans semicolon) that performs host-dependent
canonicalization when a path used in a compilation driver or
preprocessor is canonicalized.  @var{path} is a malloc-ed path to be
canonicalized.  If the C statement does canonicalize @var{path} into a
different buffer, the old path should be freed and the new buffer should
have been allocated with malloc.

@item DUMPFILE_FORMAT
Define this macro to be a C string representing the format to use for
constructing the index part of debugging dump file names.  The resultant
string must fit in fifteen bytes.  The full filename will be the
concatenation of: the prefix of the assembler file name, the string
resulting from applying this format to an index number, and a string
unique to each dump file kind, e.g.@: @samp{rtl}.

If you do not define this macro, GCC will use @samp{.%02d.}.  You should
define this macro if using the default will create an invalid file name.

@item DELETE_IF_ORDINARY
Define this macro to be a C statement (sans semicolon) that performs
host-dependent removal of ordinary temp files in the compilation driver.

If you do not define this macro, GCC will use the default version.  You
should define this macro if the default version does not reliably remove
the temp file as, for example, on VMS which allows multiple versions
of a file.

@item HOST_LACKS_INODE_NUMBERS
Define this macro if the host filesystem does not report meaningful inode
numbers in struct stat.
@end ftable

@node Host Misc
@section Host Misc
@cindex configuration file
@cindex @file{xm-@var{machine}.h}

@ftable @code
@item FATAL_EXIT_CODE
A C expression for the status code to be returned when the compiler
exits after serious errors.  The default is the system-provided macro
@samp{EXIT_FAILURE}, or @samp{1} if the system doesn't define that
macro.  Define this macro only if these defaults are incorrect.

@item SUCCESS_EXIT_CODE
A C expression for the status code to be returned when the compiler
exits without serious errors.  (Warnings are not serious errors.)  The
default is the system-provided macro @samp{EXIT_SUCCESS}, or @samp{0} if
the system doesn't define that macro.  Define this macro only if these
defaults are incorrect.

@item USE_C_ALLOCA
Define this macro if GCC should use the C implementation of @code{alloca}
provided by @file{libiberty.a}.  This only affects how some parts of the
compiler itself allocate memory.  It does not change code generation.

When GCC is built with a compiler other than itself, the C @code{alloca}
is always used.  This is because most other implementations have serious
bugs.  You should define this macro only on a system where no
stack-based @code{alloca} can possibly work.  For instance, if a system
has a small limit on the size of the stack, GCC's builtin @code{alloca}
will not work reliably.

@item COLLECT2_HOST_INITIALIZATION
If defined, a C statement (sans semicolon) that performs host-dependent
initialization when @code{collect2} is being initialized.

@item GCC_DRIVER_HOST_INITIALIZATION
If defined, a C statement (sans semicolon) that performs host-dependent
initialization when a compilation driver is being initialized.

@item HOST_LONG_LONG_FORMAT
If defined, the string used to indicate an argument of type @code{long
long} to functions like @code{printf}.  The default value is
@code{"ll"}.

@item HOST_LONG_FORMAT
If defined, the string used to indicate an argument of type @code{long}
to functions like @code{printf}.  The default value is @code{"l"}.

@item HOST_PTR_PRINTF
If defined, the string used to indicate an argument of type @code{void *}
to functions like @code{printf}.  The default value is @code{"%p"}.
@end ftable

In addition, if @command{configure} generates an incorrect definition of
any of the macros in @file{auto-host.h}, you can override that
definition in a host configuration header.  If you need to do this,
first see if it is possible to fix @command{configure}.
