/* BFD library support routines for the AVR architecture.
   Copyright (C) 1999-2016 Free Software Foundation, Inc.
   Contributed by Denis Chertykov <denisc@overta.ru>

   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"

/* This routine is provided two arch_infos and works out which AVR
   machine which would be compatible with both and returns a pointer
   to its info structure.  */

static const bfd_arch_info_type *
compatible (const bfd_arch_info_type * a,
	    const bfd_arch_info_type * b)
{
  /* If a & b are for different architectures we can do nothing.  */
  if (a->arch != b->arch)
    return NULL;

  if (a->mach == b->mach)
    return a;

  /* avr-6 is compatible only with itself as its call convention is not
     compatible with other avr (the mcu saves the return address on 3 bytes
     instead of 2).  */
  if (a->mach == bfd_mach_avr6 || b->mach == bfd_mach_avr6)
    return NULL;

  if (a->mach < bfd_mach_avr6 && b->mach < bfd_mach_avr6)
    {
      /* Special case for ATmega[16]03 (avr:3) and ATmega83 (avr:4).  */
      if ((a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr4)
         || (a->mach == bfd_mach_avr4 && b->mach == bfd_mach_avr3))
       return NULL;

      if (a->mach <= b->mach)
       return b;

      if (a->mach >= b->mach)
       return a;
    }

  if (a->mach == bfd_mach_avr2 && b->mach == bfd_mach_avr25)
    return a;
  if (a->mach == bfd_mach_avr25 && b->mach == bfd_mach_avr2)
    return b;

  if (a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr31)
    return a;
  if (a->mach == bfd_mach_avr31 && b->mach == bfd_mach_avr3)
    return b;
  if (a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr35)
    return a;
  if (a->mach == bfd_mach_avr35 && b->mach == bfd_mach_avr3)
    return b;

  if (a->mach == bfd_mach_avr5 && b->mach == bfd_mach_avr51)
    return a;
  if (a->mach == bfd_mach_avr51 && b->mach == bfd_mach_avr5)
    return b;

  return NULL;
}

#define N(addr_bits, machine, print, default, next)		\
{								\
  8,				/* 8 bits in a word.  */	\
  addr_bits,			/* bits in an address.  */	\
  8,				/* 8 bits in a byte.  */	\
  bfd_arch_avr,							\
  machine,			/* Machine number.  */		\
  "avr",			/* Architecture name.   */	\
  print,			/* Printable name.  */		\
  1,				/* Section align power.  */	\
  default,			/* Is this the default ?  */	\
  compatible,							\
  bfd_default_scan,						\
  bfd_arch_default_fill,					\
  next								\
}

static const bfd_arch_info_type arch_info_struct[] =
{
  /* Assembler only.  */
  N (16, bfd_mach_avr1, "avr:1", FALSE, & arch_info_struct[1]),

  /* Classic, <= 8K.  */
  N (16, bfd_mach_avr2, "avr:2", FALSE, & arch_info_struct[2]),

  /* Classic + MOVW, <= 8K.  */
  N (16, bfd_mach_avr25, "avr:25", FALSE, & arch_info_struct[3]),

  /* Classic, > 8K, <= 64K.  */
  /* TODO:  addr_bits should be 16, but set to 22 for some following
     version of GCC (from 4.3) for backward compatibility.  */
  N (22, bfd_mach_avr3, "avr:3", FALSE, & arch_info_struct[4]),

  /* Classic, == 128K.  */
  N (22, bfd_mach_avr31, "avr:31", FALSE, & arch_info_struct[5]),

  /* Classic + MOVW + JMP/CALL, > 8K, <= 64K. */
  N (16, bfd_mach_avr35, "avr:35", FALSE, & arch_info_struct[6]),

  /* Enhanced, <= 8K.  */
  N (16, bfd_mach_avr4, "avr:4", FALSE, & arch_info_struct[7]),

  /* Enhanced, > 8K, <= 64K.  */
  /* TODO:  addr_bits should be 16, but set to 22 for some following
     version of GCC (from 4.3) for backward compatibility.  */
  N (22, bfd_mach_avr5, "avr:5", FALSE, & arch_info_struct[8]),

  /* Enhanced, == 128K.  */
  N (22, bfd_mach_avr51, "avr:51", FALSE, & arch_info_struct[9]),

  /* 3-Byte PC.  */
  N (22, bfd_mach_avr6, "avr:6", FALSE, & arch_info_struct[10]),

  /* Tiny core (AVR Tiny).  */
  N (16, bfd_mach_avrtiny, "avr:100", FALSE, & arch_info_struct[11]),

  /* Xmega 1.  */
  N (24, bfd_mach_avrxmega1, "avr:101", FALSE, & arch_info_struct[12]),

  /* Xmega 2.  */
  N (24, bfd_mach_avrxmega2, "avr:102", FALSE, & arch_info_struct[13]),

  /* Xmega 3.  */
  N (24, bfd_mach_avrxmega3, "avr:103", FALSE, & arch_info_struct[14]),

  /* Xmega 4.  */
  N (24, bfd_mach_avrxmega4, "avr:104", FALSE, & arch_info_struct[15]),

  /* Xmega 5.  */
  N (24, bfd_mach_avrxmega5, "avr:105", FALSE, & arch_info_struct[16]),

  /* Xmega 6.  */
  N (24, bfd_mach_avrxmega6, "avr:106", FALSE, & arch_info_struct[17]),

  /* Xmega 7.  */
  N (24, bfd_mach_avrxmega7, "avr:107", FALSE, NULL)

};

const bfd_arch_info_type bfd_avr_arch =
  N (16, bfd_mach_avr2, "avr", TRUE, & arch_info_struct[0]);
