d_add_builtin_version ("AArch64");
d_add_builtin_version ("D_HardFloat");
}
+
+/* Handle a call to `__traits(getTargetInfo, "floatAbi")'. */
+
+static tree
+aarch64_d_handle_target_float_abi (void)
+{
+ const char *abi = "hard";
+
+ return build_string_literal (strlen (abi) + 1, abi);
+}
+
+/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
+
+void
+aarch64_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "floatAbi", aarch64_d_handle_target_float_abi },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
/* Defined in aarch64-d.c */
extern void aarch64_d_target_versions (void);
+extern void aarch64_d_register_target_info (void);
rtl_opt_pass *make_pass_fma_steering (gcc::context *);
rtl_opt_pass *make_pass_track_speculation (gcc::context *);
#define TARGET_CPU_CPP_BUILTINS() \
aarch64_cpu_cpp_builtins (pfile)
-/* Target CPU versions for D. */
+/* Target hooks for D language. */
#define TARGET_D_CPU_VERSIONS aarch64_d_target_versions
+#define TARGET_D_REGISTER_CPU_TARGET_INFO aarch64_d_register_target_info
\f
else if (TARGET_HARD_FLOAT)
d_add_builtin_version ("D_HardFloat");
}
+
+/* Handle a call to `__traits(getTargetInfo, "floatAbi")'. */
+
+static tree
+arm_d_handle_target_float_abi (void)
+{
+ const char *abi;
+
+ switch (arm_float_abi)
+ {
+ case ARM_FLOAT_ABI_HARD:
+ abi = "hard";
+ break;
+
+ case ARM_FLOAT_ABI_SOFT:
+ abi = "soft";
+ break;
+
+ case ARM_FLOAT_ABI_SOFTFP:
+ abi = "softfp";
+ break;
+
+ default:
+ abi = "";
+ break;
+ }
+
+ return build_string_literal (strlen (abi) + 1, abi);
+}
+
+/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
+
+void
+arm_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "floatAbi", arm_d_handle_target_float_abi },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
/* Defined in arm-d.c */
extern void arm_d_target_versions (void);
+extern void arm_d_register_target_info (void);
extern bool arm_is_constant_pool_ref (rtx);
/* Target CPU builtins. */
#define TARGET_CPU_CPP_BUILTINS() arm_cpu_cpp_builtins (pfile)
-/* Target CPU versions for D. */
+/* Target hooks for D language. */
#define TARGET_D_CPU_VERSIONS arm_d_target_versions
+#define TARGET_D_REGISTER_CPU_TARGET_INFO arm_d_register_target_info
#include "config/arm/arm-opts.h"
d_add_builtin_version ("D_SoftFloat");
}
+/* Handle a call to `__traits(getTargetInfo, "floatAbi")'. */
+
+static tree
+ix86_d_handle_target_float_abi (void)
+{
+ const char *abi;
+
+ if (! (TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387))
+ abi = "soft";
+ else
+ abi = "hard";
+
+ return build_string_literal (strlen (abi) + 1, abi);
+}
+
+/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
+
+void
+ix86_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "floatAbi", ix86_d_handle_target_float_abi },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
+
/* Implement TARGET_D_HAS_STDCALL_CONVENTION for x86 targets. */
bool
/* In i386-d.c */
extern void ix86_d_target_versions (void);
+extern void ix86_d_register_target_info (void);
extern bool ix86_d_has_stdcall_convention (unsigned int *, unsigned int *);
/* In winnt.c */
/* Target hooks for D language. */
#define TARGET_D_CPU_VERSIONS ix86_d_target_versions
+#define TARGET_D_REGISTER_CPU_TARGET_INFO ix86_d_register_target_info
#define TARGET_D_HAS_STDCALL_CONVENTION ix86_d_has_stdcall_convention
#ifndef CC1_SPEC
d_add_builtin_version ("D_SoftFloat");
}
}
+
+/* Handle a call to `__traits(getTargetInfo, "floatAbi")'. */
+
+static tree
+mips_d_handle_target_float_abi (void)
+{
+ const char *abi;
+
+ if (TARGET_HARD_FLOAT_ABI)
+ abi = "hard";
+ else if (TARGET_SOFT_FLOAT_ABI)
+ abi = "soft";
+ else
+ abi = "";
+
+ return build_string_literal (strlen (abi) + 1, abi);
+}
+
+/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
+
+void
+mips_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "floatAbi", mips_d_handle_target_float_abi },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
/* Routines implemented in mips-d.c */
extern void mips_d_target_versions (void);
+extern void mips_d_register_target_info (void);
#endif /* ! GCC_MIPS_PROTOS_H */
} \
while (0)
-/* Target CPU versions for D. */
+/* Target hooks for D language. */
#define TARGET_D_CPU_VERSIONS mips_d_target_versions
+#define TARGET_D_REGISTER_CPU_TARGET_INFO mips_d_register_target_info
/* Default target_flags if no switches are specified */
else
d_add_builtin_version ("D_HardFloat");
}
+
+/* Handle a call to `__traits(getTargetInfo, "floatAbi")'. */
+
+static tree
+pa_d_handle_target_float_abi (void)
+{
+ const char *abi;
+
+ if (TARGET_DISABLE_FPREGS || TARGET_SOFT_FLOAT)
+ abi = "soft";
+ else
+ abi = "hard";
+
+ return build_string_literal (strlen (abi) + 1, abi);
+}
+
+/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
+
+void
+pa_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "floatAbi", pa_d_handle_target_float_abi },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
/* Routines implemented in pa-d.c */
extern void pa_d_target_versions (void);
+extern void pa_d_register_target_info (void);
#define NEED_INDICATE_EXEC_STACK 0
-/* Target CPU versions for D. */
+/* Target hooks for D language. */
#define TARGET_D_CPU_VERSIONS pa_d_target_versions
+#define TARGET_D_REGISTER_CPU_TARGET_INFO pa_d_register_target_info
/* Output default function prologue for hpux. */
#define TARGET_ASM_FUNCTION_PROLOGUE pa_output_function_prologue
else
d_add_builtin_version ("D_SoftFloat");
}
+
+/* Handle a call to `__traits(getTargetInfo, "floatAbi")'. */
+
+static tree
+riscv_d_handle_target_float_abi (void)
+{
+ const char *abi;
+
+ switch (riscv_abi)
+ {
+ case ABI_ILP32E:
+ case ABI_ILP32:
+ case ABI_LP64:
+ abi = "soft";
+ break;
+
+ case ABI_ILP32F:
+ case ABI_LP64F:
+ abi = "single";
+ break;
+
+ case ABI_ILP32D:
+ case ABI_LP64D:
+ abi = "double";
+ break;
+
+ default:
+ abi = "";
+ break;
+ }
+
+ return build_string_literal (strlen (abi) + 1, abi);
+}
+
+/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
+
+void
+riscv_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "floatAbi", riscv_d_handle_target_float_abi },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
/* Routines implemented in riscv-d.c */
extern void riscv_d_target_versions (void);
+extern void riscv_d_register_target_info (void);
/* Routines implemented in riscv-builtins.c. */
extern void riscv_atomic_assign_expand_fenv (tree *, tree *, tree *);
/* Target CPU builtins. */
#define TARGET_CPU_CPP_BUILTINS() riscv_cpu_cpp_builtins (pfile)
-/* Target CPU versions for D. */
+/* Target hooks for D language. */
#define TARGET_D_CPU_VERSIONS riscv_d_target_versions
+#define TARGET_D_REGISTER_CPU_TARGET_INFO riscv_d_register_target_info
#ifdef TARGET_BIG_ENDIAN_DEFAULT
#define DEFAULT_ENDIAN_SPEC "b"
d_add_builtin_version ("D_SoftFloat");
}
}
+
+/* Handle a call to `__traits(getTargetInfo, "floatAbi")'. */
+
+static tree
+rs6000_d_handle_target_float_abi (void)
+{
+ const char *abi;
+
+ if (TARGET_HARD_FLOAT)
+ abi = "hard";
+ else if (TARGET_SOFT_FLOAT)
+ abi = "soft";
+ else
+ abi = "";
+
+ return build_string_literal (strlen (abi) + 1, abi);
+}
+
+/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
+
+void
+rs6000_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "floatAbi", rs6000_d_handle_target_float_abi },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
/* Declare functions in rs6000-d.c */
extern void rs6000_d_target_versions (void);
+extern void rs6000_d_register_target_info (void);
#ifdef NO_DOLLAR_IN_LABEL
const char * rs6000_xcoff_strip_dollar (const char *);
#define TARGET_CPU_CPP_BUILTINS() \
rs6000_cpu_cpp_builtins (pfile)
-/* Target CPU versions for D. */
+/* Target hooks for D language. */
#define TARGET_D_CPU_VERSIONS rs6000_d_target_versions
+#define TARGET_D_REGISTER_CPU_TARGET_INFO rs6000_d_register_target_info
/* This is used by rs6000_cpu_cpp_builtins to indicate the byte order
we're compiling for. Some configurations may need to override it. */
else if (TARGET_HARD_FLOAT)
d_add_builtin_version ("D_HardFloat");
}
+
+/* Handle a call to `__traits(getTargetInfo, "floatAbi")'. */
+
+static tree
+s390_d_handle_target_float_abi (void)
+{
+ const char *abi;
+
+ if (TARGET_HARD_FLOAT)
+ abi = "hard";
+ else if (TARGET_SOFT_FLOAT)
+ abi = "soft";
+ else
+ abi = "";
+
+ return build_string_literal (strlen (abi) + 1, abi);
+}
+
+/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
+
+void
+s390_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "floatAbi", s390_d_handle_target_float_abi },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
/* s390-d.c routines */
extern void s390_d_target_versions (void);
+extern void s390_d_register_target_info (void);
/* Pass management. */
namespace gcc { class context; }
/* Target CPU builtins. */
#define TARGET_CPU_CPP_BUILTINS() s390_cpu_cpp_builtins (pfile)
-/* Target CPU versions for D. */
+/* Target hooks for D language. */
#define TARGET_D_CPU_VERSIONS s390_d_target_versions
+#define TARGET_D_REGISTER_CPU_TARGET_INFO s390_d_register_target_info
#ifdef DEFAULT_TARGET_64BIT
#define TARGET_DEFAULT (MASK_64BIT | MASK_ZARCH | MASK_HARD_DFP \
d_add_builtin_version ("SPARC_SoftFloat");
}
}
+
+/* Handle a call to `__traits(getTargetInfo, "floatAbi")'. */
+
+static tree
+sparc_d_handle_target_float_abi (void)
+{
+ const char *abi;
+
+ if (TARGET_FPU)
+ abi = "hard";
+ else
+ abi = "soft";
+
+ return build_string_literal (strlen (abi) + 1, abi);
+}
+
+/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
+
+void
+sparc_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "floatAbi", sparc_d_handle_target_float_abi },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
/* Routines implemented in sparc-d.c */
extern void sparc_d_target_versions (void);
+extern void sparc_d_register_target_info (void);
#endif /* __SPARC_PROTOS_H__ */
#define TARGET_CPU_CPP_BUILTINS() sparc_target_macros ()
-/* Target CPU versions for D. */
+/* Target hooks for D language. */
#define TARGET_D_CPU_VERSIONS sparc_d_target_versions
+#define TARGET_D_REGISTER_CPU_TARGET_INFO sparc_d_register_target_info
/* Specify this in a cover file to provide bi-architecture (32/64) support. */
/* #define SPARC_BI_ARCH */
/* Initialize target info tables, the keys required by the language are added
last, so that the OS and CPU handlers can override. */
+ targetdm.d_register_cpu_target_info ();
d_add_target_info_handlers (d_language_target_info);
}
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)
+
/* ModuleInfo section name and brackets. */
DEFHOOKPOD
(d_minfo_section,
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
+
@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
@hook TARGET_D_OS_VERSIONS
+@hook TARGET_D_REGISTER_CPU_TARGET_INFO
+
@hook TARGET_D_MINFO_SECTION
@hook TARGET_D_MINFO_START_NAME