1 /* tc-avr.c -- Assembler code for the ATMEL AVR
3 Copyright (C) 1999-2017 Free Software Foundation, Inc.
4 Contributed by Denis Chertykov <denisc@overta.ru>
6 This file is part of GAS, the GNU Assembler.
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)
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.
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. */
24 #include "safe-ctype.h"
26 #include "struc-symbol.h"
27 #include "dwarf2dbg.h"
28 #include "dw2gencfi.h"
30 #include "elf32-avr.h"
32 /* For building a linked list of AVR_PROPERTY_RECORD structures. */
33 struct avr_property_record_link
35 struct avr_property_record record;
36 struct avr_property_record_link *next;
42 const char * constraints;
44 int insn_size; /* In words. */
46 unsigned int bin_opcode;
49 #define AVR_INSN(NAME, CONSTR, OPCODE, SIZE, ISA, BIN) \
50 {#NAME, CONSTR, OPCODE, SIZE, ISA, BIN},
52 struct avr_opcodes_s avr_opcodes[] =
54 #include "opcode/avr.h"
55 {NULL, NULL, NULL, 0, 0, 0}
59 /* Stuff for the `__gcc_isr' pseudo instruction.
61 Purpose of the pseudo instruction is to emit more efficient ISR prologues
62 and epilogues than GCC currently does. GCC has no explicit (on RTL level)
63 modelling of SREG, TMP_REG or ZERO_REG. These regs are used implicitly
64 during instruction printing. That doesn't hurt too much for ordinary
65 functions, however for small ISRs there might be some overhead.
67 As implementing http://gcc.gnu.org/PR20296 would imply an almost complete
68 rewite of GCC's AVR back-end (which might pop up less optimized code in
69 other places), we provide a pseudo-instruction which is resolved by GAS
70 into ISR prologue / epilogue as expected by GCC.
72 Using GAS for this purpose has the additional benefit that it can scan
73 code emit by inline asm which is opaque to GCC.
75 The pseudo-instruction is only supposed to handle the starting of
76 prologue and the ending of epilogues (without RETI) which deal with
77 SREG, TMP_REG and ZERO_REG and one additional, optional general purpose
80 __gcc_isr consists of 3 different "chunks":
83 Chunk 1 (ISR_CHUNK_Prologue)
84 Start the ISR code. Will be replaced by ISR prologue by next Done chunk.
85 Must be the 1st chunk in a file or follow a Done chunk from previous
86 ISR (which has been patched already).
88 It will finish the current frag and emit a new frag of
89 type rs_machine_dependent, subtype ISR_CHUNK_Prologue.
92 Chunk 2 (ISR_CHUNK_Epilogue)
93 Will be replaced by ISR epilogue by next Done chunk. Must follow
94 chunk 1 (Prologue) or chunk 2 (Epilogue). Functions might come
95 without epilogue or with more than one epilogue, and even code
96 located statically after the last epilogue might belong to a function.
98 It will finish the current frag and emit a new frag of
99 type rs_machine_dependent, subtype ISR_CHUNK_Epilogue.
102 Chunk 0 (ISR_CHUNK_Done)
103 Must follow chunk 1 (Prologue) or chunk 2 (Epilogue) and finishes
104 the ISR code. Only GCC can know where a function's code ends.
106 It triggers the patch-up of all rs_machine_dependent frags in the
107 current frag chain and turns them into ordinary rs_fill code frags.
109 If Rx is a register > ZERO_REG then GCC also wants to push / pop Rx.
110 If neither TMP_REG nor ZERO_REG are needed, Rx will be used in
111 the push / pop sequence avoiding the need for TMP_REG / ZERO_REG.
112 If Rx <= ZERO_REG then GCC doesn't assume anything about Rx.
116 o GCC takes care of code that is opaque to GAS like tail calls
119 o Using SEI / CLI does not count as clobbering SREG. This is
120 because a final RETI will restore the I-flag.
122 o Using OUT or ST* is supposed not to clobber SREG. Sequences like
124 IN-SREG + CLI + Atomic-Code + OUT-SREG
126 will still work as expected because the scan will reveal any
127 clobber of SREG other than I-flag and emit PUSH / POP of SREG.
133 ISR_CHUNK_Prologue = 1,
134 ISR_CHUNK_Epilogue = 2
139 /* Previous __gcc_isr chunk (one of the enums above)
140 and it's location for diagnostics. */
144 /* Replacer for __gcc_isr.n_pushed once we know how many regs are
145 pushed by the Prologue chunk. */
146 symbolS *sym_n_pushed;
148 /* Set and used during parse from chunk 1 (Prologue) up to chunk 0 (Done).
149 Set by `avr_update_gccisr' and used by `avr_patch_gccisr_frag'. */
155 static void avr_gccisr_operands (struct avr_opcodes_s*, char**);
156 static void avr_update_gccisr (struct avr_opcodes_s*, int, int);
157 static struct avr_opcodes_s *avr_gccisr_opcode;
159 const char comment_chars[] = ";";
160 const char line_comment_chars[] = "#";
161 const char line_separator_chars[] = "$";
163 const char *md_shortopts = "m:";
171 /* XXX - devices that don't seem to exist (renamed, replaced with larger
172 ones, or planned but never produced), left here for compatibility. */
174 static struct mcu_type_s mcu_types[] =
176 {"avr1", AVR_ISA_AVR1, bfd_mach_avr1},
177 /* TODO: instruction set for avr2 architecture should be AVR_ISA_AVR2,
178 but set to AVR_ISA_AVR25 for some following version
179 of GCC (from 4.3) for backward compatibility. */
180 {"avr2", AVR_ISA_AVR25, bfd_mach_avr2},
181 {"avr25", AVR_ISA_AVR25, bfd_mach_avr25},
182 /* TODO: instruction set for avr3 architecture should be AVR_ISA_AVR3,
183 but set to AVR_ISA_AVR3_ALL for some following version
184 of GCC (from 4.3) for backward compatibility. */
185 {"avr3", AVR_ISA_AVR3_ALL, bfd_mach_avr3},
186 {"avr31", AVR_ISA_AVR31, bfd_mach_avr31},
187 {"avr35", AVR_ISA_AVR35, bfd_mach_avr35},
188 {"avr4", AVR_ISA_AVR4, bfd_mach_avr4},
189 /* TODO: instruction set for avr5 architecture should be AVR_ISA_AVR5,
190 but set to AVR_ISA_AVR51 for some following version
191 of GCC (from 4.3) for backward compatibility. */
192 {"avr5", AVR_ISA_AVR51, bfd_mach_avr5},
193 {"avr51", AVR_ISA_AVR51, bfd_mach_avr51},
194 {"avr6", AVR_ISA_AVR6, bfd_mach_avr6},
195 {"avrxmega1", AVR_ISA_XMEGA, bfd_mach_avrxmega1},
196 {"avrxmega2", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
197 {"avrxmega3", AVR_ISA_XMEGA, bfd_mach_avrxmega3},
198 {"avrxmega4", AVR_ISA_XMEGA, bfd_mach_avrxmega4},
199 {"avrxmega5", AVR_ISA_XMEGA, bfd_mach_avrxmega5},
200 {"avrxmega6", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
201 {"avrxmega7", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
202 {"avrtiny", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
203 {"at90s1200", AVR_ISA_1200, bfd_mach_avr1},
204 {"attiny11", AVR_ISA_AVR1, bfd_mach_avr1},
205 {"attiny12", AVR_ISA_AVR1, bfd_mach_avr1},
206 {"attiny15", AVR_ISA_AVR1, bfd_mach_avr1},
207 {"attiny28", AVR_ISA_AVR1, bfd_mach_avr1},
208 {"at90s2313", AVR_ISA_AVR2, bfd_mach_avr2},
209 {"at90s2323", AVR_ISA_AVR2, bfd_mach_avr2},
210 {"at90s2333", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 4433 */
211 {"at90s2343", AVR_ISA_AVR2, bfd_mach_avr2},
212 {"attiny22", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 2343 */
213 {"attiny26", AVR_ISA_2xxe, bfd_mach_avr2},
214 {"at90s4414", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 8515 */
215 {"at90s4433", AVR_ISA_AVR2, bfd_mach_avr2},
216 {"at90s4434", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 8535 */
217 {"at90s8515", AVR_ISA_AVR2, bfd_mach_avr2},
218 {"at90c8534", AVR_ISA_AVR2, bfd_mach_avr2},
219 {"at90s8535", AVR_ISA_AVR2, bfd_mach_avr2},
220 {"ata5272", AVR_ISA_AVR25, bfd_mach_avr25},
221 {"attiny13", AVR_ISA_AVR25, bfd_mach_avr25},
222 {"attiny13a", AVR_ISA_AVR25, bfd_mach_avr25},
223 {"attiny2313", AVR_ISA_AVR25, bfd_mach_avr25},
224 {"attiny2313a",AVR_ISA_AVR25, bfd_mach_avr25},
225 {"attiny24", AVR_ISA_AVR25, bfd_mach_avr25},
226 {"attiny24a", AVR_ISA_AVR25, bfd_mach_avr25},
227 {"attiny4313", AVR_ISA_AVR25, bfd_mach_avr25},
228 {"attiny44", AVR_ISA_AVR25, bfd_mach_avr25},
229 {"attiny44a", AVR_ISA_AVR25, bfd_mach_avr25},
230 {"attiny84", AVR_ISA_AVR25, bfd_mach_avr25},
231 {"attiny84a", AVR_ISA_AVR25, bfd_mach_avr25},
232 {"attiny25", AVR_ISA_AVR25, bfd_mach_avr25},
233 {"attiny45", AVR_ISA_AVR25, bfd_mach_avr25},
234 {"attiny85", AVR_ISA_AVR25, bfd_mach_avr25},
235 {"attiny261", AVR_ISA_AVR25, bfd_mach_avr25},
236 {"attiny261a", AVR_ISA_AVR25, bfd_mach_avr25},
237 {"attiny461", AVR_ISA_AVR25, bfd_mach_avr25},
238 {"attiny461a", AVR_ISA_AVR25, bfd_mach_avr25},
239 {"attiny861", AVR_ISA_AVR25, bfd_mach_avr25},
240 {"attiny861a", AVR_ISA_AVR25, bfd_mach_avr25},
241 {"attiny87", AVR_ISA_AVR25, bfd_mach_avr25},
242 {"attiny43u", AVR_ISA_AVR25, bfd_mach_avr25},
243 {"attiny48", AVR_ISA_AVR25, bfd_mach_avr25},
244 {"attiny88", AVR_ISA_AVR25, bfd_mach_avr25},
245 {"attiny828", AVR_ISA_AVR25, bfd_mach_avr25},
246 {"at86rf401", AVR_ISA_RF401, bfd_mach_avr25},
247 {"at43usb355", AVR_ISA_AVR3, bfd_mach_avr3},
248 {"at76c711", AVR_ISA_AVR3, bfd_mach_avr3},
249 {"atmega103", AVR_ISA_AVR31, bfd_mach_avr31},
250 {"at43usb320", AVR_ISA_AVR31, bfd_mach_avr31},
251 {"attiny167", AVR_ISA_AVR35, bfd_mach_avr35},
252 {"at90usb82", AVR_ISA_AVR35, bfd_mach_avr35},
253 {"at90usb162", AVR_ISA_AVR35, bfd_mach_avr35},
254 {"ata5505", AVR_ISA_AVR35, bfd_mach_avr35},
255 {"atmega8u2", AVR_ISA_AVR35, bfd_mach_avr35},
256 {"atmega16u2", AVR_ISA_AVR35, bfd_mach_avr35},
257 {"atmega32u2", AVR_ISA_AVR35, bfd_mach_avr35},
258 {"attiny1634", AVR_ISA_AVR35, bfd_mach_avr35},
259 {"atmega8", AVR_ISA_M8, bfd_mach_avr4},
260 {"ata6289", AVR_ISA_AVR4, bfd_mach_avr4},
261 {"atmega8a", AVR_ISA_M8, bfd_mach_avr4},
262 {"ata6285", AVR_ISA_AVR4, bfd_mach_avr4},
263 {"ata6286", AVR_ISA_AVR4, bfd_mach_avr4},
264 {"atmega48", AVR_ISA_AVR4, bfd_mach_avr4},
265 {"atmega48a", AVR_ISA_AVR4, bfd_mach_avr4},
266 {"atmega48pa", AVR_ISA_AVR4, bfd_mach_avr4},
267 {"atmega48p", AVR_ISA_AVR4, bfd_mach_avr4},
268 {"atmega88", AVR_ISA_AVR4, bfd_mach_avr4},
269 {"atmega88a", AVR_ISA_AVR4, bfd_mach_avr4},
270 {"atmega88p", AVR_ISA_AVR4, bfd_mach_avr4},
271 {"atmega88pa", AVR_ISA_AVR4, bfd_mach_avr4},
272 {"atmega8515", AVR_ISA_M8, bfd_mach_avr4},
273 {"atmega8535", AVR_ISA_M8, bfd_mach_avr4},
274 {"atmega8hva", AVR_ISA_AVR4, bfd_mach_avr4},
275 {"at90pwm1", AVR_ISA_AVR4, bfd_mach_avr4},
276 {"at90pwm2", AVR_ISA_AVR4, bfd_mach_avr4},
277 {"at90pwm2b", AVR_ISA_AVR4, bfd_mach_avr4},
278 {"at90pwm3", AVR_ISA_AVR4, bfd_mach_avr4},
279 {"at90pwm3b", AVR_ISA_AVR4, bfd_mach_avr4},
280 {"at90pwm81", AVR_ISA_AVR4, bfd_mach_avr4},
281 {"at90pwm161", AVR_ISA_AVR5, bfd_mach_avr5},
282 {"ata5790", AVR_ISA_AVR5, bfd_mach_avr5},
283 {"ata5795", AVR_ISA_AVR5, bfd_mach_avr5},
284 {"atmega16", AVR_ISA_AVR5, bfd_mach_avr5},
285 {"atmega16a", AVR_ISA_AVR5, bfd_mach_avr5},
286 {"atmega161", AVR_ISA_M161, bfd_mach_avr5},
287 {"atmega162", AVR_ISA_AVR5, bfd_mach_avr5},
288 {"atmega163", AVR_ISA_M161, bfd_mach_avr5},
289 {"atmega164a", AVR_ISA_AVR5, bfd_mach_avr5},
290 {"atmega164p", AVR_ISA_AVR5, bfd_mach_avr5},
291 {"atmega164pa",AVR_ISA_AVR5, bfd_mach_avr5},
292 {"atmega165", AVR_ISA_AVR5, bfd_mach_avr5},
293 {"atmega165a", AVR_ISA_AVR5, bfd_mach_avr5},
294 {"atmega165p", AVR_ISA_AVR5, bfd_mach_avr5},
295 {"atmega165pa",AVR_ISA_AVR5, bfd_mach_avr5},
296 {"atmega168", AVR_ISA_AVR5, bfd_mach_avr5},
297 {"atmega168a", AVR_ISA_AVR5, bfd_mach_avr5},
298 {"atmega168p", AVR_ISA_AVR5, bfd_mach_avr5},
299 {"atmega168pa",AVR_ISA_AVR5, bfd_mach_avr5},
300 {"atmega169", AVR_ISA_AVR5, bfd_mach_avr5},
301 {"atmega169a", AVR_ISA_AVR5, bfd_mach_avr5},
302 {"atmega169p", AVR_ISA_AVR5, bfd_mach_avr5},
303 {"atmega169pa",AVR_ISA_AVR5, bfd_mach_avr5},
304 {"atmega32", AVR_ISA_AVR5, bfd_mach_avr5},
305 {"atmega32a", AVR_ISA_AVR5, bfd_mach_avr5},
306 {"atmega323", AVR_ISA_AVR5, bfd_mach_avr5},
307 {"atmega324a", AVR_ISA_AVR5, bfd_mach_avr5},
308 {"atmega324p", AVR_ISA_AVR5, bfd_mach_avr5},
309 {"atmega324pa",AVR_ISA_AVR5, bfd_mach_avr5},
310 {"atmega325", AVR_ISA_AVR5, bfd_mach_avr5},
311 {"atmega325a", AVR_ISA_AVR5, bfd_mach_avr5},
312 {"atmega325p", AVR_ISA_AVR5, bfd_mach_avr5},
313 {"atmega325pa",AVR_ISA_AVR5, bfd_mach_avr5},
314 {"atmega3250", AVR_ISA_AVR5, bfd_mach_avr5},
315 {"atmega3250a",AVR_ISA_AVR5, bfd_mach_avr5},
316 {"atmega3250p",AVR_ISA_AVR5, bfd_mach_avr5},
317 {"atmega3250pa",AVR_ISA_AVR5, bfd_mach_avr5},
318 {"atmega328", AVR_ISA_AVR5, bfd_mach_avr5},
319 {"atmega328p", AVR_ISA_AVR5, bfd_mach_avr5},
320 {"atmega329", AVR_ISA_AVR5, bfd_mach_avr5},
321 {"atmega329a", AVR_ISA_AVR5, bfd_mach_avr5},
322 {"atmega329p", AVR_ISA_AVR5, bfd_mach_avr5},
323 {"atmega329pa",AVR_ISA_AVR5, bfd_mach_avr5},
324 {"atmega3290", AVR_ISA_AVR5, bfd_mach_avr5},
325 {"atmega3290a",AVR_ISA_AVR5, bfd_mach_avr5},
326 {"atmega3290p",AVR_ISA_AVR5, bfd_mach_avr5},
327 {"atmega3290pa",AVR_ISA_AVR5, bfd_mach_avr5},
328 {"atmega406", AVR_ISA_AVR5, bfd_mach_avr5},
329 {"atmega64rfr2", AVR_ISA_AVR5, bfd_mach_avr5},
330 {"atmega644rfr2",AVR_ISA_AVR5, bfd_mach_avr5},
331 {"atmega64", AVR_ISA_AVR5, bfd_mach_avr5},
332 {"atmega64a", AVR_ISA_AVR5, bfd_mach_avr5},
333 {"atmega640", AVR_ISA_AVR5, bfd_mach_avr5},
334 {"atmega644", AVR_ISA_AVR5, bfd_mach_avr5},
335 {"atmega644a", AVR_ISA_AVR5, bfd_mach_avr5},
336 {"atmega644p", AVR_ISA_AVR5, bfd_mach_avr5},
337 {"atmega644pa",AVR_ISA_AVR5, bfd_mach_avr5},
338 {"atmega645", AVR_ISA_AVR5, bfd_mach_avr5},
339 {"atmega645a", AVR_ISA_AVR5, bfd_mach_avr5},
340 {"atmega645p", AVR_ISA_AVR5, bfd_mach_avr5},
341 {"atmega649", AVR_ISA_AVR5, bfd_mach_avr5},
342 {"atmega649a", AVR_ISA_AVR5, bfd_mach_avr5},
343 {"atmega649p", AVR_ISA_AVR5, bfd_mach_avr5},
344 {"atmega6450", AVR_ISA_AVR5, bfd_mach_avr5},
345 {"atmega6450a",AVR_ISA_AVR5, bfd_mach_avr5},
346 {"atmega6450p",AVR_ISA_AVR5, bfd_mach_avr5},
347 {"atmega6490", AVR_ISA_AVR5, bfd_mach_avr5},
348 {"atmega6490a",AVR_ISA_AVR5, bfd_mach_avr5},
349 {"atmega6490p",AVR_ISA_AVR5, bfd_mach_avr5},
350 {"atmega64rfr2",AVR_ISA_AVR5, bfd_mach_avr5},
351 {"atmega644rfr2",AVR_ISA_AVR5, bfd_mach_avr5},
352 {"atmega16hva",AVR_ISA_AVR5, bfd_mach_avr5},
353 {"atmega16hva2",AVR_ISA_AVR5, bfd_mach_avr5},
354 {"atmega16hvb",AVR_ISA_AVR5, bfd_mach_avr5},
355 {"atmega16hvbrevb",AVR_ISA_AVR5,bfd_mach_avr5},
356 {"atmega32hvb",AVR_ISA_AVR5, bfd_mach_avr5},
357 {"atmega32hvbrevb",AVR_ISA_AVR5,bfd_mach_avr5},
358 {"atmega64hve",AVR_ISA_AVR5, bfd_mach_avr5},
359 {"at90can32" , AVR_ISA_AVR5, bfd_mach_avr5},
360 {"at90can64" , AVR_ISA_AVR5, bfd_mach_avr5},
361 {"at90pwm161", AVR_ISA_AVR5, bfd_mach_avr5},
362 {"at90pwm216", AVR_ISA_AVR5, bfd_mach_avr5},
363 {"at90pwm316", AVR_ISA_AVR5, bfd_mach_avr5},
364 {"atmega32c1", AVR_ISA_AVR5, bfd_mach_avr5},
365 {"atmega64c1", AVR_ISA_AVR5, bfd_mach_avr5},
366 {"atmega16m1", AVR_ISA_AVR5, bfd_mach_avr5},
367 {"atmega32m1", AVR_ISA_AVR5, bfd_mach_avr5},
368 {"atmega64m1", AVR_ISA_AVR5, bfd_mach_avr5},
369 {"atmega16u4", AVR_ISA_AVR5, bfd_mach_avr5},
370 {"atmega32u4", AVR_ISA_AVR5, bfd_mach_avr5},
371 {"atmega32u6", AVR_ISA_AVR5, bfd_mach_avr5},
372 {"at90usb646", AVR_ISA_AVR5, bfd_mach_avr5},
373 {"at90usb647", AVR_ISA_AVR5, bfd_mach_avr5},
374 {"at90scr100", AVR_ISA_AVR5, bfd_mach_avr5},
375 {"at94k", AVR_ISA_94K, bfd_mach_avr5},
376 {"m3000", AVR_ISA_AVR5, bfd_mach_avr5},
377 {"atmega128", AVR_ISA_AVR51, bfd_mach_avr51},
378 {"atmega128a", AVR_ISA_AVR51, bfd_mach_avr51},
379 {"atmega1280", AVR_ISA_AVR51, bfd_mach_avr51},
380 {"atmega1281", AVR_ISA_AVR51, bfd_mach_avr51},
381 {"atmega1284", AVR_ISA_AVR51, bfd_mach_avr51},
382 {"atmega1284p",AVR_ISA_AVR51, bfd_mach_avr51},
383 {"atmega128rfa1",AVR_ISA_AVR51, bfd_mach_avr51},
384 {"atmega128rfr2",AVR_ISA_AVR51, bfd_mach_avr51},
385 {"atmega1284rfr2",AVR_ISA_AVR51, bfd_mach_avr51},
386 {"at90can128", AVR_ISA_AVR51, bfd_mach_avr51},
387 {"at90usb1286",AVR_ISA_AVR51, bfd_mach_avr51},
388 {"at90usb1287",AVR_ISA_AVR51, bfd_mach_avr51},
389 {"atmega2560", AVR_ISA_AVR6, bfd_mach_avr6},
390 {"atmega2561", AVR_ISA_AVR6, bfd_mach_avr6},
391 {"atmega256rfr2", AVR_ISA_AVR6, bfd_mach_avr6},
392 {"atmega2564rfr2", AVR_ISA_AVR6, bfd_mach_avr6},
393 {"atxmega16a4", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
394 {"atxmega16a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
395 {"atxmega16c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
396 {"atxmega16d4", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
397 {"atxmega32a4", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
398 {"atxmega32a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
399 {"atxmega32c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
400 {"atxmega32d4", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
401 {"atxmega32e5", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
402 {"atxmega16e5", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
403 {"atxmega8e5", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
404 {"atxmega32x1", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
405 {"attiny416", AVR_ISA_XMEGA, bfd_mach_avrxmega3},
406 {"attiny417", AVR_ISA_XMEGA, bfd_mach_avrxmega3},
407 {"attiny816", AVR_ISA_XMEGA, bfd_mach_avrxmega3},
408 {"attiny817", AVR_ISA_XMEGA, bfd_mach_avrxmega3},
409 {"atxmega64a3", AVR_ISA_XMEGA, bfd_mach_avrxmega4},
410 {"atxmega64a3u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
411 {"atxmega64a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
412 {"atxmega64b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
413 {"atxmega64b3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
414 {"atxmega64c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
415 {"atxmega64d3", AVR_ISA_XMEGA, bfd_mach_avrxmega4},
416 {"atxmega64d4", AVR_ISA_XMEGA, bfd_mach_avrxmega4},
417 {"atxmega64a1", AVR_ISA_XMEGA, bfd_mach_avrxmega5},
418 {"atxmega64a1u",AVR_ISA_XMEGAU, bfd_mach_avrxmega5},
419 {"atxmega128a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
420 {"atxmega128a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
421 {"atxmega128b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
422 {"atxmega128b3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
423 {"atxmega128c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
424 {"atxmega128d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
425 {"atxmega128d4", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
426 {"atxmega192a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
427 {"atxmega192a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
428 {"atxmega192c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
429 {"atxmega192d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
430 {"atxmega256a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
431 {"atxmega256a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
432 {"atxmega256a3b",AVR_ISA_XMEGA, bfd_mach_avrxmega6},
433 {"atxmega256a3bu",AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
434 {"atxmega256c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
435 {"atxmega256d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
436 {"atxmega384c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
437 {"atxmega384d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
438 {"atxmega128a1", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
439 {"atxmega128a1u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7},
440 {"atxmega128a4u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7},
441 {"attiny4", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
442 {"attiny5", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
443 {"attiny9", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
444 {"attiny10", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
445 {"attiny20", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
446 {"attiny40", AVR_ISA_AVRTINY, bfd_mach_avrtiny},
451 /* Current MCU type. */
452 static struct mcu_type_s default_mcu = {"avr2", AVR_ISA_AVR2, bfd_mach_avr2};
453 static struct mcu_type_s specified_mcu;
454 static struct mcu_type_s * avr_mcu = & default_mcu;
456 /* AVR target-specific switches. */
459 int all_opcodes; /* -mall-opcodes: accept all known AVR opcodes. */
460 int no_skip_bug; /* -mno-skip-bug: no warnings for skipping 2-word insns. */
461 int no_wrap; /* -mno-wrap: reject rjmp/rcall with 8K wrap-around. */
462 int no_link_relax; /* -mno-link-relax / -mlink-relax: generate (or not)
463 relocations for linker relaxation. */
464 int have_gccisr; /* Whether "__gcc_isr" is a known (pseudo) insn. */
467 static struct avr_opt_s avr_opt = { 0, 0, 0, 0, 0 };
469 const char EXP_CHARS[] = "eE";
470 const char FLT_CHARS[] = "dD";
472 static void avr_set_arch (int);
474 /* The target specific pseudo-ops which we support. */
475 const pseudo_typeS md_pseudo_table[] =
477 {"arch", avr_set_arch, 0},
481 #define LDI_IMMEDIATE(x) (((x) & 0xf) | (((x) << 4) & 0xf00))
483 #define EXP_MOD_NAME(i) exp_mod[i].name
484 #define EXP_MOD_RELOC(i) exp_mod[i].reloc
485 #define EXP_MOD_NEG_RELOC(i) exp_mod[i].neg_reloc
486 #define HAVE_PM_P(i) exp_mod[i].have_pm
491 bfd_reloc_code_real_type reloc;
492 bfd_reloc_code_real_type neg_reloc;
496 static struct exp_mod_s exp_mod[] =
498 {"hh8", BFD_RELOC_AVR_HH8_LDI, BFD_RELOC_AVR_HH8_LDI_NEG, 1},
499 {"pm_hh8", BFD_RELOC_AVR_HH8_LDI_PM, BFD_RELOC_AVR_HH8_LDI_PM_NEG, 0},
500 {"hi8", BFD_RELOC_AVR_HI8_LDI, BFD_RELOC_AVR_HI8_LDI_NEG, 1},
501 {"pm_hi8", BFD_RELOC_AVR_HI8_LDI_PM, BFD_RELOC_AVR_HI8_LDI_PM_NEG, 0},
502 {"lo8", BFD_RELOC_AVR_LO8_LDI, BFD_RELOC_AVR_LO8_LDI_NEG, 1},
503 {"pm_lo8", BFD_RELOC_AVR_LO8_LDI_PM, BFD_RELOC_AVR_LO8_LDI_PM_NEG, 0},
504 {"hlo8", BFD_RELOC_AVR_HH8_LDI, BFD_RELOC_AVR_HH8_LDI_NEG, 0},
505 {"hhi8", BFD_RELOC_AVR_MS8_LDI, BFD_RELOC_AVR_MS8_LDI_NEG, 0},
508 /* A union used to store indices into the exp_mod[] array
509 in a hash table which expects void * data types. */
516 /* Opcode hash table. */
517 static struct hash_control *avr_hash;
519 /* Reloc modifiers hash control (hh8,hi8,lo8,pm_xx). */
520 static struct hash_control *avr_mod_hash;
522 /* Whether some opcode does not change SREG. */
523 static struct hash_control *avr_no_sreg_hash;
525 static const char* const avr_no_sreg[] =
528 "ldi", "swap", "mov", "movw",
529 /* Special instructions. I-Flag will be restored by RETI, and we don't
530 consider I-Flag as being clobbered when changed. */
531 "sei", "cli", "reti", "brie", "brid",
532 "nop", "wdr", "sleep",
534 "ld", "ldd", "lds", "pop", "in", "lpm", "elpm",
535 "st", "std", "sts", "push", "out",
536 /* Jumps and Calls. Calls might call code that changes SREG.
537 GCC has to filter out ABI calls. The non-ABI transparent calls
538 must use [R]CALL and are filtered out now by not mentioning them. */
539 "rjmp", "jmp", "ijmp", "ret",
540 /* Skipping. Branches need SREG to be set, hence we regard them
541 as if they changed SREG and don't list them here. */
542 "sbrc", "sbrs", "sbic", "sbis", "cpse",
543 /* I/O Manipulation */
545 /* Read-Modify-Write */
546 "lac", "las", "lat", "xch"
549 #define OPTION_MMCU 'm'
552 OPTION_ALL_OPCODES = OPTION_MD_BASE + 1,
557 OPTION_NO_LINK_RELAX,
561 struct option md_longopts[] =
563 { "mmcu", required_argument, NULL, OPTION_MMCU },
564 { "mall-opcodes", no_argument, NULL, OPTION_ALL_OPCODES },
565 { "mno-skip-bug", no_argument, NULL, OPTION_NO_SKIP_BUG },
566 { "mno-wrap", no_argument, NULL, OPTION_NO_WRAP },
567 { "mrmw", no_argument, NULL, OPTION_ISA_RMW },
568 { "mlink-relax", no_argument, NULL, OPTION_LINK_RELAX },
569 { "mno-link-relax", no_argument, NULL, OPTION_NO_LINK_RELAX },
570 { "mgcc-isr", no_argument, NULL, OPTION_HAVE_GCCISR },
571 { NULL, no_argument, NULL, 0 }
574 size_t md_longopts_size = sizeof (md_longopts);
576 /* Display nicely formatted list of known MCU names. */
579 show_mcu_list (FILE *stream)
583 fprintf (stream, _("Known MCU names:"));
586 for (i = 0; mcu_types[i].name; i++)
588 int len = strlen (mcu_types[i].name);
593 fprintf (stream, " %s", mcu_types[i].name);
596 fprintf (stream, "\n %s", mcu_types[i].name);
601 fprintf (stream, "\n");
607 while (*s == ' ' || *s == '\t')
612 /* Extract one word from FROM and copy it to TO. */
615 extract_word (char *from, char *to, int limit)
620 /* Drop leading whitespace. */
621 from = skip_space (from);
624 /* Find the op code end. */
625 for (op_end = from; *op_end != 0 && is_part_of_name (*op_end);)
627 to[size++] = *op_end++;
628 if (size + 1 >= limit)
637 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
638 asection *seg ATTRIBUTE_UNUSED)
645 md_show_usage (FILE *stream)
648 _("AVR Assembler options:\n"
649 " -mmcu=[avr-name] select microcontroller variant\n"
650 " [avr-name] can be:\n"
651 " avr1 - classic AVR core without data RAM\n"
652 " avr2 - classic AVR core with up to 8K program memory\n"
653 " avr25 - classic AVR core with up to 8K program memory\n"
654 " plus the MOVW instruction\n"
655 " avr3 - classic AVR core with up to 64K program memory\n"
656 " avr31 - classic AVR core with up to 128K program memory\n"
657 " avr35 - classic AVR core with up to 64K program memory\n"
658 " plus the MOVW instruction\n"
659 " avr4 - enhanced AVR core with up to 8K program memory\n"
660 " avr5 - enhanced AVR core with up to 64K program memory\n"
661 " avr51 - enhanced AVR core with up to 128K program memory\n"
662 " avr6 - enhanced AVR core with up to 256K program memory\n"
663 " avrxmega2 - XMEGA, > 8K, < 64K FLASH, < 64K RAM\n"
664 " avrxmega3 - XMEGA, > 8K, <= 64K FLASH, > 64K RAM\n"
665 " avrxmega4 - XMEGA, > 64K, <= 128K FLASH, <= 64K RAM\n"
666 " avrxmega5 - XMEGA, > 64K, <= 128K FLASH, > 64K RAM\n"
667 " avrxmega6 - XMEGA, > 128K, <= 256K FLASH, <= 64K RAM\n"
668 " avrxmega7 - XMEGA, > 128K, <= 256K FLASH, > 64K RAM\n"
669 " avrtiny - AVR Tiny core with 16 gp registers\n"));
671 _(" -mall-opcodes accept all AVR opcodes, even if not supported by MCU\n"
672 " -mno-skip-bug disable warnings for skipping two-word instructions\n"
673 " (default for avr4, avr5)\n"
674 " -mno-wrap reject rjmp/rcall instructions with 8K wrap-around\n"
675 " (default for avr3, avr5)\n"
676 " -mrmw accept Read-Modify-Write instructions\n"
677 " -mlink-relax generate relocations for linker relaxation (default)\n"
678 " -mno-link-relax don't generate relocations for linker relaxation.\n"
679 " -mgcc-isr accept the __gcc_isr pseudo-instruction.\n"
681 show_mcu_list (stream);
685 avr_set_arch (int dummy ATTRIBUTE_UNUSED)
689 input_line_pointer = extract_word (input_line_pointer, str, 20);
690 md_parse_option (OPTION_MMCU, str);
691 bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
695 md_parse_option (int c, const char *arg)
703 for (i = 0; mcu_types[i].name; ++i)
704 if (strcasecmp (mcu_types[i].name, arg) == 0)
707 if (!mcu_types[i].name)
709 show_mcu_list (stderr);
710 as_fatal (_("unknown MCU: %s\n"), arg);
713 /* It is OK to redefine mcu type within the same avr[1-5] bfd machine
714 type - this for allows passing -mmcu=... via gcc ASM_SPEC as well
715 as .arch ... in the asm output at the same time. */
716 if (avr_mcu == &default_mcu || avr_mcu->mach == mcu_types[i].mach)
718 specified_mcu.name = mcu_types[i].name;
719 specified_mcu.isa |= mcu_types[i].isa;
720 specified_mcu.mach = mcu_types[i].mach;
721 avr_mcu = &specified_mcu;
724 as_fatal (_("redefinition of mcu type `%s' to `%s'"),
725 avr_mcu->name, mcu_types[i].name);
728 case OPTION_ALL_OPCODES:
729 avr_opt.all_opcodes = 1;
731 case OPTION_NO_SKIP_BUG:
732 avr_opt.no_skip_bug = 1;
738 specified_mcu.isa |= AVR_ISA_RMW;
740 case OPTION_LINK_RELAX:
741 avr_opt.no_link_relax = 0;
743 case OPTION_NO_LINK_RELAX:
744 avr_opt.no_link_relax = 1;
746 case OPTION_HAVE_GCCISR:
747 avr_opt.have_gccisr = 1;
755 /* Implement `md_undefined_symbol' */
756 /* If we are in `__gcc_isr' chunk, pop up `__gcc_isr.n_pushed.<NUM>'
757 instead of `__gcc_isr.n_pushed'. This will be resolved by the Done
758 chunk in `avr_patch_gccisr_frag' to the number of PUSHes produced by
759 the Prologue chunk. */
762 avr_undefined_symbol (char *name)
764 if (ISR_CHUNK_Done != avr_isr.prev_chunk
765 && 0 == strcmp (name, "__gcc_isr.n_pushed"))
767 if (!avr_isr.sym_n_pushed)
769 static unsigned suffix;
771 sprintf (xname, "%s.%03u", name, (++suffix) % 1000);
772 avr_isr.sym_n_pushed = symbol_new (xname, undefined_section,
773 (valueT) 0, &zero_address_frag);
775 return avr_isr.sym_n_pushed;
782 md_atof (int type, char *litP, int *sizeP)
784 return ieee_md_atof (type, litP, sizeP, FALSE);
788 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
789 asection *sec ATTRIBUTE_UNUSED,
790 fragS *fragP ATTRIBUTE_UNUSED)
799 struct avr_opcodes_s *opcode;
801 avr_hash = hash_new ();
803 /* Insert unique names into hash table. This hash table then provides a
804 quick index to the first opcode with a particular name in the opcode
806 for (opcode = avr_opcodes; opcode->name; opcode++)
807 hash_insert (avr_hash, opcode->name, (char *) opcode);
809 avr_mod_hash = hash_new ();
811 for (i = 0; i < ARRAY_SIZE (exp_mod); ++i)
816 hash_insert (avr_mod_hash, EXP_MOD_NAME (i), m.ptr);
819 avr_no_sreg_hash = hash_new ();
821 for (i = 0; i < ARRAY_SIZE (avr_no_sreg); ++i)
823 gas_assert (hash_find (avr_hash, avr_no_sreg[i]));
824 hash_insert (avr_no_sreg_hash, avr_no_sreg[i], (char*) 4 /* dummy */);
827 avr_gccisr_opcode = (struct avr_opcodes_s*) hash_find (avr_hash, "__gcc_isr");
828 gas_assert (avr_gccisr_opcode);
830 bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
831 linkrelax = !avr_opt.no_link_relax;
834 /* Resolve STR as a constant expression and return the result.
835 If result greater than MAX then error. */
838 avr_get_constant (char *str, int max)
842 str = skip_space (str);
843 input_line_pointer = str;
846 if (ex.X_op != O_constant)
847 as_bad (_("constant value required"));
849 if (ex.X_add_number > max || ex.X_add_number < 0)
850 as_bad (_("number must be positive and less than %d"), max + 1);
852 return ex.X_add_number;
855 /* Parse for ldd/std offset. */
858 avr_offset_expression (expressionS *exp)
860 char *str = input_line_pointer;
865 str = extract_word (str, op, sizeof (op));
867 input_line_pointer = tmp;
870 /* Warn about expressions that fail to use lo8 (). */
871 if (exp->X_op == O_constant)
873 int x = exp->X_add_number;
875 if (x < -255 || x > 255)
876 as_warn (_("constant out of 8-bit range: %d"), x);
880 /* Parse ordinary expression. */
883 parse_exp (char *s, expressionS *op)
885 input_line_pointer = s;
887 if (op->X_op == O_absent)
888 as_bad (_("missing operand"));
889 return input_line_pointer;
892 /* Parse special expressions (needed for LDI command):
897 where xx is: hh, hi, lo. */
899 static bfd_reloc_code_real_type
900 avr_ldi_expression (expressionS *exp)
902 char *str = input_line_pointer;
906 int linker_stubs_should_be_generated = 0;
910 str = extract_word (str, op, sizeof (op));
916 m.ptr = hash_find (avr_mod_hash, op);
924 str = skip_space (str);
928 bfd_reloc_code_real_type reloc_to_return;
933 if (strncmp ("pm(", str, 3) == 0
934 || strncmp ("gs(",str,3) == 0
935 || strncmp ("-(gs(",str,5) == 0
936 || strncmp ("-(pm(", str, 5) == 0)
944 as_bad (_("illegal expression"));
946 if (str[0] == 'g' || str[2] == 'g')
947 linker_stubs_should_be_generated = 1;
959 if (*str == '-' && *(str + 1) == '(')
966 input_line_pointer = str;
971 if (*input_line_pointer != ')')
973 as_bad (_("`)' required"));
976 input_line_pointer++;
981 neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod);
982 if (linker_stubs_should_be_generated)
984 switch (reloc_to_return)
986 case BFD_RELOC_AVR_LO8_LDI_PM:
987 reloc_to_return = BFD_RELOC_AVR_LO8_LDI_GS;
989 case BFD_RELOC_AVR_HI8_LDI_PM:
990 reloc_to_return = BFD_RELOC_AVR_HI8_LDI_GS;
994 /* PR 5523: Do not generate a warning here,
995 legitimate code can trigger this case. */
999 return reloc_to_return;
1004 input_line_pointer = tmp;
1007 /* Warn about expressions that fail to use lo8 (). */
1008 if (exp->X_op == O_constant)
1010 int x = exp->X_add_number;
1012 if (x < -255 || x > 255)
1013 as_warn (_("constant out of 8-bit range: %d"), x);
1016 return BFD_RELOC_AVR_LDI;
1019 /* Parse one instruction operand.
1020 Return operand bitmask. Also fixups can be generated. */
1023 avr_operand (struct avr_opcodes_s *opcode,
1029 expressionS op_expr;
1030 unsigned int op_mask = 0;
1031 char *str = skip_space (*line);
1035 /* Any register operand. */
1042 char * old_str = str;
1046 str = extract_word (str, r_name, sizeof (r_name));
1047 for (lower = r_name; *lower; ++lower)
1049 if (*lower >= 'A' && *lower <= 'Z')
1050 *lower += 'a' - 'A';
1053 if (r_name[0] == 'r' && ISDIGIT (r_name[1]) && r_name[2] == 0)
1054 /* Single-digit register number, ie r0-r9. */
1055 op_mask = r_name[1] - '0';
1056 else if (r_name[0] == 'r' && ISDIGIT (r_name[1])
1057 && ISDIGIT (r_name[2]) && r_name[3] == 0)
1058 /* Double-digit register number, ie r10 - r32. */
1059 op_mask = (r_name[1] - '0') * 10 + r_name[2] - '0';
1060 else if (r_name[0] >= 'x' && r_name[0] <= 'z'
1061 && (r_name[1] == 'l' || r_name[1] == 'h') && r_name[2] == 0)
1062 /* Registers r26-r31 referred to by name, ie xl, xh, yl, yh, zl, zh. */
1063 op_mask = (r_name[0] - 'x') * 2 + (r_name[1] == 'h') + 26;
1064 else if ((*op == 'v' || *op == 'w')
1065 && r_name[0] >= 'x' && r_name[0] <= 'z' && r_name[1] == 0)
1066 /* For the movw and addiw instructions, refer to registers x, y and z by name. */
1067 op_mask = (r_name[0] - 'x') * 2 + 26;
1070 /* Numeric or symbolic constant register number. */
1071 op_mask = avr_get_constant (old_str, 31);
1072 str = input_line_pointer;
1079 if (avr_mcu->mach == bfd_mach_avrtiny)
1081 if (op_mask < 16 || op_mask > 31)
1083 as_bad (_("register name or number from 16 to 31 required"));
1087 else if (op_mask > 31)
1089 as_bad (_("register name or number from 0 to 31 required"));
1096 if (op_mask < 16 || op_mask > 23)
1097 as_bad (_("register r16-r23 required"));
1103 as_bad (_("register number above 15 required"));
1109 as_bad (_("even register number required"));
1114 if ((op_mask & 1) || op_mask < 24)
1115 as_bad (_("register r24, r26, r28 or r30 required"));
1116 op_mask = (op_mask - 24) >> 1;
1127 str = skip_space (str + 1);
1136 as_bad (_("pointer register (X, Y or Z) required"));
1138 str = skip_space (str + 1);
1143 as_bad (_("cannot both predecrement and postincrement"));
1147 /* avr1 can do "ld r,Z" and "st Z,r" but no other pointer
1148 registers, no predecrement, no postincrement. */
1149 if (!avr_opt.all_opcodes && (op_mask & 0x100F)
1150 && !(avr_mcu->isa & AVR_ISA_SRAM))
1151 as_bad (_("addressing mode not supported"));
1157 as_bad (_("can't predecrement"));
1159 if (! (*str == 'z' || *str == 'Z'))
1160 as_bad (_("pointer register Z required"));
1162 str = skip_space (str + 1);
1168 for (s = opcode->opcode; *s; ++s)
1171 op_mask |= (1 << (15 - (s - opcode->opcode)));
1175 /* attiny26 can do "lpm" and "lpm r,Z" but not "lpm r,Z+". */
1176 if (!avr_opt.all_opcodes
1177 && (op_mask & 0x0001)
1178 && !(avr_mcu->isa & AVR_ISA_MOVW))
1179 as_bad (_("postincrement not supported"));
1184 char c = TOLOWER (*str++);
1189 as_bad (_("pointer register (Y or Z) required"));
1190 str = skip_space (str);
1193 input_line_pointer = str;
1194 avr_offset_expression (& op_expr);
1195 str = input_line_pointer;
1196 fix_new_exp (frag_now, where, 3,
1197 &op_expr, FALSE, BFD_RELOC_AVR_6);
1203 str = parse_exp (str, &op_expr);
1204 fix_new_exp (frag_now, where, opcode->insn_size * 2,
1205 &op_expr, FALSE, BFD_RELOC_AVR_CALL);
1209 str = parse_exp (str, &op_expr);
1210 fix_new_exp (frag_now, where, opcode->insn_size * 2,
1211 &op_expr, TRUE, BFD_RELOC_AVR_13_PCREL);
1215 str = parse_exp (str, &op_expr);
1216 fix_new_exp (frag_now, where, opcode->insn_size * 2,
1217 &op_expr, TRUE, BFD_RELOC_AVR_7_PCREL);
1221 str = parse_exp (str, &op_expr);
1222 fix_new_exp (frag_now, where + 2, opcode->insn_size * 2,
1223 &op_expr, FALSE, BFD_RELOC_16);
1227 str = parse_exp (str, &op_expr);
1228 fix_new_exp (frag_now, where, opcode->insn_size * 2,
1229 &op_expr, FALSE, BFD_RELOC_AVR_LDS_STS_16);
1234 bfd_reloc_code_real_type r_type;
1236 input_line_pointer = str;
1237 r_type = avr_ldi_expression (&op_expr);
1238 str = input_line_pointer;
1239 fix_new_exp (frag_now, where, 3,
1240 &op_expr, FALSE, r_type);
1248 x = ~avr_get_constant (str, 255);
1249 str = input_line_pointer;
1250 op_mask |= (x & 0xf) | ((x << 4) & 0xf00);
1258 x = avr_get_constant (str, 255);
1259 str = input_line_pointer;
1265 input_line_pointer = str;
1266 avr_offset_expression (& op_expr);
1267 str = input_line_pointer;
1268 fix_new_exp (frag_now, where, 3,
1269 & op_expr, FALSE, BFD_RELOC_AVR_6_ADIW);
1277 x = avr_get_constant (str, 7);
1278 str = input_line_pointer;
1286 str = parse_exp (str, &op_expr);
1287 fix_new_exp (frag_now, where, opcode->insn_size * 2,
1288 &op_expr, FALSE, BFD_RELOC_AVR_PORT6);
1292 str = parse_exp (str, &op_expr);
1293 fix_new_exp (frag_now, where, opcode->insn_size * 2,
1294 &op_expr, FALSE, BFD_RELOC_AVR_PORT5);
1301 x = avr_get_constant (str, 15);
1302 str = input_line_pointer;
1303 op_mask |= (x << 4);
1311 as_bad (_("unknown constraint `%c'"), *op);
1318 /* Parse instruction operands.
1319 Return binary opcode. */
1322 avr_operands (struct avr_opcodes_s *opcode, char **line)
1324 const char *op = opcode->constraints;
1325 unsigned int bin = opcode->bin_opcode;
1326 char *frag = frag_more (opcode->insn_size * 2);
1328 int where = frag - frag_now->fr_literal;
1329 static unsigned int prev = 0; /* Previous opcode. */
1333 /* Opcode have operands. */
1336 unsigned int reg1 = 0;
1337 unsigned int reg2 = 0;
1338 int reg1_present = 0;
1339 int reg2_present = 0;
1341 /* Parse first operand. */
1342 if (REGISTER_P (*op))
1344 reg1 = avr_operand (opcode, where, op, &str, ®no1);
1347 /* Parse second operand. */
1361 if (REGISTER_P (*op))
1364 str = skip_space (str);
1366 as_bad (_("`,' required"));
1367 str = skip_space (str);
1369 reg2 = avr_operand (opcode, where, op, &str, ®no2);
1372 if (reg1_present && reg2_present)
1373 reg2 = (reg2 & 0xf) | ((reg2 << 5) & 0x200);
1374 else if (reg2_present)
1382 if (avr_opt.have_gccisr)
1383 avr_update_gccisr (opcode, regno1, regno2);
1385 /* Detect undefined combinations (like ld r31,Z+). */
1386 if (!avr_opt.all_opcodes && AVR_UNDEF_P (bin))
1387 as_warn (_("undefined combination of operands"));
1389 if (opcode->insn_size == 2)
1391 /* Warn if the previous opcode was cpse/sbic/sbis/sbrc/sbrs
1392 (AVR core bug, fixed in the newer devices). */
1393 if (!(avr_opt.no_skip_bug ||
1394 (avr_mcu->isa & (AVR_ISA_MUL | AVR_ISA_MOVW)))
1395 && AVR_SKIP_P (prev))
1396 as_warn (_("skipping two-word instruction"));
1398 bfd_putl32 ((bfd_vma) bin, frag);
1401 bfd_putl16 ((bfd_vma) bin, frag);
1408 /* GAS will call this function for each section at the end of the assembly,
1409 to permit the CPU backend to adjust the alignment of a section. */
1412 md_section_align (asection *seg, valueT addr)
1414 int align = bfd_get_section_alignment (stdoutput, seg);
1415 return ((addr + (1 << align) - 1) & (-1UL << align));
1418 /* If you define this macro, it should return the offset between the
1419 address of a PC relative fixup and the position from which the PC
1420 relative adjustment should be made. On many processors, the base
1421 of a PC relative instruction is the next instruction, so this
1422 macro would return the length of an instruction. */
1425 md_pcrel_from_section (fixS *fixp, segT sec)
1427 if (fixp->fx_addsy != (symbolS *) NULL
1428 && (!S_IS_DEFINED (fixp->fx_addsy)
1429 || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1432 return fixp->fx_frag->fr_address + fixp->fx_where;
1436 relaxable_section (asection *sec)
1438 return ((sec->flags & SEC_DEBUGGING) == 0
1439 && (sec->flags & SEC_CODE) != 0
1440 && (sec->flags & SEC_ALLOC) != 0);
1443 /* Does whatever the xtensa port does. */
1445 avr_validate_fix_sub (fixS *fix)
1447 segT add_symbol_segment, sub_symbol_segment;
1449 /* The difference of two symbols should be resolved by the assembler when
1450 linkrelax is not set. If the linker may relax the section containing
1451 the symbols, then an Xtensa DIFF relocation must be generated so that
1452 the linker knows to adjust the difference value. */
1453 if (!linkrelax || fix->fx_addsy == NULL)
1456 /* Make sure both symbols are in the same segment, and that segment is
1457 "normal" and relaxable. If the segment is not "normal", then the
1458 fix is not valid. If the segment is not "relaxable", then the fix
1459 should have been handled earlier. */
1460 add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
1461 if (! SEG_NORMAL (add_symbol_segment) ||
1462 ! relaxable_section (add_symbol_segment))
1465 sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
1466 return (sub_symbol_segment == add_symbol_segment);
1469 /* TC_FORCE_RELOCATION hook */
1471 /* If linkrelax is turned on, and the symbol to relocate
1472 against is in a relaxable segment, don't compute the value -
1473 generate a relocation instead. */
1475 avr_force_relocation (fixS *fix)
1477 if (linkrelax && fix->fx_addsy
1478 && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
1481 return generic_force_reloc (fix);
1484 /* GAS will call this for each fixup. It should store the correct
1485 value in the object file. */
1488 md_apply_fix (fixS *fixP, valueT * valP, segT seg)
1490 unsigned char *where;
1494 if (fixP->fx_addsy == (symbolS *) NULL)
1497 else if (fixP->fx_pcrel)
1499 segT s = S_GET_SEGMENT (fixP->fx_addsy);
1501 if (s == seg || s == absolute_section)
1503 value += S_GET_VALUE (fixP->fx_addsy);
1507 else if (linkrelax && fixP->fx_subsy)
1509 /* For a subtraction relocation expression, generate one
1510 of the DIFF relocs, with the value being the difference.
1511 Note that a sym1 - sym2 expression is adjusted into a
1512 section_start_sym + sym4_offset_from_section_start - sym1
1513 expression. fixP->fx_addsy holds the section start symbol,
1514 fixP->fx_offset holds sym2's offset, and fixP->fx_subsy
1515 holds sym1. Calculate the current difference and write value,
1516 but leave fx_offset as is - during relaxation,
1517 fx_offset - value gives sym1's value. */
1519 switch (fixP->fx_r_type)
1522 fixP->fx_r_type = BFD_RELOC_AVR_DIFF8;
1525 fixP->fx_r_type = BFD_RELOC_AVR_DIFF16;
1528 fixP->fx_r_type = BFD_RELOC_AVR_DIFF32;
1531 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1535 value = S_GET_VALUE (fixP->fx_addsy) +
1536 fixP->fx_offset - S_GET_VALUE (fixP->fx_subsy);
1539 fixP->fx_subsy = NULL;
1541 /* We don't actually support subtracting a symbol. */
1542 if (fixP->fx_subsy != (symbolS *) NULL)
1543 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1545 /* For the DIFF relocs, write the value into the object file while still
1546 keeping fx_done FALSE, as both the difference (recorded in the object file)
1547 and the sym offset (part of fixP) are needed at link relax time. */
1548 where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
1549 switch (fixP->fx_r_type)
1552 fixP->fx_no_overflow = 1;
1554 case BFD_RELOC_AVR_7_PCREL:
1555 case BFD_RELOC_AVR_13_PCREL:
1559 case BFD_RELOC_AVR_DIFF8:
1562 case BFD_RELOC_AVR_DIFF16:
1563 bfd_putl16 ((bfd_vma) value, where);
1565 case BFD_RELOC_AVR_DIFF32:
1566 bfd_putl32 ((bfd_vma) value, where);
1568 case BFD_RELOC_AVR_CALL:
1574 /* Fetch the instruction, insert the fully resolved operand
1575 value, and stuff the instruction back again. */
1576 where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
1577 insn = bfd_getl16 (where);
1579 switch (fixP->fx_r_type)
1581 case BFD_RELOC_AVR_7_PCREL:
1583 as_bad_where (fixP->fx_file, fixP->fx_line,
1584 _("odd address operand: %ld"), value);
1586 /* Instruction addresses are always right-shifted by 1. */
1588 --value; /* Correct PC. */
1590 if (value < -64 || value > 63)
1591 as_bad_where (fixP->fx_file, fixP->fx_line,
1592 _("operand out of range: %ld"), value);
1593 value = (value << 3) & 0x3f8;
1594 bfd_putl16 ((bfd_vma) (value | insn), where);
1597 case BFD_RELOC_AVR_13_PCREL:
1599 as_bad_where (fixP->fx_file, fixP->fx_line,
1600 _("odd address operand: %ld"), value);
1602 /* Instruction addresses are always right-shifted by 1. */
1604 --value; /* Correct PC. */
1606 if (value < -2048 || value > 2047)
1608 /* No wrap for devices with >8K of program memory. */
1609 if ((avr_mcu->isa & AVR_ISA_MEGA) || avr_opt.no_wrap)
1610 as_bad_where (fixP->fx_file, fixP->fx_line,
1611 _("operand out of range: %ld"), value);
1615 bfd_putl16 ((bfd_vma) (value | insn), where);
1619 bfd_putl32 ((bfd_vma) value, where);
1623 bfd_putl16 ((bfd_vma) value, where);
1627 if (value > 255 || value < -128)
1628 as_warn_where (fixP->fx_file, fixP->fx_line,
1629 _("operand out of range: %ld"), value);
1633 case BFD_RELOC_AVR_16_PM:
1634 bfd_putl16 ((bfd_vma) (value >> 1), where);
1637 case BFD_RELOC_AVR_LDI:
1639 as_bad_where (fixP->fx_file, fixP->fx_line,
1640 _("operand out of range: %ld"), value);
1641 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
1644 case BFD_RELOC_AVR_LDS_STS_16:
1645 if ((value < 0x40) || (value > 0xBF))
1646 as_warn_where (fixP->fx_file, fixP->fx_line,
1647 _("operand out of range: 0x%lx"),
1648 (unsigned long)value);
1649 insn |= ((value & 0xF) | ((value & 0x30) << 5) | ((value & 0x40) << 2));
1650 bfd_putl16 ((bfd_vma) insn, where);
1653 case BFD_RELOC_AVR_6:
1654 if ((value > 63) || (value < 0))
1655 as_bad_where (fixP->fx_file, fixP->fx_line,
1656 _("operand out of range: %ld"), value);
1657 bfd_putl16 ((bfd_vma) insn | ((value & 7) | ((value & (3 << 3)) << 7)
1658 | ((value & (1 << 5)) << 8)), where);
1661 case BFD_RELOC_AVR_6_ADIW:
1662 if ((value > 63) || (value < 0))
1663 as_bad_where (fixP->fx_file, fixP->fx_line,
1664 _("operand out of range: %ld"), value);
1665 bfd_putl16 ((bfd_vma) insn | (value & 0xf) | ((value & 0x30) << 2), where);
1668 case BFD_RELOC_AVR_LO8_LDI:
1669 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
1672 case BFD_RELOC_AVR_HI8_LDI:
1673 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 8), where);
1676 case BFD_RELOC_AVR_MS8_LDI:
1677 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 24), where);
1680 case BFD_RELOC_AVR_HH8_LDI:
1681 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 16), where);
1684 case BFD_RELOC_AVR_LO8_LDI_NEG:
1685 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value), where);
1688 case BFD_RELOC_AVR_HI8_LDI_NEG:
1689 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 8), where);
1692 case BFD_RELOC_AVR_MS8_LDI_NEG:
1693 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 24), where);
1696 case BFD_RELOC_AVR_HH8_LDI_NEG:
1697 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 16), where);
1700 case BFD_RELOC_AVR_LO8_LDI_PM:
1701 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 1), where);
1704 case BFD_RELOC_AVR_HI8_LDI_PM:
1705 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 9), where);
1708 case BFD_RELOC_AVR_HH8_LDI_PM:
1709 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 17), where);
1712 case BFD_RELOC_AVR_LO8_LDI_PM_NEG:
1713 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 1), where);
1716 case BFD_RELOC_AVR_HI8_LDI_PM_NEG:
1717 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 9), where);
1720 case BFD_RELOC_AVR_HH8_LDI_PM_NEG:
1721 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 17), where);
1724 case BFD_RELOC_AVR_CALL:
1728 x = bfd_getl16 (where);
1730 as_bad_where (fixP->fx_file, fixP->fx_line,
1731 _("odd address operand: %ld"), value);
1733 x |= ((value & 0x10000) | ((value << 3) & 0x1f00000)) >> 16;
1734 bfd_putl16 ((bfd_vma) x, where);
1735 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2);
1739 case BFD_RELOC_AVR_8_LO:
1740 *where = 0xff & value;
1743 case BFD_RELOC_AVR_8_HI:
1744 *where = 0xff & (value >> 8);
1747 case BFD_RELOC_AVR_8_HLO:
1748 *where = 0xff & (value >> 16);
1752 as_fatal (_("line %d: unknown relocation type: 0x%x"),
1753 fixP->fx_line, fixP->fx_r_type);
1756 case BFD_RELOC_AVR_PORT6:
1758 as_bad_where (fixP->fx_file, fixP->fx_line,
1759 _("operand out of range: %ld"), value);
1760 bfd_putl16 ((bfd_vma) insn | ((value & 0x30) << 5) | (value & 0x0f), where);
1763 case BFD_RELOC_AVR_PORT5:
1765 as_bad_where (fixP->fx_file, fixP->fx_line,
1766 _("operand out of range: %ld"), value);
1767 bfd_putl16 ((bfd_vma) insn | ((value & 0x1f) << 3), where);
1773 switch ((int) fixP->fx_r_type)
1775 case -BFD_RELOC_AVR_HI8_LDI_NEG:
1776 case -BFD_RELOC_AVR_HI8_LDI:
1777 case -BFD_RELOC_AVR_LO8_LDI_NEG:
1778 case -BFD_RELOC_AVR_LO8_LDI:
1779 as_bad_where (fixP->fx_file, fixP->fx_line,
1780 _("only constant expression allowed"));
1789 /* GAS will call this to generate a reloc, passing the resulting reloc
1790 to `bfd_install_relocation'. This currently works poorly, as
1791 `bfd_install_relocation' often does the wrong thing, and instances of
1792 `tc_gen_reloc' have been written to work around the problems, which
1793 in turns makes it difficult to fix `bfd_install_relocation'. */
1795 /* If while processing a fixup, a reloc really needs to be created
1796 then it is done here. */
1799 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED,
1803 bfd_reloc_code_real_type code = fixp->fx_r_type;
1805 if (fixp->fx_subsy != NULL)
1807 as_bad_where (fixp->fx_file, fixp->fx_line, _("expression too complex"));
1811 reloc = XNEW (arelent);
1813 reloc->sym_ptr_ptr = XNEW (asymbol *);
1814 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1816 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1818 if ((fixp->fx_r_type == BFD_RELOC_32) && (fixp->fx_pcrel))
1820 if (seg->use_rela_p)
1821 fixp->fx_offset -= md_pcrel_from_section (fixp, seg);
1823 fixp->fx_offset = reloc->address;
1825 code = BFD_RELOC_32_PCREL;
1828 reloc->addend = fixp->fx_offset;
1830 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
1832 if (reloc->howto == (reloc_howto_type *) NULL)
1834 as_bad_where (fixp->fx_file, fixp->fx_line,
1835 _("reloc %d not supported by object file format"),
1836 (int) fixp->fx_r_type);
1840 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1841 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1842 reloc->address = fixp->fx_offset;
1849 md_assemble (char *str)
1851 struct avr_opcodes_s *opcode;
1854 str = skip_space (extract_word (str, op, sizeof (op)));
1857 as_bad (_("can't find opcode "));
1859 opcode = (struct avr_opcodes_s *) hash_find (avr_hash, op);
1861 if (opcode && !avr_opt.all_opcodes)
1863 /* Check if the instruction's ISA bit is ON in the ISA bits of the part
1864 specified by the user. If not look for other instructions
1865 specifications with same mnemonic who's ISA bits matches.
1867 This requires include/opcode/avr.h to have the instructions with
1868 same mnemonic to be specified in sequence. */
1870 while ((opcode->isa & avr_mcu->isa) != opcode->isa)
1874 if (opcode->name && strcmp(op, opcode->name))
1876 as_bad (_("illegal opcode %s for mcu %s"),
1877 opcode->name, avr_mcu->name);
1885 as_bad (_("unknown opcode `%s'"), op);
1889 if (opcode == avr_gccisr_opcode
1890 && !avr_opt.have_gccisr)
1892 as_bad (_("pseudo instruction `%s' not supported"), op);
1896 /* Special case for opcodes with optional operands (lpm, elpm) -
1897 version with operands exists in avr_opcodes[] in the next entry. */
1899 if (*str && *opcode->constraints == '?')
1902 dwarf2_emit_insn (0);
1904 /* We used to set input_line_pointer to the result of get_operands,
1905 but that is wrong. Our caller assumes we don't change it. */
1907 char *t = input_line_pointer;
1909 if (opcode == avr_gccisr_opcode)
1910 avr_gccisr_operands (opcode, &str);
1912 avr_operands (opcode, &str);
1913 if (*skip_space (str))
1914 as_bad (_("garbage at end of line"));
1915 input_line_pointer = t;
1919 const exp_mod_data_t exp_mod_data[] =
1921 /* Default, must be first. */
1922 { "", 0, BFD_RELOC_16, "" },
1923 /* Divides by 2 to get word address. Generate Stub. */
1924 { "gs", 2, BFD_RELOC_AVR_16_PM, "`gs' " },
1925 { "pm", 2, BFD_RELOC_AVR_16_PM, "`pm' " },
1926 /* The following are used together with avr-gcc's __memx address space
1927 in order to initialize a 24-bit pointer variable with a 24-bit address.
1928 For address in flash, hlo8 will contain the flash segment if the
1929 symbol is located in flash. If the symbol is located in RAM; hlo8
1930 will contain 0x80 which matches avr-gcc's notion of how 24-bit RAM/flash
1931 addresses linearize address space. */
1932 { "lo8", 1, BFD_RELOC_AVR_8_LO, "`lo8' " },
1933 { "hi8", 1, BFD_RELOC_AVR_8_HI, "`hi8' " },
1934 { "hlo8", 1, BFD_RELOC_AVR_8_HLO, "`hlo8' " },
1935 { "hh8", 1, BFD_RELOC_AVR_8_HLO, "`hh8' " },
1938 /* Parse special CONS expression: pm (expression) or alternatively
1939 gs (expression). These are used for addressing program memory. Moreover,
1940 define lo8 (expression), hi8 (expression) and hlo8 (expression). */
1942 const exp_mod_data_t *
1943 avr_parse_cons_expression (expressionS *exp, int nbytes)
1948 tmp = input_line_pointer = skip_space (input_line_pointer);
1950 /* The first entry of exp_mod_data[] contains an entry if no
1951 expression modifier is present. Skip it. */
1953 for (i = 0; i < ARRAY_SIZE (exp_mod_data); i++)
1955 const exp_mod_data_t *pexp = &exp_mod_data[i];
1956 int len = strlen (pexp->name);
1958 if (nbytes == pexp->nbytes
1959 && strncasecmp (input_line_pointer, pexp->name, len) == 0)
1961 input_line_pointer = skip_space (input_line_pointer + len);
1963 if (*input_line_pointer == '(')
1965 input_line_pointer = skip_space (input_line_pointer + 1);
1968 if (*input_line_pointer == ')')
1970 ++input_line_pointer;
1975 as_bad (_("`)' required"));
1976 return &exp_mod_data[0];
1980 input_line_pointer = tmp;
1987 return &exp_mod_data[0];
1991 avr_cons_fix_new (fragS *frag,
1995 const exp_mod_data_t *pexp_mod_data)
1999 switch (pexp_mod_data->reloc)
2003 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_8);
2004 else if (nbytes == 2)
2005 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_16);
2006 else if (nbytes == 4)
2007 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_32);
2012 case BFD_RELOC_AVR_16_PM:
2013 case BFD_RELOC_AVR_8_LO:
2014 case BFD_RELOC_AVR_8_HI:
2015 case BFD_RELOC_AVR_8_HLO:
2016 if (nbytes == pexp_mod_data->nbytes)
2017 fix_new_exp (frag, where, nbytes, exp, FALSE, pexp_mod_data->reloc);
2024 as_bad (_("illegal %s relocation size: %d"), pexp_mod_data->error, nbytes);
2028 mcu_has_3_byte_pc (void)
2030 int mach = avr_mcu->mach;
2032 return mach == bfd_mach_avr6
2033 || mach == bfd_mach_avrxmega6
2034 || mach == bfd_mach_avrxmega7;
2038 tc_cfi_frame_initial_instructions (void)
2040 /* AVR6 pushes 3 bytes for calls. */
2041 int return_size = (mcu_has_3_byte_pc () ? 3 : 2);
2043 /* The CFA is the caller's stack location before the call insn. */
2044 /* Note that the stack pointer is dwarf register number 32. */
2045 cfi_add_CFA_def_cfa (32, return_size);
2047 /* Note that AVR consistently uses post-decrement, which means that things
2048 do not line up the same way as for targets that use pre-decrement. */
2049 cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, 1-return_size);
2053 avr_allow_local_subtract (expressionS * left,
2054 expressionS * right,
2057 /* If we are not in relaxation mode, subtraction is OK. */
2061 /* If the symbols are not in a code section then they are OK. */
2062 if ((section->flags & SEC_CODE) == 0)
2065 if (left->X_add_symbol == right->X_add_symbol)
2068 /* We have to assume that there may be instructions between the
2069 two symbols and that relaxation may increase the distance between
2075 avr_elf_final_processing (void)
2078 elf_elfheader (stdoutput)->e_flags |= EF_AVR_LINKRELAX_PREPARED;
2081 /* Write out the header of a .avr.prop section into the area pointed to by
2082 DATA. The RECORD_COUNT will be placed in the header as the number of
2083 records that are to follow.
2084 The area DATA must be big enough the receive the header, which is
2085 AVR_PROPERTY_SECTION_HEADER_SIZE bytes long. */
2088 avr_output_property_section_header (char *data,
2089 unsigned int record_count)
2091 char *orig_data = data;
2093 md_number_to_chars (data, AVR_PROPERTY_RECORDS_VERSION, 1);
2095 /* There's space for a single byte flags field, but right now there's
2096 nothing to go in here, so just set the value to zero. */
2097 md_number_to_chars (data, 0, 1);
2099 md_number_to_chars (data, record_count, 2);
2102 gas_assert (data - orig_data == AVR_PROPERTY_SECTION_HEADER_SIZE);
2107 /* Return the number of bytes required to store RECORD into the .avr.prop
2108 section. The size returned is the compressed size that corresponds to
2109 how the record will be written out in AVR_OUTPUT_PROPERTY_RECORD. */
2112 avr_record_size (const struct avr_property_record *record)
2114 /* The first 5 bytes are a 4-byte address, followed by a 1-byte type
2118 switch (record->type)
2121 size += 0; /* No extra information. */
2124 case RECORD_ORG_AND_FILL:
2125 size += 4; /* A 4-byte fill value. */
2129 size += 4; /* A 4-byte alignment value. */
2132 case RECORD_ALIGN_AND_FILL:
2133 size += 8; /* A 4-byte alignment, and 4-byte fill value. */
2137 as_fatal (_("unknown record type %d (in %s)"),
2138 record->type, __PRETTY_FUNCTION__);
2144 /* Write out RECORD. FRAG_BASE points to the start of the data area setup
2145 to hold all of the .avr.prop content, FRAG_PTR points to the next
2146 writable location. The data area must be big enough to hold all of the
2147 records. The size of the data written out for this RECORD must match
2148 the size from AVR_RECORD_SIZE. */
2151 avr_output_property_record (char * const frag_base, char *frag_ptr,
2152 const struct avr_property_record *record)
2156 char *init_frag_ptr = frag_ptr;
2158 where = frag_ptr - frag_base;
2159 fix = fix_new (frag_now, where, 4,
2160 section_symbol (record->section),
2161 record->offset, FALSE, BFD_RELOC_32);
2162 fix->fx_file = "<internal>";
2166 md_number_to_chars (frag_ptr, (bfd_byte) record->type, 1);
2169 /* Write out the rest of the data. */
2170 switch (record->type)
2175 case RECORD_ORG_AND_FILL:
2176 md_number_to_chars (frag_ptr, record->data.org.fill, 4);
2181 md_number_to_chars (frag_ptr, record->data.align.bytes, 4);
2185 case RECORD_ALIGN_AND_FILL:
2186 md_number_to_chars (frag_ptr, record->data.align.bytes, 4);
2187 md_number_to_chars (frag_ptr + 4, record->data.align.fill, 4);
2192 as_fatal (_("unknown record type %d (in %s)"),
2193 record->type, __PRETTY_FUNCTION__);
2196 gas_assert (frag_ptr - init_frag_ptr == avr_record_size (record));
2201 /* Create the section to hold the AVR property information. Return the
2205 avr_create_property_section (void)
2208 flagword flags = (SEC_RELOC | SEC_HAS_CONTENTS | SEC_READONLY);
2209 const char *section_name = AVR_PROPERTY_RECORD_SECTION_NAME;
2211 sec = bfd_make_section (stdoutput, section_name);
2213 as_fatal (_("Failed to create property section `%s'\n"), section_name);
2214 bfd_set_section_flags (stdoutput, sec, flags);
2215 sec->output_section = sec;
2219 /* This hook is called when alignment is performed, and allows us to
2220 capture the details of both .org and .align directives. */
2223 avr_handle_align (fragS *fragP)
2227 /* Ignore alignment requests at FR_ADDRESS 0, these are at the very
2228 start of a section, and will be handled by the standard section
2229 alignment mechanism. */
2230 if ((fragP->fr_type == rs_align
2231 || fragP->fr_type == rs_align_code)
2232 && fragP->fr_offset > 0)
2234 char *p = fragP->fr_literal + fragP->fr_fix;
2236 fragP->tc_frag_data.is_align = TRUE;
2237 fragP->tc_frag_data.alignment = fragP->fr_offset;
2238 fragP->tc_frag_data.fill = *p;
2239 fragP->tc_frag_data.has_fill = (fragP->tc_frag_data.fill != 0);
2242 if (fragP->fr_type == rs_org && fragP->fr_offset > 0)
2244 char *p = fragP->fr_literal + fragP->fr_fix;
2246 fragP->tc_frag_data.is_org = TRUE;
2247 fragP->tc_frag_data.fill = *p;
2248 fragP->tc_frag_data.has_fill = (fragP->tc_frag_data.fill != 0);
2253 /* Return TRUE if this section is not one for which we need to record
2254 information in the avr property section. */
2257 exclude_section_from_property_tables (segT sec)
2259 /* Only generate property information for sections on which linker
2260 relaxation could be performed. */
2261 return !relaxable_section (sec);
2264 /* Create a property record for fragment FRAGP from section SEC and place
2265 it into an AVR_PROPERTY_RECORD_LINK structure, which can then formed
2266 into a linked list by the caller. */
2268 static struct avr_property_record_link *
2269 create_record_for_frag (segT sec, fragS *fragP)
2271 struct avr_property_record_link *prop_rec_link;
2273 prop_rec_link = XCNEW (struct avr_property_record_link);
2274 gas_assert (fragP->fr_next != NULL);
2276 if (fragP->tc_frag_data.is_org)
2278 prop_rec_link->record.offset = fragP->fr_next->fr_address;
2279 prop_rec_link->record.section = sec;
2281 if (fragP->tc_frag_data.has_fill)
2283 prop_rec_link->record.data.org.fill = fragP->tc_frag_data.fill;
2284 prop_rec_link->record.type = RECORD_ORG_AND_FILL;
2287 prop_rec_link->record.type = RECORD_ORG;
2291 prop_rec_link->record.offset = fragP->fr_next->fr_address;
2292 prop_rec_link->record.section = sec;
2294 gas_assert (fragP->tc_frag_data.is_align);
2295 if (fragP->tc_frag_data.has_fill)
2297 prop_rec_link->record.data.align.fill = fragP->tc_frag_data.fill;
2298 prop_rec_link->record.type = RECORD_ALIGN_AND_FILL;
2301 prop_rec_link->record.type = RECORD_ALIGN;
2302 prop_rec_link->record.data.align.bytes = fragP->tc_frag_data.alignment;
2305 return prop_rec_link;
2308 /* Build a list of AVR_PROPERTY_RECORD_LINK structures for section SEC, and
2309 merged them onto the list pointed to by NEXT_PTR. Return a pointer to
2310 the last list item created. */
2312 static struct avr_property_record_link **
2313 append_records_for_section (segT sec,
2314 struct avr_property_record_link **next_ptr)
2316 segment_info_type *seginfo = seg_info (sec);
2319 if (seginfo && seginfo->frchainP)
2321 for (fragP = seginfo->frchainP->frch_root;
2323 fragP = fragP->fr_next)
2325 if (fragP->tc_frag_data.is_align
2326 || fragP->tc_frag_data.is_org)
2328 /* Create a single new entry. */
2329 struct avr_property_record_link *new_link
2330 = create_record_for_frag (sec, fragP);
2332 *next_ptr = new_link;
2333 next_ptr = &new_link->next;
2341 /* Create the AVR property section and fill it with records of .org and
2342 .align directives that were used. The section is only created if it
2343 will actually have any content. */
2346 avr_create_and_fill_property_section (void)
2350 struct avr_property_record_link *r_list, **next_ptr;
2351 char *frag_ptr, *frag_base;
2352 bfd_size_type sec_size;
2353 struct avr_property_record_link *rec;
2354 unsigned int record_count;
2356 /* First walk over all sections. For sections on which linker
2357 relaxation could be applied, extend the record list. The record list
2358 holds information that the linker will need to know. */
2363 for (seclist = &stdoutput->sections;
2364 seclist && *seclist;
2365 seclist = &(*seclist)->next)
2367 segT sec = *seclist;
2369 if (exclude_section_from_property_tables (sec))
2372 next_ptr = append_records_for_section (sec, next_ptr);
2375 /* Create property section and ensure the size is correct. We've already
2376 passed the point where gas could size this for us. */
2377 sec_size = AVR_PROPERTY_SECTION_HEADER_SIZE;
2379 for (rec = r_list; rec != NULL; rec = rec->next)
2382 sec_size += avr_record_size (&rec->record);
2385 if (record_count == 0)
2388 prop_sec = avr_create_property_section ();
2389 bfd_set_section_size (stdoutput, prop_sec, sec_size);
2391 subseg_set (prop_sec, 0);
2392 frag_base = frag_more (sec_size);
2395 avr_output_property_section_header (frag_base, record_count);
2397 for (rec = r_list; rec != NULL; rec = rec->next)
2398 frag_ptr = avr_output_property_record (frag_base, frag_ptr, &rec->record);
2400 frag_wane (frag_now);
2402 frag_wane (frag_now);
2405 /* We're using this hook to build up the AVR property section. It's called
2406 late in the assembly process which suits our needs. */
2408 avr_post_relax_hook (void)
2410 avr_create_and_fill_property_section ();
2414 /* Accumulate information about instruction sequence to `avr_isr':
2415 wheter TMP_REG, ZERO_REG and SREG might be touched. Used during parse.
2416 REG1 is either -1 or a register number used by the instruction as input
2417 or output operand. Similar for REG2. */
2420 avr_update_gccisr (struct avr_opcodes_s *opcode, int reg1, int reg2)
2422 const int tiny_p = avr_mcu->mach == bfd_mach_avrtiny;
2423 const int reg_tmp = tiny_p ? 16 : 0;
2424 const int reg_zero = 1 + reg_tmp;
2426 if (ISR_CHUNK_Done == avr_isr.prev_chunk
2427 || (avr_isr.need_sreg
2428 && avr_isr.need_reg_tmp
2429 && avr_isr.need_reg_zero))
2431 /* Nothing (more) to do */
2435 /* SREG: Look up instructions that don't clobber SREG. */
2437 if (!avr_isr.need_sreg
2438 && !hash_find (avr_no_sreg_hash, opcode->name))
2440 avr_isr.need_sreg = 1;
2443 /* Handle explicit register operands. Record *any* use as clobber.
2444 This is because TMP_REG and ZERO_REG are not global and using
2445 them makes no sense without a previous set. */
2447 avr_isr.need_reg_tmp |= reg1 == reg_tmp || reg2 == reg_tmp;
2448 avr_isr.need_reg_zero |= reg1 == reg_zero || reg2 == reg_zero;
2450 /* Handle implicit register operands and some opaque stuff. */
2452 if (strstr (opcode->name, "lpm")
2453 && '?' == *opcode->constraints)
2455 avr_isr.need_reg_tmp = 1;
2458 if (strstr (opcode->name, "call")
2459 || strstr (opcode->name, "mul")
2460 || 0 == strcmp (opcode->name, "des")
2461 || (0 == strcmp (opcode->name, "movw")
2462 && (reg1 == reg_tmp || reg2 == reg_tmp)))
2464 avr_isr.need_reg_tmp = 1;
2465 avr_isr.need_reg_zero = 1;
2470 /* Emit some 1-word instruction to **PWHERE and advance *PWHERE by the number
2471 of octets written. INSN specifies the desired instruction and REG is the
2472 register used by it. This function is only used with restricted subset of
2473 instructions as might be emit by `__gcc_isr'. IN / OUT will use SREG
2477 avr_emit_insn (const char *insn, int reg, char **pwhere)
2479 const int sreg = 0x3f;
2481 const struct avr_opcodes_s *op
2482 = (struct avr_opcodes_s*) hash_find (avr_hash, insn);
2484 /* We only have to deal with: IN, OUT, PUSH, POP, CLR, LDI 0. All of
2485 these deal with at least one Reg and are 1-word instructions. */
2487 gas_assert (op && 1 == op->insn_size);
2488 gas_assert (reg >= 0 && reg <= 31);
2490 if (strchr (op->constraints, 'r'))
2492 bin = op->bin_opcode | (reg << 4);
2494 else if (strchr (op->constraints, 'd'))
2496 gas_assert (reg >= 16);
2497 bin = op->bin_opcode | ((reg & 0xf) << 4);
2502 if (strchr (op->constraints, 'P'))
2504 bin |= ((sreg & 0x30) << 5) | (sreg & 0x0f);
2506 else if (0 == strcmp ("r=r", op->constraints))
2508 bin |= ((reg & 0x10) << 5) | (reg & 0x0f);
2511 gas_assert (0 == strcmp ("r", op->constraints)
2512 || 0 == strcmp ("ldi", op->name));
2514 bfd_putl16 ((bfd_vma) bin, *pwhere);
2515 (*pwhere) += 2 * op->insn_size;
2519 /* Turn rs_machine_dependent frag *FR into an ordinary rs_fill code frag,
2520 using information gathered in `avr_isr'. REG is the register number as
2521 supplied by Done chunk "__gcc_isr 0,REG". */
2524 avr_patch_gccisr_frag (fragS *fr, int reg)
2528 char *where = fr->fr_literal;
2529 const int tiny_p = avr_mcu->mach == bfd_mach_avrtiny;
2530 const int reg_tmp = tiny_p ? 16 : 0;
2531 const int reg_zero = 1 + reg_tmp;
2533 /* Clearing ZERO_REG on non-Tiny needs CLR which clobbers SREG. */
2535 avr_isr.need_sreg |= !tiny_p && avr_isr.need_reg_zero;
2537 /* A working register to PUSH / POP the SREG. We might use the register
2538 as supplied by ISR_CHUNK_Done for that purpose as GCC wants to push
2539 it anyways. If GCC passes ZERO_REG or TMP_REG, it has no clue (and
2540 no additional regs to safe) and we use that reg. */
2543 = avr_isr.need_reg_tmp ? reg_tmp
2544 : avr_isr.need_reg_zero ? reg_zero
2545 : avr_isr.need_sreg ? reg
2546 : reg > reg_zero ? reg
2551 /* Non-empty prologue / epilogue */
2553 if (ISR_CHUNK_Prologue == fr->fr_subtype)
2555 avr_emit_insn ("push", treg, &where);
2558 if (avr_isr.need_sreg)
2560 avr_emit_insn ("in", treg, &where);
2561 avr_emit_insn ("push", treg, &where);
2565 if (avr_isr.need_reg_zero)
2567 if (reg_zero != treg)
2569 avr_emit_insn ("push", reg_zero, &where);
2572 avr_emit_insn (tiny_p ? "ldi" : "clr", reg_zero, &where);
2575 if (reg > reg_zero && reg != treg)
2577 avr_emit_insn ("push", reg, &where);
2581 else if (ISR_CHUNK_Epilogue == fr->fr_subtype)
2583 /* Same logic as in Prologue but in reverse order and with counter
2584 parts of either instruction: POP instead of PUSH and OUT instead
2585 of IN. Clearing ZERO_REG has no couter part. */
2587 if (reg > reg_zero && reg != treg)
2588 avr_emit_insn ("pop", reg, &where);
2590 if (avr_isr.need_reg_zero
2591 && reg_zero != treg)
2592 avr_emit_insn ("pop", reg_zero, &where);
2594 if (avr_isr.need_sreg)
2596 avr_emit_insn ("pop", treg, &where);
2597 avr_emit_insn ("out", treg, &where);
2600 avr_emit_insn ("pop", treg, &where);
2606 if (ISR_CHUNK_Prologue == fr->fr_subtype
2607 && avr_isr.sym_n_pushed)
2609 symbolS *sy = avr_isr.sym_n_pushed;
2610 /* Turn magic `__gcc_isr.n_pushed' into its now known value. */
2612 sy->sy_value.X_op = O_constant;
2613 sy->sy_value.X_add_number = n_pushed;
2614 S_SET_SEGMENT (sy, expr_section);
2615 avr_isr.sym_n_pushed = NULL;
2618 /* Turn frag into ordinary code frag of now known size. */
2621 fr->fr_fix = (offsetT) (where - fr->fr_literal);
2622 gas_assert (fr->fr_fix <= fr->fr_offset);
2624 fr->fr_type = rs_fill;
2629 /* Implements `__gcc_isr' pseudo-instruction. For Prologue and Epilogue
2630 chunks, emit a new rs_machine_dependent frag. For Done chunks, traverse
2631 the current segment and patch all rs_machine_dependent frags to become
2632 appropriate rs_fill code frags. If chunks are seen in an odd ordering,
2633 throw an error instead. */
2636 avr_gccisr_operands (struct avr_opcodes_s *opcode, char **line)
2642 gas_assert (avr_opt.have_gccisr);
2644 /* We only use operands "N" and "r" which don't pop new fix-ups. */
2646 /* 1st operand: Which chunk of __gcc_isr: 0...2. */
2648 chunk = avr_operand (opcode, -1, "N", &str, NULL);
2649 if (chunk < 0 || chunk > 2)
2650 as_bad (_("%s requires value 0-2 as operand 1"), opcode->name);
2652 if (ISR_CHUNK_Done == chunk)
2654 /* 2nd operand: A register to push / pop. */
2656 str = skip_space (str);
2657 if (*str == '\0' || *str++ != ',')
2658 as_bad (_("`,' required"));
2660 avr_operand (opcode, -1, "r", &str, ®);
2665 /* Chunks must follow in a specific order:
2666 - Prologue: Exactly one
2667 - Epilogue: Any number
2668 - Done: Exactly one. */
2669 bad |= ISR_CHUNK_Prologue == chunk && avr_isr.prev_chunk != ISR_CHUNK_Done;
2670 bad |= ISR_CHUNK_Epilogue == chunk && avr_isr.prev_chunk == ISR_CHUNK_Done;
2671 bad |= ISR_CHUNK_Done == chunk && avr_isr.prev_chunk == ISR_CHUNK_Done;
2675 as_bad (_("`%s %d' after `%s %d' from %s:%u"), opcode->name, chunk,
2676 opcode->name, avr_isr.prev_chunk, avr_isr.file, avr_isr.line);
2678 as_bad (_("`%s %d' but no chunk open yet"), opcode->name, chunk);
2683 /* The longest sequence (prologue) might have up to 6 insns (words):
2692 unsigned int size = 2 * 6;
2697 case ISR_CHUNK_Prologue:
2698 avr_isr.need_reg_tmp = 0;
2699 avr_isr.need_reg_zero = 0;
2700 avr_isr.need_sreg = 0;
2701 avr_isr.sym_n_pushed = NULL;
2704 case ISR_CHUNK_Epilogue:
2705 /* Emit a new rs_machine_dependent fragment into the fragment chain.
2706 It will be patched and cleaned up once we see the matching
2708 frag_wane (frag_now);
2712 frag_now->fr_var = 1;
2713 frag_now->fr_offset = size;
2714 frag_now->fr_fix = 0;
2715 frag_now->fr_type = rs_machine_dependent;
2716 frag_now->fr_subtype = chunk;
2720 case ISR_CHUNK_Done:
2721 /* Traverse all frags of the current subseg and turn ones of type
2722 rs_machine_dependent into ordinary code as expected by GCC. */
2724 for (fr = frchain_now->frch_root; fr; fr = fr->fr_next)
2725 if (fr->fr_type == rs_machine_dependent)
2726 avr_patch_gccisr_frag (fr, reg);
2735 avr_isr.prev_chunk = chunk;
2736 avr_isr.file = as_where (&avr_isr.line);
2740 /* Callback used by the function below. Diagnose any dangling stuff from
2741 `__gcc_isr', i.e. frags of type rs_machine_dependent. Such frags should
2742 have been resolved during parse by ISR_CHUNK_Done. If such a frag is
2743 seen, report an error and turn it into something harmless. */
2746 avr_check_gccisr_done (bfd *abfd ATTRIBUTE_UNUSED,
2748 void *xxx ATTRIBUTE_UNUSED)
2750 segment_info_type *info = seg_info (section);
2752 if (SEG_NORMAL (section)
2753 /* BFD may have introduced its own sections without using
2754 subseg_new, so it is possible that seg_info is NULL. */
2760 for (frch = info->frchainP; frch; frch = frch->frch_next)
2761 for (fr = frch->frch_root; fr; fr = fr->fr_next)
2762 if (fr->fr_type == rs_machine_dependent)
2765 as_bad_where (avr_isr.file, avr_isr.line,
2766 _("dangling `__gcc_isr %d'"), avr_isr.prev_chunk);
2767 else if (!had_errors())
2768 as_bad (_("dangling `__gcc_isr'"));
2770 avr_isr.file = NULL;
2772 /* Avoid Internal errors due to rs_machine_dependent in the
2773 remainder: Turn frag into something harmless. */
2777 fr->fr_type = rs_fill;
2784 /* Implement `md_pre_output_hook' */
2785 /* Run over all relevant sections and diagnose any dangling `__gcc_isr'.
2786 This runs after parsing all inputs but before relaxing and writing. */
2789 avr_pre_output_hook (void)
2791 if (avr_opt.have_gccisr)
2792 bfd_map_over_sections (stdoutput, avr_check_gccisr_done, NULL);