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