Add support for the AVR Tiny series of microcontrollers.
[deliverable/binutils-gdb.git] / gas / config / tc-avr.c
1 /* tc-avr.c -- Assembler code for the ATMEL AVR
2
3 Copyright (C) 1999-2014 Free Software Foundation, Inc.
4 Contributed by Denis Chertykov <denisc@overta.ru>
5
6 This file is part of GAS, the GNU Assembler.
7
8 GAS 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, or (at your option)
11 any later version.
12
13 GAS 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 GAS; see the file COPYING. If not, write to
20 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
21 Boston, MA 02110-1301, USA. */
22
23 #include "as.h"
24 #include "safe-ctype.h"
25 #include "subsegs.h"
26 #include "dwarf2dbg.h"
27 #include "dw2gencfi.h"
28
29
30 struct avr_opcodes_s
31 {
32 char * name;
33 char * constraints;
34 char * opcode;
35 int insn_size; /* In words. */
36 int isa;
37 unsigned int bin_opcode;
38 };
39
40 #define AVR_INSN(NAME, CONSTR, OPCODE, SIZE, ISA, BIN) \
41 {#NAME, CONSTR, OPCODE, SIZE, ISA, BIN},
42
43 struct avr_opcodes_s avr_opcodes[] =
44 {
45 #include "opcode/avr.h"
46 {NULL, NULL, NULL, 0, 0, 0}
47 };
48
49 const char comment_chars[] = ";";
50 const char line_comment_chars[] = "#";
51 const char line_separator_chars[] = "$";
52
53 const char *md_shortopts = "m:";
54 struct mcu_type_s
55 {
56 char *name;
57 int isa;
58 int mach;
59 };
60
61 /* XXX - devices that don't seem to exist (renamed, replaced with larger
62 ones, or planned but never produced), left here for compatibility. */
63
64 static struct mcu_type_s mcu_types[] =
65 {
66 {"avr1", AVR_ISA_AVR1, bfd_mach_avr1},
67 /* TODO: insruction set for avr2 architecture should be AVR_ISA_AVR2,
68 but set to AVR_ISA_AVR25 for some following version
69 of GCC (from 4.3) for backward compatibility. */
70 {"avr2", AVR_ISA_AVR25, bfd_mach_avr2},
71 {"avr25", AVR_ISA_AVR25, bfd_mach_avr25},
72 /* TODO: insruction set for avr3 architecture should be AVR_ISA_AVR3,
73 but set to AVR_ISA_AVR3_ALL for some following version
74 of GCC (from 4.3) for backward compatibility. */
75 {"avr3", AVR_ISA_AVR3_ALL, bfd_mach_avr3},
76 {"avr31", AVR_ISA_AVR31, bfd_mach_avr31},
77 {"avr35", AVR_ISA_AVR35, bfd_mach_avr35},
78 {"avr4", AVR_ISA_AVR4, bfd_mach_avr4},
79 /* TODO: insruction set for avr5 architecture should be AVR_ISA_AVR5,
80 but set to AVR_ISA_AVR51 for some following version
81 of GCC (from 4.3) for backward compatibility. */
82 {"avr5", AVR_ISA_AVR51, bfd_mach_avr5},
83 {"avr51", AVR_ISA_AVR51, bfd_mach_avr51},
84 {"avr6", AVR_ISA_AVR6, bfd_mach_avr6},
85 {"avrxmega1", AVR_ISA_XMEGA, bfd_mach_avrxmega1},
86 {"avrxmega2", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
87 {"avrxmega3", AVR_ISA_XMEGA, bfd_mach_avrxmega3},
88 {"avrxmega4", AVR_ISA_XMEGA, bfd_mach_avrxmega4},
89 {"avrxmega5", AVR_ISA_XMEGA, bfd_mach_avrxmega5},
90 {"avrxmega6", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
91 {"avrxmega7", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
92 {"avrtiny", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
93 {"at90s1200", AVR_ISA_1200, bfd_mach_avr1},
94 {"attiny11", AVR_ISA_AVR1, bfd_mach_avr1},
95 {"attiny12", AVR_ISA_AVR1, bfd_mach_avr1},
96 {"attiny15", AVR_ISA_AVR1, bfd_mach_avr1},
97 {"attiny28", AVR_ISA_AVR1, bfd_mach_avr1},
98 {"at90s2313", AVR_ISA_AVR2, bfd_mach_avr2},
99 {"at90s2323", AVR_ISA_AVR2, bfd_mach_avr2},
100 {"at90s2333", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 4433 */
101 {"at90s2343", AVR_ISA_AVR2, bfd_mach_avr2},
102 {"attiny22", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 2343 */
103 {"attiny26", AVR_ISA_2xxe, bfd_mach_avr2},
104 {"at90s4414", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 8515 */
105 {"at90s4433", AVR_ISA_AVR2, bfd_mach_avr2},
106 {"at90s4434", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 8535 */
107 {"at90s8515", AVR_ISA_AVR2, bfd_mach_avr2},
108 {"at90c8534", AVR_ISA_AVR2, bfd_mach_avr2},
109 {"at90s8535", AVR_ISA_AVR2, bfd_mach_avr2},
110 {"ata5272", AVR_ISA_AVR25, bfd_mach_avr25},
111 {"attiny13", AVR_ISA_AVR25, bfd_mach_avr25},
112 {"attiny13a", AVR_ISA_AVR25, bfd_mach_avr25},
113 {"attiny2313", AVR_ISA_AVR25, bfd_mach_avr25},
114 {"attiny2313a",AVR_ISA_AVR25, bfd_mach_avr25},
115 {"attiny24", AVR_ISA_AVR25, bfd_mach_avr25},
116 {"attiny24a", AVR_ISA_AVR25, bfd_mach_avr25},
117 {"attiny4313", AVR_ISA_AVR25, bfd_mach_avr25},
118 {"attiny44", AVR_ISA_AVR25, bfd_mach_avr25},
119 {"attiny44a", AVR_ISA_AVR25, bfd_mach_avr25},
120 {"attiny84", AVR_ISA_AVR25, bfd_mach_avr25},
121 {"attiny84a", AVR_ISA_AVR25, bfd_mach_avr25},
122 {"attiny25", AVR_ISA_AVR25, bfd_mach_avr25},
123 {"attiny45", AVR_ISA_AVR25, bfd_mach_avr25},
124 {"attiny85", AVR_ISA_AVR25, bfd_mach_avr25},
125 {"attiny261", AVR_ISA_AVR25, bfd_mach_avr25},
126 {"attiny261a", AVR_ISA_AVR25, bfd_mach_avr25},
127 {"attiny461", AVR_ISA_AVR25, bfd_mach_avr25},
128 {"attiny461a", AVR_ISA_AVR25, bfd_mach_avr25},
129 {"attiny861", AVR_ISA_AVR25, bfd_mach_avr25},
130 {"attiny861a", AVR_ISA_AVR25, bfd_mach_avr25},
131 {"attiny87", AVR_ISA_AVR25, bfd_mach_avr25},
132 {"attiny43u", AVR_ISA_AVR25, bfd_mach_avr25},
133 {"attiny48", AVR_ISA_AVR25, bfd_mach_avr25},
134 {"attiny88", AVR_ISA_AVR25, bfd_mach_avr25},
135 {"attiny828", AVR_ISA_AVR25, bfd_mach_avr25},
136 {"at86rf401", AVR_ISA_RF401, bfd_mach_avr25},
137 {"at43usb355", AVR_ISA_AVR3, bfd_mach_avr3},
138 {"at76c711", AVR_ISA_AVR3, bfd_mach_avr3},
139 {"atmega103", AVR_ISA_AVR31, bfd_mach_avr31},
140 {"at43usb320", AVR_ISA_AVR31, bfd_mach_avr31},
141 {"attiny167", AVR_ISA_AVR35, bfd_mach_avr35},
142 {"at90usb82", AVR_ISA_AVR35, bfd_mach_avr35},
143 {"at90usb162", AVR_ISA_AVR35, bfd_mach_avr35},
144 {"ata5505", AVR_ISA_AVR35, bfd_mach_avr35},
145 {"atmega8u2", AVR_ISA_AVR35, bfd_mach_avr35},
146 {"atmega16u2", AVR_ISA_AVR35, bfd_mach_avr35},
147 {"atmega32u2", AVR_ISA_AVR35, bfd_mach_avr35},
148 {"attiny1634", AVR_ISA_AVR35, bfd_mach_avr35},
149 {"atmega8", AVR_ISA_M8, bfd_mach_avr4},
150 {"ata6289", AVR_ISA_AVR4, bfd_mach_avr4},
151 {"atmega8a", AVR_ISA_M8, bfd_mach_avr4},
152 {"ata6285", AVR_ISA_AVR4, bfd_mach_avr4},
153 {"ata6286", AVR_ISA_AVR4, bfd_mach_avr4},
154 {"atmega48", AVR_ISA_AVR4, bfd_mach_avr4},
155 {"atmega48a", AVR_ISA_AVR4, bfd_mach_avr4},
156 {"atmega48pa", AVR_ISA_AVR4, bfd_mach_avr4},
157 {"atmega48p", AVR_ISA_AVR4, bfd_mach_avr4},
158 {"atmega88", AVR_ISA_AVR4, bfd_mach_avr4},
159 {"atmega88a", AVR_ISA_AVR4, bfd_mach_avr4},
160 {"atmega88p", AVR_ISA_AVR4, bfd_mach_avr4},
161 {"atmega88pa", AVR_ISA_AVR4, bfd_mach_avr4},
162 {"atmega8515", AVR_ISA_M8, bfd_mach_avr4},
163 {"atmega8535", AVR_ISA_M8, bfd_mach_avr4},
164 {"atmega8hva", AVR_ISA_AVR4, bfd_mach_avr4},
165 {"at90pwm1", AVR_ISA_AVR4, bfd_mach_avr4},
166 {"at90pwm2", AVR_ISA_AVR4, bfd_mach_avr4},
167 {"at90pwm2b", AVR_ISA_AVR4, bfd_mach_avr4},
168 {"at90pwm3", AVR_ISA_AVR4, bfd_mach_avr4},
169 {"at90pwm3b", AVR_ISA_AVR4, bfd_mach_avr4},
170 {"at90pwm81", AVR_ISA_AVR4, bfd_mach_avr4},
171 {"at90pwm161", AVR_ISA_AVR5, bfd_mach_avr5},
172 {"ata5790", AVR_ISA_AVR5, bfd_mach_avr5},
173 {"ata5795", AVR_ISA_AVR5, bfd_mach_avr5},
174 {"atmega16", AVR_ISA_AVR5, bfd_mach_avr5},
175 {"atmega16a", AVR_ISA_AVR5, bfd_mach_avr5},
176 {"atmega161", AVR_ISA_M161, bfd_mach_avr5},
177 {"atmega162", AVR_ISA_AVR5, bfd_mach_avr5},
178 {"atmega163", AVR_ISA_M161, bfd_mach_avr5},
179 {"atmega164a", AVR_ISA_AVR5, bfd_mach_avr5},
180 {"atmega164p", AVR_ISA_AVR5, bfd_mach_avr5},
181 {"atmega164pa",AVR_ISA_AVR5, bfd_mach_avr5},
182 {"atmega165", AVR_ISA_AVR5, bfd_mach_avr5},
183 {"atmega165a", AVR_ISA_AVR5, bfd_mach_avr5},
184 {"atmega165p", AVR_ISA_AVR5, bfd_mach_avr5},
185 {"atmega165pa",AVR_ISA_AVR5, bfd_mach_avr5},
186 {"atmega168", AVR_ISA_AVR5, bfd_mach_avr5},
187 {"atmega168a", AVR_ISA_AVR5, bfd_mach_avr5},
188 {"atmega168p", AVR_ISA_AVR5, bfd_mach_avr5},
189 {"atmega168pa",AVR_ISA_AVR5, bfd_mach_avr5},
190 {"atmega169", AVR_ISA_AVR5, bfd_mach_avr5},
191 {"atmega169a", AVR_ISA_AVR5, bfd_mach_avr5},
192 {"atmega169p", AVR_ISA_AVR5, bfd_mach_avr5},
193 {"atmega169pa",AVR_ISA_AVR5, bfd_mach_avr5},
194 {"atmega32", AVR_ISA_AVR5, bfd_mach_avr5},
195 {"atmega32a", AVR_ISA_AVR5, bfd_mach_avr5},
196 {"atmega323", AVR_ISA_AVR5, bfd_mach_avr5},
197 {"atmega324a", AVR_ISA_AVR5, bfd_mach_avr5},
198 {"atmega324p", AVR_ISA_AVR5, bfd_mach_avr5},
199 {"atmega324pa",AVR_ISA_AVR5, bfd_mach_avr5},
200 {"atmega325", AVR_ISA_AVR5, bfd_mach_avr5},
201 {"atmega325a", AVR_ISA_AVR5, bfd_mach_avr5},
202 {"atmega325p", AVR_ISA_AVR5, bfd_mach_avr5},
203 {"atmega325pa",AVR_ISA_AVR5, bfd_mach_avr5},
204 {"atmega3250", AVR_ISA_AVR5, bfd_mach_avr5},
205 {"atmega3250a",AVR_ISA_AVR5, bfd_mach_avr5},
206 {"atmega3250p",AVR_ISA_AVR5, bfd_mach_avr5},
207 {"atmega3250pa",AVR_ISA_AVR5, bfd_mach_avr5},
208 {"atmega328", AVR_ISA_AVR5, bfd_mach_avr5},
209 {"atmega328p", AVR_ISA_AVR5, bfd_mach_avr5},
210 {"atmega329", AVR_ISA_AVR5, bfd_mach_avr5},
211 {"atmega329a", AVR_ISA_AVR5, bfd_mach_avr5},
212 {"atmega329p", AVR_ISA_AVR5, bfd_mach_avr5},
213 {"atmega329pa",AVR_ISA_AVR5, bfd_mach_avr5},
214 {"atmega3290", AVR_ISA_AVR5, bfd_mach_avr5},
215 {"atmega3290a",AVR_ISA_AVR5, bfd_mach_avr5},
216 {"atmega3290p",AVR_ISA_AVR5, bfd_mach_avr5},
217 {"atmega3290pa",AVR_ISA_AVR5, bfd_mach_avr5},
218 {"atmega406", AVR_ISA_AVR5, bfd_mach_avr5},
219 {"atmega64rfr2", AVR_ISA_AVR5, bfd_mach_avr5},
220 {"atmega644rfr2",AVR_ISA_AVR5, bfd_mach_avr5},
221 {"atmega64", AVR_ISA_AVR5, bfd_mach_avr5},
222 {"atmega64a", AVR_ISA_AVR5, bfd_mach_avr5},
223 {"atmega640", AVR_ISA_AVR5, bfd_mach_avr5},
224 {"atmega644", AVR_ISA_AVR5, bfd_mach_avr5},
225 {"atmega644a", AVR_ISA_AVR5, bfd_mach_avr5},
226 {"atmega644p", AVR_ISA_AVR5, bfd_mach_avr5},
227 {"atmega644pa",AVR_ISA_AVR5, bfd_mach_avr5},
228 {"atmega645", AVR_ISA_AVR5, bfd_mach_avr5},
229 {"atmega645a", AVR_ISA_AVR5, bfd_mach_avr5},
230 {"atmega645p", AVR_ISA_AVR5, bfd_mach_avr5},
231 {"atmega649", AVR_ISA_AVR5, bfd_mach_avr5},
232 {"atmega649a", AVR_ISA_AVR5, bfd_mach_avr5},
233 {"atmega649p", AVR_ISA_AVR5, bfd_mach_avr5},
234 {"atmega6450", AVR_ISA_AVR5, bfd_mach_avr5},
235 {"atmega6450a",AVR_ISA_AVR5, bfd_mach_avr5},
236 {"atmega6450p",AVR_ISA_AVR5, bfd_mach_avr5},
237 {"atmega6490", AVR_ISA_AVR5, bfd_mach_avr5},
238 {"atmega6490a",AVR_ISA_AVR5, bfd_mach_avr5},
239 {"atmega6490p",AVR_ISA_AVR5, bfd_mach_avr5},
240 {"atmega64rfr2",AVR_ISA_AVR5, bfd_mach_avr5},
241 {"atmega644rfr2",AVR_ISA_AVR5, bfd_mach_avr5},
242 {"atmega16hva",AVR_ISA_AVR5, bfd_mach_avr5},
243 {"atmega16hva2",AVR_ISA_AVR5, bfd_mach_avr5},
244 {"atmega16hvb",AVR_ISA_AVR5, bfd_mach_avr5},
245 {"atmega16hvbrevb",AVR_ISA_AVR5,bfd_mach_avr5},
246 {"atmega32hvb",AVR_ISA_AVR5, bfd_mach_avr5},
247 {"atmega32hvbrevb",AVR_ISA_AVR5,bfd_mach_avr5},
248 {"atmega64hve",AVR_ISA_AVR5, bfd_mach_avr5},
249 {"at90can32" , AVR_ISA_AVR5, bfd_mach_avr5},
250 {"at90can64" , AVR_ISA_AVR5, bfd_mach_avr5},
251 {"at90pwm161", AVR_ISA_AVR5, bfd_mach_avr5},
252 {"at90pwm216", AVR_ISA_AVR5, bfd_mach_avr5},
253 {"at90pwm316", AVR_ISA_AVR5, bfd_mach_avr5},
254 {"atmega32c1", AVR_ISA_AVR5, bfd_mach_avr5},
255 {"atmega64c1", AVR_ISA_AVR5, bfd_mach_avr5},
256 {"atmega16m1", AVR_ISA_AVR5, bfd_mach_avr5},
257 {"atmega32m1", AVR_ISA_AVR5, bfd_mach_avr5},
258 {"atmega64m1", AVR_ISA_AVR5, bfd_mach_avr5},
259 {"atmega16u4", AVR_ISA_AVR5, bfd_mach_avr5},
260 {"atmega32u4", AVR_ISA_AVR5, bfd_mach_avr5},
261 {"atmega32u6", AVR_ISA_AVR5, bfd_mach_avr5},
262 {"at90usb646", AVR_ISA_AVR5, bfd_mach_avr5},
263 {"at90usb647", AVR_ISA_AVR5, bfd_mach_avr5},
264 {"at90scr100", AVR_ISA_AVR5, bfd_mach_avr5},
265 {"at94k", AVR_ISA_94K, bfd_mach_avr5},
266 {"m3000", AVR_ISA_AVR5, bfd_mach_avr5},
267 {"atmega128", AVR_ISA_AVR51, bfd_mach_avr51},
268 {"atmega128a", AVR_ISA_AVR51, bfd_mach_avr51},
269 {"atmega1280", AVR_ISA_AVR51, bfd_mach_avr51},
270 {"atmega1281", AVR_ISA_AVR51, bfd_mach_avr51},
271 {"atmega1284", AVR_ISA_AVR51, bfd_mach_avr51},
272 {"atmega1284p",AVR_ISA_AVR51, bfd_mach_avr51},
273 {"atmega128rfa1",AVR_ISA_AVR51, bfd_mach_avr51},
274 {"atmega128rfr2",AVR_ISA_AVR51, bfd_mach_avr51},
275 {"atmega1284rfr2",AVR_ISA_AVR51, bfd_mach_avr51},
276 {"at90can128", AVR_ISA_AVR51, bfd_mach_avr51},
277 {"at90usb1286",AVR_ISA_AVR51, bfd_mach_avr51},
278 {"at90usb1287",AVR_ISA_AVR51, bfd_mach_avr51},
279 {"atmega2560", AVR_ISA_AVR6, bfd_mach_avr6},
280 {"atmega2561", AVR_ISA_AVR6, bfd_mach_avr6},
281 {"atmega256rfr2", AVR_ISA_AVR6, bfd_mach_avr6},
282 {"atmega2564rfr2", AVR_ISA_AVR6, bfd_mach_avr6},
283 {"atxmega16a4", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
284 {"atxmega16a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
285 {"atxmega16c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
286 {"atxmega16d4", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
287 {"atxmega32a4", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
288 {"atxmega32a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
289 {"atxmega32c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
290 {"atxmega32d4", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
291 {"atxmega32e5", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
292 {"atxmega16e5", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
293 {"atxmega8e5", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
294 {"atxmega32x1", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
295 {"atxmega64a3", AVR_ISA_XMEGA, bfd_mach_avrxmega4},
296 {"atxmega64a3u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
297 {"atxmega64a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
298 {"atxmega64b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
299 {"atxmega64b3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
300 {"atxmega64c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
301 {"atxmega64d3", AVR_ISA_XMEGA, bfd_mach_avrxmega4},
302 {"atxmega64d4", AVR_ISA_XMEGA, bfd_mach_avrxmega4},
303 {"atxmega64a1", AVR_ISA_XMEGA, bfd_mach_avrxmega5},
304 {"atxmega64a1u",AVR_ISA_XMEGAU, bfd_mach_avrxmega5},
305 {"atxmega128a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
306 {"atxmega128a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
307 {"atxmega128b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
308 {"atxmega128b3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
309 {"atxmega128c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
310 {"atxmega128d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
311 {"atxmega128d4", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
312 {"atxmega192a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
313 {"atxmega192a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
314 {"atxmega192c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
315 {"atxmega192d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
316 {"atxmega256a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
317 {"atxmega256a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
318 {"atxmega256a3b",AVR_ISA_XMEGA, bfd_mach_avrxmega6},
319 {"atxmega256a3bu",AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
320 {"atxmega256c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
321 {"atxmega256d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
322 {"atxmega384c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
323 {"atxmega384d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
324 {"atxmega128a1", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
325 {"atxmega128a1u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7},
326 {"atxmega128a4u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7},
327 {"attiny4", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
328 {"attiny5", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
329 {"attiny9", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
330 {"attiny10", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
331 {"attiny20", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
332 {"attiny40", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
333 {NULL, 0, 0}
334 };
335
336
337 /* Current MCU type. */
338 static struct mcu_type_s default_mcu = {"avr2", AVR_ISA_AVR2, bfd_mach_avr2};
339 static struct mcu_type_s specified_mcu;
340 static struct mcu_type_s * avr_mcu = & default_mcu;
341
342 /* AVR target-specific switches. */
343 struct avr_opt_s
344 {
345 int all_opcodes; /* -mall-opcodes: accept all known AVR opcodes. */
346 int no_skip_bug; /* -mno-skip-bug: no warnings for skipping 2-word insns. */
347 int no_wrap; /* -mno-wrap: reject rjmp/rcall with 8K wrap-around. */
348 int link_relax; /* -mlink-relax: generate relocations for linker
349 relaxation. */
350 };
351
352 static struct avr_opt_s avr_opt = { 0, 0, 0, 0 };
353
354 const char EXP_CHARS[] = "eE";
355 const char FLT_CHARS[] = "dD";
356
357 static void avr_set_arch (int);
358
359 /* The target specific pseudo-ops which we support. */
360 const pseudo_typeS md_pseudo_table[] =
361 {
362 {"arch", avr_set_arch, 0},
363 { NULL, NULL, 0}
364 };
365
366 #define LDI_IMMEDIATE(x) (((x) & 0xf) | (((x) << 4) & 0xf00))
367
368 #define EXP_MOD_NAME(i) exp_mod[i].name
369 #define EXP_MOD_RELOC(i) exp_mod[i].reloc
370 #define EXP_MOD_NEG_RELOC(i) exp_mod[i].neg_reloc
371 #define HAVE_PM_P(i) exp_mod[i].have_pm
372
373 struct exp_mod_s
374 {
375 char * name;
376 bfd_reloc_code_real_type reloc;
377 bfd_reloc_code_real_type neg_reloc;
378 int have_pm;
379 };
380
381 static struct exp_mod_s exp_mod[] =
382 {
383 {"hh8", BFD_RELOC_AVR_HH8_LDI, BFD_RELOC_AVR_HH8_LDI_NEG, 1},
384 {"pm_hh8", BFD_RELOC_AVR_HH8_LDI_PM, BFD_RELOC_AVR_HH8_LDI_PM_NEG, 0},
385 {"hi8", BFD_RELOC_AVR_HI8_LDI, BFD_RELOC_AVR_HI8_LDI_NEG, 1},
386 {"pm_hi8", BFD_RELOC_AVR_HI8_LDI_PM, BFD_RELOC_AVR_HI8_LDI_PM_NEG, 0},
387 {"lo8", BFD_RELOC_AVR_LO8_LDI, BFD_RELOC_AVR_LO8_LDI_NEG, 1},
388 {"pm_lo8", BFD_RELOC_AVR_LO8_LDI_PM, BFD_RELOC_AVR_LO8_LDI_PM_NEG, 0},
389 {"hlo8", BFD_RELOC_AVR_HH8_LDI, BFD_RELOC_AVR_HH8_LDI_NEG, 0},
390 {"hhi8", BFD_RELOC_AVR_MS8_LDI, BFD_RELOC_AVR_MS8_LDI_NEG, 0},
391 };
392
393 /* A union used to store indicies into the exp_mod[] array
394 in a hash table which expects void * data types. */
395 typedef union
396 {
397 void * ptr;
398 int index;
399 } mod_index;
400
401 /* Opcode hash table. */
402 static struct hash_control *avr_hash;
403
404 /* Reloc modifiers hash control (hh8,hi8,lo8,pm_xx). */
405 static struct hash_control *avr_mod_hash;
406
407 #define OPTION_MMCU 'm'
408 enum options
409 {
410 OPTION_ALL_OPCODES = OPTION_MD_BASE + 1,
411 OPTION_NO_SKIP_BUG,
412 OPTION_NO_WRAP,
413 OPTION_ISA_RMW,
414 OPTION_LINK_RELAX
415 };
416
417 struct option md_longopts[] =
418 {
419 { "mmcu", required_argument, NULL, OPTION_MMCU },
420 { "mall-opcodes", no_argument, NULL, OPTION_ALL_OPCODES },
421 { "mno-skip-bug", no_argument, NULL, OPTION_NO_SKIP_BUG },
422 { "mno-wrap", no_argument, NULL, OPTION_NO_WRAP },
423 { "mrmw", no_argument, NULL, OPTION_ISA_RMW },
424 { "mlink-relax", no_argument, NULL, OPTION_LINK_RELAX },
425 { NULL, no_argument, NULL, 0 }
426 };
427
428 size_t md_longopts_size = sizeof (md_longopts);
429
430 /* Display nicely formatted list of known MCU names. */
431
432 static void
433 show_mcu_list (FILE *stream)
434 {
435 int i, x;
436
437 fprintf (stream, _("Known MCU names:"));
438 x = 1000;
439
440 for (i = 0; mcu_types[i].name; i++)
441 {
442 int len = strlen (mcu_types[i].name);
443
444 x += len + 1;
445
446 if (x < 75)
447 fprintf (stream, " %s", mcu_types[i].name);
448 else
449 {
450 fprintf (stream, "\n %s", mcu_types[i].name);
451 x = len + 2;
452 }
453 }
454
455 fprintf (stream, "\n");
456 }
457
458 static inline char *
459 skip_space (char *s)
460 {
461 while (*s == ' ' || *s == '\t')
462 ++s;
463 return s;
464 }
465
466 /* Extract one word from FROM and copy it to TO. */
467
468 static char *
469 extract_word (char *from, char *to, int limit)
470 {
471 char *op_end;
472 int size = 0;
473
474 /* Drop leading whitespace. */
475 from = skip_space (from);
476 *to = 0;
477
478 /* Find the op code end. */
479 for (op_end = from; *op_end != 0 && is_part_of_name (*op_end);)
480 {
481 to[size++] = *op_end++;
482 if (size + 1 >= limit)
483 break;
484 }
485
486 to[size] = 0;
487 return op_end;
488 }
489
490 int
491 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
492 asection *seg ATTRIBUTE_UNUSED)
493 {
494 abort ();
495 return 0;
496 }
497
498 void
499 md_show_usage (FILE *stream)
500 {
501 fprintf (stream,
502 _("AVR Assembler options:\n"
503 " -mmcu=[avr-name] select microcontroller variant\n"
504 " [avr-name] can be:\n"
505 " avr1 - classic AVR core without data RAM\n"
506 " avr2 - classic AVR core with up to 8K program memory\n"
507 " avr25 - classic AVR core with up to 8K program memory\n"
508 " plus the MOVW instruction\n"
509 " avr3 - classic AVR core with up to 64K program memory\n"
510 " avr31 - classic AVR core with up to 128K program memory\n"
511 " avr35 - classic AVR core with up to 64K program memory\n"
512 " plus the MOVW instruction\n"
513 " avr4 - enhanced AVR core with up to 8K program memory\n"
514 " avr5 - enhanced AVR core with up to 64K program memory\n"
515 " avr51 - enhanced AVR core with up to 128K program memory\n"
516 " avr6 - enhanced AVR core with up to 256K program memory\n"
517 " avrxmega2 - XMEGA, > 8K, < 64K FLASH, < 64K RAM\n"
518 " avrxmega3 - XMEGA, > 8K, <= 64K FLASH, > 64K RAM\n"
519 " avrxmega4 - XMEGA, > 64K, <= 128K FLASH, <= 64K RAM\n"
520 " avrxmega5 - XMEGA, > 64K, <= 128K FLASH, > 64K RAM\n"
521 " avrxmega6 - XMEGA, > 128K, <= 256K FLASH, <= 64K RAM\n"
522 " avrxmega7 - XMEGA, > 128K, <= 256K FLASH, > 64K RAM\n"
523 " avrtiny - AVR Tiny core with 16 gp registers\n"));
524 fprintf (stream,
525 _(" -mall-opcodes accept all AVR opcodes, even if not supported by MCU\n"
526 " -mno-skip-bug disable warnings for skipping two-word instructions\n"
527 " (default for avr4, avr5)\n"
528 " -mno-wrap reject rjmp/rcall instructions with 8K wrap-around\n"
529 " (default for avr3, avr5)\n"
530 " -mrmw accept Read-Modify-Write instructions\n"
531 " -mlink-relax generate relocations for linker relaxation\n"
532 ));
533 show_mcu_list (stream);
534 }
535
536 static void
537 avr_set_arch (int dummy ATTRIBUTE_UNUSED)
538 {
539 char str[20];
540
541 input_line_pointer = extract_word (input_line_pointer, str, 20);
542 md_parse_option (OPTION_MMCU, str);
543 bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
544 }
545
546 int
547 md_parse_option (int c, char *arg)
548 {
549 switch (c)
550 {
551 case OPTION_MMCU:
552 {
553 int i;
554 char *s = alloca (strlen (arg) + 1);
555
556 {
557 char *t = s;
558 char *arg1 = arg;
559
560 do
561 *t = TOLOWER (*arg1++);
562 while (*t++);
563 }
564
565 for (i = 0; mcu_types[i].name; ++i)
566 if (strcmp (mcu_types[i].name, s) == 0)
567 break;
568
569 if (!mcu_types[i].name)
570 {
571 show_mcu_list (stderr);
572 as_fatal (_("unknown MCU: %s\n"), arg);
573 }
574
575 /* It is OK to redefine mcu type within the same avr[1-5] bfd machine
576 type - this for allows passing -mmcu=... via gcc ASM_SPEC as well
577 as .arch ... in the asm output at the same time. */
578 if (avr_mcu == &default_mcu || avr_mcu->mach == mcu_types[i].mach)
579 {
580 specified_mcu.name = mcu_types[i].name;
581 specified_mcu.isa |= mcu_types[i].isa;
582 specified_mcu.mach = mcu_types[i].mach;
583 avr_mcu = &specified_mcu;
584 }
585 else
586 as_fatal (_("redefinition of mcu type `%s' to `%s'"),
587 avr_mcu->name, mcu_types[i].name);
588 return 1;
589 }
590 case OPTION_ALL_OPCODES:
591 avr_opt.all_opcodes = 1;
592 return 1;
593 case OPTION_NO_SKIP_BUG:
594 avr_opt.no_skip_bug = 1;
595 return 1;
596 case OPTION_NO_WRAP:
597 avr_opt.no_wrap = 1;
598 return 1;
599 case OPTION_ISA_RMW:
600 specified_mcu.isa |= AVR_ISA_RMW;
601 return 1;
602 case OPTION_LINK_RELAX:
603 avr_opt.link_relax = 1;
604 return 1;
605 }
606
607 return 0;
608 }
609
610 symbolS *
611 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
612 {
613 return NULL;
614 }
615
616 char *
617 md_atof (int type, char *litP, int *sizeP)
618 {
619 return ieee_md_atof (type, litP, sizeP, FALSE);
620 }
621
622 void
623 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
624 asection *sec ATTRIBUTE_UNUSED,
625 fragS *fragP ATTRIBUTE_UNUSED)
626 {
627 abort ();
628 }
629
630 void
631 md_begin (void)
632 {
633 unsigned int i;
634 struct avr_opcodes_s *opcode;
635
636 avr_hash = hash_new ();
637
638 /* Insert unique names into hash table. This hash table then provides a
639 quick index to the first opcode with a particular name in the opcode
640 table. */
641 for (opcode = avr_opcodes; opcode->name; opcode++)
642 hash_insert (avr_hash, opcode->name, (char *) opcode);
643
644 avr_mod_hash = hash_new ();
645
646 for (i = 0; i < ARRAY_SIZE (exp_mod); ++i)
647 {
648 mod_index m;
649
650 m.index = i + 10;
651 hash_insert (avr_mod_hash, EXP_MOD_NAME (i), m.ptr);
652 }
653
654 bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
655 linkrelax = avr_opt.link_relax;
656 }
657
658 /* Resolve STR as a constant expression and return the result.
659 If result greater than MAX then error. */
660
661 static unsigned int
662 avr_get_constant (char *str, int max)
663 {
664 expressionS ex;
665
666 str = skip_space (str);
667 input_line_pointer = str;
668 expression (& ex);
669
670 if (ex.X_op != O_constant)
671 as_bad (_("constant value required"));
672
673 if (ex.X_add_number > max || ex.X_add_number < 0)
674 as_bad (_("number must be positive and less than %d"), max + 1);
675
676 return ex.X_add_number;
677 }
678
679 /* Parse for ldd/std offset. */
680
681 static void
682 avr_offset_expression (expressionS *exp)
683 {
684 char *str = input_line_pointer;
685 char *tmp;
686 char op[8];
687
688 tmp = str;
689 str = extract_word (str, op, sizeof (op));
690
691 input_line_pointer = tmp;
692 expression (exp);
693
694 /* Warn about expressions that fail to use lo8 (). */
695 if (exp->X_op == O_constant)
696 {
697 int x = exp->X_add_number;
698
699 if (x < -255 || x > 255)
700 as_warn (_("constant out of 8-bit range: %d"), x);
701 }
702 }
703
704 /* Parse ordinary expression. */
705
706 static char *
707 parse_exp (char *s, expressionS *op)
708 {
709 input_line_pointer = s;
710 expression (op);
711 if (op->X_op == O_absent)
712 as_bad (_("missing operand"));
713 return input_line_pointer;
714 }
715
716 /* Parse special expressions (needed for LDI command):
717 xx8 (address)
718 xx8 (-address)
719 pm_xx8 (address)
720 pm_xx8 (-address)
721 where xx is: hh, hi, lo. */
722
723 static bfd_reloc_code_real_type
724 avr_ldi_expression (expressionS *exp)
725 {
726 char *str = input_line_pointer;
727 char *tmp;
728 char op[8];
729 int mod;
730 int linker_stubs_should_be_generated = 0;
731
732 tmp = str;
733
734 str = extract_word (str, op, sizeof (op));
735
736 if (op[0])
737 {
738 mod_index m;
739
740 m.ptr = hash_find (avr_mod_hash, op);
741 mod = m.index;
742
743 if (mod)
744 {
745 int closes = 0;
746
747 mod -= 10;
748 str = skip_space (str);
749
750 if (*str == '(')
751 {
752 bfd_reloc_code_real_type reloc_to_return;
753 int neg_p = 0;
754
755 ++str;
756
757 if (strncmp ("pm(", str, 3) == 0
758 || strncmp ("gs(",str,3) == 0
759 || strncmp ("-(gs(",str,5) == 0
760 || strncmp ("-(pm(", str, 5) == 0)
761 {
762 if (HAVE_PM_P (mod))
763 {
764 ++mod;
765 ++closes;
766 }
767 else
768 as_bad (_("illegal expression"));
769
770 if (str[0] == 'g' || str[2] == 'g')
771 linker_stubs_should_be_generated = 1;
772
773 if (*str == '-')
774 {
775 neg_p = 1;
776 ++closes;
777 str += 5;
778 }
779 else
780 str += 3;
781 }
782
783 if (*str == '-' && *(str + 1) == '(')
784 {
785 neg_p ^= 1;
786 ++closes;
787 str += 2;
788 }
789
790 input_line_pointer = str;
791 expression (exp);
792
793 do
794 {
795 if (*input_line_pointer != ')')
796 {
797 as_bad (_("`)' required"));
798 break;
799 }
800 input_line_pointer++;
801 }
802 while (closes--);
803
804 reloc_to_return =
805 neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod);
806 if (linker_stubs_should_be_generated)
807 {
808 switch (reloc_to_return)
809 {
810 case BFD_RELOC_AVR_LO8_LDI_PM:
811 reloc_to_return = BFD_RELOC_AVR_LO8_LDI_GS;
812 break;
813 case BFD_RELOC_AVR_HI8_LDI_PM:
814 reloc_to_return = BFD_RELOC_AVR_HI8_LDI_GS;
815 break;
816
817 default:
818 /* PR 5523: Do not generate a warning here,
819 legitimate code can trigger this case. */
820 break;
821 }
822 }
823 return reloc_to_return;
824 }
825 }
826 }
827
828 input_line_pointer = tmp;
829 expression (exp);
830
831 /* Warn about expressions that fail to use lo8 (). */
832 if (exp->X_op == O_constant)
833 {
834 int x = exp->X_add_number;
835
836 if (x < -255 || x > 255)
837 as_warn (_("constant out of 8-bit range: %d"), x);
838 }
839
840 return BFD_RELOC_AVR_LDI;
841 }
842
843 /* Parse one instruction operand.
844 Return operand bitmask. Also fixups can be generated. */
845
846 static unsigned int
847 avr_operand (struct avr_opcodes_s *opcode,
848 int where,
849 char *op,
850 char **line)
851 {
852 expressionS op_expr;
853 unsigned int op_mask = 0;
854 char *str = skip_space (*line);
855
856 switch (*op)
857 {
858 /* Any register operand. */
859 case 'w':
860 case 'd':
861 case 'r':
862 case 'a':
863 case 'v':
864 if (*str == 'r' || *str == 'R')
865 {
866 char r_name[20];
867
868 str = extract_word (str, r_name, sizeof (r_name));
869 op_mask = 0xff;
870 if (ISDIGIT (r_name[1]))
871 {
872 if (r_name[2] == '\0')
873 op_mask = r_name[1] - '0';
874 else if (r_name[1] != '0'
875 && ISDIGIT (r_name[2])
876 && r_name[3] == '\0')
877 op_mask = (r_name[1] - '0') * 10 + r_name[2] - '0';
878 }
879 }
880 else
881 {
882 op_mask = avr_get_constant (str, 31);
883 str = input_line_pointer;
884 }
885
886 if (avr_mcu->mach == bfd_mach_avrtiny)
887 {
888 if (op_mask < 16 || op_mask > 31)
889 {
890 as_bad (_("register name or number from 16 to 31 required"));
891 break;
892 }
893 }
894 else if (op_mask > 31)
895 {
896 as_bad (_("register name or number from 0 to 31 required"));
897 break;
898 }
899
900 switch (*op)
901 {
902 case 'a':
903 if (op_mask < 16 || op_mask > 23)
904 as_bad (_("register r16-r23 required"));
905 op_mask -= 16;
906 break;
907
908 case 'd':
909 if (op_mask < 16)
910 as_bad (_("register number above 15 required"));
911 op_mask -= 16;
912 break;
913
914 case 'v':
915 if (op_mask & 1)
916 as_bad (_("even register number required"));
917 op_mask >>= 1;
918 break;
919
920 case 'w':
921 if ((op_mask & 1) || op_mask < 24)
922 as_bad (_("register r24, r26, r28 or r30 required"));
923 op_mask = (op_mask - 24) >> 1;
924 break;
925 }
926 break;
927
928 case 'e':
929 {
930 char c;
931
932 if (*str == '-')
933 {
934 str = skip_space (str + 1);
935 op_mask = 0x1002;
936 }
937 c = TOLOWER (*str);
938 if (c == 'x')
939 op_mask |= 0x100c;
940 else if (c == 'y')
941 op_mask |= 0x8;
942 else if (c != 'z')
943 as_bad (_("pointer register (X, Y or Z) required"));
944
945 str = skip_space (str + 1);
946 if (*str == '+')
947 {
948 ++str;
949 if (op_mask & 2)
950 as_bad (_("cannot both predecrement and postincrement"));
951 op_mask |= 0x1001;
952 }
953
954 /* avr1 can do "ld r,Z" and "st Z,r" but no other pointer
955 registers, no predecrement, no postincrement. */
956 if (!avr_opt.all_opcodes && (op_mask & 0x100F)
957 && !(avr_mcu->isa & AVR_ISA_SRAM))
958 as_bad (_("addressing mode not supported"));
959 }
960 break;
961
962 case 'z':
963 if (*str == '-')
964 as_bad (_("can't predecrement"));
965
966 if (! (*str == 'z' || *str == 'Z'))
967 as_bad (_("pointer register Z required"));
968
969 str = skip_space (str + 1);
970
971 if (*str == '+')
972 {
973 ++str;
974 char *s;
975 for (s = opcode->opcode; *s; ++s)
976 {
977 if (*s == '+')
978 op_mask |= (1 << (15 - (s - opcode->opcode)));
979 }
980 }
981
982 /* attiny26 can do "lpm" and "lpm r,Z" but not "lpm r,Z+". */
983 if (!avr_opt.all_opcodes
984 && (op_mask & 0x0001)
985 && !(avr_mcu->isa & AVR_ISA_MOVW))
986 as_bad (_("postincrement not supported"));
987 break;
988
989 case 'b':
990 {
991 char c = TOLOWER (*str++);
992
993 if (c == 'y')
994 op_mask |= 0x8;
995 else if (c != 'z')
996 as_bad (_("pointer register (Y or Z) required"));
997 str = skip_space (str);
998 if (*str++ == '+')
999 {
1000 input_line_pointer = str;
1001 avr_offset_expression (& op_expr);
1002 str = input_line_pointer;
1003 fix_new_exp (frag_now, where, 3,
1004 &op_expr, FALSE, BFD_RELOC_AVR_6);
1005 }
1006 }
1007 break;
1008
1009 case 'h':
1010 str = parse_exp (str, &op_expr);
1011 fix_new_exp (frag_now, where, opcode->insn_size * 2,
1012 &op_expr, FALSE, BFD_RELOC_AVR_CALL);
1013 break;
1014
1015 case 'L':
1016 str = parse_exp (str, &op_expr);
1017 fix_new_exp (frag_now, where, opcode->insn_size * 2,
1018 &op_expr, TRUE, BFD_RELOC_AVR_13_PCREL);
1019 break;
1020
1021 case 'l':
1022 str = parse_exp (str, &op_expr);
1023 fix_new_exp (frag_now, where, opcode->insn_size * 2,
1024 &op_expr, TRUE, BFD_RELOC_AVR_7_PCREL);
1025 break;
1026
1027 case 'i':
1028 str = parse_exp (str, &op_expr);
1029 fix_new_exp (frag_now, where + 2, opcode->insn_size * 2,
1030 &op_expr, FALSE, BFD_RELOC_16);
1031 break;
1032
1033 case 'j':
1034 str = parse_exp (str, &op_expr);
1035 fix_new_exp (frag_now, where, opcode->insn_size * 2,
1036 &op_expr, FALSE, BFD_RELOC_AVR_LDS_STS_16);
1037 break;
1038
1039 case 'M':
1040 {
1041 bfd_reloc_code_real_type r_type;
1042
1043 input_line_pointer = str;
1044 r_type = avr_ldi_expression (&op_expr);
1045 str = input_line_pointer;
1046 fix_new_exp (frag_now, where, 3,
1047 &op_expr, FALSE, r_type);
1048 }
1049 break;
1050
1051 case 'n':
1052 {
1053 unsigned int x;
1054
1055 x = ~avr_get_constant (str, 255);
1056 str = input_line_pointer;
1057 op_mask |= (x & 0xf) | ((x << 4) & 0xf00);
1058 }
1059 break;
1060
1061 case 'K':
1062 input_line_pointer = str;
1063 avr_offset_expression (& op_expr);
1064 str = input_line_pointer;
1065 fix_new_exp (frag_now, where, 3,
1066 & op_expr, FALSE, BFD_RELOC_AVR_6_ADIW);
1067 break;
1068
1069 case 'S':
1070 case 's':
1071 {
1072 unsigned int x;
1073
1074 x = avr_get_constant (str, 7);
1075 str = input_line_pointer;
1076 if (*op == 'S')
1077 x <<= 4;
1078 op_mask |= x;
1079 }
1080 break;
1081
1082 case 'P':
1083 {
1084 unsigned int x;
1085
1086 x = avr_get_constant (str, 63);
1087 str = input_line_pointer;
1088 op_mask |= (x & 0xf) | ((x & 0x30) << 5);
1089 }
1090 break;
1091
1092 case 'p':
1093 {
1094 unsigned int x;
1095
1096 x = avr_get_constant (str, 31);
1097 str = input_line_pointer;
1098 op_mask |= x << 3;
1099 }
1100 break;
1101
1102 case 'E':
1103 {
1104 unsigned int x;
1105
1106 x = avr_get_constant (str, 15);
1107 str = input_line_pointer;
1108 op_mask |= (x << 4);
1109 }
1110 break;
1111
1112 case '?':
1113 break;
1114
1115 default:
1116 as_bad (_("unknown constraint `%c'"), *op);
1117 }
1118
1119 *line = str;
1120 return op_mask;
1121 }
1122
1123 /* Parse instruction operands.
1124 Return binary opcode. */
1125
1126 static unsigned int
1127 avr_operands (struct avr_opcodes_s *opcode, char **line)
1128 {
1129 char *op = opcode->constraints;
1130 unsigned int bin = opcode->bin_opcode;
1131 char *frag = frag_more (opcode->insn_size * 2);
1132 char *str = *line;
1133 int where = frag - frag_now->fr_literal;
1134 static unsigned int prev = 0; /* Previous opcode. */
1135
1136 /* Opcode have operands. */
1137 if (*op)
1138 {
1139 unsigned int reg1 = 0;
1140 unsigned int reg2 = 0;
1141 int reg1_present = 0;
1142 int reg2_present = 0;
1143
1144 /* Parse first operand. */
1145 if (REGISTER_P (*op))
1146 reg1_present = 1;
1147 reg1 = avr_operand (opcode, where, op, &str);
1148 ++op;
1149
1150 /* Parse second operand. */
1151 if (*op)
1152 {
1153 if (*op == ',')
1154 ++op;
1155
1156 if (*op == '=')
1157 {
1158 reg2 = reg1;
1159 reg2_present = 1;
1160 }
1161 else
1162 {
1163 if (REGISTER_P (*op))
1164 reg2_present = 1;
1165
1166 str = skip_space (str);
1167 if (*str++ != ',')
1168 as_bad (_("`,' required"));
1169 str = skip_space (str);
1170
1171 reg2 = avr_operand (opcode, where, op, &str);
1172 }
1173
1174 if (reg1_present && reg2_present)
1175 reg2 = (reg2 & 0xf) | ((reg2 << 5) & 0x200);
1176 else if (reg2_present)
1177 reg2 <<= 4;
1178 }
1179 if (reg1_present)
1180 reg1 <<= 4;
1181 bin |= reg1 | reg2;
1182 }
1183
1184 /* Detect undefined combinations (like ld r31,Z+). */
1185 if (!avr_opt.all_opcodes && AVR_UNDEF_P (bin))
1186 as_warn (_("undefined combination of operands"));
1187
1188 if (opcode->insn_size == 2)
1189 {
1190 /* Warn if the previous opcode was cpse/sbic/sbis/sbrc/sbrs
1191 (AVR core bug, fixed in the newer devices). */
1192 if (!(avr_opt.no_skip_bug ||
1193 (avr_mcu->isa & (AVR_ISA_MUL | AVR_ISA_MOVW)))
1194 && AVR_SKIP_P (prev))
1195 as_warn (_("skipping two-word instruction"));
1196
1197 bfd_putl32 ((bfd_vma) bin, frag);
1198 }
1199 else
1200 bfd_putl16 ((bfd_vma) bin, frag);
1201
1202 prev = bin;
1203 *line = str;
1204 return bin;
1205 }
1206
1207 /* GAS will call this function for each section at the end of the assembly,
1208 to permit the CPU backend to adjust the alignment of a section. */
1209
1210 valueT
1211 md_section_align (asection *seg, valueT addr)
1212 {
1213 int align = bfd_get_section_alignment (stdoutput, seg);
1214 return ((addr + (1 << align) - 1) & (-1 << align));
1215 }
1216
1217 /* If you define this macro, it should return the offset between the
1218 address of a PC relative fixup and the position from which the PC
1219 relative adjustment should be made. On many processors, the base
1220 of a PC relative instruction is the next instruction, so this
1221 macro would return the length of an instruction. */
1222
1223 long
1224 md_pcrel_from_section (fixS *fixp, segT sec)
1225 {
1226 if (fixp->fx_addsy != (symbolS *) NULL
1227 && (!S_IS_DEFINED (fixp->fx_addsy)
1228 || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1229 return 0;
1230
1231 return fixp->fx_frag->fr_address + fixp->fx_where;
1232 }
1233
1234 static bfd_boolean
1235 relaxable_section (asection *sec)
1236 {
1237 return (sec->flags & SEC_DEBUGGING) == 0;
1238 }
1239
1240 /* Does whatever the xtensa port does. */
1241 int
1242 avr_validate_fix_sub (fixS *fix)
1243 {
1244 segT add_symbol_segment, sub_symbol_segment;
1245
1246 /* The difference of two symbols should be resolved by the assembler when
1247 linkrelax is not set. If the linker may relax the section containing
1248 the symbols, then an Xtensa DIFF relocation must be generated so that
1249 the linker knows to adjust the difference value. */
1250 if (!linkrelax || fix->fx_addsy == NULL)
1251 return 0;
1252
1253 /* Make sure both symbols are in the same segment, and that segment is
1254 "normal" and relaxable. If the segment is not "normal", then the
1255 fix is not valid. If the segment is not "relaxable", then the fix
1256 should have been handled earlier. */
1257 add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
1258 if (! SEG_NORMAL (add_symbol_segment) ||
1259 ! relaxable_section (add_symbol_segment))
1260 return 0;
1261
1262 sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
1263 return (sub_symbol_segment == add_symbol_segment);
1264 }
1265
1266 /* TC_FORCE_RELOCATION hook */
1267
1268 /* If linkrelax is turned on, and the symbol to relocate
1269 against is in a relaxable segment, don't compute the value -
1270 generate a relocation instead. */
1271 int
1272 avr_force_relocation (fixS *fix)
1273 {
1274 if (linkrelax && fix->fx_addsy
1275 && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
1276 return 1;
1277
1278 return generic_force_reloc (fix);
1279 }
1280
1281 /* GAS will call this for each fixup. It should store the correct
1282 value in the object file. */
1283
1284 void
1285 md_apply_fix (fixS *fixP, valueT * valP, segT seg)
1286 {
1287 unsigned char *where;
1288 unsigned long insn;
1289 long value = *valP;
1290
1291 if (fixP->fx_addsy == (symbolS *) NULL)
1292 fixP->fx_done = 1;
1293
1294 else if (fixP->fx_pcrel)
1295 {
1296 segT s = S_GET_SEGMENT (fixP->fx_addsy);
1297
1298 if (s == seg || s == absolute_section)
1299 {
1300 value += S_GET_VALUE (fixP->fx_addsy);
1301 fixP->fx_done = 1;
1302 }
1303 }
1304 else if (linkrelax && fixP->fx_subsy)
1305 {
1306 /* For a subtraction relocation expression, generate one
1307 of the DIFF relocs, with the value being the difference.
1308 Note that a sym1 - sym2 expression is adjusted into a
1309 section_start_sym + sym4_offset_from_section_start - sym1
1310 expression. fixP->fx_addsy holds the section start symbol,
1311 fixP->fx_offset holds sym2's offset, and fixP->fx_subsy
1312 holds sym1. Calculate the current difference and write value,
1313 but leave fx_offset as is - during relaxation,
1314 fx_offset - value gives sym1's value */
1315
1316 switch (fixP->fx_r_type)
1317 {
1318 case BFD_RELOC_8:
1319 fixP->fx_r_type = BFD_RELOC_AVR_DIFF8;
1320 break;
1321 case BFD_RELOC_16:
1322 fixP->fx_r_type = BFD_RELOC_AVR_DIFF16;
1323 break;
1324 case BFD_RELOC_32:
1325 fixP->fx_r_type = BFD_RELOC_AVR_DIFF32;
1326 break;
1327 default:
1328 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1329 break;
1330 }
1331
1332 value = S_GET_VALUE (fixP->fx_addsy) +
1333 fixP->fx_offset - S_GET_VALUE (fixP->fx_subsy);
1334
1335 fixP->fx_subsy = NULL;
1336 }
1337 /* We don't actually support subtracting a symbol. */
1338 if (fixP->fx_subsy != (symbolS *) NULL)
1339 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1340
1341 /* For the DIFF relocs, write the value into the object file while still
1342 keeping fx_done FALSE, as both the difference (recorded in the object file)
1343 and the sym offset (part of fixP) are needed at link relax time */
1344 where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
1345 switch (fixP->fx_r_type)
1346 {
1347 default:
1348 fixP->fx_no_overflow = 1;
1349 break;
1350 case BFD_RELOC_AVR_7_PCREL:
1351 case BFD_RELOC_AVR_13_PCREL:
1352 case BFD_RELOC_32:
1353 case BFD_RELOC_16:
1354 break;
1355 case BFD_RELOC_AVR_DIFF8:
1356 *where = value;
1357 break;
1358 case BFD_RELOC_AVR_DIFF16:
1359 bfd_putl16 ((bfd_vma) value, where);
1360 break;
1361 case BFD_RELOC_AVR_DIFF32:
1362 bfd_putl32 ((bfd_vma) value, where);
1363 break;
1364 case BFD_RELOC_AVR_CALL:
1365 break;
1366 }
1367
1368 if (fixP->fx_done)
1369 {
1370 /* Fetch the instruction, insert the fully resolved operand
1371 value, and stuff the instruction back again. */
1372 where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
1373 insn = bfd_getl16 (where);
1374
1375 switch (fixP->fx_r_type)
1376 {
1377 case BFD_RELOC_AVR_7_PCREL:
1378 if (value & 1)
1379 as_bad_where (fixP->fx_file, fixP->fx_line,
1380 _("odd address operand: %ld"), value);
1381
1382 /* Instruction addresses are always right-shifted by 1. */
1383 value >>= 1;
1384 --value; /* Correct PC. */
1385
1386 if (value < -64 || value > 63)
1387 as_bad_where (fixP->fx_file, fixP->fx_line,
1388 _("operand out of range: %ld"), value);
1389 value = (value << 3) & 0x3f8;
1390 bfd_putl16 ((bfd_vma) (value | insn), where);
1391 break;
1392
1393 case BFD_RELOC_AVR_13_PCREL:
1394 if (value & 1)
1395 as_bad_where (fixP->fx_file, fixP->fx_line,
1396 _("odd address operand: %ld"), value);
1397
1398 /* Instruction addresses are always right-shifted by 1. */
1399 value >>= 1;
1400 --value; /* Correct PC. */
1401
1402 if (value < -2048 || value > 2047)
1403 {
1404 /* No wrap for devices with >8K of program memory. */
1405 if ((avr_mcu->isa & AVR_ISA_MEGA) || avr_opt.no_wrap)
1406 as_bad_where (fixP->fx_file, fixP->fx_line,
1407 _("operand out of range: %ld"), value);
1408 }
1409
1410 value &= 0xfff;
1411 bfd_putl16 ((bfd_vma) (value | insn), where);
1412 break;
1413
1414 case BFD_RELOC_32:
1415 bfd_putl32 ((bfd_vma) value, where);
1416 break;
1417
1418 case BFD_RELOC_16:
1419 bfd_putl16 ((bfd_vma) value, where);
1420 break;
1421
1422 case BFD_RELOC_8:
1423 if (value > 255 || value < -128)
1424 as_warn_where (fixP->fx_file, fixP->fx_line,
1425 _("operand out of range: %ld"), value);
1426 *where = value;
1427 break;
1428
1429 case BFD_RELOC_AVR_16_PM:
1430 bfd_putl16 ((bfd_vma) (value >> 1), where);
1431 break;
1432
1433 case BFD_RELOC_AVR_LDI:
1434 if (value > 255)
1435 as_bad_where (fixP->fx_file, fixP->fx_line,
1436 _("operand out of range: %ld"), value);
1437 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
1438 break;
1439
1440 case BFD_RELOC_AVR_LDS_STS_16:
1441 if ((value < 0x40) || (value > 0xBF))
1442 as_warn_where (fixP->fx_file, fixP->fx_line,
1443 _("operand out of range: 0x%lx"),
1444 (unsigned long)value);
1445 insn |= ((value & 0xF) | ((value & 0x30) << 5) | ((value & 0x40) << 2));
1446 bfd_putl16 ((bfd_vma) insn, where);
1447 break;
1448
1449 case BFD_RELOC_AVR_6:
1450 if ((value > 63) || (value < 0))
1451 as_bad_where (fixP->fx_file, fixP->fx_line,
1452 _("operand out of range: %ld"), value);
1453 bfd_putl16 ((bfd_vma) insn | ((value & 7) | ((value & (3 << 3)) << 7)
1454 | ((value & (1 << 5)) << 8)), where);
1455 break;
1456
1457 case BFD_RELOC_AVR_6_ADIW:
1458 if ((value > 63) || (value < 0))
1459 as_bad_where (fixP->fx_file, fixP->fx_line,
1460 _("operand out of range: %ld"), value);
1461 bfd_putl16 ((bfd_vma) insn | (value & 0xf) | ((value & 0x30) << 2), where);
1462 break;
1463
1464 case BFD_RELOC_AVR_LO8_LDI:
1465 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
1466 break;
1467
1468 case BFD_RELOC_AVR_HI8_LDI:
1469 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 8), where);
1470 break;
1471
1472 case BFD_RELOC_AVR_MS8_LDI:
1473 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 24), where);
1474 break;
1475
1476 case BFD_RELOC_AVR_HH8_LDI:
1477 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 16), where);
1478 break;
1479
1480 case BFD_RELOC_AVR_LO8_LDI_NEG:
1481 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value), where);
1482 break;
1483
1484 case BFD_RELOC_AVR_HI8_LDI_NEG:
1485 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 8), where);
1486 break;
1487
1488 case BFD_RELOC_AVR_MS8_LDI_NEG:
1489 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 24), where);
1490 break;
1491
1492 case BFD_RELOC_AVR_HH8_LDI_NEG:
1493 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 16), where);
1494 break;
1495
1496 case BFD_RELOC_AVR_LO8_LDI_PM:
1497 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 1), where);
1498 break;
1499
1500 case BFD_RELOC_AVR_HI8_LDI_PM:
1501 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 9), where);
1502 break;
1503
1504 case BFD_RELOC_AVR_HH8_LDI_PM:
1505 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 17), where);
1506 break;
1507
1508 case BFD_RELOC_AVR_LO8_LDI_PM_NEG:
1509 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 1), where);
1510 break;
1511
1512 case BFD_RELOC_AVR_HI8_LDI_PM_NEG:
1513 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 9), where);
1514 break;
1515
1516 case BFD_RELOC_AVR_HH8_LDI_PM_NEG:
1517 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 17), where);
1518 break;
1519
1520 case BFD_RELOC_AVR_CALL:
1521 {
1522 unsigned long x;
1523
1524 x = bfd_getl16 (where);
1525 if (value & 1)
1526 as_bad_where (fixP->fx_file, fixP->fx_line,
1527 _("odd address operand: %ld"), value);
1528 value >>= 1;
1529 x |= ((value & 0x10000) | ((value << 3) & 0x1f00000)) >> 16;
1530 bfd_putl16 ((bfd_vma) x, where);
1531 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2);
1532 }
1533 break;
1534
1535 case BFD_RELOC_AVR_8_LO:
1536 *where = 0xff & value;
1537 break;
1538
1539 case BFD_RELOC_AVR_8_HI:
1540 *where = 0xff & (value >> 8);
1541 break;
1542
1543 case BFD_RELOC_AVR_8_HLO:
1544 *where = 0xff & (value >> 16);
1545 break;
1546
1547 default:
1548 as_fatal (_("line %d: unknown relocation type: 0x%x"),
1549 fixP->fx_line, fixP->fx_r_type);
1550 break;
1551 }
1552 }
1553 else
1554 {
1555 switch ((int) fixP->fx_r_type)
1556 {
1557 case -BFD_RELOC_AVR_HI8_LDI_NEG:
1558 case -BFD_RELOC_AVR_HI8_LDI:
1559 case -BFD_RELOC_AVR_LO8_LDI_NEG:
1560 case -BFD_RELOC_AVR_LO8_LDI:
1561 as_bad_where (fixP->fx_file, fixP->fx_line,
1562 _("only constant expression allowed"));
1563 fixP->fx_done = 1;
1564 break;
1565 default:
1566 break;
1567 }
1568 }
1569 }
1570
1571 /* GAS will call this to generate a reloc, passing the resulting reloc
1572 to `bfd_install_relocation'. This currently works poorly, as
1573 `bfd_install_relocation' often does the wrong thing, and instances of
1574 `tc_gen_reloc' have been written to work around the problems, which
1575 in turns makes it difficult to fix `bfd_install_relocation'. */
1576
1577 /* If while processing a fixup, a reloc really needs to be created
1578 then it is done here. */
1579
1580 arelent *
1581 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED,
1582 fixS *fixp)
1583 {
1584 arelent *reloc;
1585
1586 if (fixp->fx_subsy != NULL)
1587 {
1588 as_bad_where (fixp->fx_file, fixp->fx_line, _("expression too complex"));
1589 return NULL;
1590 }
1591
1592 reloc = xmalloc (sizeof (arelent));
1593
1594 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1595 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1596
1597 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1598 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1599 if (reloc->howto == (reloc_howto_type *) NULL)
1600 {
1601 as_bad_where (fixp->fx_file, fixp->fx_line,
1602 _("reloc %d not supported by object file format"),
1603 (int) fixp->fx_r_type);
1604 return NULL;
1605 }
1606
1607 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1608 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1609 reloc->address = fixp->fx_offset;
1610
1611 reloc->addend = fixp->fx_offset;
1612
1613 return reloc;
1614 }
1615
1616 void
1617 md_assemble (char *str)
1618 {
1619 struct avr_opcodes_s *opcode;
1620 char op[11];
1621
1622 str = skip_space (extract_word (str, op, sizeof (op)));
1623
1624 if (!op[0])
1625 as_bad (_("can't find opcode "));
1626
1627 opcode = (struct avr_opcodes_s *) hash_find (avr_hash, op);
1628
1629 if (opcode && !avr_opt.all_opcodes)
1630 {
1631 /* Check if the instruction's ISA bit is ON in the ISA bits of the part
1632 specified by the user. If not look for other instructions
1633 specifications with same mnemonic who's ISA bits matches.
1634
1635 This requires include/opcode/avr.h to have the instructions with
1636 same mnenomic to be specified in sequence. */
1637
1638 while ((opcode->isa & avr_mcu->isa) != opcode->isa)
1639 {
1640 opcode++;
1641
1642 if (opcode->name && strcmp(op, opcode->name))
1643 {
1644 as_bad (_("illegal opcode %s for mcu %s"),
1645 opcode->name, avr_mcu->name);
1646 return;
1647 }
1648 }
1649 }
1650
1651 if (opcode == NULL)
1652 {
1653 as_bad (_("unknown opcode `%s'"), op);
1654 return;
1655 }
1656
1657 /* Special case for opcodes with optional operands (lpm, elpm) -
1658 version with operands exists in avr_opcodes[] in the next entry. */
1659
1660 if (*str && *opcode->constraints == '?')
1661 ++opcode;
1662
1663 dwarf2_emit_insn (0);
1664
1665 /* We used to set input_line_pointer to the result of get_operands,
1666 but that is wrong. Our caller assumes we don't change it. */
1667 {
1668 char *t = input_line_pointer;
1669
1670 avr_operands (opcode, &str);
1671 if (*skip_space (str))
1672 as_bad (_("garbage at end of line"));
1673 input_line_pointer = t;
1674 }
1675 }
1676
1677 const exp_mod_data_t exp_mod_data[] =
1678 {
1679 /* Default, must be first. */
1680 { "", 0, BFD_RELOC_16, "" },
1681 /* Divides by 2 to get word address. Generate Stub. */
1682 { "gs", 2, BFD_RELOC_AVR_16_PM, "`gs' " },
1683 { "pm", 2, BFD_RELOC_AVR_16_PM, "`pm' " },
1684 /* The following are used together with avr-gcc's __memx address space
1685 in order to initialize a 24-bit pointer variable with a 24-bit address.
1686 For address in flash, hlo8 will contain the flash segment if the
1687 symbol is located in flash. If the symbol is located in RAM; hlo8
1688 will contain 0x80 which matches avr-gcc's notion of how 24-bit RAM/flash
1689 addresses linearize address space. */
1690 { "lo8", 1, BFD_RELOC_AVR_8_LO, "`lo8' " },
1691 { "hi8", 1, BFD_RELOC_AVR_8_HI, "`hi8' " },
1692 { "hlo8", 1, BFD_RELOC_AVR_8_HLO, "`hlo8' " },
1693 { "hh8", 1, BFD_RELOC_AVR_8_HLO, "`hh8' " },
1694 /* End of list. */
1695 { NULL, 0, 0, NULL }
1696 };
1697
1698 /* Parse special CONS expression: pm (expression) or alternatively
1699 gs (expression). These are used for addressing program memory. Moreover,
1700 define lo8 (expression), hi8 (expression) and hlo8 (expression). */
1701
1702 const exp_mod_data_t *
1703 avr_parse_cons_expression (expressionS *exp, int nbytes)
1704 {
1705 const exp_mod_data_t *pexp = &exp_mod_data[0];
1706 char *tmp;
1707
1708 tmp = input_line_pointer = skip_space (input_line_pointer);
1709
1710 /* The first entry of exp_mod_data[] contains an entry if no
1711 expression modifier is present. Skip it. */
1712
1713 for (pexp++; pexp->name; pexp++)
1714 {
1715 int len = strlen (pexp->name);
1716
1717 if (nbytes == pexp->nbytes
1718 && strncasecmp (input_line_pointer, pexp->name, len) == 0)
1719 {
1720 input_line_pointer = skip_space (input_line_pointer + len);
1721
1722 if (*input_line_pointer == '(')
1723 {
1724 input_line_pointer = skip_space (input_line_pointer + 1);
1725 expression (exp);
1726
1727 if (*input_line_pointer == ')')
1728 {
1729 ++input_line_pointer;
1730 return pexp;
1731 }
1732 else
1733 {
1734 as_bad (_("`)' required"));
1735 return &exp_mod_data[0];
1736 }
1737 }
1738
1739 input_line_pointer = tmp;
1740
1741 break;
1742 }
1743 }
1744
1745 expression (exp);
1746 return &exp_mod_data[0];
1747 }
1748
1749 void
1750 avr_cons_fix_new (fragS *frag,
1751 int where,
1752 int nbytes,
1753 expressionS *exp,
1754 const exp_mod_data_t *pexp_mod_data)
1755 {
1756 int bad = 0;
1757
1758 switch (pexp_mod_data->reloc)
1759 {
1760 default:
1761 if (nbytes == 1)
1762 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_8);
1763 else if (nbytes == 2)
1764 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_16);
1765 else if (nbytes == 4)
1766 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_32);
1767 else
1768 bad = 1;
1769 break;
1770
1771 case BFD_RELOC_AVR_16_PM:
1772 case BFD_RELOC_AVR_8_LO:
1773 case BFD_RELOC_AVR_8_HI:
1774 case BFD_RELOC_AVR_8_HLO:
1775 if (nbytes == pexp_mod_data->nbytes)
1776 fix_new_exp (frag, where, nbytes, exp, FALSE, pexp_mod_data->reloc);
1777 else
1778 bad = 1;
1779 break;
1780 }
1781
1782 if (bad)
1783 as_bad (_("illegal %srelocation size: %d"), pexp_mod_data->error, nbytes);
1784 }
1785
1786 static bfd_boolean
1787 mcu_has_3_byte_pc (void)
1788 {
1789 int mach = avr_mcu->mach;
1790
1791 return mach == bfd_mach_avr6
1792 || mach == bfd_mach_avrxmega6
1793 || mach == bfd_mach_avrxmega7;
1794 }
1795
1796 void
1797 tc_cfi_frame_initial_instructions (void)
1798 {
1799 /* AVR6 pushes 3 bytes for calls. */
1800 int return_size = (mcu_has_3_byte_pc () ? 3 : 2);
1801
1802 /* The CFA is the caller's stack location before the call insn. */
1803 /* Note that the stack pointer is dwarf register number 32. */
1804 cfi_add_CFA_def_cfa (32, return_size);
1805
1806 /* Note that AVR consistently uses post-decrement, which means that things
1807 do not line up the same way as for targers that use pre-decrement. */
1808 cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, 1-return_size);
1809 }
1810
1811 bfd_boolean
1812 avr_allow_local_subtract (expressionS * left,
1813 expressionS * right,
1814 segT section)
1815 {
1816 /* If we are not in relaxation mode, subtraction is OK. */
1817 if (!linkrelax)
1818 return TRUE;
1819
1820 /* If the symbols are not in a code section then they are OK. */
1821 if ((section->flags & SEC_CODE) == 0)
1822 return TRUE;
1823
1824 if (left->X_add_symbol == right->X_add_symbol)
1825 return TRUE;
1826
1827 /* We have to assume that there may be instructions between the
1828 two symbols and that relaxation may increase the distance between
1829 them. */
1830 return FALSE;
1831 }
This page took 0.069694 seconds and 4 git commands to generate.