aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2021-04-12 01:39:08 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2021-04-17 12:50:25 +0200
commitd81bc495a426b0020e44a9764fd904462a39983b (patch)
tree8376a0f59ea36d081a0c1e6c8628ff0cdf560b2d /gcc/config
parentb96c7a063b27986e6e0ef2b7a1684421583a332d (diff)
downloadgcc-d81bc495a426b0020e44a9764fd904462a39983b.zip
gcc-d81bc495a426b0020e44a9764fd904462a39983b.tar.gz
gcc-d81bc495a426b0020e44a9764fd904462a39983b.tar.bz2
d: Implement __traits(getTargetInfo, "objectFormat")
Following on from adding TARGET_D_REGISTER_OS_TARGET_INFO, this adds the required handlers to implement `__traits(getTargetInfo, "objectFormat")' for all platforms that have D support files. Some back-ends (i386, rs6000, and pa) have some awarenes of the what object format they are compiling for, so new getTargetInfo handlers have been have added both to those back-ends as well as platform-specific target files to override the default in the D front-end. gcc/ChangeLog: * config/darwin-d.c (darwin_d_handle_target_object_format): New function. (darwin_d_register_target_info): New function. (TARGET_D_REGISTER_OS_TARGET_INFO): Define. * config/dragonfly-d.c (dragonfly_d_handle_target_object_format): New function. (dragonfly_d_register_target_info): New function. (TARGET_D_REGISTER_OS_TARGET_INFO): Define. * config/freebsd-d.c (freebsd_d_handle_target_object_format): New function. (freebsd_d_register_target_info): New function. (TARGET_D_REGISTER_OS_TARGET_INFO): Define. * config/glibc-d.c (glibc_d_handle_target_object_format): New function. (glibc_d_register_target_info): New function. (TARGET_D_REGISTER_OS_TARGET_INFO): Define. * config/i386/i386-d.c (ix86_d_handle_target_object_format): New function. (ix86_d_register_target_info): Add ix86_d_handle_target_object_format as handler for objectFormat key. * config/i386/winnt-d.c (winnt_d_handle_target_object_format): New function. (winnt_d_register_target_info): New function. (TARGET_D_REGISTER_OS_TARGET_INFO): Define. * config/netbsd-d.c (netbsd_d_handle_target_object_format): New function. (netbsd_d_register_target_info): New function. (TARGET_D_REGISTER_OS_TARGET_INFO): Define. * config/openbsd-d.c (openbsd_d_handle_target_object_format): New function. (openbsd_d_register_target_info): New function. (TARGET_D_REGISTER_OS_TARGET_INFO): Define. * config/pa/pa-d.c (pa_d_handle_target_object_format): New function. (pa_d_register_target_info): Add pa_d_handle_target_object_format as handler for objectFormat key. * config/rs6000/rs6000-d.c (rs6000_d_handle_target_object_format): New function. (rs6000_d_register_target_info): Add rs6000_d_handle_target_object_format as handler for objectFormat key. * config/sol2-d.c (solaris_d_handle_target_object_format): New function. (solaris_d_register_target_info): New function. (TARGET_D_REGISTER_OS_TARGET_INFO): Define. gcc/d/ChangeLog: * d-target.cc (d_handle_target_object_format): New function. (d_language_target_info): Add d_handle_target_object_format as handler for objectFormat key. (Target::getTargetInfo): Continue if handler returned NULL_TREE.
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/darwin-d.c26
-rw-r--r--gcc/config/dragonfly-d.c26
-rw-r--r--gcc/config/freebsd-d.c26
-rw-r--r--gcc/config/glibc-d.c26
-rw-r--r--gcc/config/i386/i386-d.c19
-rw-r--r--gcc/config/i386/winnt-d.c25
-rw-r--r--gcc/config/netbsd-d.c28
-rw-r--r--gcc/config/openbsd-d.c28
-rw-r--r--gcc/config/pa/pa-d.c17
-rw-r--r--gcc/config/rs6000/rs6000-d.c21
-rw-r--r--gcc/config/sol2-d.c26
11 files changed, 268 insertions, 0 deletions
diff --git a/gcc/config/darwin-d.c b/gcc/config/darwin-d.c
index afc32da..67d69b7 100644
--- a/gcc/config/darwin-d.c
+++ b/gcc/config/darwin-d.c
@@ -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
diff --git a/gcc/config/dragonfly-d.c b/gcc/config/dragonfly-d.c
index 76f4cc0..dc301b5 100644
--- a/gcc/config/dragonfly-d.c
+++ b/gcc/config/dragonfly-d.c
@@ -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;
diff --git a/gcc/config/freebsd-d.c b/gcc/config/freebsd-d.c
index 8a8ddd9..8bebe79 100644
--- a/gcc/config/freebsd-d.c
+++ b/gcc/config/freebsd-d.c
@@ -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;
diff --git a/gcc/config/glibc-d.c b/gcc/config/glibc-d.c
index 092c5d8..c98d494 100644
--- a/gcc/config/glibc-d.c
+++ b/gcc/config/glibc-d.c
@@ -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;
diff --git a/gcc/config/i386/i386-d.c b/gcc/config/i386/i386-d.c
index da5958c..cb99376 100644
--- a/gcc/config/i386/i386-d.c
+++ b/gcc/config/i386/i386-d.c
@@ -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 },
};
diff --git a/gcc/config/i386/winnt-d.c b/gcc/config/i386/winnt-d.c
index 8a6b9c5..b978025 100644
--- a/gcc/config/i386/winnt-d.c
+++ b/gcc/config/i386/winnt-d.c
@@ -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
diff --git a/gcc/config/netbsd-d.c b/gcc/config/netbsd-d.c
index c3ac010..842644f 100644
--- a/gcc/config/netbsd-d.c
+++ b/gcc/config/netbsd-d.c
@@ -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;
diff --git a/gcc/config/openbsd-d.c b/gcc/config/openbsd-d.c
index b42727e..31f8eb4 100644
--- a/gcc/config/openbsd-d.c
+++ b/gcc/config/openbsd-d.c
@@ -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;
diff --git a/gcc/config/pa/pa-d.c b/gcc/config/pa/pa-d.c
index 41b2f18..6802738 100644
--- a/gcc/config/pa/pa-d.c
+++ b/gcc/config/pa/pa-d.c
@@ -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 },
};
diff --git a/gcc/config/rs6000/rs6000-d.c b/gcc/config/rs6000/rs6000-d.c
index 755de42..6f1f55b 100644
--- a/gcc/config/rs6000/rs6000-d.c
+++ b/gcc/config/rs6000/rs6000-d.c
@@ -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 },
};
diff --git a/gcc/config/sol2-d.c b/gcc/config/sol2-d.c
index 529d365..650cb37 100644
--- a/gcc/config/sol2-d.c
+++ b/gcc/config/sol2-d.c
@@ -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;