aboutsummaryrefslogtreecommitdiff
path: root/ld/emultempl
diff options
context:
space:
mode:
Diffstat (limited to 'ld/emultempl')
-rw-r--r--ld/emultempl/z80.em122
1 files changed, 16 insertions, 106 deletions
diff --git a/ld/emultempl/z80.em b/ld/emultempl/z80.em
index 81385e7..8894ffe 100644
--- a/ld/emultempl/z80.em
+++ b/ld/emultempl/z80.em
@@ -19,135 +19,45 @@
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
-fragment <<EOF
-/* --- \begin{z80.em} */
-
+if [ x"${EMULATION_NAME}" = x"elf32z80" ]; then
+ fragment <<EOF
#include "elf/z80.h"
-
+EOF
+else
+ fragment <<EOF
static void
-gld${EMULATION_NAME}_after_open (void);
-
-static int result_mach_type;
-
-struct z80_mach_info
-{
- unsigned eflags;
- unsigned bfd_mach;
- const int *compat; /* back compatible machines */
-};
-
-static const int
-back_compat_z80[] = {bfd_mach_z80, -1};
-
-static const int
-back_compat_z180[] = {bfd_mach_z180, bfd_mach_z80, -1};
-
-static const int
-back_compat_ez80[] = {bfd_mach_ez80_z80, bfd_mach_z180, bfd_mach_z80, -1};
-
-static const struct z80_mach_info
-z80_mach_info[] =
-{
- { EF_Z80_MACH_Z80, bfd_mach_z80, NULL },
- { EF_Z80_MACH_Z80, bfd_mach_z80strict, back_compat_z80 },
- { EF_Z80_MACH_Z80, bfd_mach_z80full, back_compat_z80 },
- { EF_Z80_MACH_Z180, bfd_mach_z180, back_compat_z80 },
- { EF_Z80_MACH_EZ80_Z80, bfd_mach_ez80_z80, back_compat_z180 },
- { EF_Z80_MACH_EZ80_ADL, bfd_mach_ez80_adl, back_compat_ez80 },
- { EF_Z80_MACH_Z80N, bfd_mach_z80n, back_compat_z80 },
- { EF_Z80_MACH_GBZ80, bfd_mach_gbz80, NULL },
- { EF_Z80_MACH_R800, bfd_mach_r800, back_compat_z80 }
-};
-/*
-static const struct z80_mach_info *
-z80_mach_info_by_eflags (unsigned int eflags)
-{
- const struct z80_mach_info *p;
- const struct z80_mach_info *e;
-
- eflags &= EF_Z80_MACH_MSK;
- p = &z80_mach_info[0];
- e = &z80_mach_info[sizeof(z80_mach_info)/sizeof(*z80_mach_info)];
- for (; p != e; ++p)
- if (eflags == p->eflags)
- return p;
- return NULL;
-}*/
-
-static const struct z80_mach_info *
-z80_mach_info_by_mach (unsigned int bfd_mach)
+gld${EMULATION_NAME}_after_open (void)
{
- const struct z80_mach_info *p;
- const struct z80_mach_info *e;
-
- p = &z80_mach_info[0];
- e = &z80_mach_info[sizeof(z80_mach_info)/sizeof(*z80_mach_info)];
- for (; p != e; ++p)
- if (bfd_mach == p->bfd_mach)
- return p;
- return NULL;
}
+EOF
+fi
-static const struct z80_mach_info *
-z80_combine_mach (const struct z80_mach_info *m1,
- const struct z80_mach_info *m2)
-{
- int i;
- int mach;
- if (m1->compat != NULL)
- for (i = 0; (mach = m1->compat[i]) >= 0; ++i)
- if ((unsigned)mach == m2->bfd_mach)
- return m1;
- if (m2->compat != NULL)
- for (i = 0; (mach = m2->compat[i]) >= 0; ++i)
- if ((unsigned)mach == m1->bfd_mach)
- return m2;
- /* incompatible mach */
- return NULL;
-}
+fragment <<EOF
+/* --- \begin{z80.em} */
-/* Set the machine type of the output file based on result_mach_type. */
+/* Set the machine type of the output file based on types of inputs. */
static void
z80_after_open (void)
{
- const struct z80_mach_info *mach = NULL;
bfd *abfd;
/* For now, make sure all object files are of the same architecture.
We may try to merge object files with different architecture together. */
for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next)
{
- const struct z80_mach_info *new_mach;
- /*new_mach = z80_mach_info_by_eflags (elf_elfheader (abfd)->e_flags);*/
- new_mach = z80_mach_info_by_mach(bfd_get_mach (abfd));
- if (mach == NULL)
- mach = new_mach;
- else if (mach != new_mach)
- mach = z80_combine_mach (mach, new_mach);
- if (mach == NULL)
+ const bfd_arch_info_type *info;
+ info = bfd_arch_get_compatible (link_info.output_bfd, abfd, FALSE);
+ if (info == NULL)
einfo (_("%F%P: %pB: Instruction sets of object files incompatible\n"),
abfd);
+ else
+ bfd_set_arch_info (link_info.output_bfd, info);
}
- if (mach != NULL)
- {
- bfd_set_arch_mach (link_info.output_bfd, bfd_arch_z80, mach->bfd_mach);
- result_mach_type = mach->bfd_mach;
- }
- else
- einfo (_("%F%P: %pB: Unknown machine type\n"),
- abfd);
/* Call the standard elf routine. */
gld${EMULATION_NAME}_after_open ();
}
-#ifndef TARGET_IS_elf32z80
-static void
-gld${EMULATION_NAME}_after_open (void)
-{
-}
-#endif
-
/* --- \end{z80.em} */
EOF