]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/cpu-avr.c
* symtab.h: Remove outdated comment.
[thirdparty/binutils-gdb.git] / bfd / cpu-avr.c
CommitLineData
adde6300 1/* BFD library support routines for the AVR architecture.
aa820537
AM
2 Copyright 1999, 2000, 2002, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
adde6300
AM
4 Contributed by Denis Chertykov <denisc@overta.ru>
5
4cdc7696 6 This file is part of BFD, the Binary File Descriptor library.
adde6300 7
4cdc7696
NC
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
cd123cb7 10 the Free Software Foundation; either version 3 of the License, or
4cdc7696 11 (at your option) any later version.
adde6300 12
4cdc7696
NC
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.
adde6300 17
4cdc7696
NC
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
cd123cb7
NC
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
adde6300 22
adde6300 23#include "sysdep.h"
3db64b00 24#include "bfd.h"
adde6300
AM
25#include "libbfd.h"
26
adde6300
AM
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 *
4cdc7696
NC
32compatible (const bfd_arch_info_type * a,
33 const bfd_arch_info_type * b)
adde6300
AM
34{
35 /* If a & b are for different architectures we can do nothing. */
36 if (a->arch != b->arch)
37 return NULL;
38
7b21ac3f
EW
39 if (a->mach == b->mach)
40 return a;
adde6300 41
3e22044a
TG
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)
7b21ac3f
EW
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)
adde6300
AM
70 return b;
71
7b21ac3f 72 if (a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr35)
65aa24b6 73 return a;
7b21ac3f
EW
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
65aa24b6 82
adde6300
AM
83 return NULL;
84}
4cdc7696
NC
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{
7b21ac3f 104 /* Assembler only. */
4cdc7696
NC
105 N (16, bfd_mach_avr1, "avr:1", FALSE, & arch_info_struct[1]),
106
7b21ac3f 107 /* Classic, <= 8K. */
4cdc7696
NC
108 N (16, bfd_mach_avr2, "avr:2", FALSE, & arch_info_struct[2]),
109
7b21ac3f
EW
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]),
4cdc7696 123
7b21ac3f
EW
124 /* Enhanced, <= 8K. */
125 N (16, bfd_mach_avr4, "avr:4", FALSE, & arch_info_struct[7]),
4cdc7696 126
7b21ac3f
EW
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]),
28c9d252 134
7b21ac3f 135 /* 3-Byte PC. */
8cc66334
EW
136 N (22, bfd_mach_avr6, "avr:6", FALSE, & arch_info_struct[10]),
137
138 /* Xmega 1 */
139 N (24, bfd_mach_avrxmega1, "avr:101", FALSE, & arch_info_struct[11]),
140
141 /* Xmega 2 */
142 N (24, bfd_mach_avrxmega2, "avr:102", FALSE, & arch_info_struct[12]),
143
144 /* Xmega 3 */
145 N (24, bfd_mach_avrxmega3, "avr:103", FALSE, & arch_info_struct[13]),
146
147 /* Xmega 4 */
148 N (24, bfd_mach_avrxmega4, "avr:104", FALSE, & arch_info_struct[14]),
149
150 /* Xmega 5 */
151 N (24, bfd_mach_avrxmega5, "avr:105", FALSE, & arch_info_struct[15]),
152
153 /* Xmega 6 */
154 N (24, bfd_mach_avrxmega6, "avr:106", FALSE, & arch_info_struct[16]),
155
156 /* Xmega 7 */
157 N (24, bfd_mach_avrxmega7, "avr:107", FALSE, NULL)
158
4cdc7696
NC
159};
160
161const bfd_arch_info_type bfd_avr_arch =
162 N (16, bfd_mach_avr2, "avr", TRUE, & arch_info_struct[0]);