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