/* d-target.def -- Target hook definitions for the D front end.
   Copyright (C) 2017-2021 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the
   Free Software Foundation; either version 3, or (at your option) any
   later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; see the file COPYING3.  If not see
   <http://www.gnu.org/licenses/>.  */

/* See target-hooks-macros.h for details of macros that should be
   provided by the including file, and how to use them here.  */

#include "target-hooks-macros.h"

#undef HOOK_TYPE
#define HOOK_TYPE "D Target Hook"

HOOK_VECTOR (TARGETDM_INITIALIZER, gcc_targetdm)

#undef HOOK_PREFIX
#define HOOK_PREFIX "TARGET_"

/* Environmental version identifiers relating to the target CPU.  */
DEFHOOK
(d_cpu_versions,
 "Declare all environmental version identifiers relating to the target CPU\n\
using the function @code{builtin_version}, which takes a string representing\n\
the name of the version.  Version identifiers predefined by this hook apply\n\
to all modules that are being compiled and imported.",
 void, (void),
 hook_void_void)

/* Environmental version identifiers relating to the target OS.  */
DEFHOOK
(d_os_versions,
 "Similarly to @code{TARGET_D_CPU_VERSIONS}, but is used for versions\n\
relating to the target operating system.",
 void, (void),
 hook_void_void)

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

/* getTargetInfo keys relating to the target OS.  */
DEFHOOK
(d_register_os_target_info,
 "Same as @code{TARGET_D_CPU_TARGET_INFO}, but is used for keys relating to\n\
the target operating system.",
 void, (void),
 hook_void_void)

/* ModuleInfo section name and brackets.  */
DEFHOOKPOD
(d_minfo_section,
 "Contains the name of the section in which module info references should be\n\
placed.  This section is expected to be bracketed by two symbols to indicate\n\
the start and end address of the section, so that the runtime library can\n\
collect all modules for each loaded shared library and executable.  The\n\
default value of @code{NULL} disables the use of sections altogether.",
 const char *, NULL)

DEFHOOKPOD
(d_minfo_start_name,
 "If @code{TARGET_D_MINFO_SECTION} is defined, then this must also be defined\n\
as the name of the symbol indicating the start address of the module info\n\
section",
 const char *, NULL)

/* The name of the ModuleInfo section.  */
DEFHOOKPOD
(d_minfo_end_name,
 "If @code{TARGET_D_MINFO_SECTION} is defined, then this must also be defined\n\
as the name of the symbol indicating the end address of the module info\n\
section",
 const char *, NULL)

/* The "stdcall" convention is really supported on 32-bit x86/Windows only.
   The following hook is a helper to determine whether to apply the attribute
   on declarations with `extern(System)' and `extern(Windows)' linkage.  */
DEFHOOK
(d_has_stdcall_convention,
 "Returns @code{true} if the target supports the stdcall calling convention.\n\
The hook should also set @var{link_system} to @code{1} if the @code{stdcall}\n\
attribute should be applied to functions with @code{extern(System)} linkage,\n\
and @var{link_windows} to @code{1} to apply @code{stdcall} to functions with\n\
@code{extern(Windows)} linkage.",
 bool, (unsigned int *link_system, unsigned int *link_windows),
 hook_bool_uintp_uintp_false)

/* True if instantiations are always COMDAT if they have external linkage.  */
DEFHOOKPOD
(d_templates_always_comdat,
 "This flag is true if instantiated functions and variables are always COMDAT\n\
if they have external linkage.  If this flag is false, then instantiated\n\
decls will be emitted as weak symbols.  The default is @code{false}.",
 bool, false)

/* Close the 'struct gcc_targetdm' definition.  */
HOOK_VECTOR_END (C90_EMPTY_HACK)
