/* BFD support for the RX processor.
   Copyright (C) 2008-2019 Free Software Foundation, Inc.

   This file is part of BFD, the Binary File Descriptor library.

   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.  */

#include "sysdep.h"
#include "bfd.h"
#include "libbfd.h"

static const bfd_arch_info_type arch_info_struct[] =
{
  {
    32,				/* Bits per word.  */
    32,				/* Bits per address.  */
    8,				/* Bits per byte.  */
    bfd_arch_rx,		/* Architecture.  */
    bfd_mach_rx,		/* Machine.  */
    "rx",			/* Architecture name.  */
    "rx",			/* Printable name.  */
    3,				/* Section align power.  */
    FALSE,			/* The default ?  */
    bfd_default_compatible,	/* Architecture comparison fn.  */
    bfd_default_scan,		/* String to architecture convert fn.  */
    bfd_arch_default_fill,	/* Default fill.  */
    &arch_info_struct[1]	/* Next in list.  */
  },
  {
    32,				/* Bits per word.  */
    32,				/* Bits per address.  */
    8,				/* Bits per byte.  */
    bfd_arch_rx,		/* Architecture.  */
    bfd_mach_rx_v2,		/* Machine.  */
    "rx:v2",			/* Architecture name.  */
    "rx:v2",			/* Printable name.  */
    3,				/* Section align power.  */
    FALSE,			/* The default ?  */
    bfd_default_compatible,	/* Architecture comparison fn.  */
    bfd_default_scan,		/* String to architecture convert fn.  */
    bfd_arch_default_fill,	/* Default fill.  */
    &arch_info_struct[2]	/* Next in list.  */
  },
  {
    32,				/* Bits per word.  */
    32,				/* Bits per address.  */
    8,				/* Bits per byte.  */
    bfd_arch_rx,		/* Architecture.  */
    bfd_mach_rx_v3,		/* Machine.  */
    "rx:v3",			/* Architecture name.  */
    "rx:v3",			/* Printable name.  */
    3,				/* Section align power.  */
    FALSE,			/* The default ?  */
    bfd_default_compatible,	/* Architecture comparison fn.  */
    bfd_default_scan,		/* String to architecture convert fn.  */
    bfd_arch_default_fill,	/* Default fill.  */
    NULL			/* Next in list.  */
  },
};

const bfd_arch_info_type bfd_rx_arch =
{
  32,				/* Bits per word.  */
  32,				/* Bits per address.  */
  8,				/* Bits per byte.  */
  bfd_arch_rx,			/* Architecture.  */
  bfd_mach_rx,			/* Machine.  */
  "rx",				/* Architecture name.  */
  "rx",				/* Printable name.  */
  4,				/* Section align power.  */
  TRUE,				/* The default ?  */
  bfd_default_compatible,	/* Architecture comparison fn.  */
  bfd_default_scan,		/* String to architecture convert fn.  */
  bfd_arch_default_fill,	/* Default fill.  */
  & arch_info_struct[0],	/* Next in list.  */
};
