@@ -32,9 +32,35 @@ darwin_d_os_builtins (void)
d_add_builtin_version ("darwin");
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+darwin_d_handle_target_object_format (void)
+{
+ const char *objfmt = "macho";
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
+/* Implement TARGET_D_REGISTER_OS_TARGET_INFO for Darwin targets. */
+
+static void
+darwin_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "objectFormat", darwin_d_handle_target_object_format },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
+
#undef TARGET_D_OS_VERSIONS
#define TARGET_D_OS_VERSIONS darwin_d_os_builtins
+#undef TARGET_D_REGISTER_OS_TARGET_INFO
+#define TARGET_D_REGISTER_OS_TARGET_INFO darwin_d_register_target_info
+
/* Define TARGET_D_MINFO_SECTION for Darwin targets. */
#undef TARGET_D_MINFO_SECTION
@@ -31,7 +31,33 @@ dragonfly_d_os_builtins (void)
d_add_builtin_version ("Posix");
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+dragonfly_d_handle_target_object_format (void)
+{
+ const char *objfmt = "elf";
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
+/* Implement TARGET_D_REGISTER_OS_TARGET_INFO for DragonFly targets. */
+
+static void
+dragonfly_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "objectFormat", dragonfly_d_handle_target_object_format },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
+
#undef TARGET_D_OS_VERSIONS
#define TARGET_D_OS_VERSIONS dragonfly_d_os_builtins
+#undef TARGET_D_REGISTER_OS_TARGET_INFO
+#define TARGET_D_REGISTER_OS_TARGET_INFO dragonfly_d_register_target_info
+
struct gcc_targetdm targetdm = TARGETDM_INITIALIZER;
@@ -37,7 +37,33 @@ freebsd_d_os_builtins (void)
d_add_builtin_version ("Posix");
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+freebsd_d_handle_target_object_format (void)
+{
+ const char *objfmt = "elf";
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
+/* Implement TARGET_D_REGISTER_OS_TARGET_INFO for FreeBSD targets. */
+
+static void
+freebsd_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "objectFormat", freebsd_d_handle_target_object_format },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
+
#undef TARGET_D_OS_VERSIONS
#define TARGET_D_OS_VERSIONS freebsd_d_os_builtins
+#undef TARGET_D_REGISTER_OS_TARGET_INFO
+#define TARGET_D_REGISTER_OS_TARGET_INFO freebsd_d_register_target_info
+
struct gcc_targetdm targetdm = TARGETDM_INITIALIZER;
@@ -42,7 +42,33 @@ glibc_d_os_builtins (void)
#endif
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+glibc_d_handle_target_object_format (void)
+{
+ const char *objfmt = "elf";
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
+/* Implement TARGET_D_REGISTER_OS_TARGET_INFO for Glibc targets. */
+
+static void
+glibc_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "objectFormat", glibc_d_handle_target_object_format },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
+
#undef TARGET_D_OS_VERSIONS
#define TARGET_D_OS_VERSIONS glibc_d_os_builtins
+#undef TARGET_D_REGISTER_OS_TARGET_INFO
+#define TARGET_D_REGISTER_OS_TARGET_INFO glibc_d_register_target_info
+
struct gcc_targetdm targetdm = TARGETDM_INITIALIZER;
@@ -60,6 +60,24 @@ ix86_d_handle_target_float_abi (void)
return build_string_literal (strlen (abi) + 1, abi);
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+ix86_d_handle_target_object_format (void)
+{
+ const char *objfmt = NULL;
+
+ if (TARGET_MACHO)
+ objfmt = "macho";
+ else if (TARGET_COFF || TARGET_PECOFF)
+ objfmt = "coff";
+
+ if (objfmt == NULL)
+ return NULL_TREE;
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
void
@@ -67,6 +85,7 @@ ix86_d_register_target_info (void)
{
const struct d_target_info_spec handlers[] = {
{ "floatAbi", ix86_d_handle_target_float_abi },
+ { "objectFormat", ix86_d_handle_target_object_format },
{ NULL, NULL },
};
@@ -39,9 +39,34 @@ winnt_d_os_builtins (void)
#endif
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+winnt_d_handle_target_object_format (void)
+{
+ const char *objfmt = "coff";
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
+/* Implement TARGET_D_REGISTER_OS_TARGET_INFO for Windows targets. */
+
+static void
+winnt_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "objectFormat", winnt_d_handle_target_object_format },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
#undef TARGET_D_OS_VERSIONS
#define TARGET_D_OS_VERSIONS winnt_d_os_builtins
+#undef TARGET_D_REGISTER_OS_TARGET_INFO
+#define TARGET_D_REGISTER_OS_TARGET_INFO winnt_d_register_target_info
+
/* Define TARGET_D_MINFO_SECTION for Windows targets. */
#undef TARGET_D_MINFO_SECTION
@@ -26,6 +26,8 @@ along with GCC; see the file COPYING3. If not see
#include "d/d-target.h"
#include "d/d-target-def.h"
+/* Define TARGET_D_OS_VERSIONS for NetBSD targets. */
+
static void
netbsd_d_os_builtins (void)
{
@@ -33,7 +35,33 @@ netbsd_d_os_builtins (void)
d_add_builtin_version ("NetBSD");
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+netbsd_d_handle_target_object_format (void)
+{
+ const char *objfmt = "elf";
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
+/* Implement TARGET_D_REGISTER_OS_TARGET_INFO for NetBSD targets. */
+
+static void
+netbsd_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "objectFormat", netbsd_d_handle_target_object_format },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
+
#undef TARGET_D_OS_VERSIONS
#define TARGET_D_OS_VERSIONS netbsd_d_os_builtins
+#undef TARGET_D_REGISTER_OS_TARGET_INFO
+#define TARGET_D_REGISTER_OS_TARGET_INFO netbsd_d_register_target_info
+
struct gcc_targetdm targetdm = TARGETDM_INITIALIZER;
@@ -26,6 +26,8 @@ along with GCC; see the file COPYING3. If not see
#include "d/d-target.h"
#include "d/d-target-def.h"
+/* Define TARGET_D_OS_VERSIONS for OpenBSD targets. */
+
static void
openbsd_d_os_builtins (void)
{
@@ -33,7 +35,33 @@ openbsd_d_os_builtins (void)
d_add_builtin_version ("OpenBSD");
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+openbsd_d_handle_target_object_format (void)
+{
+ const char *objfmt = "elf";
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
+/* Implement TARGET_D_REGISTER_OS_TARGET_INFO for OpenBSD targets. */
+
+static void
+openbsd_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "objectFormat", openbsd_d_handle_target_object_format },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
+
#undef TARGET_D_OS_VERSIONS
#define TARGET_D_OS_VERSIONS openbsd_d_os_builtins
+#undef TARGET_D_REGISTER_OS_TARGET_INFO
+#define TARGET_D_REGISTER_OS_TARGET_INFO openbsd_d_register_target_info
+
struct gcc_targetdm targetdm = TARGETDM_INITIALIZER;
@@ -55,6 +55,22 @@ pa_d_handle_target_float_abi (void)
return build_string_literal (strlen (abi) + 1, abi);
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+pa_d_handle_target_object_format (void)
+{
+ const char *objfmt = NULL;
+
+ if (TARGET_SOM)
+ objfmt = "som";
+
+ if (objfmt == NULL)
+ return NULL_TREE;
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
void
@@ -62,6 +78,7 @@ pa_d_register_target_info (void)
{
const struct d_target_info_spec handlers[] = {
{ "floatAbi", pa_d_handle_target_float_abi },
+ { "objectFormat", pa_d_handle_target_object_format },
{ NULL, NULL },
};
@@ -63,6 +63,26 @@ rs6000_d_handle_target_float_abi (void)
return build_string_literal (strlen (abi) + 1, abi);
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+rs6000_d_handle_target_object_format (void)
+{
+ const char *objfmt = NULL;
+
+ if (TARGET_ELF)
+ objfmt = "elf";
+ else if (TARGET_MACHO)
+ objfmt = "macho";
+ else if (TARGET_XCOFF)
+ objfmt = "coff";
+
+ if (objfmt == NULL)
+ return NULL_TREE;
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO. */
void
@@ -70,6 +90,7 @@ rs6000_d_register_target_info (void)
{
const struct d_target_info_spec handlers[] = {
{ "floatAbi", rs6000_d_handle_target_float_abi },
+ { "objectFormat", rs6000_d_handle_target_object_format },
{ NULL, NULL },
};
@@ -33,7 +33,33 @@ solaris_d_os_builtins (void)
d_add_builtin_version ("Solaris"); \
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+static tree
+solaris_d_handle_target_object_format (void)
+{
+ const char *objfmt = "elf";
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
+/* Implement TARGET_D_REGISTER_OS_TARGET_INFO for Solaris targets. */
+
+static void
+solaris_d_register_target_info (void)
+{
+ const struct d_target_info_spec handlers[] = {
+ { "objectFormat", solaris_d_handle_target_object_format },
+ { NULL, NULL },
+ };
+
+ d_add_target_info_handlers (handlers);
+}
+
#undef TARGET_D_OS_VERSIONS
#define TARGET_D_OS_VERSIONS solaris_d_os_builtins
+#undef TARGET_D_REGISTER_OS_TARGET_INFO
+#define TARGET_D_REGISTER_OS_TARGET_INFO solaris_d_register_target_info
+
struct gcc_targetdm targetdm = TARGETDM_INITIALIZER;
@@ -47,6 +47,7 @@ Target target;
/* Internal key handlers for `__traits(getTargetInfo)'. */
static tree d_handle_target_cpp_std (void);
static tree d_handle_target_cpp_runtime_library (void);
+static tree d_handle_target_object_format (void);
/* In [traits/getTargetInfo], a reliable subset of getTargetInfo keys exists
which are always available. */
@@ -56,7 +57,7 @@ static const struct d_target_info_spec d_language_target_info[] =
{ "cppStd", d_handle_target_cpp_std },
{ "cppRuntimeLibrary", d_handle_target_cpp_runtime_library },
{ "floatAbi", NULL },
- { "objectFormat", NULL },
+ { "objectFormat", d_handle_target_object_format },
{ NULL, NULL },
};
@@ -517,6 +518,25 @@ d_handle_target_cpp_runtime_library (void)
return build_string_literal (strlen (libstdcxx) + 1, libstdcxx);
}
+/* Handle a call to `__traits(getTargetInfo, "objectFormat")'. */
+
+tree
+d_handle_target_object_format (void)
+{
+ const char *objfmt;
+
+#ifdef OBJECT_FORMAT_ELF
+ objfmt = "elf";
+#else
+ if (TARGET_COFF || TARGET_PECOFF)
+ objfmt = "coff";
+ else
+ objfmt = "";
+#endif
+
+ return build_string_literal (strlen (objfmt) + 1, objfmt);
+}
+
/* Look up the target info KEY in the available getTargetInfo tables, and return
the result as an Expression, or NULL if KEY is not found. When the key must
always exist, but is not supported, an empty string expression is returned.
@@ -533,13 +553,20 @@ Target::getTargetInfo (const char *key, const Loc &loc)
tree result;
if (strcmp (key, spec->name) != 0)
- continue;
+ continue;
/* Get the requested information, or empty string if unhandled. */
if (spec->handler)
- result = (spec->handler) ();
+ {
+ result = (spec->handler) ();
+ /* Handler didn't return a result, meaning it really does not support
+ the key in the current target configuration. Check whether there
+ are any other handlers which may recognize the key. */
+ if (result == NULL_TREE)
+ continue;
+ }
else
- result = build_string_literal (1, "");
+ result = build_string_literal (1, "");
gcc_assert (result);
return d_eval_constant_expression (loc, result);