Home | History | Annotate | Line # | Download | only in bfd
      1   1.1  christos /* BFD library support routines for the AVR architecture.
      2  1.10  christos    Copyright (C) 1999-2025 Free Software Foundation, Inc.
      3   1.1  christos    Contributed by Denis Chertykov <denisc (at) overta.ru>
      4   1.1  christos 
      5   1.1  christos    This file is part of BFD, the Binary File Descriptor library.
      6   1.1  christos 
      7   1.1  christos    This program is free software; you can redistribute it and/or modify
      8   1.1  christos    it under the terms of the GNU General Public License as published by
      9   1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10   1.1  christos    (at your option) any later version.
     11   1.1  christos 
     12   1.1  christos    This program is distributed in the hope that it will be useful,
     13   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15   1.1  christos    GNU General Public License for more details.
     16   1.1  christos 
     17   1.1  christos    You should have received a copy of the GNU General Public License
     18   1.1  christos    along with this program; if not, write to the Free Software
     19   1.1  christos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20   1.1  christos    MA 02110-1301, USA.  */
     21   1.1  christos 
     22   1.1  christos #include "sysdep.h"
     23   1.1  christos #include "bfd.h"
     24   1.1  christos #include "libbfd.h"
     25   1.1  christos 
     26   1.1  christos /* This routine is provided two arch_infos and works out which AVR
     27   1.1  christos    machine which would be compatible with both and returns a pointer
     28   1.1  christos    to its info structure.  */
     29   1.1  christos 
     30   1.1  christos static const bfd_arch_info_type *
     31   1.1  christos compatible (const bfd_arch_info_type * a,
     32   1.1  christos 	    const bfd_arch_info_type * b)
     33   1.1  christos {
     34   1.1  christos   /* If a & b are for different architectures we can do nothing.  */
     35   1.1  christos   if (a->arch != b->arch)
     36   1.1  christos     return NULL;
     37   1.1  christos 
     38   1.1  christos   if (a->mach == b->mach)
     39   1.1  christos     return a;
     40   1.1  christos 
     41   1.1  christos   /* avr-6 is compatible only with itself as its call convention is not
     42   1.1  christos      compatible with other avr (the mcu saves the return address on 3 bytes
     43   1.1  christos      instead of 2).  */
     44   1.1  christos   if (a->mach == bfd_mach_avr6 || b->mach == bfd_mach_avr6)
     45   1.1  christos     return NULL;
     46   1.1  christos 
     47   1.1  christos   if (a->mach < bfd_mach_avr6 && b->mach < bfd_mach_avr6)
     48   1.1  christos     {
     49   1.1  christos       /* Special case for ATmega[16]03 (avr:3) and ATmega83 (avr:4).  */
     50   1.1  christos       if ((a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr4)
     51   1.6  christos 	 || (a->mach == bfd_mach_avr4 && b->mach == bfd_mach_avr3))
     52   1.1  christos        return NULL;
     53   1.1  christos 
     54   1.1  christos       if (a->mach <= b->mach)
     55   1.1  christos        return b;
     56   1.3  christos 
     57   1.1  christos       if (a->mach >= b->mach)
     58   1.1  christos        return a;
     59   1.1  christos     }
     60   1.1  christos 
     61   1.1  christos   if (a->mach == bfd_mach_avr2 && b->mach == bfd_mach_avr25)
     62   1.1  christos     return a;
     63   1.1  christos   if (a->mach == bfd_mach_avr25 && b->mach == bfd_mach_avr2)
     64   1.1  christos     return b;
     65   1.3  christos 
     66   1.1  christos   if (a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr31)
     67   1.1  christos     return a;
     68   1.1  christos   if (a->mach == bfd_mach_avr31 && b->mach == bfd_mach_avr3)
     69   1.1  christos     return b;
     70   1.1  christos   if (a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr35)
     71   1.1  christos     return a;
     72   1.1  christos   if (a->mach == bfd_mach_avr35 && b->mach == bfd_mach_avr3)
     73   1.1  christos     return b;
     74   1.1  christos 
     75   1.1  christos   if (a->mach == bfd_mach_avr5 && b->mach == bfd_mach_avr51)
     76   1.1  christos     return a;
     77   1.1  christos   if (a->mach == bfd_mach_avr51 && b->mach == bfd_mach_avr5)
     78   1.1  christos     return b;
     79   1.1  christos 
     80   1.1  christos   return NULL;
     81   1.1  christos }
     82   1.1  christos 
     83   1.1  christos #define N(addr_bits, machine, print, default, next)		\
     84   1.1  christos {								\
     85   1.7  christos   8,				/* Bits in a word.  */		\
     86   1.7  christos   addr_bits,			/* Bits in an address.  */	\
     87   1.7  christos   8,				/* Bits in a byte.  */		\
     88   1.1  christos   bfd_arch_avr,							\
     89   1.1  christos   machine,			/* Machine number.  */		\
     90   1.1  christos   "avr",			/* Architecture name.   */	\
     91   1.1  christos   print,			/* Printable name.  */		\
     92   1.1  christos   1,				/* Section align power.  */	\
     93   1.1  christos   default,			/* Is this the default ?  */	\
     94   1.1  christos   compatible,							\
     95   1.1  christos   bfd_default_scan,						\
     96   1.1  christos   bfd_arch_default_fill,					\
     97   1.7  christos   next,								\
     98   1.7  christos   0 /* Maximum offset of a reloc from the start of an insn.  */	\
     99   1.1  christos }
    100   1.1  christos 
    101   1.1  christos static const bfd_arch_info_type arch_info_struct[] =
    102   1.1  christos {
    103   1.1  christos   /* Assembler only.  */
    104   1.8  christos   N (16, bfd_mach_avr1, "avr:1", false, & arch_info_struct[1]),
    105   1.1  christos 
    106   1.1  christos   /* Classic, <= 8K.  */
    107   1.8  christos   N (16, bfd_mach_avr2, "avr:2", false, & arch_info_struct[2]),
    108   1.1  christos 
    109   1.1  christos   /* Classic + MOVW, <= 8K.  */
    110   1.8  christos   N (16, bfd_mach_avr25, "avr:25", false, & arch_info_struct[3]),
    111   1.1  christos 
    112   1.1  christos   /* Classic, > 8K, <= 64K.  */
    113   1.3  christos   /* TODO:  addr_bits should be 16, but set to 22 for some following
    114   1.1  christos      version of GCC (from 4.3) for backward compatibility.  */
    115   1.8  christos   N (22, bfd_mach_avr3, "avr:3", false, & arch_info_struct[4]),
    116   1.1  christos 
    117   1.1  christos   /* Classic, == 128K.  */
    118   1.8  christos   N (22, bfd_mach_avr31, "avr:31", false, & arch_info_struct[5]),
    119   1.1  christos 
    120   1.1  christos   /* Classic + MOVW + JMP/CALL, > 8K, <= 64K. */
    121   1.8  christos   N (16, bfd_mach_avr35, "avr:35", false, & arch_info_struct[6]),
    122   1.1  christos 
    123   1.1  christos   /* Enhanced, <= 8K.  */
    124   1.8  christos   N (16, bfd_mach_avr4, "avr:4", false, & arch_info_struct[7]),
    125   1.1  christos 
    126   1.1  christos   /* Enhanced, > 8K, <= 64K.  */
    127   1.3  christos   /* TODO:  addr_bits should be 16, but set to 22 for some following
    128   1.1  christos      version of GCC (from 4.3) for backward compatibility.  */
    129   1.8  christos   N (22, bfd_mach_avr5, "avr:5", false, & arch_info_struct[8]),
    130   1.3  christos 
    131   1.1  christos   /* Enhanced, == 128K.  */
    132   1.8  christos   N (22, bfd_mach_avr51, "avr:51", false, & arch_info_struct[9]),
    133   1.1  christos 
    134   1.1  christos   /* 3-Byte PC.  */
    135   1.8  christos   N (22, bfd_mach_avr6, "avr:6", false, & arch_info_struct[10]),
    136   1.3  christos 
    137   1.3  christos   /* Tiny core (AVR Tiny).  */
    138   1.8  christos   N (16, bfd_mach_avrtiny, "avr:100", false, & arch_info_struct[11]),
    139   1.3  christos 
    140   1.3  christos   /* Xmega 1.  */
    141   1.8  christos   N (24, bfd_mach_avrxmega1, "avr:101", false, & arch_info_struct[12]),
    142   1.3  christos 
    143   1.3  christos   /* Xmega 2.  */
    144   1.8  christos   N (24, bfd_mach_avrxmega2, "avr:102", false, & arch_info_struct[13]),
    145   1.3  christos 
    146   1.3  christos   /* Xmega 3.  */
    147   1.8  christos   N (24, bfd_mach_avrxmega3, "avr:103", false, & arch_info_struct[14]),
    148   1.3  christos 
    149   1.3  christos   /* Xmega 4.  */
    150   1.8  christos   N (24, bfd_mach_avrxmega4, "avr:104", false, & arch_info_struct[15]),
    151   1.3  christos 
    152   1.3  christos   /* Xmega 5.  */
    153   1.8  christos   N (24, bfd_mach_avrxmega5, "avr:105", false, & arch_info_struct[16]),
    154   1.3  christos 
    155   1.3  christos   /* Xmega 6.  */
    156   1.8  christos   N (24, bfd_mach_avrxmega6, "avr:106", false, & arch_info_struct[17]),
    157   1.3  christos 
    158   1.3  christos   /* Xmega 7.  */
    159   1.8  christos   N (24, bfd_mach_avrxmega7, "avr:107", false, NULL)
    160   1.3  christos 
    161   1.1  christos };
    162   1.1  christos 
    163   1.1  christos const bfd_arch_info_type bfd_avr_arch =
    164   1.8  christos   N (16, bfd_mach_avr2, "avr", true, & arch_info_struct[0]);
    165