/* BFD support for C-SKY processors.
   Copyright (C) 1994-2021 Free Software Foundation, Inc.
   Contributed by C-SKY Microsystems and Mentor Graphics.

   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"

#define N(NUMBER, PRINT, ISDEFAULT, NEXT)			        \
{                                                                       \
  32,                     /* Bits in a word.  */                        \
  32,                     /* Bits in an address.  */                    \
  8,                      /* Bits in a byte.  */                        \
  bfd_arch_csky,          /* Architecture.  */                          \
  NUMBER,                 /* Machine number.  */                        \
  "csky",                 /* Architecture name.  */                     \
  PRINT,                  /* Printable name.  */                        \
  3,                      /* Section align power.  */                   \
  ISDEFAULT,              /* Is this the default architecture ?  */	\
  bfd_default_compatible, /* Architecture comparison function.  */	\
  bfd_default_scan,       /* String to architecture conversion.  */	\
  bfd_arch_default_fill,						\
  NEXT,                   /* Next in list.  */				\
  0 /* Maximum offset of a reloc from the start of an insn.  */		\
}

static const bfd_arch_info_type arch_info_struct[] =
{
  /* ABI v1 processors. */
  N (bfd_mach_ck510,   "csky:ck510",    false, & arch_info_struct[1]),
  N (bfd_mach_ck610,   "csky:ck610",    false, & arch_info_struct[2]),

  /* ABI v2 processors.  */
  N (bfd_mach_ck801,   "csky:ck801",    false, & arch_info_struct[3]),
  N (bfd_mach_ck802,   "csky:ck802",    false, & arch_info_struct[4]),
  N (bfd_mach_ck803,   "csky:ck803",    false, & arch_info_struct[5]),
  N (bfd_mach_ck807,   "csky:ck807",    false, & arch_info_struct[6]),
  N (bfd_mach_ck810,   "csky:ck810",    false, & arch_info_struct[7]),
  N (bfd_mach_ck860,   "csky:ck860",    false, & arch_info_struct[8]),
  N (bfd_mach_ck_unknown, "csky:any",   false, NULL)
};

const bfd_arch_info_type bfd_csky_arch =
  N (0, "csky", true, & arch_info_struct[0]);
