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