# This shell script emits C code -*- C -*-
# to keep track of the machine type of Z80 object files
# It does some substitutions.
#   Copyright (C) 2005-2016 Free Software Foundation, Inc.
# This file is part of the GNU Binutils.
#
# 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 of the License, 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; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.

LDEMUL_BEFORE_PARSE=gldz80_before_parse
LDEMUL_RECOGNIZED_FILE=gldz80_recognized_file
LDEMUL_AFTER_OPEN=gldz80_after_open

fragment <<EOF
/* --- \begin{z80.em} */
/* Codes for machine types, bitwise or gives the code to use for the
   output.  */
#define M_Z80STRICT 1
#define M_Z80 3
#define M_Z80FULL 7
#define M_R800 11
#define M_Z80ANY 15

/* Bitwise or of the machine types seen so far.  */
static int result_mach_type;

static void
${LDEMUL_BEFORE_PARSE} (void)
{
#ifndef TARGET_			/* I.e., if not generic.  */
  ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
#endif /* not TARGET_ */
  result_mach_type = M_Z80STRICT;
}


/* Update result_mach_type.  */
static bfd_boolean
${LDEMUL_RECOGNIZED_FILE} (lang_input_statement_type *entry)
{
  unsigned long mach_type;

  mach_type = bfd_get_mach (entry->the_bfd);
  switch (mach_type)
    {
    case bfd_mach_z80strict:
      result_mach_type |= M_Z80STRICT;
      break;
    case bfd_mach_z80:
      result_mach_type |= M_Z80;
      break;
    case bfd_mach_z80full:
      result_mach_type |= M_Z80FULL;
      break;
    case bfd_mach_r800:
      result_mach_type |= M_R800;
      break;
    default:
      result_mach_type |= M_Z80ANY;
    }
  return FALSE;
}

/* Set the machine type of the output file based on result_mach_type.  */
static void
gldz80_after_open (void)
{
  unsigned long mach_type;

  after_open_default ();

  switch (result_mach_type)
    {
    case M_Z80STRICT:
      mach_type = bfd_mach_z80strict;
      break;
    case M_Z80:
      mach_type = bfd_mach_z80;
      break;
    case M_Z80FULL:
      mach_type = bfd_mach_z80full;
      break;
    case M_R800:
      mach_type = bfd_mach_r800;
      break;
    default:
      mach_type = 0;
    }
  bfd_set_arch_mach (link_info.output_bfd, bfd_arch_z80, mach_type);
}
/* --- \end{z80.em} */
EOF
