Update assembler documentation on some AVR cores.
[external/binutils.git] / gas / config / tc-avr.c
1 /* tc-avr.c -- Assembler code for the ATMEL AVR
2
3    Copyright (C) 1999-2017 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 "struc-symbol.h"
27 #include "dwarf2dbg.h"
28 #include "dw2gencfi.h"
29 #include "elf/avr.h"
30 #include "elf32-avr.h"
31
32 /* For building a linked list of AVR_PROPERTY_RECORD structures.  */
33 struct avr_property_record_link
34 {
35   struct avr_property_record record;
36   struct avr_property_record_link *next;
37 };
38
39 struct avr_opcodes_s
40 {
41   const char *        name;
42   const char *        constraints;
43   const char *        opcode;
44   int           insn_size;              /* In words.  */
45   int           isa;
46   unsigned int  bin_opcode;
47 };
48
49 #define AVR_INSN(NAME, CONSTR, OPCODE, SIZE, ISA, BIN) \
50 {#NAME, CONSTR, OPCODE, SIZE, ISA, BIN},
51
52 struct avr_opcodes_s avr_opcodes[] =
53 {
54   #include "opcode/avr.h"
55   {NULL, NULL, NULL, 0, 0, 0}
56 };
57
58
59 /* Stuff for the `__gcc_isr' pseudo instruction.
60
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.
66
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.
71
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.
74
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
78    register.
79
80    __gcc_isr consists of 3 different "chunks":
81
82    __gcc_isr 1
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).
87
88         It will finish the current frag and emit a new frag of
89         type rs_machine_dependent, subtype ISR_CHUNK_Prologue.
90
91    __gcc_isr 2
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.
97
98         It will finish the current frag and emit a new frag of
99         type rs_machine_dependent, subtype ISR_CHUNK_Epilogue.
100
101    __gcc_isr 0, Rx
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.
105
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.
108
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.
113
114    Assumptions:
115
116         o  GCC takes care of code that is opaque to GAS like tail calls
117         or non-local goto.
118
119         o  Using SEI / CLI does not count as clobbering SREG.  This is
120         because a final RETI will restore the I-flag.
121
122         o  Using OUT or ST* is supposed not to clobber SREG.  Sequences like
123
124                 IN-SREG  +  CLI  +  Atomic-Code  +  OUT-SREG
125
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.
128 */
129
130 enum
131   {
132     ISR_CHUNK_Done = 0,
133     ISR_CHUNK_Prologue = 1,
134     ISR_CHUNK_Epilogue = 2
135   };
136
137 static struct
138 {
139   /* Previous __gcc_isr chunk (one of the enums above)
140      and it's location for diagnostics.  */
141   int prev_chunk;
142   unsigned line;
143   const char *file;
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;
147
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'.  */
150   int need_reg_tmp;
151   int need_reg_zero;
152   int need_sreg;
153 } avr_isr;
154
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;
158
159 const char comment_chars[] = ";";
160 const char line_comment_chars[] = "#";
161 const char line_separator_chars[] = "$";
162
163 const char *md_shortopts = "m:";
164 struct mcu_type_s
165 {
166   const char *name;
167   int isa;
168   int mach;
169 };
170
171 /* XXX - devices that don't seem to exist (renamed, replaced with larger
172    ones, or planned but never produced), left here for compatibility.  */
173
174 static struct mcu_type_s mcu_types[] =
175 {
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   {"attiny212",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
406   {"attiny214",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
407   {"attiny412",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
408   {"attiny414",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
409   {"attiny416",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
410   {"attiny417",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
411   {"attiny814",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
412   {"attiny816",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
413   {"attiny817",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
414   {"attiny1614",  AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
415   {"attiny1616",  AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
416   {"attiny1617",  AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
417   {"attiny3214",  AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
418   {"attiny3216",  AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
419   {"attiny3217",  AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
420   {"atxmega64a3", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
421   {"atxmega64a3u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
422   {"atxmega64a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
423   {"atxmega64b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
424   {"atxmega64b3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
425   {"atxmega64c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
426   {"atxmega64d3", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
427   {"atxmega64d4", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
428   {"atxmega64a1", AVR_ISA_XMEGA,  bfd_mach_avrxmega5},
429   {"atxmega64a1u",AVR_ISA_XMEGAU, bfd_mach_avrxmega5},
430   {"atxmega128a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
431   {"atxmega128a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
432   {"atxmega128b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
433   {"atxmega128b3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
434   {"atxmega128c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
435   {"atxmega128d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
436   {"atxmega128d4", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
437   {"atxmega192a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
438   {"atxmega192a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
439   {"atxmega192c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
440   {"atxmega192d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
441   {"atxmega256a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
442   {"atxmega256a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
443   {"atxmega256a3b",AVR_ISA_XMEGA, bfd_mach_avrxmega6},
444   {"atxmega256a3bu",AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
445   {"atxmega256c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
446   {"atxmega256d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
447   {"atxmega384c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
448   {"atxmega384d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
449   {"atxmega128a1", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
450   {"atxmega128a1u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7},
451   {"atxmega128a4u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7},
452   {"attiny4",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
453   {"attiny5",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
454   {"attiny9",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
455   {"attiny10",     AVR_ISA_AVRTINY, bfd_mach_avrtiny},
456   {"attiny20",     AVR_ISA_AVRTINY, bfd_mach_avrtiny},
457   {"attiny40",     AVR_ISA_AVRTINY, bfd_mach_avrtiny},
458   {NULL, 0, 0}
459 };
460
461
462 /* Current MCU type.  */
463 static struct mcu_type_s   default_mcu = {"avr2", AVR_ISA_AVR2, bfd_mach_avr2};
464 static struct mcu_type_s   specified_mcu;
465 static struct mcu_type_s * avr_mcu = & default_mcu;
466
467 /* AVR target-specific switches.  */
468 struct avr_opt_s
469 {
470   int all_opcodes;  /* -mall-opcodes: accept all known AVR opcodes.  */
471   int no_skip_bug;  /* -mno-skip-bug: no warnings for skipping 2-word insns.  */
472   int no_wrap;      /* -mno-wrap: reject rjmp/rcall with 8K wrap-around.  */
473   int no_link_relax;   /* -mno-link-relax / -mlink-relax: generate (or not)
474                           relocations for linker relaxation.  */
475   int have_gccisr;      /* Whether "__gcc_isr" is a known (pseudo) insn.  */
476 };
477
478 static struct avr_opt_s avr_opt = { 0, 0, 0, 0, 0 };
479
480 const char EXP_CHARS[] = "eE";
481 const char FLT_CHARS[] = "dD";
482
483 static void avr_set_arch (int);
484
485 /* The target specific pseudo-ops which we support.  */
486 const pseudo_typeS md_pseudo_table[] =
487 {
488   {"arch", avr_set_arch,        0},
489   { NULL,       NULL,           0}
490 };
491
492 #define LDI_IMMEDIATE(x) (((x) & 0xf) | (((x) << 4) & 0xf00))
493
494 #define EXP_MOD_NAME(i)       exp_mod[i].name
495 #define EXP_MOD_RELOC(i)      exp_mod[i].reloc
496 #define EXP_MOD_NEG_RELOC(i)  exp_mod[i].neg_reloc
497 #define HAVE_PM_P(i)          exp_mod[i].have_pm
498
499 struct exp_mod_s
500 {
501   const char *                    name;
502   bfd_reloc_code_real_type  reloc;
503   bfd_reloc_code_real_type  neg_reloc;
504   int                       have_pm;
505 };
506
507 static struct exp_mod_s exp_mod[] =
508 {
509   {"hh8",    BFD_RELOC_AVR_HH8_LDI,    BFD_RELOC_AVR_HH8_LDI_NEG,    1},
510   {"pm_hh8", BFD_RELOC_AVR_HH8_LDI_PM, BFD_RELOC_AVR_HH8_LDI_PM_NEG, 0},
511   {"hi8",    BFD_RELOC_AVR_HI8_LDI,    BFD_RELOC_AVR_HI8_LDI_NEG,    1},
512   {"pm_hi8", BFD_RELOC_AVR_HI8_LDI_PM, BFD_RELOC_AVR_HI8_LDI_PM_NEG, 0},
513   {"lo8",    BFD_RELOC_AVR_LO8_LDI,    BFD_RELOC_AVR_LO8_LDI_NEG,    1},
514   {"pm_lo8", BFD_RELOC_AVR_LO8_LDI_PM, BFD_RELOC_AVR_LO8_LDI_PM_NEG, 0},
515   {"hlo8",   BFD_RELOC_AVR_HH8_LDI,    BFD_RELOC_AVR_HH8_LDI_NEG,    0},
516   {"hhi8",   BFD_RELOC_AVR_MS8_LDI,    BFD_RELOC_AVR_MS8_LDI_NEG,    0},
517 };
518
519 /* A union used to store indices into the exp_mod[] array
520    in a hash table which expects void * data types.  */
521 typedef union
522 {
523   void * ptr;
524   int    index;
525 } mod_index;
526
527 /* Opcode hash table.  */
528 static struct hash_control *avr_hash;
529
530 /* Reloc modifiers hash control (hh8,hi8,lo8,pm_xx).  */
531 static struct hash_control *avr_mod_hash;
532
533 /* Whether some opcode does not change SREG.  */
534 static struct hash_control *avr_no_sreg_hash;
535
536 static const char* const avr_no_sreg[] =
537   {
538     /* Arithmetic */
539     "ldi", "swap", "mov", "movw",
540     /* Special instructions.  I-Flag will be restored by RETI, and we don't
541        consider I-Flag as being clobbered when changed.  */
542     "sei", "cli", "reti", "brie", "brid",
543     "nop", "wdr", "sleep",
544     /* Load / Store */
545     "ld", "ldd", "lds", "pop",  "in", "lpm", "elpm",
546     "st", "std", "sts", "push", "out",
547     /* Jumps and Calls.  Calls might call code that changes SREG.
548        GCC has to filter out ABI calls.  The non-ABI transparent calls
549        must use [R]CALL and are filtered out now by not mentioning them.  */
550     "rjmp", "jmp", "ijmp", "ret",
551     /* Skipping.  Branches need SREG to be set, hence we regard them
552        as if they changed SREG and don't list them here.  */
553     "sbrc", "sbrs", "sbic", "sbis", "cpse",
554     /* I/O Manipulation */
555     "sbi", "cbi",
556     /* Read-Modify-Write */
557     "lac", "las", "lat", "xch"
558   };
559
560 #define OPTION_MMCU 'm'
561 enum options
562 {
563   OPTION_ALL_OPCODES = OPTION_MD_BASE + 1,
564   OPTION_NO_SKIP_BUG,
565   OPTION_NO_WRAP,
566   OPTION_ISA_RMW,
567   OPTION_LINK_RELAX,
568   OPTION_NO_LINK_RELAX,
569   OPTION_HAVE_GCCISR
570 };
571
572 struct option md_longopts[] =
573 {
574   { "mmcu",   required_argument, NULL, OPTION_MMCU        },
575   { "mall-opcodes", no_argument, NULL, OPTION_ALL_OPCODES },
576   { "mno-skip-bug", no_argument, NULL, OPTION_NO_SKIP_BUG },
577   { "mno-wrap",     no_argument, NULL, OPTION_NO_WRAP     },
578   { "mrmw",         no_argument, NULL, OPTION_ISA_RMW     },
579   { "mlink-relax",  no_argument, NULL, OPTION_LINK_RELAX  },
580   { "mno-link-relax",  no_argument, NULL, OPTION_NO_LINK_RELAX  },
581   { "mgcc-isr",     no_argument, NULL, OPTION_HAVE_GCCISR },
582   { NULL, no_argument, NULL, 0 }
583 };
584
585 size_t md_longopts_size = sizeof (md_longopts);
586
587 /* Display nicely formatted list of known MCU names.  */
588
589 static void
590 show_mcu_list (FILE *stream)
591 {
592   int i, x;
593
594   fprintf (stream, _("Known MCU names:"));
595   x = 1000;
596
597   for (i = 0; mcu_types[i].name; i++)
598     {
599       int len = strlen (mcu_types[i].name);
600
601       x += len + 1;
602
603       if (x < 75)
604         fprintf (stream, " %s", mcu_types[i].name);
605       else
606         {
607           fprintf (stream, "\n  %s", mcu_types[i].name);
608           x = len + 2;
609         }
610     }
611
612   fprintf (stream, "\n");
613 }
614
615 static inline char *
616 skip_space (char *s)
617 {
618   while (*s == ' ' || *s == '\t')
619     ++s;
620   return s;
621 }
622
623 /* Extract one word from FROM and copy it to TO.  */
624
625 static char *
626 extract_word (char *from, char *to, int limit)
627 {
628   char *op_end;
629   int size = 0;
630
631   /* Drop leading whitespace.  */
632   from = skip_space (from);
633   *to = 0;
634
635   /* Find the op code end.  */
636   for (op_end = from; *op_end != 0 && is_part_of_name (*op_end);)
637     {
638       to[size++] = *op_end++;
639       if (size + 1 >= limit)
640         break;
641     }
642
643   to[size] = 0;
644   return op_end;
645 }
646
647 int
648 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
649                                asection *seg ATTRIBUTE_UNUSED)
650 {
651   abort ();
652   return 0;
653 }
654
655 void
656 md_show_usage (FILE *stream)
657 {
658   fprintf (stream,
659       _("AVR Assembler options:\n"
660         "  -mmcu=[avr-name] select microcontroller variant\n"
661         "                   [avr-name] can be:\n"
662         "                   avr1  - classic AVR core without data RAM\n"
663         "                   avr2  - classic AVR core with up to 8K program memory\n"
664         "                   avr25 - classic AVR core with up to 8K program memory\n"
665         "                           plus the MOVW instruction\n"
666         "                   avr3  - classic AVR core with up to 64K program memory\n"
667         "                   avr31 - classic AVR core with up to 128K program memory\n"
668         "                   avr35 - classic AVR core with up to 64K program memory\n"
669         "                           plus the MOVW instruction\n"
670         "                   avr4  - enhanced AVR core with up to 8K program memory\n"
671         "                   avr5  - enhanced AVR core with up to 64K program memory\n"
672         "                   avr51 - enhanced AVR core with up to 128K program memory\n"
673         "                   avr6  - enhanced AVR core with up to 256K program memory\n"
674         "                   avrxmega2 - XMEGA, > 8K, < 64K FLASH, < 64K RAM\n"
675         "                   avrxmega3 - XMEGA, RAM + FLASH < 64K, Flash visible in RAM\n"
676         "                   avrxmega4 - XMEGA, > 64K, <= 128K FLASH, <= 64K RAM\n"
677         "                   avrxmega5 - XMEGA, > 64K, <= 128K FLASH, > 64K RAM\n"
678         "                   avrxmega6 - XMEGA, > 128K, <= 256K FLASH, <= 64K RAM\n"
679         "                   avrxmega7 - XMEGA, > 128K, <= 256K FLASH, > 64K RAM\n"
680         "                   avrtiny   - AVR Tiny core with 16 gp registers\n"));
681   fprintf (stream,
682       _("  -mall-opcodes    accept all AVR opcodes, even if not supported by MCU\n"
683         "  -mno-skip-bug    disable warnings for skipping two-word instructions\n"
684         "                   (default for avr4, avr5)\n"
685         "  -mno-wrap        reject rjmp/rcall instructions with 8K wrap-around\n"
686         "                   (default for avr3, avr5)\n"
687         "  -mrmw            accept Read-Modify-Write instructions\n"
688         "  -mlink-relax     generate relocations for linker relaxation (default)\n"
689         "  -mno-link-relax  don't generate relocations for linker relaxation.\n"
690         "  -mgcc-isr        accept the __gcc_isr pseudo-instruction.\n"
691         ));
692   show_mcu_list (stream);
693 }
694
695 static void
696 avr_set_arch (int dummy ATTRIBUTE_UNUSED)
697 {
698   char str[20];
699
700   input_line_pointer = extract_word (input_line_pointer, str, 20);
701   md_parse_option (OPTION_MMCU, str);
702   bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
703 }
704
705 int
706 md_parse_option (int c, const char *arg)
707 {
708   switch (c)
709     {
710     case OPTION_MMCU:
711       {
712         int i;
713
714         for (i = 0; mcu_types[i].name; ++i)
715           if (strcasecmp (mcu_types[i].name, arg) == 0)
716             break;
717
718         if (!mcu_types[i].name)
719           {
720             show_mcu_list (stderr);
721             as_fatal (_("unknown MCU: %s\n"), arg);
722           }
723
724         /* It is OK to redefine mcu type within the same avr[1-5] bfd machine
725            type - this for allows passing -mmcu=... via gcc ASM_SPEC as well
726            as .arch ... in the asm output at the same time.  */
727         if (avr_mcu == &default_mcu || avr_mcu->mach == mcu_types[i].mach)
728           {
729             specified_mcu.name = mcu_types[i].name;
730             specified_mcu.isa  |= mcu_types[i].isa;
731             specified_mcu.mach = mcu_types[i].mach;
732             avr_mcu = &specified_mcu;
733           }
734         else
735           as_fatal (_("redefinition of mcu type `%s' to `%s'"),
736                     avr_mcu->name, mcu_types[i].name);
737         return 1;
738       }
739     case OPTION_ALL_OPCODES:
740       avr_opt.all_opcodes = 1;
741       return 1;
742     case OPTION_NO_SKIP_BUG:
743       avr_opt.no_skip_bug = 1;
744       return 1;
745     case OPTION_NO_WRAP:
746       avr_opt.no_wrap = 1;
747       return 1;
748     case OPTION_ISA_RMW:
749       specified_mcu.isa |= AVR_ISA_RMW;
750       return 1;
751     case OPTION_LINK_RELAX:
752       avr_opt.no_link_relax = 0;
753       return 1;
754     case OPTION_NO_LINK_RELAX:
755       avr_opt.no_link_relax = 1;
756       return 1;
757     case OPTION_HAVE_GCCISR:
758       avr_opt.have_gccisr = 1;
759       return 1;
760     }
761
762   return 0;
763 }
764
765
766 /* Implement `md_undefined_symbol' */
767 /* If we are in `__gcc_isr' chunk, pop up `__gcc_isr.n_pushed.<NUM>'
768    instead of `__gcc_isr.n_pushed'.  This will be resolved by the Done
769    chunk in `avr_patch_gccisr_frag' to the number of PUSHes produced by
770    the Prologue chunk.  */
771
772 symbolS *
773 avr_undefined_symbol (char *name)
774 {
775   if (ISR_CHUNK_Done != avr_isr.prev_chunk
776       && 0 == strcmp (name, "__gcc_isr.n_pushed"))
777     {
778       if (!avr_isr.sym_n_pushed)
779         {
780           static unsigned suffix;
781           char xname[30];
782           sprintf (xname, "%s.%03u", name, (++suffix) % 1000);
783           avr_isr.sym_n_pushed = symbol_new (xname, undefined_section,
784                                              (valueT) 0, &zero_address_frag);
785         }
786       return avr_isr.sym_n_pushed;
787     }
788
789   return NULL;
790 }
791
792 const char *
793 md_atof (int type, char *litP, int *sizeP)
794 {
795   return ieee_md_atof (type, litP, sizeP, FALSE);
796 }
797
798 void
799 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
800                  asection *sec ATTRIBUTE_UNUSED,
801                  fragS *fragP ATTRIBUTE_UNUSED)
802 {
803   abort ();
804 }
805
806 void
807 md_begin (void)
808 {
809   unsigned int i;
810   struct avr_opcodes_s *opcode;
811
812   avr_hash = hash_new ();
813
814   /* Insert unique names into hash table.  This hash table then provides a
815      quick index to the first opcode with a particular name in the opcode
816      table.  */
817   for (opcode = avr_opcodes; opcode->name; opcode++)
818     hash_insert (avr_hash, opcode->name, (char *) opcode);
819
820   avr_mod_hash = hash_new ();
821
822   for (i = 0; i < ARRAY_SIZE (exp_mod); ++i)
823     {
824       mod_index m;
825
826       m.index = i + 10;
827       hash_insert (avr_mod_hash, EXP_MOD_NAME (i), m.ptr);
828     }
829
830   avr_no_sreg_hash = hash_new ();
831
832   for (i = 0; i < ARRAY_SIZE (avr_no_sreg); ++i)
833     {
834       gas_assert (hash_find (avr_hash, avr_no_sreg[i]));
835       hash_insert (avr_no_sreg_hash, avr_no_sreg[i], (char*) 4 /* dummy */);
836     }
837
838   avr_gccisr_opcode = (struct avr_opcodes_s*) hash_find (avr_hash, "__gcc_isr");
839   gas_assert (avr_gccisr_opcode);
840
841   bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
842   linkrelax = !avr_opt.no_link_relax;
843 }
844
845 /* Resolve STR as a constant expression and return the result.
846    If result greater than MAX then error.  */
847
848 static unsigned int
849 avr_get_constant (char *str, int max)
850 {
851   expressionS ex;
852
853   str = skip_space (str);
854   input_line_pointer = str;
855   expression (& ex);
856
857   if (ex.X_op != O_constant)
858     as_bad (_("constant value required"));
859
860   if (ex.X_add_number > max || ex.X_add_number < 0)
861     as_bad (_("number must be positive and less than %d"), max + 1);
862
863   return ex.X_add_number;
864 }
865
866 /* Parse for ldd/std offset.  */
867
868 static void
869 avr_offset_expression (expressionS *exp)
870 {
871   char *str = input_line_pointer;
872   char *tmp;
873   char op[8];
874
875   tmp = str;
876   str = extract_word (str, op, sizeof (op));
877
878   input_line_pointer = tmp;
879   expression (exp);
880
881   /* Warn about expressions that fail to use lo8 ().  */
882   if (exp->X_op == O_constant)
883     {
884       int x = exp->X_add_number;
885
886       if (x < -255 || x > 255)
887         as_warn (_("constant out of 8-bit range: %d"), x);
888     }
889 }
890
891 /* Parse ordinary expression.  */
892
893 static char *
894 parse_exp (char *s, expressionS *op)
895 {
896   input_line_pointer = s;
897   expression (op);
898   if (op->X_op == O_absent)
899     as_bad (_("missing operand"));
900   return input_line_pointer;
901 }
902
903 /* Parse special expressions (needed for LDI command):
904    xx8 (address)
905    xx8 (-address)
906    pm_xx8 (address)
907    pm_xx8 (-address)
908    where xx is: hh, hi, lo.  */
909
910 static bfd_reloc_code_real_type
911 avr_ldi_expression (expressionS *exp)
912 {
913   char *str = input_line_pointer;
914   char *tmp;
915   char op[8];
916   int mod;
917   int linker_stubs_should_be_generated = 0;
918
919   tmp = str;
920
921   str = extract_word (str, op, sizeof (op));
922
923   if (op[0])
924     {
925       mod_index m;
926
927       m.ptr = hash_find (avr_mod_hash, op);
928       mod = m.index;
929
930       if (mod)
931         {
932           int closes = 0;
933
934           mod -= 10;
935           str = skip_space (str);
936
937           if (*str == '(')
938             {
939               bfd_reloc_code_real_type  reloc_to_return;
940               int neg_p = 0;
941
942               ++str;
943
944               if (strncmp ("pm(", str, 3) == 0
945                   || strncmp ("gs(",str,3) == 0
946                   || strncmp ("-(gs(",str,5) == 0
947                   || strncmp ("-(pm(", str, 5) == 0)
948                 {
949                   if (HAVE_PM_P (mod))
950                     {
951                       ++mod;
952                       ++closes;
953                     }
954                   else
955                     as_bad (_("illegal expression"));
956
957                   if (str[0] == 'g' || str[2] == 'g')
958                     linker_stubs_should_be_generated = 1;
959
960                   if (*str == '-')
961                     {
962                       neg_p = 1;
963                       ++closes;
964                       str += 5;
965                     }
966                   else
967                     str += 3;
968                 }
969
970               if (*str == '-' && *(str + 1) == '(')
971                 {
972                   neg_p ^= 1;
973                   ++closes;
974                   str += 2;
975                 }
976
977               input_line_pointer = str;
978               expression (exp);
979
980               do
981                 {
982                   if (*input_line_pointer != ')')
983                     {
984                       as_bad (_("`)' required"));
985                       break;
986                     }
987                   input_line_pointer++;
988                 }
989               while (closes--);
990
991               reloc_to_return =
992                 neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod);
993               if (linker_stubs_should_be_generated)
994                 {
995                   switch (reloc_to_return)
996                     {
997                     case BFD_RELOC_AVR_LO8_LDI_PM:
998                       reloc_to_return = BFD_RELOC_AVR_LO8_LDI_GS;
999                       break;
1000                     case BFD_RELOC_AVR_HI8_LDI_PM:
1001                       reloc_to_return = BFD_RELOC_AVR_HI8_LDI_GS;
1002                       break;
1003
1004                     default:
1005                       /* PR 5523: Do not generate a warning here,
1006                          legitimate code can trigger this case.  */
1007                       break;
1008                     }
1009                 }
1010               return reloc_to_return;
1011             }
1012         }
1013     }
1014
1015   input_line_pointer = tmp;
1016   expression (exp);
1017
1018   /* Warn about expressions that fail to use lo8 ().  */
1019   if (exp->X_op == O_constant)
1020     {
1021       int x = exp->X_add_number;
1022
1023       if (x < -255 || x > 255)
1024         as_warn (_("constant out of 8-bit range: %d"), x);
1025     }
1026
1027   return BFD_RELOC_AVR_LDI;
1028 }
1029
1030 /* Parse one instruction operand.
1031    Return operand bitmask.  Also fixups can be generated.  */
1032
1033 static unsigned int
1034 avr_operand (struct avr_opcodes_s *opcode,
1035              int where,
1036              const char *op,
1037              char **line,
1038              int *pregno)
1039 {
1040   expressionS op_expr;
1041   unsigned int op_mask = 0;
1042   char *str = skip_space (*line);
1043
1044   switch (*op)
1045     {
1046       /* Any register operand.  */
1047     case 'w':
1048     case 'd':
1049     case 'r':
1050     case 'a':
1051     case 'v':
1052       {
1053         char * old_str = str;
1054         char *lower;
1055         char r_name[20];
1056
1057         str = extract_word (str, r_name, sizeof (r_name));
1058         for (lower = r_name; *lower; ++lower)
1059           {
1060             if (*lower >= 'A' && *lower <= 'Z')
1061               *lower += 'a' - 'A';
1062           }
1063
1064         if (r_name[0] == 'r' && ISDIGIT (r_name[1]) && r_name[2] == 0)
1065           /* Single-digit register number, ie r0-r9.  */
1066           op_mask = r_name[1] - '0';
1067         else if (r_name[0] == 'r' && ISDIGIT (r_name[1])
1068                  && ISDIGIT (r_name[2]) && r_name[3] == 0)
1069           /* Double-digit register number, ie r10 - r32.  */
1070           op_mask = (r_name[1] - '0') * 10 + r_name[2] - '0';
1071         else if (r_name[0] >= 'x' && r_name[0] <= 'z'
1072                  && (r_name[1] == 'l' || r_name[1] == 'h') && r_name[2] == 0)
1073           /* Registers r26-r31 referred to by name, ie xl, xh, yl, yh, zl, zh.  */
1074           op_mask = (r_name[0] - 'x') * 2 + (r_name[1] == 'h') + 26;
1075         else if ((*op == 'v' || *op == 'w')
1076                  && r_name[0] >= 'x' && r_name[0] <= 'z' && r_name[1] == 0)
1077           /* For the movw and addiw instructions, refer to registers x, y and z by name.  */
1078           op_mask = (r_name[0] - 'x') * 2 + 26;
1079         else
1080           {
1081             /* Numeric or symbolic constant register number.  */
1082             op_mask = avr_get_constant (old_str, 31);
1083             str = input_line_pointer;
1084           }
1085       }
1086
1087       if (pregno)
1088         *pregno = op_mask;
1089
1090       if (avr_mcu->mach == bfd_mach_avrtiny)
1091         {
1092           if (op_mask < 16 || op_mask > 31)
1093             {
1094               as_bad (_("register name or number from 16 to 31 required"));
1095               break;
1096             }
1097         }
1098       else if (op_mask > 31)
1099         {
1100           as_bad (_("register name or number from 0 to 31 required"));
1101           break;
1102         }
1103
1104           switch (*op)
1105             {
1106             case 'a':
1107               if (op_mask < 16 || op_mask > 23)
1108                 as_bad (_("register r16-r23 required"));
1109               op_mask -= 16;
1110               break;
1111
1112             case 'd':
1113               if (op_mask < 16)
1114                 as_bad (_("register number above 15 required"));
1115               op_mask -= 16;
1116               break;
1117
1118             case 'v':
1119               if (op_mask & 1)
1120                 as_bad (_("even register number required"));
1121               op_mask >>= 1;
1122               break;
1123
1124             case 'w':
1125               if ((op_mask & 1) || op_mask < 24)
1126                 as_bad (_("register r24, r26, r28 or r30 required"));
1127               op_mask = (op_mask - 24) >> 1;
1128               break;
1129             }
1130           break;
1131
1132     case 'e':
1133       {
1134         char c;
1135
1136         if (*str == '-')
1137           {
1138             str = skip_space (str + 1);
1139             op_mask = 0x1002;
1140           }
1141         c = TOLOWER (*str);
1142         if (c == 'x')
1143           op_mask |= 0x100c;
1144         else if (c == 'y')
1145           op_mask |= 0x8;
1146         else if (c != 'z')
1147           as_bad (_("pointer register (X, Y or Z) required"));
1148
1149         str = skip_space (str + 1);
1150         if (*str == '+')
1151           {
1152             ++str;
1153             if (op_mask & 2)
1154               as_bad (_("cannot both predecrement and postincrement"));
1155             op_mask |= 0x1001;
1156           }
1157
1158         /* avr1 can do "ld r,Z" and "st Z,r" but no other pointer
1159            registers, no predecrement, no postincrement.  */
1160         if (!avr_opt.all_opcodes && (op_mask & 0x100F)
1161             && !(avr_mcu->isa & AVR_ISA_SRAM))
1162           as_bad (_("addressing mode not supported"));
1163       }
1164       break;
1165
1166     case 'z':
1167       if (*str == '-')
1168         as_bad (_("can't predecrement"));
1169
1170       if (! (*str == 'z' || *str == 'Z'))
1171         as_bad (_("pointer register Z required"));
1172
1173       str = skip_space (str + 1);
1174
1175       if (*str == '+')
1176         {
1177           ++str;
1178           const char *s;
1179           for (s = opcode->opcode; *s; ++s)
1180             {
1181               if (*s == '+')
1182                 op_mask |= (1 << (15 - (s - opcode->opcode)));
1183             }
1184         }
1185
1186       /* attiny26 can do "lpm" and "lpm r,Z" but not "lpm r,Z+".  */
1187       if (!avr_opt.all_opcodes
1188           && (op_mask & 0x0001)
1189           && !(avr_mcu->isa & AVR_ISA_MOVW))
1190         as_bad (_("postincrement not supported"));
1191       break;
1192
1193     case 'b':
1194       {
1195         char c = TOLOWER (*str++);
1196
1197         if (c == 'y')
1198           op_mask |= 0x8;
1199         else if (c != 'z')
1200           as_bad (_("pointer register (Y or Z) required"));
1201         str = skip_space (str);
1202         if (*str++ == '+')
1203           {
1204             input_line_pointer = str;
1205             avr_offset_expression (& op_expr);
1206             str = input_line_pointer;
1207             fix_new_exp (frag_now, where, 3,
1208                          &op_expr, FALSE, BFD_RELOC_AVR_6);
1209           }
1210       }
1211       break;
1212
1213     case 'h':
1214       str = parse_exp (str, &op_expr);
1215       fix_new_exp (frag_now, where, opcode->insn_size * 2,
1216                    &op_expr, FALSE, BFD_RELOC_AVR_CALL);
1217       break;
1218
1219     case 'L':
1220       str = parse_exp (str, &op_expr);
1221       fix_new_exp (frag_now, where, opcode->insn_size * 2,
1222                    &op_expr, TRUE, BFD_RELOC_AVR_13_PCREL);
1223       break;
1224
1225     case 'l':
1226       str = parse_exp (str, &op_expr);
1227       fix_new_exp (frag_now, where, opcode->insn_size * 2,
1228                    &op_expr, TRUE, BFD_RELOC_AVR_7_PCREL);
1229       break;
1230
1231     case 'i':
1232       str = parse_exp (str, &op_expr);
1233       fix_new_exp (frag_now, where + 2, opcode->insn_size * 2,
1234                    &op_expr, FALSE, BFD_RELOC_16);
1235       break;
1236
1237     case 'j':
1238       str = parse_exp (str, &op_expr);
1239       fix_new_exp (frag_now, where, opcode->insn_size * 2,
1240                    &op_expr, FALSE, BFD_RELOC_AVR_LDS_STS_16);
1241       break;
1242
1243     case 'M':
1244       {
1245         bfd_reloc_code_real_type r_type;
1246
1247         input_line_pointer = str;
1248         r_type = avr_ldi_expression (&op_expr);
1249         str = input_line_pointer;
1250         fix_new_exp (frag_now, where, 3,
1251                      &op_expr, FALSE, r_type);
1252       }
1253       break;
1254
1255     case 'n':
1256       {
1257         unsigned int x;
1258
1259         x = ~avr_get_constant (str, 255);
1260         str = input_line_pointer;
1261         op_mask |= (x & 0xf) | ((x << 4) & 0xf00);
1262       }
1263       break;
1264
1265     case 'N':
1266       {
1267         unsigned int x;
1268
1269         x = avr_get_constant (str, 255);
1270         str = input_line_pointer;
1271         op_mask = x;
1272       }
1273       break;
1274
1275     case 'K':
1276       input_line_pointer = str;
1277       avr_offset_expression (& op_expr);
1278       str = input_line_pointer;
1279       fix_new_exp (frag_now, where, 3,
1280                    & op_expr, FALSE, BFD_RELOC_AVR_6_ADIW);
1281       break;
1282
1283     case 'S':
1284     case 's':
1285       {
1286         unsigned int x;
1287
1288         x = avr_get_constant (str, 7);
1289         str = input_line_pointer;
1290         if (*op == 'S')
1291           x <<= 4;
1292         op_mask |= x;
1293       }
1294       break;
1295
1296     case 'P':
1297       str = parse_exp (str, &op_expr);
1298       fix_new_exp (frag_now, where, opcode->insn_size * 2,
1299                      &op_expr, FALSE, BFD_RELOC_AVR_PORT6);
1300       break;
1301
1302     case 'p':
1303       str = parse_exp (str, &op_expr);
1304       fix_new_exp (frag_now, where, opcode->insn_size * 2,
1305                      &op_expr, FALSE, BFD_RELOC_AVR_PORT5);
1306       break;
1307
1308     case 'E':
1309       {
1310         unsigned int x;
1311
1312         x = avr_get_constant (str, 15);
1313         str = input_line_pointer;
1314         op_mask |= (x << 4);
1315       }
1316       break;
1317
1318     case '?':
1319       break;
1320
1321     default:
1322       as_bad (_("unknown constraint `%c'"), *op);
1323     }
1324
1325   *line = str;
1326   return op_mask;
1327 }
1328
1329 /* Parse instruction operands.
1330    Return binary opcode.  */
1331
1332 static unsigned int
1333 avr_operands (struct avr_opcodes_s *opcode, char **line)
1334 {
1335   const char *op = opcode->constraints;
1336   unsigned int bin = opcode->bin_opcode;
1337   char *frag = frag_more (opcode->insn_size * 2);
1338   char *str = *line;
1339   int where = frag - frag_now->fr_literal;
1340   static unsigned int prev = 0;  /* Previous opcode.  */
1341   int regno1 = -2;
1342   int regno2 = -2;
1343
1344   /* Opcode have operands.  */
1345   if (*op)
1346     {
1347       unsigned int reg1 = 0;
1348       unsigned int reg2 = 0;
1349       int reg1_present = 0;
1350       int reg2_present = 0;
1351
1352       /* Parse first operand.  */
1353       if (REGISTER_P (*op))
1354         reg1_present = 1;
1355       reg1 = avr_operand (opcode, where, op, &str, &regno1);
1356       ++op;
1357
1358       /* Parse second operand.  */
1359       if (*op)
1360         {
1361           if (*op == ',')
1362             ++op;
1363
1364           if (*op == '=')
1365             {
1366               reg2 = reg1;
1367               reg2_present = 1;
1368               regno2 = regno1;
1369             }
1370           else
1371             {
1372               if (REGISTER_P (*op))
1373                 reg2_present = 1;
1374
1375               str = skip_space (str);
1376               if (*str++ != ',')
1377                 as_bad (_("`,' required"));
1378               str = skip_space (str);
1379
1380               reg2 = avr_operand (opcode, where, op, &str, &regno2);
1381             }
1382
1383           if (reg1_present && reg2_present)
1384             reg2 = (reg2 & 0xf) | ((reg2 << 5) & 0x200);
1385           else if (reg2_present)
1386             reg2 <<= 4;
1387         }
1388       if (reg1_present)
1389         reg1 <<= 4;
1390       bin |= reg1 | reg2;
1391     }
1392
1393   if (avr_opt.have_gccisr)
1394     avr_update_gccisr (opcode, regno1, regno2);
1395
1396   /* Detect undefined combinations (like ld r31,Z+).  */
1397   if (!avr_opt.all_opcodes && AVR_UNDEF_P (bin))
1398     as_warn (_("undefined combination of operands"));
1399
1400   if (opcode->insn_size == 2)
1401     {
1402       /* Warn if the previous opcode was cpse/sbic/sbis/sbrc/sbrs
1403          (AVR core bug, fixed in the newer devices).  */
1404       if (!(avr_opt.no_skip_bug ||
1405             (avr_mcu->isa & (AVR_ISA_MUL | AVR_ISA_MOVW)))
1406           && AVR_SKIP_P (prev))
1407         as_warn (_("skipping two-word instruction"));
1408
1409       bfd_putl32 ((bfd_vma) bin, frag);
1410     }
1411   else
1412     bfd_putl16 ((bfd_vma) bin, frag);
1413
1414   prev = bin;
1415   *line = str;
1416   return bin;
1417 }
1418
1419 /* GAS will call this function for each section at the end of the assembly,
1420    to permit the CPU backend to adjust the alignment of a section.  */
1421
1422 valueT
1423 md_section_align (asection *seg, valueT addr)
1424 {
1425   int align = bfd_get_section_alignment (stdoutput, seg);
1426   return ((addr + (1 << align) - 1) & (-1UL << align));
1427 }
1428
1429 /* If you define this macro, it should return the offset between the
1430    address of a PC relative fixup and the position from which the PC
1431    relative adjustment should be made.  On many processors, the base
1432    of a PC relative instruction is the next instruction, so this
1433    macro would return the length of an instruction.  */
1434
1435 long
1436 md_pcrel_from_section (fixS *fixp, segT sec)
1437 {
1438   if (fixp->fx_addsy != (symbolS *) NULL
1439       && (!S_IS_DEFINED (fixp->fx_addsy)
1440           || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1441     return 0;
1442
1443   return fixp->fx_frag->fr_address + fixp->fx_where;
1444 }
1445
1446 static bfd_boolean
1447 relaxable_section (asection *sec)
1448 {
1449   return ((sec->flags & SEC_DEBUGGING) == 0
1450           && (sec->flags & SEC_CODE) != 0
1451           && (sec->flags & SEC_ALLOC) != 0);
1452 }
1453
1454 /* Does whatever the xtensa port does.  */
1455 int
1456 avr_validate_fix_sub (fixS *fix)
1457 {
1458   segT add_symbol_segment, sub_symbol_segment;
1459
1460   /* The difference of two symbols should be resolved by the assembler when
1461      linkrelax is not set.  If the linker may relax the section containing
1462      the symbols, then an Xtensa DIFF relocation must be generated so that
1463      the linker knows to adjust the difference value.  */
1464   if (!linkrelax || fix->fx_addsy == NULL)
1465     return 0;
1466
1467   /* Make sure both symbols are in the same segment, and that segment is
1468      "normal" and relaxable.  If the segment is not "normal", then the
1469      fix is not valid.  If the segment is not "relaxable", then the fix
1470      should have been handled earlier.  */
1471   add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
1472   if (! SEG_NORMAL (add_symbol_segment) ||
1473       ! relaxable_section (add_symbol_segment))
1474     return 0;
1475
1476   sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
1477   return (sub_symbol_segment == add_symbol_segment);
1478 }
1479
1480 /* TC_FORCE_RELOCATION hook */
1481
1482 /* If linkrelax is turned on, and the symbol to relocate
1483    against is in a relaxable segment, don't compute the value -
1484    generate a relocation instead.  */
1485 int
1486 avr_force_relocation (fixS *fix)
1487 {
1488   if (linkrelax && fix->fx_addsy
1489       && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
1490     return 1;
1491
1492   return generic_force_reloc (fix);
1493 }
1494
1495 /* GAS will call this for each fixup.  It should store the correct
1496    value in the object file.  */
1497
1498 void
1499 md_apply_fix (fixS *fixP, valueT * valP, segT seg)
1500 {
1501   unsigned char *where;
1502   unsigned long insn;
1503   long value = *valP;
1504
1505   if (fixP->fx_addsy == (symbolS *) NULL)
1506     fixP->fx_done = 1;
1507
1508   else if (fixP->fx_pcrel)
1509     {
1510       segT s = S_GET_SEGMENT (fixP->fx_addsy);
1511
1512       if (s == seg || s == absolute_section)
1513         {
1514           value += S_GET_VALUE (fixP->fx_addsy);
1515           fixP->fx_done = 1;
1516         }
1517     }
1518   else if (linkrelax && fixP->fx_subsy)
1519     {
1520       /* For a subtraction relocation expression, generate one
1521          of the DIFF relocs, with the value being the difference.
1522          Note that a sym1 - sym2 expression is adjusted into a
1523          section_start_sym + sym4_offset_from_section_start - sym1
1524          expression. fixP->fx_addsy holds the section start symbol,
1525          fixP->fx_offset holds sym2's offset, and fixP->fx_subsy
1526          holds sym1. Calculate the current difference and write value,
1527          but leave fx_offset as is - during relaxation,
1528          fx_offset - value gives sym1's value.  */
1529
1530        switch (fixP->fx_r_type)
1531          {
1532            case BFD_RELOC_8:
1533              fixP->fx_r_type = BFD_RELOC_AVR_DIFF8;
1534              break;
1535            case BFD_RELOC_16:
1536              fixP->fx_r_type = BFD_RELOC_AVR_DIFF16;
1537              break;
1538            case BFD_RELOC_32:
1539              fixP->fx_r_type = BFD_RELOC_AVR_DIFF32;
1540              break;
1541            default:
1542              as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1543              break;
1544          }
1545
1546       value = S_GET_VALUE (fixP->fx_addsy) +
1547           fixP->fx_offset - S_GET_VALUE (fixP->fx_subsy);
1548       *valP = value;
1549
1550       fixP->fx_subsy = NULL;
1551   }
1552   /* We don't actually support subtracting a symbol.  */
1553   if (fixP->fx_subsy != (symbolS *) NULL)
1554     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1555
1556   /* For the DIFF relocs, write the value into the object file while still
1557      keeping fx_done FALSE, as both the difference (recorded in the object file)
1558      and the sym offset (part of fixP) are needed at link relax time.  */
1559   where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
1560   switch (fixP->fx_r_type)
1561     {
1562     default:
1563       fixP->fx_no_overflow = 1;
1564       break;
1565     case BFD_RELOC_AVR_7_PCREL:
1566     case BFD_RELOC_AVR_13_PCREL:
1567     case BFD_RELOC_32:
1568     case BFD_RELOC_16:
1569       break;
1570     case BFD_RELOC_AVR_DIFF8:
1571       *where = value;
1572           break;
1573     case BFD_RELOC_AVR_DIFF16:
1574       bfd_putl16 ((bfd_vma) value, where);
1575       break;
1576     case BFD_RELOC_AVR_DIFF32:
1577       bfd_putl32 ((bfd_vma) value, where);
1578       break;
1579     case BFD_RELOC_AVR_CALL:
1580       break;
1581     }
1582
1583   if (fixP->fx_done)
1584     {
1585       /* Fetch the instruction, insert the fully resolved operand
1586          value, and stuff the instruction back again.  */
1587       where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
1588       insn = bfd_getl16 (where);
1589
1590       switch (fixP->fx_r_type)
1591         {
1592         case BFD_RELOC_AVR_7_PCREL:
1593           if (value & 1)
1594             as_bad_where (fixP->fx_file, fixP->fx_line,
1595                           _("odd address operand: %ld"), value);
1596
1597           /* Instruction addresses are always right-shifted by 1.  */
1598           value >>= 1;
1599           --value;                      /* Correct PC.  */
1600
1601           if (value < -64 || value > 63)
1602             as_bad_where (fixP->fx_file, fixP->fx_line,
1603                           _("operand out of range: %ld"), value);
1604           value = (value << 3) & 0x3f8;
1605           bfd_putl16 ((bfd_vma) (value | insn), where);
1606           break;
1607
1608         case BFD_RELOC_AVR_13_PCREL:
1609           if (value & 1)
1610             as_bad_where (fixP->fx_file, fixP->fx_line,
1611                           _("odd address operand: %ld"), value);
1612
1613           /* Instruction addresses are always right-shifted by 1.  */
1614           value >>= 1;
1615           --value;                      /* Correct PC.  */
1616
1617           if (value < -2048 || value > 2047)
1618             {
1619               /* No wrap for devices with >8K of program memory.  */
1620               if ((avr_mcu->isa & AVR_ISA_MEGA) || avr_opt.no_wrap)
1621                 as_bad_where (fixP->fx_file, fixP->fx_line,
1622                               _("operand out of range: %ld"), value);
1623             }
1624
1625           value &= 0xfff;
1626           bfd_putl16 ((bfd_vma) (value | insn), where);
1627           break;
1628
1629         case BFD_RELOC_32:
1630           bfd_putl32 ((bfd_vma) value, where);
1631           break;
1632
1633         case BFD_RELOC_16:
1634           bfd_putl16 ((bfd_vma) value, where);
1635           break;
1636
1637         case BFD_RELOC_8:
1638           if (value > 255 || value < -128)
1639             as_warn_where (fixP->fx_file, fixP->fx_line,
1640                            _("operand out of range: %ld"), value);
1641           *where = value;
1642           break;
1643
1644         case BFD_RELOC_AVR_16_PM:
1645           bfd_putl16 ((bfd_vma) (value >> 1), where);
1646           break;
1647
1648         case BFD_RELOC_AVR_LDI:
1649           if (value > 255)
1650             as_bad_where (fixP->fx_file, fixP->fx_line,
1651                           _("operand out of range: %ld"), value);
1652           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
1653           break;
1654
1655         case BFD_RELOC_AVR_LDS_STS_16:
1656           if ((value < 0x40) || (value > 0xBF))
1657             as_warn_where (fixP->fx_file, fixP->fx_line,
1658                            _("operand out of range: 0x%lx"),
1659                            (unsigned long)value);
1660           insn |= ((value & 0xF) | ((value & 0x30) << 5) | ((value & 0x40) << 2));
1661           bfd_putl16 ((bfd_vma) insn, where);
1662           break;
1663
1664         case BFD_RELOC_AVR_6:
1665           if ((value > 63) || (value < 0))
1666             as_bad_where (fixP->fx_file, fixP->fx_line,
1667                           _("operand out of range: %ld"), value);
1668           bfd_putl16 ((bfd_vma) insn | ((value & 7) | ((value & (3 << 3)) << 7)
1669                                         | ((value & (1 << 5)) << 8)), where);
1670           break;
1671
1672         case BFD_RELOC_AVR_6_ADIW:
1673           if ((value > 63) || (value < 0))
1674             as_bad_where (fixP->fx_file, fixP->fx_line,
1675                           _("operand out of range: %ld"), value);
1676           bfd_putl16 ((bfd_vma) insn | (value & 0xf) | ((value & 0x30) << 2), where);
1677           break;
1678
1679         case BFD_RELOC_AVR_LO8_LDI:
1680           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
1681           break;
1682
1683         case BFD_RELOC_AVR_HI8_LDI:
1684           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 8), where);
1685           break;
1686
1687         case BFD_RELOC_AVR_MS8_LDI:
1688           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 24), where);
1689           break;
1690
1691         case BFD_RELOC_AVR_HH8_LDI:
1692           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 16), where);
1693           break;
1694
1695         case BFD_RELOC_AVR_LO8_LDI_NEG:
1696           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value), where);
1697           break;
1698
1699         case BFD_RELOC_AVR_HI8_LDI_NEG:
1700           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 8), where);
1701           break;
1702
1703         case BFD_RELOC_AVR_MS8_LDI_NEG:
1704           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 24), where);
1705           break;
1706
1707         case BFD_RELOC_AVR_HH8_LDI_NEG:
1708           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 16), where);
1709           break;
1710
1711         case BFD_RELOC_AVR_LO8_LDI_PM:
1712           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 1), where);
1713           break;
1714
1715         case BFD_RELOC_AVR_HI8_LDI_PM:
1716           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 9), where);
1717           break;
1718
1719         case BFD_RELOC_AVR_HH8_LDI_PM:
1720           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 17), where);
1721           break;
1722
1723         case BFD_RELOC_AVR_LO8_LDI_PM_NEG:
1724           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 1), where);
1725           break;
1726
1727         case BFD_RELOC_AVR_HI8_LDI_PM_NEG:
1728           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 9), where);
1729           break;
1730
1731         case BFD_RELOC_AVR_HH8_LDI_PM_NEG:
1732           bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 17), where);
1733           break;
1734
1735         case BFD_RELOC_AVR_CALL:
1736           {
1737             unsigned long x;
1738
1739             x = bfd_getl16 (where);
1740             if (value & 1)
1741               as_bad_where (fixP->fx_file, fixP->fx_line,
1742                             _("odd address operand: %ld"), value);
1743             value >>= 1;
1744             x |= ((value & 0x10000) | ((value << 3) & 0x1f00000)) >> 16;
1745             bfd_putl16 ((bfd_vma) x, where);
1746             bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2);
1747           }
1748           break;
1749
1750         case BFD_RELOC_AVR_8_LO:
1751           *where = 0xff & value;
1752           break;
1753
1754         case BFD_RELOC_AVR_8_HI:
1755           *where = 0xff & (value >> 8);
1756           break;
1757
1758         case BFD_RELOC_AVR_8_HLO:
1759           *where = 0xff & (value >> 16);
1760           break;
1761
1762         default:
1763           as_fatal (_("line %d: unknown relocation type: 0x%x"),
1764                     fixP->fx_line, fixP->fx_r_type);
1765           break;
1766
1767         case BFD_RELOC_AVR_PORT6:
1768           if (value > 63)
1769             as_bad_where (fixP->fx_file, fixP->fx_line,
1770                           _("operand out of range: %ld"), value);
1771           bfd_putl16 ((bfd_vma) insn | ((value & 0x30) << 5) | (value & 0x0f), where);
1772           break;
1773
1774         case BFD_RELOC_AVR_PORT5:
1775           if (value > 31)
1776             as_bad_where (fixP->fx_file, fixP->fx_line,
1777                           _("operand out of range: %ld"), value);
1778           bfd_putl16 ((bfd_vma) insn | ((value & 0x1f) << 3), where);
1779           break;
1780         }
1781     }
1782   else
1783     {
1784       switch ((int) fixP->fx_r_type)
1785         {
1786         case -BFD_RELOC_AVR_HI8_LDI_NEG:
1787         case -BFD_RELOC_AVR_HI8_LDI:
1788         case -BFD_RELOC_AVR_LO8_LDI_NEG:
1789         case -BFD_RELOC_AVR_LO8_LDI:
1790           as_bad_where (fixP->fx_file, fixP->fx_line,
1791                         _("only constant expression allowed"));
1792           fixP->fx_done = 1;
1793           break;
1794         default:
1795           break;
1796         }
1797     }
1798 }
1799
1800 /* GAS will call this to generate a reloc, passing the resulting reloc
1801    to `bfd_install_relocation'.  This currently works poorly, as
1802    `bfd_install_relocation' often does the wrong thing, and instances of
1803    `tc_gen_reloc' have been written to work around the problems, which
1804    in turns makes it difficult to fix `bfd_install_relocation'.  */
1805
1806 /* If while processing a fixup, a reloc really needs to be created
1807    then it is done here.  */
1808
1809 arelent *
1810 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED,
1811               fixS *fixp)
1812 {
1813   arelent *reloc;
1814   bfd_reloc_code_real_type code = fixp->fx_r_type;
1815
1816   if (fixp->fx_subsy != NULL)
1817     {
1818       as_bad_where (fixp->fx_file, fixp->fx_line, _("expression too complex"));
1819       return NULL;
1820     }
1821
1822   reloc = XNEW (arelent);
1823
1824   reloc->sym_ptr_ptr = XNEW (asymbol *);
1825   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1826
1827   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1828
1829   if ((fixp->fx_r_type == BFD_RELOC_32) && (fixp->fx_pcrel))
1830     {
1831       if (seg->use_rela_p)
1832         fixp->fx_offset -= md_pcrel_from_section (fixp, seg);
1833       else
1834         fixp->fx_offset = reloc->address;
1835
1836       code = BFD_RELOC_32_PCREL;
1837     }
1838
1839   reloc->addend = fixp->fx_offset;
1840
1841   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
1842
1843   if (reloc->howto == (reloc_howto_type *) NULL)
1844     {
1845       as_bad_where (fixp->fx_file, fixp->fx_line,
1846                     _("reloc %d not supported by object file format"),
1847                     (int) fixp->fx_r_type);
1848       return NULL;
1849     }
1850
1851   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1852       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1853     reloc->address = fixp->fx_offset;
1854
1855
1856   return reloc;
1857 }
1858
1859 void
1860 md_assemble (char *str)
1861 {
1862   struct avr_opcodes_s *opcode;
1863   char op[11];
1864
1865   str = skip_space (extract_word (str, op, sizeof (op)));
1866
1867   if (!op[0])
1868     as_bad (_("can't find opcode "));
1869
1870   opcode = (struct avr_opcodes_s *) hash_find (avr_hash, op);
1871
1872   if (opcode && !avr_opt.all_opcodes)
1873     {
1874       /* Check if the instruction's ISA bit is ON in the ISA bits of the part
1875          specified by the user.  If not look for other instructions
1876          specifications with same mnemonic who's ISA bits matches.
1877
1878          This requires include/opcode/avr.h to have the instructions with
1879          same mnemonic to be specified in sequence.  */
1880
1881       while ((opcode->isa & avr_mcu->isa) != opcode->isa)
1882         {
1883           opcode++;
1884
1885           if (opcode->name && strcmp(op, opcode->name))
1886             {
1887               as_bad (_("illegal opcode %s for mcu %s"),
1888                       opcode->name, avr_mcu->name);
1889               return;
1890             }
1891         }
1892     }
1893
1894   if (opcode == NULL)
1895     {
1896       as_bad (_("unknown opcode `%s'"), op);
1897       return;
1898     }
1899
1900     if (opcode == avr_gccisr_opcode
1901         && !avr_opt.have_gccisr)
1902     {
1903       as_bad (_("pseudo instruction `%s' not supported"), op);
1904       return;
1905     }
1906
1907   /* Special case for opcodes with optional operands (lpm, elpm) -
1908      version with operands exists in avr_opcodes[] in the next entry.  */
1909
1910   if (*str && *opcode->constraints == '?')
1911     ++opcode;
1912
1913   dwarf2_emit_insn (0);
1914
1915   /* We used to set input_line_pointer to the result of get_operands,
1916      but that is wrong.  Our caller assumes we don't change it.  */
1917   {
1918     char *t = input_line_pointer;
1919
1920     if (opcode == avr_gccisr_opcode)
1921       avr_gccisr_operands (opcode, &str);
1922     else
1923       avr_operands (opcode, &str);
1924     if (*skip_space (str))
1925       as_bad (_("garbage at end of line"));
1926     input_line_pointer = t;
1927   }
1928 }
1929
1930 const exp_mod_data_t exp_mod_data[] =
1931 {
1932   /* Default, must be first.  */
1933   { "", 0, BFD_RELOC_16, "" },
1934   /* Divides by 2 to get word address.  Generate Stub.  */
1935   { "gs", 2, BFD_RELOC_AVR_16_PM, "`gs' " },
1936   { "pm", 2, BFD_RELOC_AVR_16_PM, "`pm' " },
1937   /* The following are used together with avr-gcc's __memx address space
1938      in order to initialize a 24-bit pointer variable with a 24-bit address.
1939      For address in flash, hlo8 will contain the flash segment if the
1940      symbol is located in flash. If the symbol is located in RAM; hlo8
1941      will contain 0x80 which matches avr-gcc's notion of how 24-bit RAM/flash
1942      addresses linearize address space.  */
1943   { "lo8",  1, BFD_RELOC_AVR_8_LO,  "`lo8' "  },
1944   { "hi8",  1, BFD_RELOC_AVR_8_HI,  "`hi8' "  },
1945   { "hlo8", 1, BFD_RELOC_AVR_8_HLO, "`hlo8' " },
1946   { "hh8",  1, BFD_RELOC_AVR_8_HLO, "`hh8' "  },
1947 };
1948
1949 /* Parse special CONS expression: pm (expression) or alternatively
1950    gs (expression).  These are used for addressing program memory.  Moreover,
1951    define lo8 (expression), hi8 (expression) and hlo8 (expression).  */
1952
1953 const exp_mod_data_t *
1954 avr_parse_cons_expression (expressionS *exp, int nbytes)
1955 {
1956   char *tmp;
1957   unsigned int i;
1958
1959   tmp = input_line_pointer = skip_space (input_line_pointer);
1960
1961   /* The first entry of exp_mod_data[] contains an entry if no
1962      expression modifier is present.  Skip it.  */
1963
1964   for (i = 0; i < ARRAY_SIZE (exp_mod_data); i++)
1965     {
1966       const exp_mod_data_t *pexp = &exp_mod_data[i];
1967       int len = strlen (pexp->name);
1968
1969       if (nbytes == pexp->nbytes
1970           && strncasecmp (input_line_pointer, pexp->name, len) == 0)
1971         {
1972           input_line_pointer = skip_space (input_line_pointer + len);
1973
1974           if (*input_line_pointer == '(')
1975             {
1976               input_line_pointer = skip_space (input_line_pointer + 1);
1977               expression (exp);
1978
1979               if (*input_line_pointer == ')')
1980                 {
1981                   ++input_line_pointer;
1982                   return pexp;
1983                 }
1984               else
1985                 {
1986                   as_bad (_("`)' required"));
1987                   return &exp_mod_data[0];
1988                 }
1989             }
1990
1991           input_line_pointer = tmp;
1992
1993           break;
1994         }
1995     }
1996
1997   expression (exp);
1998   return &exp_mod_data[0];
1999 }
2000
2001 void
2002 avr_cons_fix_new (fragS *frag,
2003                   int where,
2004                   int nbytes,
2005                   expressionS *exp,
2006                   const exp_mod_data_t *pexp_mod_data)
2007 {
2008   int bad = 0;
2009
2010   switch (pexp_mod_data->reloc)
2011     {
2012     default:
2013       if (nbytes == 1)
2014         fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_8);
2015       else if (nbytes == 2)
2016         fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_16);
2017       else if (nbytes == 4)
2018         fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_32);
2019       else
2020         bad = 1;
2021       break;
2022
2023     case BFD_RELOC_AVR_16_PM:
2024     case BFD_RELOC_AVR_8_LO:
2025     case BFD_RELOC_AVR_8_HI:
2026     case BFD_RELOC_AVR_8_HLO:
2027       if (nbytes == pexp_mod_data->nbytes)
2028         fix_new_exp (frag, where, nbytes, exp, FALSE, pexp_mod_data->reloc);
2029       else
2030         bad = 1;
2031       break;
2032     }
2033
2034   if (bad)
2035     as_bad (_("illegal %s relocation size: %d"), pexp_mod_data->error, nbytes);
2036 }
2037
2038 static bfd_boolean
2039 mcu_has_3_byte_pc (void)
2040 {
2041   int mach = avr_mcu->mach;
2042
2043   return mach == bfd_mach_avr6
2044     || mach == bfd_mach_avrxmega6
2045     || mach == bfd_mach_avrxmega7;
2046 }
2047
2048 void
2049 tc_cfi_frame_initial_instructions (void)
2050 {
2051   /* AVR6 pushes 3 bytes for calls.  */
2052   int return_size = (mcu_has_3_byte_pc () ? 3 : 2);
2053
2054   /* The CFA is the caller's stack location before the call insn.  */
2055   /* Note that the stack pointer is dwarf register number 32.  */
2056   cfi_add_CFA_def_cfa (32, return_size);
2057
2058   /* Note that AVR consistently uses post-decrement, which means that things
2059      do not line up the same way as for targets that use pre-decrement.  */
2060   cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, 1-return_size);
2061 }
2062
2063 bfd_boolean
2064 avr_allow_local_subtract (expressionS * left,
2065                              expressionS * right,
2066                              segT section)
2067 {
2068   /* If we are not in relaxation mode, subtraction is OK.  */
2069   if (!linkrelax)
2070     return TRUE;
2071
2072   /* If the symbols are not in a code section then they are OK.  */
2073   if ((section->flags & SEC_CODE) == 0)
2074     return TRUE;
2075
2076   if (left->X_add_symbol == right->X_add_symbol)
2077     return TRUE;
2078
2079   /* We have to assume that there may be instructions between the
2080      two symbols and that relaxation may increase the distance between
2081      them.  */
2082   return FALSE;
2083 }
2084
2085 void
2086 avr_elf_final_processing (void)
2087 {
2088   if (linkrelax)
2089     elf_elfheader (stdoutput)->e_flags |= EF_AVR_LINKRELAX_PREPARED;
2090 }
2091
2092 /* Write out the header of a .avr.prop section into the area pointed to by
2093    DATA.  The RECORD_COUNT will be placed in the header as the number of
2094    records that are to follow.
2095    The area DATA must be big enough the receive the header, which is
2096    AVR_PROPERTY_SECTION_HEADER_SIZE bytes long.  */
2097
2098 static char *
2099 avr_output_property_section_header (char *data,
2100                                     unsigned int record_count)
2101 {
2102   char *orig_data = data;
2103
2104   md_number_to_chars (data, AVR_PROPERTY_RECORDS_VERSION, 1);
2105   data++;
2106   /* There's space for a single byte flags field, but right now there's
2107      nothing to go in here, so just set the value to zero.  */
2108   md_number_to_chars (data, 0, 1);
2109   data++;
2110   md_number_to_chars (data, record_count, 2);
2111   data+=2;
2112
2113   gas_assert (data - orig_data == AVR_PROPERTY_SECTION_HEADER_SIZE);
2114
2115   return data;
2116 }
2117
2118 /* Return the number of bytes required to store RECORD into the .avr.prop
2119    section. The size returned is the compressed size that corresponds to
2120    how the record will be written out in AVR_OUTPUT_PROPERTY_RECORD.  */
2121
2122 static int
2123 avr_record_size (const struct avr_property_record *record)
2124 {
2125   /* The first 5 bytes are a 4-byte address, followed by a 1-byte type
2126      identifier.  */
2127   int size = 5;
2128
2129   switch (record->type)
2130     {
2131     case RECORD_ORG:
2132       size += 0; /* No extra information.  */
2133       break;
2134
2135     case RECORD_ORG_AND_FILL:
2136       size += 4; /* A 4-byte fill value.  */
2137       break;
2138
2139     case RECORD_ALIGN:
2140       size += 4; /* A 4-byte alignment value.  */
2141       break;
2142
2143     case RECORD_ALIGN_AND_FILL:
2144       size += 8; /* A 4-byte alignment, and 4-byte fill value.  */
2145       break;
2146
2147     default:
2148       as_fatal (_("unknown record type %d (in %s)"),
2149                 record->type, __PRETTY_FUNCTION__);
2150     }
2151
2152   return size;
2153 }
2154
2155 /* Write out RECORD.  FRAG_BASE points to the start of the data area setup
2156    to hold all of the .avr.prop content, FRAG_PTR points to the next
2157    writable location.  The data area must be big enough to hold all of the
2158    records.  The size of the data written out for this RECORD must match
2159    the size from AVR_RECORD_SIZE.  */
2160
2161 static char *
2162 avr_output_property_record (char * const frag_base, char *frag_ptr,
2163                             const struct avr_property_record *record)
2164 {
2165   fixS *fix;
2166   int where;
2167   char *init_frag_ptr = frag_ptr;
2168
2169   where = frag_ptr - frag_base;
2170   fix = fix_new (frag_now, where, 4,
2171                  section_symbol (record->section),
2172                  record->offset, FALSE, BFD_RELOC_32);
2173   fix->fx_file = "<internal>";
2174   fix->fx_line = 0;
2175   frag_ptr += 4;
2176
2177   md_number_to_chars (frag_ptr, (bfd_byte) record->type, 1);
2178   frag_ptr += 1;
2179
2180   /* Write out the rest of the data.  */
2181   switch (record->type)
2182     {
2183     case RECORD_ORG:
2184       break;
2185
2186     case RECORD_ORG_AND_FILL:
2187       md_number_to_chars (frag_ptr, record->data.org.fill, 4);
2188       frag_ptr += 4;
2189       break;
2190
2191     case RECORD_ALIGN:
2192       md_number_to_chars (frag_ptr, record->data.align.bytes, 4);
2193       frag_ptr += 4;
2194       break;
2195
2196     case RECORD_ALIGN_AND_FILL:
2197       md_number_to_chars (frag_ptr, record->data.align.bytes, 4);
2198       md_number_to_chars (frag_ptr + 4, record->data.align.fill, 4);
2199       frag_ptr += 8;
2200       break;
2201
2202     default:
2203       as_fatal (_("unknown record type %d (in %s)"),
2204                 record->type, __PRETTY_FUNCTION__);
2205     }
2206
2207   gas_assert (frag_ptr - init_frag_ptr == avr_record_size (record));
2208
2209   return frag_ptr;
2210 }
2211
2212 /* Create the section to hold the AVR property information.  Return the
2213    section.  */
2214
2215 static asection *
2216 avr_create_property_section (void)
2217 {
2218   asection *sec;
2219   flagword flags = (SEC_RELOC | SEC_HAS_CONTENTS | SEC_READONLY);
2220   const char *section_name = AVR_PROPERTY_RECORD_SECTION_NAME;
2221
2222   sec = bfd_make_section (stdoutput, section_name);
2223   if (sec == NULL)
2224     as_fatal (_("Failed to create property section `%s'\n"), section_name);
2225   bfd_set_section_flags (stdoutput, sec, flags);
2226   sec->output_section = sec;
2227   return sec;
2228 }
2229
2230 /* This hook is called when alignment is performed, and allows us to
2231    capture the details of both .org and .align directives.  */
2232
2233 void
2234 avr_handle_align (fragS *fragP)
2235 {
2236   if (linkrelax)
2237     {
2238       /* Ignore alignment requests at FR_ADDRESS 0, these are at the very
2239          start of a section, and will be handled by the standard section
2240          alignment mechanism.  */
2241       if ((fragP->fr_type == rs_align
2242            || fragP->fr_type == rs_align_code)
2243           && fragP->fr_offset > 0)
2244         {
2245           char *p = fragP->fr_literal + fragP->fr_fix;
2246
2247           fragP->tc_frag_data.is_align = TRUE;
2248           fragP->tc_frag_data.alignment = fragP->fr_offset;
2249           fragP->tc_frag_data.fill = *p;
2250           fragP->tc_frag_data.has_fill = (fragP->tc_frag_data.fill != 0);
2251         }
2252
2253       if (fragP->fr_type == rs_org && fragP->fr_offset > 0)
2254         {
2255           char *p = fragP->fr_literal + fragP->fr_fix;
2256
2257           fragP->tc_frag_data.is_org = TRUE;
2258           fragP->tc_frag_data.fill = *p;
2259           fragP->tc_frag_data.has_fill = (fragP->tc_frag_data.fill != 0);
2260         }
2261     }
2262 }
2263
2264 /* Return TRUE if this section is not one for which we need to record
2265    information in the avr property section.  */
2266
2267 static bfd_boolean
2268 exclude_section_from_property_tables (segT sec)
2269 {
2270   /* Only generate property information for sections on which linker
2271      relaxation could be performed.  */
2272   return !relaxable_section (sec);
2273 }
2274
2275 /* Create a property record for fragment FRAGP from section SEC and place
2276    it into an AVR_PROPERTY_RECORD_LINK structure, which can then formed
2277    into a linked list by the caller.  */
2278
2279 static struct avr_property_record_link *
2280 create_record_for_frag (segT sec, fragS *fragP)
2281 {
2282   struct avr_property_record_link *prop_rec_link;
2283
2284   prop_rec_link = XCNEW (struct avr_property_record_link);
2285   gas_assert (fragP->fr_next != NULL);
2286
2287   if (fragP->tc_frag_data.is_org)
2288     {
2289       prop_rec_link->record.offset = fragP->fr_next->fr_address;
2290       prop_rec_link->record.section = sec;
2291
2292       if (fragP->tc_frag_data.has_fill)
2293         {
2294           prop_rec_link->record.data.org.fill = fragP->tc_frag_data.fill;
2295           prop_rec_link->record.type = RECORD_ORG_AND_FILL;
2296         }
2297       else
2298         prop_rec_link->record.type = RECORD_ORG;
2299     }
2300   else
2301     {
2302       prop_rec_link->record.offset = fragP->fr_next->fr_address;
2303       prop_rec_link->record.section = sec;
2304
2305       gas_assert (fragP->tc_frag_data.is_align);
2306       if (fragP->tc_frag_data.has_fill)
2307         {
2308           prop_rec_link->record.data.align.fill = fragP->tc_frag_data.fill;
2309           prop_rec_link->record.type = RECORD_ALIGN_AND_FILL;
2310         }
2311       else
2312         prop_rec_link->record.type = RECORD_ALIGN;
2313       prop_rec_link->record.data.align.bytes = fragP->tc_frag_data.alignment;
2314     }
2315
2316   return prop_rec_link;
2317 }
2318
2319 /* Build a list of AVR_PROPERTY_RECORD_LINK structures for section SEC, and
2320    merged them onto the list pointed to by NEXT_PTR.  Return a pointer to
2321    the last list item created.  */
2322
2323 static struct avr_property_record_link **
2324 append_records_for_section (segT sec,
2325                             struct avr_property_record_link **next_ptr)
2326 {
2327   segment_info_type *seginfo = seg_info (sec);
2328   fragS *fragP;
2329
2330   if (seginfo && seginfo->frchainP)
2331     {
2332       for (fragP = seginfo->frchainP->frch_root;
2333            fragP;
2334            fragP = fragP->fr_next)
2335         {
2336           if (fragP->tc_frag_data.is_align
2337               || fragP->tc_frag_data.is_org)
2338             {
2339               /* Create a single new entry.  */
2340               struct avr_property_record_link *new_link
2341                 = create_record_for_frag (sec, fragP);
2342
2343               *next_ptr = new_link;
2344               next_ptr = &new_link->next;
2345             }
2346         }
2347     }
2348
2349   return next_ptr;
2350 }
2351
2352 /* Create the AVR property section and fill it with records of .org and
2353    .align directives that were used.  The section is only created if it
2354    will actually have any content.  */
2355
2356 static void
2357 avr_create_and_fill_property_section (void)
2358 {
2359   segT *seclist;
2360   asection *prop_sec;
2361   struct avr_property_record_link *r_list, **next_ptr;
2362   char *frag_ptr, *frag_base;
2363   bfd_size_type sec_size;
2364   struct avr_property_record_link *rec;
2365   unsigned int record_count;
2366
2367   /* First walk over all sections.  For sections on which linker
2368      relaxation could be applied, extend the record list.  The record list
2369      holds information that the linker will need to know.  */
2370
2371   prop_sec = NULL;
2372   r_list = NULL;
2373   next_ptr = &r_list;
2374   for (seclist = &stdoutput->sections;
2375        seclist && *seclist;
2376        seclist = &(*seclist)->next)
2377     {
2378       segT sec = *seclist;
2379
2380       if (exclude_section_from_property_tables (sec))
2381         continue;
2382
2383       next_ptr = append_records_for_section (sec, next_ptr);
2384     }
2385
2386   /* Create property section and ensure the size is correct.  We've already
2387      passed the point where gas could size this for us.  */
2388   sec_size = AVR_PROPERTY_SECTION_HEADER_SIZE;
2389   record_count = 0;
2390   for (rec = r_list; rec != NULL; rec = rec->next)
2391     {
2392       record_count++;
2393       sec_size += avr_record_size (&rec->record);
2394     }
2395
2396   if (record_count == 0)
2397     return;
2398
2399   prop_sec = avr_create_property_section ();
2400   bfd_set_section_size (stdoutput, prop_sec, sec_size);
2401
2402   subseg_set (prop_sec, 0);
2403   frag_base = frag_more (sec_size);
2404
2405   frag_ptr =
2406     avr_output_property_section_header (frag_base, record_count);
2407
2408   for (rec = r_list; rec != NULL; rec = rec->next)
2409     frag_ptr = avr_output_property_record (frag_base, frag_ptr, &rec->record);
2410
2411   frag_wane (frag_now);
2412   frag_new (0);
2413   frag_wane (frag_now);
2414 }
2415
2416 /* We're using this hook to build up the AVR property section.  It's called
2417    late in the assembly process which suits our needs.  */
2418 void
2419 avr_post_relax_hook (void)
2420 {
2421   avr_create_and_fill_property_section ();
2422 }
2423
2424
2425 /* Accumulate information about instruction sequence to `avr_isr':
2426    wheter TMP_REG, ZERO_REG and SREG might be touched.  Used during parse.
2427    REG1 is either -1 or a register number used by the instruction as input
2428    or output operand.  Similar for REG2.  */
2429
2430 static void
2431 avr_update_gccisr (struct avr_opcodes_s *opcode, int reg1, int reg2)
2432 {
2433   const int tiny_p = avr_mcu->mach == bfd_mach_avrtiny;
2434   const int reg_tmp = tiny_p ? 16 : 0;
2435   const int reg_zero = 1 + reg_tmp;
2436
2437   if (ISR_CHUNK_Done == avr_isr.prev_chunk
2438       || (avr_isr.need_sreg
2439           && avr_isr.need_reg_tmp
2440           && avr_isr.need_reg_zero))
2441     {
2442       /* Nothing (more) to do */
2443       return;
2444     }
2445
2446   /* SREG: Look up instructions that don't clobber SREG.  */
2447
2448   if (!avr_isr.need_sreg
2449       && !hash_find (avr_no_sreg_hash, opcode->name))
2450     {
2451       avr_isr.need_sreg = 1;
2452     }
2453
2454   /* Handle explicit register operands.  Record *any* use as clobber.
2455      This is because TMP_REG and ZERO_REG are not global and using
2456      them makes no sense without a previous set.  */
2457
2458   avr_isr.need_reg_tmp  |= reg1 == reg_tmp  || reg2 == reg_tmp;
2459   avr_isr.need_reg_zero |= reg1 == reg_zero || reg2 == reg_zero;
2460
2461   /* Handle implicit register operands and some opaque stuff.  */
2462
2463   if (strstr (opcode->name, "lpm")
2464       && '?' == *opcode->constraints)
2465     {
2466       avr_isr.need_reg_tmp = 1;
2467     }
2468
2469   if (strstr (opcode->name, "call")
2470       || strstr (opcode->name, "mul")
2471       || 0 == strcmp (opcode->name, "des")
2472       || (0 == strcmp (opcode->name, "movw")
2473           && (reg1 == reg_tmp || reg2 == reg_tmp)))
2474     {
2475       avr_isr.need_reg_tmp = 1;
2476       avr_isr.need_reg_zero = 1;
2477     }
2478 }
2479
2480
2481 /* Emit some 1-word instruction to **PWHERE and advance *PWHERE by the number
2482    of octets written.  INSN specifies the desired instruction and REG is the
2483    register used by it.  This function is only used with restricted subset of
2484    instructions as might be emit by `__gcc_isr'.  IN / OUT will use SREG
2485    and LDI loads 0.  */
2486
2487 static void
2488 avr_emit_insn (const char *insn, int reg, char **pwhere)
2489 {
2490   const int sreg = 0x3f;
2491   unsigned bin = 0;
2492   const struct avr_opcodes_s *op
2493     = (struct avr_opcodes_s*) hash_find (avr_hash, insn);
2494
2495   /* We only have to deal with: IN, OUT, PUSH, POP, CLR, LDI 0.  All of
2496      these deal with at least one Reg and are 1-word instructions.  */
2497
2498   gas_assert (op && 1 == op->insn_size);
2499   gas_assert (reg >= 0 && reg <= 31);
2500
2501   if (strchr (op->constraints, 'r'))
2502     {
2503       bin = op->bin_opcode | (reg << 4);
2504     }
2505   else if (strchr (op->constraints, 'd'))
2506     {
2507       gas_assert (reg >= 16);
2508       bin = op->bin_opcode | ((reg & 0xf) << 4);
2509     }
2510   else
2511     abort();
2512
2513   if (strchr (op->constraints, 'P'))
2514     {
2515       bin |= ((sreg & 0x30) << 5) | (sreg & 0x0f);
2516     }
2517   else if (0 == strcmp ("r=r", op->constraints))
2518     {
2519       bin |= ((reg & 0x10) << 5) | (reg & 0x0f);
2520     }
2521   else
2522     gas_assert (0 == strcmp ("r", op->constraints)
2523                 || 0 == strcmp ("ldi", op->name));
2524
2525   bfd_putl16 ((bfd_vma) bin, *pwhere);
2526   (*pwhere) += 2 * op->insn_size;
2527 }
2528
2529
2530 /* Turn rs_machine_dependent frag *FR into an ordinary rs_fill code frag,
2531    using information gathered in `avr_isr'.  REG is the register number as
2532    supplied by Done chunk "__gcc_isr 0,REG".  */
2533
2534 static void
2535 avr_patch_gccisr_frag (fragS *fr, int reg)
2536 {
2537   int treg;
2538   int n_pushed = 0;
2539   char *where = fr->fr_literal;
2540   const int tiny_p = avr_mcu->mach == bfd_mach_avrtiny;
2541   const int reg_tmp = tiny_p ? 16 : 0;
2542   const int reg_zero = 1 + reg_tmp;
2543
2544   /* Clearing ZERO_REG on non-Tiny needs CLR which clobbers SREG.  */
2545
2546   avr_isr.need_sreg |= !tiny_p && avr_isr.need_reg_zero;
2547
2548   /* A working register to PUSH / POP the SREG.  We might use the register
2549      as supplied by ISR_CHUNK_Done for that purpose as GCC wants to push
2550      it anyways.  If GCC passes ZERO_REG or TMP_REG, it has no clue (and
2551      no additional regs to safe) and we use that reg.  */
2552
2553   treg
2554     = avr_isr.need_reg_tmp   ? reg_tmp
2555     : avr_isr.need_reg_zero  ? reg_zero
2556     : avr_isr.need_sreg      ? reg
2557     : reg > reg_zero         ? reg
2558     : -1;
2559
2560   if (treg >= 0)
2561     {
2562       /* Non-empty prologue / epilogue */
2563
2564       if (ISR_CHUNK_Prologue == fr->fr_subtype)
2565         {
2566           avr_emit_insn ("push", treg, &where);
2567           n_pushed++;
2568
2569           if (avr_isr.need_sreg)
2570             {
2571               avr_emit_insn ("in",   treg, &where);
2572               avr_emit_insn ("push", treg, &where);
2573               n_pushed++;
2574             }
2575
2576           if (avr_isr.need_reg_zero)
2577             {
2578               if (reg_zero != treg)
2579                 {
2580                   avr_emit_insn ("push", reg_zero, &where);
2581                   n_pushed++;
2582                 }
2583               avr_emit_insn (tiny_p ? "ldi" : "clr", reg_zero, &where);
2584             }
2585
2586           if (reg > reg_zero && reg != treg)
2587             {
2588               avr_emit_insn ("push", reg, &where);
2589               n_pushed++;
2590             }
2591         }
2592       else if (ISR_CHUNK_Epilogue == fr->fr_subtype)
2593         {
2594           /* Same logic as in Prologue but in reverse order and with counter
2595              parts of either instruction:  POP instead of PUSH and OUT instead
2596              of IN.  Clearing ZERO_REG has no couter part.  */
2597
2598           if (reg > reg_zero && reg != treg)
2599             avr_emit_insn ("pop", reg, &where);
2600
2601           if (avr_isr.need_reg_zero
2602               && reg_zero != treg)
2603             avr_emit_insn ("pop", reg_zero, &where);
2604
2605           if (avr_isr.need_sreg)
2606             {
2607               avr_emit_insn ("pop", treg, &where);
2608               avr_emit_insn ("out", treg, &where);
2609             }
2610
2611           avr_emit_insn ("pop", treg, &where);
2612         }
2613       else
2614         abort();
2615     } /* treg >= 0 */
2616
2617   if (ISR_CHUNK_Prologue == fr->fr_subtype
2618       && avr_isr.sym_n_pushed)
2619     {
2620       symbolS *sy = avr_isr.sym_n_pushed;
2621       /* Turn magic `__gcc_isr.n_pushed' into its now known value.  */
2622
2623       sy->sy_value.X_op = O_constant;
2624       sy->sy_value.X_add_number = n_pushed;
2625       S_SET_SEGMENT (sy, expr_section);
2626       avr_isr.sym_n_pushed = NULL;
2627     }
2628
2629   /* Turn frag into ordinary code frag of now known size.  */
2630
2631   fr->fr_var = 0;
2632   fr->fr_fix = (offsetT) (where - fr->fr_literal);
2633   gas_assert (fr->fr_fix <= fr->fr_offset);
2634   fr->fr_offset = 0;
2635   fr->fr_type = rs_fill;
2636   fr->fr_subtype = 0;
2637 }
2638
2639
2640 /* Implements `__gcc_isr' pseudo-instruction.  For Prologue and Epilogue
2641    chunks, emit a new rs_machine_dependent frag.  For Done chunks, traverse
2642    the current segment and patch all rs_machine_dependent frags to become
2643    appropriate rs_fill code frags.  If chunks are seen in an odd ordering,
2644    throw an error instead.  */
2645
2646 static void
2647 avr_gccisr_operands (struct avr_opcodes_s *opcode, char **line)
2648 {
2649   int bad = 0;
2650   int chunk, reg = 0;
2651   char *str = *line;
2652
2653   gas_assert (avr_opt.have_gccisr);
2654
2655   /* We only use operands "N" and "r" which don't pop new fix-ups.  */
2656
2657   /* 1st operand: Which chunk of __gcc_isr: 0...2.  */
2658
2659   chunk = avr_operand (opcode, -1, "N", &str, NULL);
2660   if (chunk < 0 || chunk > 2)
2661     as_bad (_("%s requires value 0-2 as operand 1"), opcode->name);
2662
2663   if (ISR_CHUNK_Done == chunk)
2664     {
2665       /* 2nd operand: A register to push / pop.  */
2666
2667       str = skip_space (str);
2668       if (*str == '\0' || *str++ != ',')
2669         as_bad (_("`,' required"));
2670       else
2671         avr_operand (opcode, -1, "r", &str, &reg);
2672     }
2673
2674   *line = str;
2675
2676   /* Chunks must follow in a specific order:
2677      - Prologue: Exactly one
2678      - Epilogue: Any number
2679      - Done: Exactly one.  */
2680   bad |= ISR_CHUNK_Prologue == chunk && avr_isr.prev_chunk != ISR_CHUNK_Done;
2681   bad |= ISR_CHUNK_Epilogue == chunk && avr_isr.prev_chunk == ISR_CHUNK_Done;
2682   bad |= ISR_CHUNK_Done == chunk && avr_isr.prev_chunk == ISR_CHUNK_Done;
2683   if (bad)
2684     {
2685       if (avr_isr.file)
2686         as_bad (_("`%s %d' after `%s %d' from %s:%u"), opcode->name, chunk,
2687                 opcode->name, avr_isr.prev_chunk, avr_isr.file, avr_isr.line);
2688       else
2689         as_bad (_("`%s %d' but no chunk open yet"), opcode->name, chunk);
2690     }
2691
2692   if (!had_errors())
2693     {
2694       /* The longest sequence (prologue) might have up to 6 insns (words):
2695
2696          push  R0
2697          in    R0, SREG
2698          push  R0
2699          push  R1
2700          clr   R1
2701          push  Rx
2702       */
2703       unsigned int size = 2 * 6;
2704       fragS *fr;
2705
2706       switch (chunk)
2707         {
2708         case ISR_CHUNK_Prologue:
2709           avr_isr.need_reg_tmp = 0;
2710           avr_isr.need_reg_zero = 0;
2711           avr_isr.need_sreg = 0;
2712           avr_isr.sym_n_pushed = NULL;
2713           /* FALLTHRU */
2714
2715         case ISR_CHUNK_Epilogue:
2716           /* Emit a new rs_machine_dependent fragment into the fragment chain.
2717              It will be patched and cleaned up once we see the matching
2718              ISR_CHUNK_Done.  */
2719           frag_wane (frag_now);
2720           frag_new (0);
2721           frag_more (size);
2722
2723           frag_now->fr_var = 1;
2724           frag_now->fr_offset = size;
2725           frag_now->fr_fix = 0;
2726           frag_now->fr_type = rs_machine_dependent;
2727           frag_now->fr_subtype = chunk;
2728           frag_new (size);
2729           break;
2730
2731         case ISR_CHUNK_Done:
2732           /* Traverse all frags of the current subseg and turn ones of type
2733              rs_machine_dependent into ordinary code as expected by GCC.  */
2734
2735           for (fr = frchain_now->frch_root; fr; fr = fr->fr_next)
2736             if (fr->fr_type == rs_machine_dependent)
2737               avr_patch_gccisr_frag (fr, reg);
2738           break;
2739
2740         default:
2741           abort();
2742           break;
2743         }
2744     } /* !had_errors */
2745
2746   avr_isr.prev_chunk = chunk;
2747   avr_isr.file = as_where (&avr_isr.line);
2748 }
2749
2750
2751 /* Callback used by the function below.  Diagnose any dangling stuff from
2752    `__gcc_isr', i.e. frags of type rs_machine_dependent.  Such frags should
2753    have been resolved during parse by ISR_CHUNK_Done.  If such a frag is
2754    seen, report an error and turn it into something harmless.  */
2755
2756 static void
2757 avr_check_gccisr_done (bfd *abfd ATTRIBUTE_UNUSED,
2758                        segT section,
2759                        void *xxx ATTRIBUTE_UNUSED)
2760 {
2761   segment_info_type *info = seg_info (section);
2762
2763   if (SEG_NORMAL (section)
2764       /* BFD may have introduced its own sections without using
2765          subseg_new, so it is possible that seg_info is NULL.  */
2766       && info)
2767     {
2768       fragS *fr;
2769       frchainS *frch;
2770
2771       for (frch = info->frchainP; frch; frch = frch->frch_next)
2772         for (fr = frch->frch_root; fr; fr = fr->fr_next)
2773           if (fr->fr_type == rs_machine_dependent)
2774             {
2775               if (avr_isr.file)
2776                 as_bad_where (avr_isr.file, avr_isr.line,
2777                               _("dangling `__gcc_isr %d'"), avr_isr.prev_chunk);
2778               else if (!had_errors())
2779                 as_bad (_("dangling `__gcc_isr'"));
2780
2781               avr_isr.file = NULL;
2782
2783               /* Avoid Internal errors due to rs_machine_dependent in the
2784                  remainder:  Turn frag into something harmless.   */
2785               fr->fr_var = 0;
2786               fr->fr_fix = 0;
2787               fr->fr_offset = 0;
2788               fr->fr_type = rs_fill;
2789               fr->fr_subtype = 0;
2790             }
2791     }
2792 }
2793
2794
2795 /* Implement `md_pre_output_hook' */
2796 /* Run over all relevant sections and diagnose any dangling `__gcc_isr'.
2797    This runs after parsing all inputs but before relaxing and writing.  */
2798
2799 void
2800 avr_pre_output_hook (void)
2801 {
2802   if (avr_opt.have_gccisr)
2803     bfd_map_over_sections (stdoutput, avr_check_gccisr_done, NULL);
2804 }