/* BFD support for the ARC processor
   Copyright 1994, 1995, 1997, 2001 Free Software Foundation, Inc.
   Contributed by Doug Evans (dje@cygnus.com).

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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

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

#define ARC(mach, print_name, default_p, next) \
{					\
    32,	/* 32 bits in a word  */	\
    32,	/* 32 bits in an address  */	\
    8,	/* 8 bits in a byte  */		\
    bfd_arch_arc,			\
    mach,				\
    "arc",				\
    print_name,				\
    4, /* section alignment power  */	\
    default_p,				\
    bfd_default_compatible,		\
    bfd_default_scan,			\
    next,				\
  }

static const bfd_arch_info_type arch_info_struct[] =
{
  ARC ( bfd_mach_arc_5, "arc5", false, &arch_info_struct[1] ),
  ARC ( bfd_mach_arc_5, "base", false, &arch_info_struct[2] ),
  ARC ( bfd_mach_arc_6, "arc6", false, &arch_info_struct[3] ),
  ARC ( bfd_mach_arc_7, "arc7", false, &arch_info_struct[4] ),
  ARC ( bfd_mach_arc_8, "arc8", false, NULL ),
};

const bfd_arch_info_type bfd_arc_arch =
  ARC ( bfd_mach_arc_6, "arc", true, &arch_info_struct[0] );

/* Utility routines.  */

/* Given cpu type NAME, return its bfd_mach_arc_xxx value.
   Returns -1 if not found.  */

int
arc_get_mach (name)
     char *name;
{
  const bfd_arch_info_type *p;

  for (p = &bfd_arc_arch; p != NULL; p = p->next)
    if (strcmp (name, p->printable_name) == 0)
      return p->mach;
  return -1;
}
