merge from gcc
[gdb/gnu.git] / bfd / elf32-avr.c
blob43100cd20fc0f48e26bdbd8c841c661f9c37c33f
1 /* AVR-specific support for 32-bit ELF
2 Copyright 1999-2013 Free Software Foundation, Inc.
3 Contributed by Denis Chertykov <denisc@overta.ru>
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 Boston, MA 02110-1301, USA. */
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/avr.h"
27 #include "elf32-avr.h"
29 /* Enable debugging printout at stdout with this variable. */
30 static bfd_boolean debug_relax = FALSE;
32 /* Enable debugging printout at stdout with this variable. */
33 static bfd_boolean debug_stubs = FALSE;
35 /* Hash table initialization and handling. Code is taken from the hppa port
36 and adapted to the needs of AVR. */
38 /* We use two hash tables to hold information for linking avr objects.
40 The first is the elf32_avr_link_hash_table which is derived from the
41 stanard ELF linker hash table. We use this as a place to attach the other
42 hash table and some static information.
44 The second is the stub hash table which is derived from the base BFD
45 hash table. The stub hash table holds the information on the linker
46 stubs. */
48 struct elf32_avr_stub_hash_entry
50 /* Base hash table entry structure. */
51 struct bfd_hash_entry bh_root;
53 /* Offset within stub_sec of the beginning of this stub. */
54 bfd_vma stub_offset;
56 /* Given the symbol's value and its section we can determine its final
57 value when building the stubs (so the stub knows where to jump). */
58 bfd_vma target_value;
60 /* This way we could mark stubs to be no longer necessary. */
61 bfd_boolean is_actually_needed;
64 struct elf32_avr_link_hash_table
66 /* The main hash table. */
67 struct elf_link_hash_table etab;
69 /* The stub hash table. */
70 struct bfd_hash_table bstab;
72 bfd_boolean no_stubs;
74 /* Linker stub bfd. */
75 bfd *stub_bfd;
77 /* The stub section. */
78 asection *stub_sec;
80 /* Usually 0, unless we are generating code for a bootloader. Will
81 be initialized by elf32_avr_size_stubs to the vma offset of the
82 output section associated with the stub section. */
83 bfd_vma vector_base;
85 /* Assorted information used by elf32_avr_size_stubs. */
86 unsigned int bfd_count;
87 int top_index;
88 asection ** input_list;
89 Elf_Internal_Sym ** all_local_syms;
91 /* Tables for mapping vma beyond the 128k boundary to the address of the
92 corresponding stub. (AMT)
93 "amt_max_entry_cnt" reflects the number of entries that memory is allocated
94 for in the "amt_stub_offsets" and "amt_destination_addr" arrays.
95 "amt_entry_cnt" informs how many of these entries actually contain
96 useful data. */
97 unsigned int amt_entry_cnt;
98 unsigned int amt_max_entry_cnt;
99 bfd_vma * amt_stub_offsets;
100 bfd_vma * amt_destination_addr;
103 /* Various hash macros and functions. */
104 #define avr_link_hash_table(p) \
105 /* PR 3874: Check that we have an AVR style hash table before using it. */\
106 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
107 == AVR_ELF_DATA ? ((struct elf32_avr_link_hash_table *) ((p)->hash)) : NULL)
109 #define avr_stub_hash_entry(ent) \
110 ((struct elf32_avr_stub_hash_entry *)(ent))
112 #define avr_stub_hash_lookup(table, string, create, copy) \
113 ((struct elf32_avr_stub_hash_entry *) \
114 bfd_hash_lookup ((table), (string), (create), (copy)))
116 static reloc_howto_type elf_avr_howto_table[] =
118 HOWTO (R_AVR_NONE, /* type */
119 0, /* rightshift */
120 2, /* size (0 = byte, 1 = short, 2 = long) */
121 32, /* bitsize */
122 FALSE, /* pc_relative */
123 0, /* bitpos */
124 complain_overflow_bitfield, /* complain_on_overflow */
125 bfd_elf_generic_reloc, /* special_function */
126 "R_AVR_NONE", /* name */
127 FALSE, /* partial_inplace */
128 0, /* src_mask */
129 0, /* dst_mask */
130 FALSE), /* pcrel_offset */
132 HOWTO (R_AVR_32, /* type */
133 0, /* rightshift */
134 2, /* size (0 = byte, 1 = short, 2 = long) */
135 32, /* bitsize */
136 FALSE, /* pc_relative */
137 0, /* bitpos */
138 complain_overflow_bitfield, /* complain_on_overflow */
139 bfd_elf_generic_reloc, /* special_function */
140 "R_AVR_32", /* name */
141 FALSE, /* partial_inplace */
142 0xffffffff, /* src_mask */
143 0xffffffff, /* dst_mask */
144 FALSE), /* pcrel_offset */
146 /* A 7 bit PC relative relocation. */
147 HOWTO (R_AVR_7_PCREL, /* type */
148 1, /* rightshift */
149 1, /* size (0 = byte, 1 = short, 2 = long) */
150 7, /* bitsize */
151 TRUE, /* pc_relative */
152 3, /* bitpos */
153 complain_overflow_bitfield, /* complain_on_overflow */
154 bfd_elf_generic_reloc, /* special_function */
155 "R_AVR_7_PCREL", /* name */
156 FALSE, /* partial_inplace */
157 0xffff, /* src_mask */
158 0xffff, /* dst_mask */
159 TRUE), /* pcrel_offset */
161 /* A 13 bit PC relative relocation. */
162 HOWTO (R_AVR_13_PCREL, /* type */
163 1, /* rightshift */
164 1, /* size (0 = byte, 1 = short, 2 = long) */
165 13, /* bitsize */
166 TRUE, /* pc_relative */
167 0, /* bitpos */
168 complain_overflow_bitfield, /* complain_on_overflow */
169 bfd_elf_generic_reloc, /* special_function */
170 "R_AVR_13_PCREL", /* name */
171 FALSE, /* partial_inplace */
172 0xfff, /* src_mask */
173 0xfff, /* dst_mask */
174 TRUE), /* pcrel_offset */
176 /* A 16 bit absolute relocation. */
177 HOWTO (R_AVR_16, /* type */
178 0, /* rightshift */
179 1, /* size (0 = byte, 1 = short, 2 = long) */
180 16, /* bitsize */
181 FALSE, /* pc_relative */
182 0, /* bitpos */
183 complain_overflow_dont, /* complain_on_overflow */
184 bfd_elf_generic_reloc, /* special_function */
185 "R_AVR_16", /* name */
186 FALSE, /* partial_inplace */
187 0xffff, /* src_mask */
188 0xffff, /* dst_mask */
189 FALSE), /* pcrel_offset */
191 /* A 16 bit absolute relocation for command address
192 Will be changed when linker stubs are needed. */
193 HOWTO (R_AVR_16_PM, /* type */
194 1, /* rightshift */
195 1, /* size (0 = byte, 1 = short, 2 = long) */
196 16, /* bitsize */
197 FALSE, /* pc_relative */
198 0, /* bitpos */
199 complain_overflow_bitfield, /* complain_on_overflow */
200 bfd_elf_generic_reloc, /* special_function */
201 "R_AVR_16_PM", /* name */
202 FALSE, /* partial_inplace */
203 0xffff, /* src_mask */
204 0xffff, /* dst_mask */
205 FALSE), /* pcrel_offset */
206 /* A low 8 bit absolute relocation of 16 bit address.
207 For LDI command. */
208 HOWTO (R_AVR_LO8_LDI, /* type */
209 0, /* rightshift */
210 1, /* size (0 = byte, 1 = short, 2 = long) */
211 8, /* bitsize */
212 FALSE, /* pc_relative */
213 0, /* bitpos */
214 complain_overflow_dont, /* complain_on_overflow */
215 bfd_elf_generic_reloc, /* special_function */
216 "R_AVR_LO8_LDI", /* name */
217 FALSE, /* partial_inplace */
218 0xffff, /* src_mask */
219 0xffff, /* dst_mask */
220 FALSE), /* pcrel_offset */
221 /* A high 8 bit absolute relocation of 16 bit address.
222 For LDI command. */
223 HOWTO (R_AVR_HI8_LDI, /* type */
224 8, /* rightshift */
225 1, /* size (0 = byte, 1 = short, 2 = long) */
226 8, /* bitsize */
227 FALSE, /* pc_relative */
228 0, /* bitpos */
229 complain_overflow_dont, /* complain_on_overflow */
230 bfd_elf_generic_reloc, /* special_function */
231 "R_AVR_HI8_LDI", /* name */
232 FALSE, /* partial_inplace */
233 0xffff, /* src_mask */
234 0xffff, /* dst_mask */
235 FALSE), /* pcrel_offset */
236 /* A high 6 bit absolute relocation of 22 bit address.
237 For LDI command. As well second most significant 8 bit value of
238 a 32 bit link-time constant. */
239 HOWTO (R_AVR_HH8_LDI, /* type */
240 16, /* rightshift */
241 1, /* size (0 = byte, 1 = short, 2 = long) */
242 8, /* bitsize */
243 FALSE, /* pc_relative */
244 0, /* bitpos */
245 complain_overflow_dont, /* complain_on_overflow */
246 bfd_elf_generic_reloc, /* special_function */
247 "R_AVR_HH8_LDI", /* name */
248 FALSE, /* partial_inplace */
249 0xffff, /* src_mask */
250 0xffff, /* dst_mask */
251 FALSE), /* pcrel_offset */
252 /* A negative low 8 bit absolute relocation of 16 bit address.
253 For LDI command. */
254 HOWTO (R_AVR_LO8_LDI_NEG, /* type */
255 0, /* rightshift */
256 1, /* size (0 = byte, 1 = short, 2 = long) */
257 8, /* bitsize */
258 FALSE, /* pc_relative */
259 0, /* bitpos */
260 complain_overflow_dont, /* complain_on_overflow */
261 bfd_elf_generic_reloc, /* special_function */
262 "R_AVR_LO8_LDI_NEG", /* name */
263 FALSE, /* partial_inplace */
264 0xffff, /* src_mask */
265 0xffff, /* dst_mask */
266 FALSE), /* pcrel_offset */
267 /* A negative high 8 bit absolute relocation of 16 bit address.
268 For LDI command. */
269 HOWTO (R_AVR_HI8_LDI_NEG, /* type */
270 8, /* rightshift */
271 1, /* size (0 = byte, 1 = short, 2 = long) */
272 8, /* bitsize */
273 FALSE, /* pc_relative */
274 0, /* bitpos */
275 complain_overflow_dont, /* complain_on_overflow */
276 bfd_elf_generic_reloc, /* special_function */
277 "R_AVR_HI8_LDI_NEG", /* name */
278 FALSE, /* partial_inplace */
279 0xffff, /* src_mask */
280 0xffff, /* dst_mask */
281 FALSE), /* pcrel_offset */
282 /* A negative high 6 bit absolute relocation of 22 bit address.
283 For LDI command. */
284 HOWTO (R_AVR_HH8_LDI_NEG, /* type */
285 16, /* rightshift */
286 1, /* size (0 = byte, 1 = short, 2 = long) */
287 8, /* bitsize */
288 FALSE, /* pc_relative */
289 0, /* bitpos */
290 complain_overflow_dont, /* complain_on_overflow */
291 bfd_elf_generic_reloc, /* special_function */
292 "R_AVR_HH8_LDI_NEG", /* name */
293 FALSE, /* partial_inplace */
294 0xffff, /* src_mask */
295 0xffff, /* dst_mask */
296 FALSE), /* pcrel_offset */
297 /* A low 8 bit absolute relocation of 24 bit program memory address.
298 For LDI command. Will not be changed when linker stubs are needed. */
299 HOWTO (R_AVR_LO8_LDI_PM, /* type */
300 1, /* rightshift */
301 1, /* size (0 = byte, 1 = short, 2 = long) */
302 8, /* bitsize */
303 FALSE, /* pc_relative */
304 0, /* bitpos */
305 complain_overflow_dont, /* complain_on_overflow */
306 bfd_elf_generic_reloc, /* special_function */
307 "R_AVR_LO8_LDI_PM", /* name */
308 FALSE, /* partial_inplace */
309 0xffff, /* src_mask */
310 0xffff, /* dst_mask */
311 FALSE), /* pcrel_offset */
312 /* A low 8 bit absolute relocation of 24 bit program memory address.
313 For LDI command. Will not be changed when linker stubs are needed. */
314 HOWTO (R_AVR_HI8_LDI_PM, /* type */
315 9, /* rightshift */
316 1, /* size (0 = byte, 1 = short, 2 = long) */
317 8, /* bitsize */
318 FALSE, /* pc_relative */
319 0, /* bitpos */
320 complain_overflow_dont, /* complain_on_overflow */
321 bfd_elf_generic_reloc, /* special_function */
322 "R_AVR_HI8_LDI_PM", /* name */
323 FALSE, /* partial_inplace */
324 0xffff, /* src_mask */
325 0xffff, /* dst_mask */
326 FALSE), /* pcrel_offset */
327 /* A low 8 bit absolute relocation of 24 bit program memory address.
328 For LDI command. Will not be changed when linker stubs are needed. */
329 HOWTO (R_AVR_HH8_LDI_PM, /* type */
330 17, /* rightshift */
331 1, /* size (0 = byte, 1 = short, 2 = long) */
332 8, /* bitsize */
333 FALSE, /* pc_relative */
334 0, /* bitpos */
335 complain_overflow_dont, /* complain_on_overflow */
336 bfd_elf_generic_reloc, /* special_function */
337 "R_AVR_HH8_LDI_PM", /* name */
338 FALSE, /* partial_inplace */
339 0xffff, /* src_mask */
340 0xffff, /* dst_mask */
341 FALSE), /* pcrel_offset */
342 /* A low 8 bit absolute relocation of 24 bit program memory address.
343 For LDI command. Will not be changed when linker stubs are needed. */
344 HOWTO (R_AVR_LO8_LDI_PM_NEG, /* type */
345 1, /* rightshift */
346 1, /* size (0 = byte, 1 = short, 2 = long) */
347 8, /* bitsize */
348 FALSE, /* pc_relative */
349 0, /* bitpos */
350 complain_overflow_dont, /* complain_on_overflow */
351 bfd_elf_generic_reloc, /* special_function */
352 "R_AVR_LO8_LDI_PM_NEG", /* name */
353 FALSE, /* partial_inplace */
354 0xffff, /* src_mask */
355 0xffff, /* dst_mask */
356 FALSE), /* pcrel_offset */
357 /* A low 8 bit absolute relocation of 24 bit program memory address.
358 For LDI command. Will not be changed when linker stubs are needed. */
359 HOWTO (R_AVR_HI8_LDI_PM_NEG, /* type */
360 9, /* rightshift */
361 1, /* size (0 = byte, 1 = short, 2 = long) */
362 8, /* bitsize */
363 FALSE, /* pc_relative */
364 0, /* bitpos */
365 complain_overflow_dont, /* complain_on_overflow */
366 bfd_elf_generic_reloc, /* special_function */
367 "R_AVR_HI8_LDI_PM_NEG", /* name */
368 FALSE, /* partial_inplace */
369 0xffff, /* src_mask */
370 0xffff, /* dst_mask */
371 FALSE), /* pcrel_offset */
372 /* A low 8 bit absolute relocation of 24 bit program memory address.
373 For LDI command. Will not be changed when linker stubs are needed. */
374 HOWTO (R_AVR_HH8_LDI_PM_NEG, /* type */
375 17, /* rightshift */
376 1, /* size (0 = byte, 1 = short, 2 = long) */
377 8, /* bitsize */
378 FALSE, /* pc_relative */
379 0, /* bitpos */
380 complain_overflow_dont, /* complain_on_overflow */
381 bfd_elf_generic_reloc, /* special_function */
382 "R_AVR_HH8_LDI_PM_NEG", /* name */
383 FALSE, /* partial_inplace */
384 0xffff, /* src_mask */
385 0xffff, /* dst_mask */
386 FALSE), /* pcrel_offset */
387 /* Relocation for CALL command in ATmega. */
388 HOWTO (R_AVR_CALL, /* type */
389 1, /* rightshift */
390 2, /* size (0 = byte, 1 = short, 2 = long) */
391 23, /* bitsize */
392 FALSE, /* pc_relative */
393 0, /* bitpos */
394 complain_overflow_dont,/* complain_on_overflow */
395 bfd_elf_generic_reloc, /* special_function */
396 "R_AVR_CALL", /* name */
397 FALSE, /* partial_inplace */
398 0xffffffff, /* src_mask */
399 0xffffffff, /* dst_mask */
400 FALSE), /* pcrel_offset */
401 /* A 16 bit absolute relocation of 16 bit address.
402 For LDI command. */
403 HOWTO (R_AVR_LDI, /* type */
404 0, /* rightshift */
405 1, /* size (0 = byte, 1 = short, 2 = long) */
406 16, /* bitsize */
407 FALSE, /* pc_relative */
408 0, /* bitpos */
409 complain_overflow_dont,/* complain_on_overflow */
410 bfd_elf_generic_reloc, /* special_function */
411 "R_AVR_LDI", /* name */
412 FALSE, /* partial_inplace */
413 0xffff, /* src_mask */
414 0xffff, /* dst_mask */
415 FALSE), /* pcrel_offset */
416 /* A 6 bit absolute relocation of 6 bit offset.
417 For ldd/sdd command. */
418 HOWTO (R_AVR_6, /* type */
419 0, /* rightshift */
420 0, /* size (0 = byte, 1 = short, 2 = long) */
421 6, /* bitsize */
422 FALSE, /* pc_relative */
423 0, /* bitpos */
424 complain_overflow_dont,/* complain_on_overflow */
425 bfd_elf_generic_reloc, /* special_function */
426 "R_AVR_6", /* name */
427 FALSE, /* partial_inplace */
428 0xffff, /* src_mask */
429 0xffff, /* dst_mask */
430 FALSE), /* pcrel_offset */
431 /* A 6 bit absolute relocation of 6 bit offset.
432 For sbiw/adiw command. */
433 HOWTO (R_AVR_6_ADIW, /* type */
434 0, /* rightshift */
435 0, /* size (0 = byte, 1 = short, 2 = long) */
436 6, /* bitsize */
437 FALSE, /* pc_relative */
438 0, /* bitpos */
439 complain_overflow_dont,/* complain_on_overflow */
440 bfd_elf_generic_reloc, /* special_function */
441 "R_AVR_6_ADIW", /* name */
442 FALSE, /* partial_inplace */
443 0xffff, /* src_mask */
444 0xffff, /* dst_mask */
445 FALSE), /* pcrel_offset */
446 /* Most significant 8 bit value of a 32 bit link-time constant. */
447 HOWTO (R_AVR_MS8_LDI, /* type */
448 24, /* rightshift */
449 1, /* size (0 = byte, 1 = short, 2 = long) */
450 8, /* bitsize */
451 FALSE, /* pc_relative */
452 0, /* bitpos */
453 complain_overflow_dont, /* complain_on_overflow */
454 bfd_elf_generic_reloc, /* special_function */
455 "R_AVR_MS8_LDI", /* name */
456 FALSE, /* partial_inplace */
457 0xffff, /* src_mask */
458 0xffff, /* dst_mask */
459 FALSE), /* pcrel_offset */
460 /* Negative most significant 8 bit value of a 32 bit link-time constant. */
461 HOWTO (R_AVR_MS8_LDI_NEG, /* type */
462 24, /* rightshift */
463 1, /* size (0 = byte, 1 = short, 2 = long) */
464 8, /* bitsize */
465 FALSE, /* pc_relative */
466 0, /* bitpos */
467 complain_overflow_dont, /* complain_on_overflow */
468 bfd_elf_generic_reloc, /* special_function */
469 "R_AVR_MS8_LDI_NEG", /* name */
470 FALSE, /* partial_inplace */
471 0xffff, /* src_mask */
472 0xffff, /* dst_mask */
473 FALSE), /* pcrel_offset */
474 /* A low 8 bit absolute relocation of 24 bit program memory address.
475 For LDI command. Will be changed when linker stubs are needed. */
476 HOWTO (R_AVR_LO8_LDI_GS, /* type */
477 1, /* rightshift */
478 1, /* size (0 = byte, 1 = short, 2 = long) */
479 8, /* bitsize */
480 FALSE, /* pc_relative */
481 0, /* bitpos */
482 complain_overflow_dont, /* complain_on_overflow */
483 bfd_elf_generic_reloc, /* special_function */
484 "R_AVR_LO8_LDI_GS", /* name */
485 FALSE, /* partial_inplace */
486 0xffff, /* src_mask */
487 0xffff, /* dst_mask */
488 FALSE), /* pcrel_offset */
489 /* A low 8 bit absolute relocation of 24 bit program memory address.
490 For LDI command. Will be changed when linker stubs are needed. */
491 HOWTO (R_AVR_HI8_LDI_GS, /* type */
492 9, /* rightshift */
493 1, /* size (0 = byte, 1 = short, 2 = long) */
494 8, /* bitsize */
495 FALSE, /* pc_relative */
496 0, /* bitpos */
497 complain_overflow_dont, /* complain_on_overflow */
498 bfd_elf_generic_reloc, /* special_function */
499 "R_AVR_HI8_LDI_GS", /* name */
500 FALSE, /* partial_inplace */
501 0xffff, /* src_mask */
502 0xffff, /* dst_mask */
503 FALSE), /* pcrel_offset */
504 /* 8 bit offset. */
505 HOWTO (R_AVR_8, /* type */
506 0, /* rightshift */
507 0, /* size (0 = byte, 1 = short, 2 = long) */
508 8, /* bitsize */
509 FALSE, /* pc_relative */
510 0, /* bitpos */
511 complain_overflow_bitfield,/* complain_on_overflow */
512 bfd_elf_generic_reloc, /* special_function */
513 "R_AVR_8", /* name */
514 FALSE, /* partial_inplace */
515 0x000000ff, /* src_mask */
516 0x000000ff, /* dst_mask */
517 FALSE), /* pcrel_offset */
518 /* lo8-part to use in .byte lo8(sym). */
519 HOWTO (R_AVR_8_LO8, /* type */
520 0, /* rightshift */
521 0, /* size (0 = byte, 1 = short, 2 = long) */
522 8, /* bitsize */
523 FALSE, /* pc_relative */
524 0, /* bitpos */
525 complain_overflow_dont,/* complain_on_overflow */
526 bfd_elf_generic_reloc, /* special_function */
527 "R_AVR_8_LO8", /* name */
528 FALSE, /* partial_inplace */
529 0xffffff, /* src_mask */
530 0xffffff, /* dst_mask */
531 FALSE), /* pcrel_offset */
532 /* hi8-part to use in .byte hi8(sym). */
533 HOWTO (R_AVR_8_HI8, /* type */
534 8, /* rightshift */
535 0, /* size (0 = byte, 1 = short, 2 = long) */
536 8, /* bitsize */
537 FALSE, /* pc_relative */
538 0, /* bitpos */
539 complain_overflow_dont,/* complain_on_overflow */
540 bfd_elf_generic_reloc, /* special_function */
541 "R_AVR_8_HI8", /* name */
542 FALSE, /* partial_inplace */
543 0xffffff, /* src_mask */
544 0xffffff, /* dst_mask */
545 FALSE), /* pcrel_offset */
546 /* hlo8-part to use in .byte hlo8(sym). */
547 HOWTO (R_AVR_8_HLO8, /* type */
548 16, /* rightshift */
549 0, /* size (0 = byte, 1 = short, 2 = long) */
550 8, /* bitsize */
551 FALSE, /* pc_relative */
552 0, /* bitpos */
553 complain_overflow_dont,/* complain_on_overflow */
554 bfd_elf_generic_reloc, /* special_function */
555 "R_AVR_8_HLO8", /* name */
556 FALSE, /* partial_inplace */
557 0xffffff, /* src_mask */
558 0xffffff, /* dst_mask */
559 FALSE), /* pcrel_offset */
562 /* Map BFD reloc types to AVR ELF reloc types. */
564 struct avr_reloc_map
566 bfd_reloc_code_real_type bfd_reloc_val;
567 unsigned int elf_reloc_val;
570 static const struct avr_reloc_map avr_reloc_map[] =
572 { BFD_RELOC_NONE, R_AVR_NONE },
573 { BFD_RELOC_32, R_AVR_32 },
574 { BFD_RELOC_AVR_7_PCREL, R_AVR_7_PCREL },
575 { BFD_RELOC_AVR_13_PCREL, R_AVR_13_PCREL },
576 { BFD_RELOC_16, R_AVR_16 },
577 { BFD_RELOC_AVR_16_PM, R_AVR_16_PM },
578 { BFD_RELOC_AVR_LO8_LDI, R_AVR_LO8_LDI},
579 { BFD_RELOC_AVR_HI8_LDI, R_AVR_HI8_LDI },
580 { BFD_RELOC_AVR_HH8_LDI, R_AVR_HH8_LDI },
581 { BFD_RELOC_AVR_MS8_LDI, R_AVR_MS8_LDI },
582 { BFD_RELOC_AVR_LO8_LDI_NEG, R_AVR_LO8_LDI_NEG },
583 { BFD_RELOC_AVR_HI8_LDI_NEG, R_AVR_HI8_LDI_NEG },
584 { BFD_RELOC_AVR_HH8_LDI_NEG, R_AVR_HH8_LDI_NEG },
585 { BFD_RELOC_AVR_MS8_LDI_NEG, R_AVR_MS8_LDI_NEG },
586 { BFD_RELOC_AVR_LO8_LDI_PM, R_AVR_LO8_LDI_PM },
587 { BFD_RELOC_AVR_LO8_LDI_GS, R_AVR_LO8_LDI_GS },
588 { BFD_RELOC_AVR_HI8_LDI_PM, R_AVR_HI8_LDI_PM },
589 { BFD_RELOC_AVR_HI8_LDI_GS, R_AVR_HI8_LDI_GS },
590 { BFD_RELOC_AVR_HH8_LDI_PM, R_AVR_HH8_LDI_PM },
591 { BFD_RELOC_AVR_LO8_LDI_PM_NEG, R_AVR_LO8_LDI_PM_NEG },
592 { BFD_RELOC_AVR_HI8_LDI_PM_NEG, R_AVR_HI8_LDI_PM_NEG },
593 { BFD_RELOC_AVR_HH8_LDI_PM_NEG, R_AVR_HH8_LDI_PM_NEG },
594 { BFD_RELOC_AVR_CALL, R_AVR_CALL },
595 { BFD_RELOC_AVR_LDI, R_AVR_LDI },
596 { BFD_RELOC_AVR_6, R_AVR_6 },
597 { BFD_RELOC_AVR_6_ADIW, R_AVR_6_ADIW },
598 { BFD_RELOC_8, R_AVR_8 },
599 { BFD_RELOC_AVR_8_LO, R_AVR_8_LO8 },
600 { BFD_RELOC_AVR_8_HI, R_AVR_8_HI8 },
601 { BFD_RELOC_AVR_8_HLO, R_AVR_8_HLO8 }
604 /* Meant to be filled one day with the wrap around address for the
605 specific device. I.e. should get the value 0x4000 for 16k devices,
606 0x8000 for 32k devices and so on.
608 We initialize it here with a value of 0x1000000 resulting in
609 that we will never suggest a wrap-around jump during relaxation.
610 The logic of the source code later on assumes that in
611 avr_pc_wrap_around one single bit is set. */
612 static bfd_vma avr_pc_wrap_around = 0x10000000;
614 /* If this variable holds a value different from zero, the linker relaxation
615 machine will try to optimize call/ret sequences by a single jump
616 instruction. This option could be switched off by a linker switch. */
617 static int avr_replace_call_ret_sequences = 1;
619 /* Initialize an entry in the stub hash table. */
621 static struct bfd_hash_entry *
622 stub_hash_newfunc (struct bfd_hash_entry *entry,
623 struct bfd_hash_table *table,
624 const char *string)
626 /* Allocate the structure if it has not already been allocated by a
627 subclass. */
628 if (entry == NULL)
630 entry = bfd_hash_allocate (table,
631 sizeof (struct elf32_avr_stub_hash_entry));
632 if (entry == NULL)
633 return entry;
636 /* Call the allocation method of the superclass. */
637 entry = bfd_hash_newfunc (entry, table, string);
638 if (entry != NULL)
640 struct elf32_avr_stub_hash_entry *hsh;
642 /* Initialize the local fields. */
643 hsh = avr_stub_hash_entry (entry);
644 hsh->stub_offset = 0;
645 hsh->target_value = 0;
648 return entry;
651 /* This function is just a straight passthrough to the real
652 function in linker.c. Its prupose is so that its address
653 can be compared inside the avr_link_hash_table macro. */
655 static struct bfd_hash_entry *
656 elf32_avr_link_hash_newfunc (struct bfd_hash_entry * entry,
657 struct bfd_hash_table * table,
658 const char * string)
660 return _bfd_elf_link_hash_newfunc (entry, table, string);
663 /* Create the derived linker hash table. The AVR ELF port uses the derived
664 hash table to keep information specific to the AVR ELF linker (without
665 using static variables). */
667 static struct bfd_link_hash_table *
668 elf32_avr_link_hash_table_create (bfd *abfd)
670 struct elf32_avr_link_hash_table *htab;
671 bfd_size_type amt = sizeof (*htab);
673 htab = bfd_zmalloc (amt);
674 if (htab == NULL)
675 return NULL;
677 if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd,
678 elf32_avr_link_hash_newfunc,
679 sizeof (struct elf_link_hash_entry),
680 AVR_ELF_DATA))
682 free (htab);
683 return NULL;
686 /* Init the stub hash table too. */
687 if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc,
688 sizeof (struct elf32_avr_stub_hash_entry)))
689 return NULL;
691 return &htab->etab.root;
694 /* Free the derived linker hash table. */
696 static void
697 elf32_avr_link_hash_table_free (struct bfd_link_hash_table *btab)
699 struct elf32_avr_link_hash_table *htab
700 = (struct elf32_avr_link_hash_table *) btab;
702 /* Free the address mapping table. */
703 if (htab->amt_stub_offsets != NULL)
704 free (htab->amt_stub_offsets);
705 if (htab->amt_destination_addr != NULL)
706 free (htab->amt_destination_addr);
708 bfd_hash_table_free (&htab->bstab);
709 _bfd_elf_link_hash_table_free (btab);
712 /* Calculates the effective distance of a pc relative jump/call. */
714 static int
715 avr_relative_distance_considering_wrap_around (unsigned int distance)
717 unsigned int wrap_around_mask = avr_pc_wrap_around - 1;
718 int dist_with_wrap_around = distance & wrap_around_mask;
720 if (dist_with_wrap_around > ((int) (avr_pc_wrap_around >> 1)))
721 dist_with_wrap_around -= avr_pc_wrap_around;
723 return dist_with_wrap_around;
727 static reloc_howto_type *
728 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
729 bfd_reloc_code_real_type code)
731 unsigned int i;
733 for (i = 0;
734 i < sizeof (avr_reloc_map) / sizeof (struct avr_reloc_map);
735 i++)
736 if (avr_reloc_map[i].bfd_reloc_val == code)
737 return &elf_avr_howto_table[avr_reloc_map[i].elf_reloc_val];
739 return NULL;
742 static reloc_howto_type *
743 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
744 const char *r_name)
746 unsigned int i;
748 for (i = 0;
749 i < sizeof (elf_avr_howto_table) / sizeof (elf_avr_howto_table[0]);
750 i++)
751 if (elf_avr_howto_table[i].name != NULL
752 && strcasecmp (elf_avr_howto_table[i].name, r_name) == 0)
753 return &elf_avr_howto_table[i];
755 return NULL;
758 /* Set the howto pointer for an AVR ELF reloc. */
760 static void
761 avr_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
762 arelent *cache_ptr,
763 Elf_Internal_Rela *dst)
765 unsigned int r_type;
767 r_type = ELF32_R_TYPE (dst->r_info);
768 BFD_ASSERT (r_type < (unsigned int) R_AVR_max);
769 cache_ptr->howto = &elf_avr_howto_table[r_type];
772 static bfd_boolean
773 avr_stub_is_required_for_16_bit_reloc (bfd_vma relocation)
775 return (relocation >= 0x020000);
778 /* Returns the address of the corresponding stub if there is one.
779 Returns otherwise an address above 0x020000. This function
780 could also be used, if there is no knowledge on the section where
781 the destination is found. */
783 static bfd_vma
784 avr_get_stub_addr (bfd_vma srel,
785 struct elf32_avr_link_hash_table *htab)
787 unsigned int sindex;
788 bfd_vma stub_sec_addr =
789 (htab->stub_sec->output_section->vma +
790 htab->stub_sec->output_offset);
792 for (sindex = 0; sindex < htab->amt_max_entry_cnt; sindex ++)
793 if (htab->amt_destination_addr[sindex] == srel)
794 return htab->amt_stub_offsets[sindex] + stub_sec_addr;
796 /* Return an address that could not be reached by 16 bit relocs. */
797 return 0x020000;
800 /* Perform a single relocation. By default we use the standard BFD
801 routines, but a few relocs, we have to do them ourselves. */
803 static bfd_reloc_status_type
804 avr_final_link_relocate (reloc_howto_type * howto,
805 bfd * input_bfd,
806 asection * input_section,
807 bfd_byte * contents,
808 Elf_Internal_Rela * rel,
809 bfd_vma relocation,
810 struct elf32_avr_link_hash_table * htab)
812 bfd_reloc_status_type r = bfd_reloc_ok;
813 bfd_vma x;
814 bfd_signed_vma srel;
815 bfd_signed_vma reloc_addr;
816 bfd_boolean use_stubs = FALSE;
817 /* Usually is 0, unless we are generating code for a bootloader. */
818 bfd_signed_vma base_addr = htab->vector_base;
820 /* Absolute addr of the reloc in the final excecutable. */
821 reloc_addr = rel->r_offset + input_section->output_section->vma
822 + input_section->output_offset;
824 switch (howto->type)
826 case R_AVR_7_PCREL:
827 contents += rel->r_offset;
828 srel = (bfd_signed_vma) relocation;
829 srel += rel->r_addend;
830 srel -= rel->r_offset;
831 srel -= 2; /* Branch instructions add 2 to the PC... */
832 srel -= (input_section->output_section->vma +
833 input_section->output_offset);
835 if (srel & 1)
836 return bfd_reloc_outofrange;
837 if (srel > ((1 << 7) - 1) || (srel < - (1 << 7)))
838 return bfd_reloc_overflow;
839 x = bfd_get_16 (input_bfd, contents);
840 x = (x & 0xfc07) | (((srel >> 1) << 3) & 0x3f8);
841 bfd_put_16 (input_bfd, x, contents);
842 break;
844 case R_AVR_13_PCREL:
845 contents += rel->r_offset;
846 srel = (bfd_signed_vma) relocation;
847 srel += rel->r_addend;
848 srel -= rel->r_offset;
849 srel -= 2; /* Branch instructions add 2 to the PC... */
850 srel -= (input_section->output_section->vma +
851 input_section->output_offset);
853 if (srel & 1)
854 return bfd_reloc_outofrange;
856 srel = avr_relative_distance_considering_wrap_around (srel);
858 /* AVR addresses commands as words. */
859 srel >>= 1;
861 /* Check for overflow. */
862 if (srel < -2048 || srel > 2047)
864 /* Relative distance is too large. */
866 /* Always apply WRAPAROUND for avr2, avr25, and avr4. */
867 switch (bfd_get_mach (input_bfd))
869 case bfd_mach_avr2:
870 case bfd_mach_avr25:
871 case bfd_mach_avr4:
872 break;
874 default:
875 return bfd_reloc_overflow;
879 x = bfd_get_16 (input_bfd, contents);
880 x = (x & 0xf000) | (srel & 0xfff);
881 bfd_put_16 (input_bfd, x, contents);
882 break;
884 case R_AVR_LO8_LDI:
885 contents += rel->r_offset;
886 srel = (bfd_signed_vma) relocation + rel->r_addend;
887 x = bfd_get_16 (input_bfd, contents);
888 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
889 bfd_put_16 (input_bfd, x, contents);
890 break;
892 case R_AVR_LDI:
893 contents += rel->r_offset;
894 srel = (bfd_signed_vma) relocation + rel->r_addend;
895 if (((srel > 0) && (srel & 0xffff) > 255)
896 || ((srel < 0) && ((-srel) & 0xffff) > 128))
897 /* Remove offset for data/eeprom section. */
898 return bfd_reloc_overflow;
900 x = bfd_get_16 (input_bfd, contents);
901 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
902 bfd_put_16 (input_bfd, x, contents);
903 break;
905 case R_AVR_6:
906 contents += rel->r_offset;
907 srel = (bfd_signed_vma) relocation + rel->r_addend;
908 if (((srel & 0xffff) > 63) || (srel < 0))
909 /* Remove offset for data/eeprom section. */
910 return bfd_reloc_overflow;
911 x = bfd_get_16 (input_bfd, contents);
912 x = (x & 0xd3f8) | ((srel & 7) | ((srel & (3 << 3)) << 7)
913 | ((srel & (1 << 5)) << 8));
914 bfd_put_16 (input_bfd, x, contents);
915 break;
917 case R_AVR_6_ADIW:
918 contents += rel->r_offset;
919 srel = (bfd_signed_vma) relocation + rel->r_addend;
920 if (((srel & 0xffff) > 63) || (srel < 0))
921 /* Remove offset for data/eeprom section. */
922 return bfd_reloc_overflow;
923 x = bfd_get_16 (input_bfd, contents);
924 x = (x & 0xff30) | (srel & 0xf) | ((srel & 0x30) << 2);
925 bfd_put_16 (input_bfd, x, contents);
926 break;
928 case R_AVR_HI8_LDI:
929 contents += rel->r_offset;
930 srel = (bfd_signed_vma) relocation + rel->r_addend;
931 srel = (srel >> 8) & 0xff;
932 x = bfd_get_16 (input_bfd, contents);
933 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
934 bfd_put_16 (input_bfd, x, contents);
935 break;
937 case R_AVR_HH8_LDI:
938 contents += rel->r_offset;
939 srel = (bfd_signed_vma) relocation + rel->r_addend;
940 srel = (srel >> 16) & 0xff;
941 x = bfd_get_16 (input_bfd, contents);
942 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
943 bfd_put_16 (input_bfd, x, contents);
944 break;
946 case R_AVR_MS8_LDI:
947 contents += rel->r_offset;
948 srel = (bfd_signed_vma) relocation + rel->r_addend;
949 srel = (srel >> 24) & 0xff;
950 x = bfd_get_16 (input_bfd, contents);
951 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
952 bfd_put_16 (input_bfd, x, contents);
953 break;
955 case R_AVR_LO8_LDI_NEG:
956 contents += rel->r_offset;
957 srel = (bfd_signed_vma) relocation + rel->r_addend;
958 srel = -srel;
959 x = bfd_get_16 (input_bfd, contents);
960 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
961 bfd_put_16 (input_bfd, x, contents);
962 break;
964 case R_AVR_HI8_LDI_NEG:
965 contents += rel->r_offset;
966 srel = (bfd_signed_vma) relocation + rel->r_addend;
967 srel = -srel;
968 srel = (srel >> 8) & 0xff;
969 x = bfd_get_16 (input_bfd, contents);
970 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
971 bfd_put_16 (input_bfd, x, contents);
972 break;
974 case R_AVR_HH8_LDI_NEG:
975 contents += rel->r_offset;
976 srel = (bfd_signed_vma) relocation + rel->r_addend;
977 srel = -srel;
978 srel = (srel >> 16) & 0xff;
979 x = bfd_get_16 (input_bfd, contents);
980 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
981 bfd_put_16 (input_bfd, x, contents);
982 break;
984 case R_AVR_MS8_LDI_NEG:
985 contents += rel->r_offset;
986 srel = (bfd_signed_vma) relocation + rel->r_addend;
987 srel = -srel;
988 srel = (srel >> 24) & 0xff;
989 x = bfd_get_16 (input_bfd, contents);
990 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
991 bfd_put_16 (input_bfd, x, contents);
992 break;
994 case R_AVR_LO8_LDI_GS:
995 use_stubs = (!htab->no_stubs);
996 /* Fall through. */
997 case R_AVR_LO8_LDI_PM:
998 contents += rel->r_offset;
999 srel = (bfd_signed_vma) relocation + rel->r_addend;
1001 if (use_stubs
1002 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1004 bfd_vma old_srel = srel;
1006 /* We need to use the address of the stub instead. */
1007 srel = avr_get_stub_addr (srel, htab);
1008 if (debug_stubs)
1009 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1010 "reloc at address 0x%x.\n",
1011 (unsigned int) srel,
1012 (unsigned int) old_srel,
1013 (unsigned int) reloc_addr);
1015 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1016 return bfd_reloc_outofrange;
1019 if (srel & 1)
1020 return bfd_reloc_outofrange;
1021 srel = srel >> 1;
1022 x = bfd_get_16 (input_bfd, contents);
1023 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1024 bfd_put_16 (input_bfd, x, contents);
1025 break;
1027 case R_AVR_HI8_LDI_GS:
1028 use_stubs = (!htab->no_stubs);
1029 /* Fall through. */
1030 case R_AVR_HI8_LDI_PM:
1031 contents += rel->r_offset;
1032 srel = (bfd_signed_vma) relocation + rel->r_addend;
1034 if (use_stubs
1035 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1037 bfd_vma old_srel = srel;
1039 /* We need to use the address of the stub instead. */
1040 srel = avr_get_stub_addr (srel, htab);
1041 if (debug_stubs)
1042 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1043 "reloc at address 0x%x.\n",
1044 (unsigned int) srel,
1045 (unsigned int) old_srel,
1046 (unsigned int) reloc_addr);
1048 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1049 return bfd_reloc_outofrange;
1052 if (srel & 1)
1053 return bfd_reloc_outofrange;
1054 srel = srel >> 1;
1055 srel = (srel >> 8) & 0xff;
1056 x = bfd_get_16 (input_bfd, contents);
1057 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1058 bfd_put_16 (input_bfd, x, contents);
1059 break;
1061 case R_AVR_HH8_LDI_PM:
1062 contents += rel->r_offset;
1063 srel = (bfd_signed_vma) relocation + rel->r_addend;
1064 if (srel & 1)
1065 return bfd_reloc_outofrange;
1066 srel = srel >> 1;
1067 srel = (srel >> 16) & 0xff;
1068 x = bfd_get_16 (input_bfd, contents);
1069 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1070 bfd_put_16 (input_bfd, x, contents);
1071 break;
1073 case R_AVR_LO8_LDI_PM_NEG:
1074 contents += rel->r_offset;
1075 srel = (bfd_signed_vma) relocation + rel->r_addend;
1076 srel = -srel;
1077 if (srel & 1)
1078 return bfd_reloc_outofrange;
1079 srel = srel >> 1;
1080 x = bfd_get_16 (input_bfd, contents);
1081 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1082 bfd_put_16 (input_bfd, x, contents);
1083 break;
1085 case R_AVR_HI8_LDI_PM_NEG:
1086 contents += rel->r_offset;
1087 srel = (bfd_signed_vma) relocation + rel->r_addend;
1088 srel = -srel;
1089 if (srel & 1)
1090 return bfd_reloc_outofrange;
1091 srel = srel >> 1;
1092 srel = (srel >> 8) & 0xff;
1093 x = bfd_get_16 (input_bfd, contents);
1094 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1095 bfd_put_16 (input_bfd, x, contents);
1096 break;
1098 case R_AVR_HH8_LDI_PM_NEG:
1099 contents += rel->r_offset;
1100 srel = (bfd_signed_vma) relocation + rel->r_addend;
1101 srel = -srel;
1102 if (srel & 1)
1103 return bfd_reloc_outofrange;
1104 srel = srel >> 1;
1105 srel = (srel >> 16) & 0xff;
1106 x = bfd_get_16 (input_bfd, contents);
1107 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1108 bfd_put_16 (input_bfd, x, contents);
1109 break;
1111 case R_AVR_CALL:
1112 contents += rel->r_offset;
1113 srel = (bfd_signed_vma) relocation + rel->r_addend;
1114 if (srel & 1)
1115 return bfd_reloc_outofrange;
1116 srel = srel >> 1;
1117 x = bfd_get_16 (input_bfd, contents);
1118 x |= ((srel & 0x10000) | ((srel << 3) & 0x1f00000)) >> 16;
1119 bfd_put_16 (input_bfd, x, contents);
1120 bfd_put_16 (input_bfd, (bfd_vma) srel & 0xffff, contents+2);
1121 break;
1123 case R_AVR_16_PM:
1124 use_stubs = (!htab->no_stubs);
1125 contents += rel->r_offset;
1126 srel = (bfd_signed_vma) relocation + rel->r_addend;
1128 if (use_stubs
1129 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1131 bfd_vma old_srel = srel;
1133 /* We need to use the address of the stub instead. */
1134 srel = avr_get_stub_addr (srel,htab);
1135 if (debug_stubs)
1136 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1137 "reloc at address 0x%x.\n",
1138 (unsigned int) srel,
1139 (unsigned int) old_srel,
1140 (unsigned int) reloc_addr);
1142 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1143 return bfd_reloc_outofrange;
1146 if (srel & 1)
1147 return bfd_reloc_outofrange;
1148 srel = srel >> 1;
1149 bfd_put_16 (input_bfd, (bfd_vma) srel &0x00ffff, contents);
1150 break;
1152 default:
1153 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1154 contents, rel->r_offset,
1155 relocation, rel->r_addend);
1158 return r;
1161 /* Relocate an AVR ELF section. */
1163 static bfd_boolean
1164 elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1165 struct bfd_link_info *info,
1166 bfd *input_bfd,
1167 asection *input_section,
1168 bfd_byte *contents,
1169 Elf_Internal_Rela *relocs,
1170 Elf_Internal_Sym *local_syms,
1171 asection **local_sections)
1173 Elf_Internal_Shdr * symtab_hdr;
1174 struct elf_link_hash_entry ** sym_hashes;
1175 Elf_Internal_Rela * rel;
1176 Elf_Internal_Rela * relend;
1177 struct elf32_avr_link_hash_table * htab = avr_link_hash_table (info);
1179 if (htab == NULL)
1180 return FALSE;
1182 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1183 sym_hashes = elf_sym_hashes (input_bfd);
1184 relend = relocs + input_section->reloc_count;
1186 for (rel = relocs; rel < relend; rel ++)
1188 reloc_howto_type * howto;
1189 unsigned long r_symndx;
1190 Elf_Internal_Sym * sym;
1191 asection * sec;
1192 struct elf_link_hash_entry * h;
1193 bfd_vma relocation;
1194 bfd_reloc_status_type r;
1195 const char * name;
1196 int r_type;
1198 r_type = ELF32_R_TYPE (rel->r_info);
1199 r_symndx = ELF32_R_SYM (rel->r_info);
1200 howto = elf_avr_howto_table + r_type;
1201 h = NULL;
1202 sym = NULL;
1203 sec = NULL;
1205 if (r_symndx < symtab_hdr->sh_info)
1207 sym = local_syms + r_symndx;
1208 sec = local_sections [r_symndx];
1209 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1211 name = bfd_elf_string_from_elf_section
1212 (input_bfd, symtab_hdr->sh_link, sym->st_name);
1213 name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1215 else
1217 bfd_boolean unresolved_reloc, warned;
1219 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1220 r_symndx, symtab_hdr, sym_hashes,
1221 h, sec, relocation,
1222 unresolved_reloc, warned);
1224 name = h->root.root.string;
1227 if (sec != NULL && discarded_section (sec))
1228 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1229 rel, 1, relend, howto, 0, contents);
1231 if (info->relocatable)
1232 continue;
1234 r = avr_final_link_relocate (howto, input_bfd, input_section,
1235 contents, rel, relocation, htab);
1237 if (r != bfd_reloc_ok)
1239 const char * msg = (const char *) NULL;
1241 switch (r)
1243 case bfd_reloc_overflow:
1244 r = info->callbacks->reloc_overflow
1245 (info, (h ? &h->root : NULL),
1246 name, howto->name, (bfd_vma) 0,
1247 input_bfd, input_section, rel->r_offset);
1248 break;
1250 case bfd_reloc_undefined:
1251 r = info->callbacks->undefined_symbol
1252 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1253 break;
1255 case bfd_reloc_outofrange:
1256 msg = _("internal error: out of range error");
1257 break;
1259 case bfd_reloc_notsupported:
1260 msg = _("internal error: unsupported relocation error");
1261 break;
1263 case bfd_reloc_dangerous:
1264 msg = _("internal error: dangerous relocation");
1265 break;
1267 default:
1268 msg = _("internal error: unknown error");
1269 break;
1272 if (msg)
1273 r = info->callbacks->warning
1274 (info, msg, name, input_bfd, input_section, rel->r_offset);
1276 if (! r)
1277 return FALSE;
1281 return TRUE;
1284 /* The final processing done just before writing out a AVR ELF object
1285 file. This gets the AVR architecture right based on the machine
1286 number. */
1288 static void
1289 bfd_elf_avr_final_write_processing (bfd *abfd,
1290 bfd_boolean linker ATTRIBUTE_UNUSED)
1292 unsigned long val;
1294 switch (bfd_get_mach (abfd))
1296 default:
1297 case bfd_mach_avr2:
1298 val = E_AVR_MACH_AVR2;
1299 break;
1301 case bfd_mach_avr1:
1302 val = E_AVR_MACH_AVR1;
1303 break;
1305 case bfd_mach_avr25:
1306 val = E_AVR_MACH_AVR25;
1307 break;
1309 case bfd_mach_avr3:
1310 val = E_AVR_MACH_AVR3;
1311 break;
1313 case bfd_mach_avr31:
1314 val = E_AVR_MACH_AVR31;
1315 break;
1317 case bfd_mach_avr35:
1318 val = E_AVR_MACH_AVR35;
1319 break;
1321 case bfd_mach_avr4:
1322 val = E_AVR_MACH_AVR4;
1323 break;
1325 case bfd_mach_avr5:
1326 val = E_AVR_MACH_AVR5;
1327 break;
1329 case bfd_mach_avr51:
1330 val = E_AVR_MACH_AVR51;
1331 break;
1333 case bfd_mach_avr6:
1334 val = E_AVR_MACH_AVR6;
1335 break;
1337 case bfd_mach_avrxmega1:
1338 val = E_AVR_MACH_XMEGA1;
1339 break;
1341 case bfd_mach_avrxmega2:
1342 val = E_AVR_MACH_XMEGA2;
1343 break;
1345 case bfd_mach_avrxmega3:
1346 val = E_AVR_MACH_XMEGA3;
1347 break;
1349 case bfd_mach_avrxmega4:
1350 val = E_AVR_MACH_XMEGA4;
1351 break;
1353 case bfd_mach_avrxmega5:
1354 val = E_AVR_MACH_XMEGA5;
1355 break;
1357 case bfd_mach_avrxmega6:
1358 val = E_AVR_MACH_XMEGA6;
1359 break;
1361 case bfd_mach_avrxmega7:
1362 val = E_AVR_MACH_XMEGA7;
1363 break;
1366 elf_elfheader (abfd)->e_machine = EM_AVR;
1367 elf_elfheader (abfd)->e_flags &= ~ EF_AVR_MACH;
1368 elf_elfheader (abfd)->e_flags |= val;
1369 elf_elfheader (abfd)->e_flags |= EF_AVR_LINKRELAX_PREPARED;
1372 /* Set the right machine number. */
1374 static bfd_boolean
1375 elf32_avr_object_p (bfd *abfd)
1377 unsigned int e_set = bfd_mach_avr2;
1379 if (elf_elfheader (abfd)->e_machine == EM_AVR
1380 || elf_elfheader (abfd)->e_machine == EM_AVR_OLD)
1382 int e_mach = elf_elfheader (abfd)->e_flags & EF_AVR_MACH;
1384 switch (e_mach)
1386 default:
1387 case E_AVR_MACH_AVR2:
1388 e_set = bfd_mach_avr2;
1389 break;
1391 case E_AVR_MACH_AVR1:
1392 e_set = bfd_mach_avr1;
1393 break;
1395 case E_AVR_MACH_AVR25:
1396 e_set = bfd_mach_avr25;
1397 break;
1399 case E_AVR_MACH_AVR3:
1400 e_set = bfd_mach_avr3;
1401 break;
1403 case E_AVR_MACH_AVR31:
1404 e_set = bfd_mach_avr31;
1405 break;
1407 case E_AVR_MACH_AVR35:
1408 e_set = bfd_mach_avr35;
1409 break;
1411 case E_AVR_MACH_AVR4:
1412 e_set = bfd_mach_avr4;
1413 break;
1415 case E_AVR_MACH_AVR5:
1416 e_set = bfd_mach_avr5;
1417 break;
1419 case E_AVR_MACH_AVR51:
1420 e_set = bfd_mach_avr51;
1421 break;
1423 case E_AVR_MACH_AVR6:
1424 e_set = bfd_mach_avr6;
1425 break;
1427 case E_AVR_MACH_XMEGA1:
1428 e_set = bfd_mach_avrxmega1;
1429 break;
1431 case E_AVR_MACH_XMEGA2:
1432 e_set = bfd_mach_avrxmega2;
1433 break;
1435 case E_AVR_MACH_XMEGA3:
1436 e_set = bfd_mach_avrxmega3;
1437 break;
1439 case E_AVR_MACH_XMEGA4:
1440 e_set = bfd_mach_avrxmega4;
1441 break;
1443 case E_AVR_MACH_XMEGA5:
1444 e_set = bfd_mach_avrxmega5;
1445 break;
1447 case E_AVR_MACH_XMEGA6:
1448 e_set = bfd_mach_avrxmega6;
1449 break;
1451 case E_AVR_MACH_XMEGA7:
1452 e_set = bfd_mach_avrxmega7;
1453 break;
1456 return bfd_default_set_arch_mach (abfd, bfd_arch_avr,
1457 e_set);
1461 /* Delete some bytes from a section while changing the size of an instruction.
1462 The parameter "addr" denotes the section-relative offset pointing just
1463 behind the shrinked instruction. "addr+count" point at the first
1464 byte just behind the original unshrinked instruction. */
1466 static bfd_boolean
1467 elf32_avr_relax_delete_bytes (bfd *abfd,
1468 asection *sec,
1469 bfd_vma addr,
1470 int count)
1472 Elf_Internal_Shdr *symtab_hdr;
1473 unsigned int sec_shndx;
1474 bfd_byte *contents;
1475 Elf_Internal_Rela *irel, *irelend;
1476 Elf_Internal_Sym *isym;
1477 Elf_Internal_Sym *isymbuf = NULL;
1478 bfd_vma toaddr;
1479 struct elf_link_hash_entry **sym_hashes;
1480 struct elf_link_hash_entry **end_hashes;
1481 unsigned int symcount;
1483 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1484 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1485 contents = elf_section_data (sec)->this_hdr.contents;
1487 toaddr = sec->size;
1489 irel = elf_section_data (sec)->relocs;
1490 irelend = irel + sec->reloc_count;
1492 /* Actually delete the bytes. */
1493 if (toaddr - addr - count > 0)
1494 memmove (contents + addr, contents + addr + count,
1495 (size_t) (toaddr - addr - count));
1496 sec->size -= count;
1498 /* Adjust all the reloc addresses. */
1499 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1501 bfd_vma old_reloc_address;
1503 old_reloc_address = (sec->output_section->vma
1504 + sec->output_offset + irel->r_offset);
1506 /* Get the new reloc address. */
1507 if ((irel->r_offset > addr
1508 && irel->r_offset < toaddr))
1510 if (debug_relax)
1511 printf ("Relocation at address 0x%x needs to be moved.\n"
1512 "Old section offset: 0x%x, New section offset: 0x%x \n",
1513 (unsigned int) old_reloc_address,
1514 (unsigned int) irel->r_offset,
1515 (unsigned int) ((irel->r_offset) - count));
1517 irel->r_offset -= count;
1522 /* The reloc's own addresses are now ok. However, we need to readjust
1523 the reloc's addend, i.e. the reloc's value if two conditions are met:
1524 1.) the reloc is relative to a symbol in this section that
1525 is located in front of the shrinked instruction
1526 2.) symbol plus addend end up behind the shrinked instruction.
1528 The most common case where this happens are relocs relative to
1529 the section-start symbol.
1531 This step needs to be done for all of the sections of the bfd. */
1534 struct bfd_section *isec;
1536 for (isec = abfd->sections; isec; isec = isec->next)
1538 bfd_vma symval;
1539 bfd_vma shrinked_insn_address;
1541 if (isec->reloc_count == 0)
1542 continue;
1544 shrinked_insn_address = (sec->output_section->vma
1545 + sec->output_offset + addr - count);
1547 irel = elf_section_data (isec)->relocs;
1548 /* PR 12161: Read in the relocs for this section if necessary. */
1549 if (irel == NULL)
1550 irel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, TRUE);
1552 for (irelend = irel + isec->reloc_count;
1553 irel < irelend;
1554 irel++)
1556 /* Read this BFD's local symbols if we haven't done
1557 so already. */
1558 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1560 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1561 if (isymbuf == NULL)
1562 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1563 symtab_hdr->sh_info, 0,
1564 NULL, NULL, NULL);
1565 if (isymbuf == NULL)
1566 return FALSE;
1569 /* Get the value of the symbol referred to by the reloc. */
1570 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1572 /* A local symbol. */
1573 asection *sym_sec;
1575 isym = isymbuf + ELF32_R_SYM (irel->r_info);
1576 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1577 symval = isym->st_value;
1578 /* If the reloc is absolute, it will not have
1579 a symbol or section associated with it. */
1580 if (sym_sec == sec)
1582 symval += sym_sec->output_section->vma
1583 + sym_sec->output_offset;
1585 if (debug_relax)
1586 printf ("Checking if the relocation's "
1587 "addend needs corrections.\n"
1588 "Address of anchor symbol: 0x%x \n"
1589 "Address of relocation target: 0x%x \n"
1590 "Address of relaxed insn: 0x%x \n",
1591 (unsigned int) symval,
1592 (unsigned int) (symval + irel->r_addend),
1593 (unsigned int) shrinked_insn_address);
1595 if (symval <= shrinked_insn_address
1596 && (symval + irel->r_addend) > shrinked_insn_address)
1598 irel->r_addend -= count;
1600 if (debug_relax)
1601 printf ("Relocation's addend needed to be fixed \n");
1604 /* else...Reference symbol is absolute. No adjustment needed. */
1606 /* else...Reference symbol is extern. No need for adjusting
1607 the addend. */
1612 /* Adjust the local symbols defined in this section. */
1613 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1614 /* Fix PR 9841, there may be no local symbols. */
1615 if (isym != NULL)
1617 Elf_Internal_Sym *isymend;
1619 isymend = isym + symtab_hdr->sh_info;
1620 for (; isym < isymend; isym++)
1622 if (isym->st_shndx == sec_shndx
1623 && isym->st_value > addr
1624 && isym->st_value < toaddr)
1625 isym->st_value -= count;
1629 /* Now adjust the global symbols defined in this section. */
1630 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1631 - symtab_hdr->sh_info);
1632 sym_hashes = elf_sym_hashes (abfd);
1633 end_hashes = sym_hashes + symcount;
1634 for (; sym_hashes < end_hashes; sym_hashes++)
1636 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1637 if ((sym_hash->root.type == bfd_link_hash_defined
1638 || sym_hash->root.type == bfd_link_hash_defweak)
1639 && sym_hash->root.u.def.section == sec
1640 && sym_hash->root.u.def.value > addr
1641 && sym_hash->root.u.def.value < toaddr)
1643 sym_hash->root.u.def.value -= count;
1647 return TRUE;
1650 /* This function handles relaxing for the avr.
1651 Many important relaxing opportunities within functions are already
1652 realized by the compiler itself.
1653 Here we try to replace call (4 bytes) -> rcall (2 bytes)
1654 and jump -> rjmp (safes also 2 bytes).
1655 As well we now optimize seqences of
1656 - call/rcall function
1657 - ret
1658 to yield
1659 - jmp/rjmp function
1660 - ret
1661 . In case that within a sequence
1662 - jmp/rjmp label
1663 - ret
1664 the ret could no longer be reached it is optimized away. In order
1665 to check if the ret is no longer needed, it is checked that the ret's address
1666 is not the target of a branch or jump within the same section, it is checked
1667 that there is no skip instruction before the jmp/rjmp and that there
1668 is no local or global label place at the address of the ret.
1670 We refrain from relaxing within sections ".vectors" and
1671 ".jumptables" in order to maintain the position of the instructions.
1672 There, however, we substitute jmp/call by a sequence rjmp,nop/rcall,nop
1673 if possible. (In future one could possibly use the space of the nop
1674 for the first instruction of the irq service function.
1676 The .jumptables sections is meant to be used for a future tablejump variant
1677 for the devices with 3-byte program counter where the table itself
1678 contains 4-byte jump instructions whose relative offset must not
1679 be changed. */
1681 static bfd_boolean
1682 elf32_avr_relax_section (bfd *abfd,
1683 asection *sec,
1684 struct bfd_link_info *link_info,
1685 bfd_boolean *again)
1687 Elf_Internal_Shdr *symtab_hdr;
1688 Elf_Internal_Rela *internal_relocs;
1689 Elf_Internal_Rela *irel, *irelend;
1690 bfd_byte *contents = NULL;
1691 Elf_Internal_Sym *isymbuf = NULL;
1692 struct elf32_avr_link_hash_table *htab;
1694 /* If 'shrinkable' is FALSE, do not shrink by deleting bytes while
1695 relaxing. Such shrinking can cause issues for the sections such
1696 as .vectors and .jumptables. Instead the unused bytes should be
1697 filled with nop instructions. */
1698 bfd_boolean shrinkable = TRUE;
1700 if (!strcmp (sec->name,".vectors")
1701 || !strcmp (sec->name,".jumptables"))
1702 shrinkable = FALSE;
1704 if (link_info->relocatable)
1705 (*link_info->callbacks->einfo)
1706 (_("%P%F: --relax and -r may not be used together\n"));
1708 htab = avr_link_hash_table (link_info);
1709 if (htab == NULL)
1710 return FALSE;
1712 /* Assume nothing changes. */
1713 *again = FALSE;
1715 if ((!htab->no_stubs) && (sec == htab->stub_sec))
1717 /* We are just relaxing the stub section.
1718 Let's calculate the size needed again. */
1719 bfd_size_type last_estimated_stub_section_size = htab->stub_sec->size;
1721 if (debug_relax)
1722 printf ("Relaxing the stub section. Size prior to this pass: %i\n",
1723 (int) last_estimated_stub_section_size);
1725 elf32_avr_size_stubs (htab->stub_sec->output_section->owner,
1726 link_info, FALSE);
1728 /* Check if the number of trampolines changed. */
1729 if (last_estimated_stub_section_size != htab->stub_sec->size)
1730 *again = TRUE;
1732 if (debug_relax)
1733 printf ("Size of stub section after this pass: %i\n",
1734 (int) htab->stub_sec->size);
1736 return TRUE;
1739 /* We don't have to do anything for a relocatable link, if
1740 this section does not have relocs, or if this is not a
1741 code section. */
1742 if (link_info->relocatable
1743 || (sec->flags & SEC_RELOC) == 0
1744 || sec->reloc_count == 0
1745 || (sec->flags & SEC_CODE) == 0)
1746 return TRUE;
1748 /* Check if the object file to relax uses internal symbols so that we
1749 could fix up the relocations. */
1750 if (!(elf_elfheader (abfd)->e_flags & EF_AVR_LINKRELAX_PREPARED))
1751 return TRUE;
1753 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1755 /* Get a copy of the native relocations. */
1756 internal_relocs = (_bfd_elf_link_read_relocs
1757 (abfd, sec, NULL, NULL, link_info->keep_memory));
1758 if (internal_relocs == NULL)
1759 goto error_return;
1761 /* Walk through the relocs looking for relaxing opportunities. */
1762 irelend = internal_relocs + sec->reloc_count;
1763 for (irel = internal_relocs; irel < irelend; irel++)
1765 bfd_vma symval;
1767 if ( ELF32_R_TYPE (irel->r_info) != R_AVR_13_PCREL
1768 && ELF32_R_TYPE (irel->r_info) != R_AVR_7_PCREL
1769 && ELF32_R_TYPE (irel->r_info) != R_AVR_CALL)
1770 continue;
1772 /* Get the section contents if we haven't done so already. */
1773 if (contents == NULL)
1775 /* Get cached copy if it exists. */
1776 if (elf_section_data (sec)->this_hdr.contents != NULL)
1777 contents = elf_section_data (sec)->this_hdr.contents;
1778 else
1780 /* Go get them off disk. */
1781 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
1782 goto error_return;
1786 /* Read this BFD's local symbols if we haven't done so already. */
1787 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1789 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1790 if (isymbuf == NULL)
1791 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1792 symtab_hdr->sh_info, 0,
1793 NULL, NULL, NULL);
1794 if (isymbuf == NULL)
1795 goto error_return;
1799 /* Get the value of the symbol referred to by the reloc. */
1800 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1802 /* A local symbol. */
1803 Elf_Internal_Sym *isym;
1804 asection *sym_sec;
1806 isym = isymbuf + ELF32_R_SYM (irel->r_info);
1807 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1808 symval = isym->st_value;
1809 /* If the reloc is absolute, it will not have
1810 a symbol or section associated with it. */
1811 if (sym_sec)
1812 symval += sym_sec->output_section->vma
1813 + sym_sec->output_offset;
1815 else
1817 unsigned long indx;
1818 struct elf_link_hash_entry *h;
1820 /* An external symbol. */
1821 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1822 h = elf_sym_hashes (abfd)[indx];
1823 BFD_ASSERT (h != NULL);
1824 if (h->root.type != bfd_link_hash_defined
1825 && h->root.type != bfd_link_hash_defweak)
1826 /* This appears to be a reference to an undefined
1827 symbol. Just ignore it--it will be caught by the
1828 regular reloc processing. */
1829 continue;
1831 symval = (h->root.u.def.value
1832 + h->root.u.def.section->output_section->vma
1833 + h->root.u.def.section->output_offset);
1836 /* For simplicity of coding, we are going to modify the section
1837 contents, the section relocs, and the BFD symbol table. We
1838 must tell the rest of the code not to free up this
1839 information. It would be possible to instead create a table
1840 of changes which have to be made, as is done in coff-mips.c;
1841 that would be more work, but would require less memory when
1842 the linker is run. */
1843 switch (ELF32_R_TYPE (irel->r_info))
1845 /* Try to turn a 22-bit absolute call/jump into an 13-bit
1846 pc-relative rcall/rjmp. */
1847 case R_AVR_CALL:
1849 bfd_vma value = symval + irel->r_addend;
1850 bfd_vma dot, gap;
1851 int distance_short_enough = 0;
1853 /* Get the address of this instruction. */
1854 dot = (sec->output_section->vma
1855 + sec->output_offset + irel->r_offset);
1857 /* Compute the distance from this insn to the branch target. */
1858 gap = value - dot;
1860 /* Check if the gap falls in the range that can be accommodated
1861 in 13bits signed (It is 12bits when encoded, as we deal with
1862 word addressing). */
1863 if (!shrinkable && ((int) gap >= -4096 && (int) gap <= 4095))
1864 distance_short_enough = 1;
1865 /* If shrinkable, then we can check for a range of distance which
1866 is two bytes farther on both the directions because the call
1867 or jump target will be closer by two bytes after the
1868 relaxation. */
1869 else if (shrinkable && ((int) gap >= -4094 && (int) gap <= 4097))
1870 distance_short_enough = 1;
1872 /* Here we handle the wrap-around case. E.g. for a 16k device
1873 we could use a rjmp to jump from address 0x100 to 0x3d00!
1874 In order to make this work properly, we need to fill the
1875 vaiable avr_pc_wrap_around with the appropriate value.
1876 I.e. 0x4000 for a 16k device. */
1878 /* Shrinking the code size makes the gaps larger in the
1879 case of wrap-arounds. So we use a heuristical safety
1880 margin to avoid that during relax the distance gets
1881 again too large for the short jumps. Let's assume
1882 a typical code-size reduction due to relax for a
1883 16k device of 600 bytes. So let's use twice the
1884 typical value as safety margin. */
1885 int rgap;
1886 int safety_margin;
1888 int assumed_shrink = 600;
1889 if (avr_pc_wrap_around > 0x4000)
1890 assumed_shrink = 900;
1892 safety_margin = 2 * assumed_shrink;
1894 rgap = avr_relative_distance_considering_wrap_around (gap);
1896 if (rgap >= (-4092 + safety_margin)
1897 && rgap <= (4094 - safety_margin))
1898 distance_short_enough = 1;
1901 if (distance_short_enough)
1903 unsigned char code_msb;
1904 unsigned char code_lsb;
1906 if (debug_relax)
1907 printf ("shrinking jump/call instruction at address 0x%x"
1908 " in section %s\n\n",
1909 (int) dot, sec->name);
1911 /* Note that we've changed the relocs, section contents,
1912 etc. */
1913 elf_section_data (sec)->relocs = internal_relocs;
1914 elf_section_data (sec)->this_hdr.contents = contents;
1915 symtab_hdr->contents = (unsigned char *) isymbuf;
1917 /* Get the instruction code for relaxing. */
1918 code_lsb = bfd_get_8 (abfd, contents + irel->r_offset);
1919 code_msb = bfd_get_8 (abfd, contents + irel->r_offset + 1);
1921 /* Mask out the relocation bits. */
1922 code_msb &= 0x94;
1923 code_lsb &= 0x0E;
1924 if (code_msb == 0x94 && code_lsb == 0x0E)
1926 /* we are changing call -> rcall . */
1927 bfd_put_8 (abfd, 0x00, contents + irel->r_offset);
1928 bfd_put_8 (abfd, 0xD0, contents + irel->r_offset + 1);
1930 else if (code_msb == 0x94 && code_lsb == 0x0C)
1932 /* we are changeing jump -> rjmp. */
1933 bfd_put_8 (abfd, 0x00, contents + irel->r_offset);
1934 bfd_put_8 (abfd, 0xC0, contents + irel->r_offset + 1);
1936 else
1937 abort ();
1939 /* Fix the relocation's type. */
1940 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1941 R_AVR_13_PCREL);
1943 /* We should not modify the ordering if 'shrinkable' is
1944 FALSE. */
1945 if (!shrinkable)
1947 /* Let's insert a nop. */
1948 bfd_put_8 (abfd, 0x00, contents + irel->r_offset + 2);
1949 bfd_put_8 (abfd, 0x00, contents + irel->r_offset + 3);
1951 else
1953 /* Delete two bytes of data. */
1954 if (!elf32_avr_relax_delete_bytes (abfd, sec,
1955 irel->r_offset + 2, 2))
1956 goto error_return;
1958 /* That will change things, so, we should relax again.
1959 Note that this is not required, and it may be slow. */
1960 *again = TRUE;
1965 default:
1967 unsigned char code_msb;
1968 unsigned char code_lsb;
1969 bfd_vma dot;
1971 code_msb = bfd_get_8 (abfd, contents + irel->r_offset + 1);
1972 code_lsb = bfd_get_8 (abfd, contents + irel->r_offset + 0);
1974 /* Get the address of this instruction. */
1975 dot = (sec->output_section->vma
1976 + sec->output_offset + irel->r_offset);
1978 /* Here we look for rcall/ret or call/ret sequences that could be
1979 safely replaced by rjmp/ret or jmp/ret. */
1980 if (((code_msb & 0xf0) == 0xd0)
1981 && avr_replace_call_ret_sequences)
1983 /* This insn is a rcall. */
1984 unsigned char next_insn_msb = 0;
1985 unsigned char next_insn_lsb = 0;
1987 if (irel->r_offset + 3 < sec->size)
1989 next_insn_msb =
1990 bfd_get_8 (abfd, contents + irel->r_offset + 3);
1991 next_insn_lsb =
1992 bfd_get_8 (abfd, contents + irel->r_offset + 2);
1995 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
1997 /* The next insn is a ret. We now convert the rcall insn
1998 into a rjmp instruction. */
1999 code_msb &= 0xef;
2000 bfd_put_8 (abfd, code_msb, contents + irel->r_offset + 1);
2001 if (debug_relax)
2002 printf ("converted rcall/ret sequence at address 0x%x"
2003 " into rjmp/ret sequence. Section is %s\n\n",
2004 (int) dot, sec->name);
2005 *again = TRUE;
2006 break;
2009 else if ((0x94 == (code_msb & 0xfe))
2010 && (0x0e == (code_lsb & 0x0e))
2011 && avr_replace_call_ret_sequences)
2013 /* This insn is a call. */
2014 unsigned char next_insn_msb = 0;
2015 unsigned char next_insn_lsb = 0;
2017 if (irel->r_offset + 5 < sec->size)
2019 next_insn_msb =
2020 bfd_get_8 (abfd, contents + irel->r_offset + 5);
2021 next_insn_lsb =
2022 bfd_get_8 (abfd, contents + irel->r_offset + 4);
2025 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2027 /* The next insn is a ret. We now convert the call insn
2028 into a jmp instruction. */
2030 code_lsb &= 0xfd;
2031 bfd_put_8 (abfd, code_lsb, contents + irel->r_offset);
2032 if (debug_relax)
2033 printf ("converted call/ret sequence at address 0x%x"
2034 " into jmp/ret sequence. Section is %s\n\n",
2035 (int) dot, sec->name);
2036 *again = TRUE;
2037 break;
2040 else if ((0xc0 == (code_msb & 0xf0))
2041 || ((0x94 == (code_msb & 0xfe))
2042 && (0x0c == (code_lsb & 0x0e))))
2044 /* This insn is a rjmp or a jmp. */
2045 unsigned char next_insn_msb = 0;
2046 unsigned char next_insn_lsb = 0;
2047 int insn_size;
2049 if (0xc0 == (code_msb & 0xf0))
2050 insn_size = 2; /* rjmp insn */
2051 else
2052 insn_size = 4; /* jmp insn */
2054 if (irel->r_offset + insn_size + 1 < sec->size)
2056 next_insn_msb =
2057 bfd_get_8 (abfd, contents + irel->r_offset
2058 + insn_size + 1);
2059 next_insn_lsb =
2060 bfd_get_8 (abfd, contents + irel->r_offset
2061 + insn_size);
2064 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2066 /* The next insn is a ret. We possibly could delete
2067 this ret. First we need to check for preceding
2068 sbis/sbic/sbrs or cpse "skip" instructions. */
2070 int there_is_preceding_non_skip_insn = 1;
2071 bfd_vma address_of_ret;
2073 address_of_ret = dot + insn_size;
2075 if (debug_relax && (insn_size == 2))
2076 printf ("found rjmp / ret sequence at address 0x%x\n",
2077 (int) dot);
2078 if (debug_relax && (insn_size == 4))
2079 printf ("found jmp / ret sequence at address 0x%x\n",
2080 (int) dot);
2082 /* We have to make sure that there is a preceding insn. */
2083 if (irel->r_offset >= 2)
2085 unsigned char preceding_msb;
2086 unsigned char preceding_lsb;
2088 preceding_msb =
2089 bfd_get_8 (abfd, contents + irel->r_offset - 1);
2090 preceding_lsb =
2091 bfd_get_8 (abfd, contents + irel->r_offset - 2);
2093 /* sbic. */
2094 if (0x99 == preceding_msb)
2095 there_is_preceding_non_skip_insn = 0;
2097 /* sbis. */
2098 if (0x9b == preceding_msb)
2099 there_is_preceding_non_skip_insn = 0;
2101 /* sbrc */
2102 if ((0xfc == (preceding_msb & 0xfe)
2103 && (0x00 == (preceding_lsb & 0x08))))
2104 there_is_preceding_non_skip_insn = 0;
2106 /* sbrs */
2107 if ((0xfe == (preceding_msb & 0xfe)
2108 && (0x00 == (preceding_lsb & 0x08))))
2109 there_is_preceding_non_skip_insn = 0;
2111 /* cpse */
2112 if (0x10 == (preceding_msb & 0xfc))
2113 there_is_preceding_non_skip_insn = 0;
2115 if (there_is_preceding_non_skip_insn == 0)
2116 if (debug_relax)
2117 printf ("preceding skip insn prevents deletion of"
2118 " ret insn at Addy 0x%x in section %s\n",
2119 (int) dot + 2, sec->name);
2121 else
2123 /* There is no previous instruction. */
2124 there_is_preceding_non_skip_insn = 0;
2127 if (there_is_preceding_non_skip_insn)
2129 /* We now only have to make sure that there is no
2130 local label defined at the address of the ret
2131 instruction and that there is no local relocation
2132 in this section pointing to the ret. */
2134 int deleting_ret_is_safe = 1;
2135 unsigned int section_offset_of_ret_insn =
2136 irel->r_offset + insn_size;
2137 Elf_Internal_Sym *isym, *isymend;
2138 unsigned int sec_shndx;
2139 struct bfd_section *isec;
2141 sec_shndx =
2142 _bfd_elf_section_from_bfd_section (abfd, sec);
2144 /* Check for local symbols. */
2145 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
2146 isymend = isym + symtab_hdr->sh_info;
2147 /* PR 6019: There may not be any local symbols. */
2148 for (; isym != NULL && isym < isymend; isym++)
2150 if (isym->st_value == section_offset_of_ret_insn
2151 && isym->st_shndx == sec_shndx)
2153 deleting_ret_is_safe = 0;
2154 if (debug_relax)
2155 printf ("local label prevents deletion of ret "
2156 "insn at address 0x%x\n",
2157 (int) dot + insn_size);
2161 /* Now check for global symbols. */
2163 int symcount;
2164 struct elf_link_hash_entry **sym_hashes;
2165 struct elf_link_hash_entry **end_hashes;
2167 symcount = (symtab_hdr->sh_size
2168 / sizeof (Elf32_External_Sym)
2169 - symtab_hdr->sh_info);
2170 sym_hashes = elf_sym_hashes (abfd);
2171 end_hashes = sym_hashes + symcount;
2172 for (; sym_hashes < end_hashes; sym_hashes++)
2174 struct elf_link_hash_entry *sym_hash =
2175 *sym_hashes;
2176 if ((sym_hash->root.type == bfd_link_hash_defined
2177 || sym_hash->root.type ==
2178 bfd_link_hash_defweak)
2179 && sym_hash->root.u.def.section == sec
2180 && sym_hash->root.u.def.value == section_offset_of_ret_insn)
2182 deleting_ret_is_safe = 0;
2183 if (debug_relax)
2184 printf ("global label prevents deletion of "
2185 "ret insn at address 0x%x\n",
2186 (int) dot + insn_size);
2191 /* Now we check for relocations pointing to ret. */
2192 for (isec = abfd->sections; isec && deleting_ret_is_safe; isec = isec->next)
2194 Elf_Internal_Rela *rel;
2195 Elf_Internal_Rela *relend;
2197 rel = elf_section_data (isec)->relocs;
2198 if (rel == NULL)
2199 rel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, TRUE);
2201 relend = rel + isec->reloc_count;
2203 for (; rel && rel < relend; rel++)
2205 bfd_vma reloc_target = 0;
2207 /* Read this BFD's local symbols if we haven't
2208 done so already. */
2209 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2211 isymbuf = (Elf_Internal_Sym *)
2212 symtab_hdr->contents;
2213 if (isymbuf == NULL)
2214 isymbuf = bfd_elf_get_elf_syms
2215 (abfd,
2216 symtab_hdr,
2217 symtab_hdr->sh_info, 0,
2218 NULL, NULL, NULL);
2219 if (isymbuf == NULL)
2220 break;
2223 /* Get the value of the symbol referred to
2224 by the reloc. */
2225 if (ELF32_R_SYM (rel->r_info)
2226 < symtab_hdr->sh_info)
2228 /* A local symbol. */
2229 asection *sym_sec;
2231 isym = isymbuf
2232 + ELF32_R_SYM (rel->r_info);
2233 sym_sec = bfd_section_from_elf_index
2234 (abfd, isym->st_shndx);
2235 symval = isym->st_value;
2237 /* If the reloc is absolute, it will not
2238 have a symbol or section associated
2239 with it. */
2241 if (sym_sec)
2243 symval +=
2244 sym_sec->output_section->vma
2245 + sym_sec->output_offset;
2246 reloc_target = symval + rel->r_addend;
2248 else
2250 reloc_target = symval + rel->r_addend;
2251 /* Reference symbol is absolute. */
2254 /* else ... reference symbol is extern. */
2256 if (address_of_ret == reloc_target)
2258 deleting_ret_is_safe = 0;
2259 if (debug_relax)
2260 printf ("ret from "
2261 "rjmp/jmp ret sequence at address"
2262 " 0x%x could not be deleted. ret"
2263 " is target of a relocation.\n",
2264 (int) address_of_ret);
2265 break;
2270 if (deleting_ret_is_safe)
2272 if (debug_relax)
2273 printf ("unreachable ret instruction "
2274 "at address 0x%x deleted.\n",
2275 (int) dot + insn_size);
2277 /* Delete two bytes of data. */
2278 if (!elf32_avr_relax_delete_bytes (abfd, sec,
2279 irel->r_offset + insn_size, 2))
2280 goto error_return;
2282 /* That will change things, so, we should relax
2283 again. Note that this is not required, and it
2284 may be slow. */
2285 *again = TRUE;
2286 break;
2291 break;
2296 if (contents != NULL
2297 && elf_section_data (sec)->this_hdr.contents != contents)
2299 if (! link_info->keep_memory)
2300 free (contents);
2301 else
2303 /* Cache the section contents for elf_link_input_bfd. */
2304 elf_section_data (sec)->this_hdr.contents = contents;
2308 if (internal_relocs != NULL
2309 && elf_section_data (sec)->relocs != internal_relocs)
2310 free (internal_relocs);
2312 return TRUE;
2314 error_return:
2315 if (isymbuf != NULL
2316 && symtab_hdr->contents != (unsigned char *) isymbuf)
2317 free (isymbuf);
2318 if (contents != NULL
2319 && elf_section_data (sec)->this_hdr.contents != contents)
2320 free (contents);
2321 if (internal_relocs != NULL
2322 && elf_section_data (sec)->relocs != internal_relocs)
2323 free (internal_relocs);
2325 return FALSE;
2328 /* This is a version of bfd_generic_get_relocated_section_contents
2329 which uses elf32_avr_relocate_section.
2331 For avr it's essentially a cut and paste taken from the H8300 port.
2332 The author of the relaxation support patch for avr had absolutely no
2333 clue what is happening here but found out that this part of the code
2334 seems to be important. */
2336 static bfd_byte *
2337 elf32_avr_get_relocated_section_contents (bfd *output_bfd,
2338 struct bfd_link_info *link_info,
2339 struct bfd_link_order *link_order,
2340 bfd_byte *data,
2341 bfd_boolean relocatable,
2342 asymbol **symbols)
2344 Elf_Internal_Shdr *symtab_hdr;
2345 asection *input_section = link_order->u.indirect.section;
2346 bfd *input_bfd = input_section->owner;
2347 asection **sections = NULL;
2348 Elf_Internal_Rela *internal_relocs = NULL;
2349 Elf_Internal_Sym *isymbuf = NULL;
2351 /* We only need to handle the case of relaxing, or of having a
2352 particular set of section contents, specially. */
2353 if (relocatable
2354 || elf_section_data (input_section)->this_hdr.contents == NULL)
2355 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
2356 link_order, data,
2357 relocatable,
2358 symbols);
2359 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2361 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
2362 (size_t) input_section->size);
2364 if ((input_section->flags & SEC_RELOC) != 0
2365 && input_section->reloc_count > 0)
2367 asection **secpp;
2368 Elf_Internal_Sym *isym, *isymend;
2369 bfd_size_type amt;
2371 internal_relocs = (_bfd_elf_link_read_relocs
2372 (input_bfd, input_section, NULL, NULL, FALSE));
2373 if (internal_relocs == NULL)
2374 goto error_return;
2376 if (symtab_hdr->sh_info != 0)
2378 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2379 if (isymbuf == NULL)
2380 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2381 symtab_hdr->sh_info, 0,
2382 NULL, NULL, NULL);
2383 if (isymbuf == NULL)
2384 goto error_return;
2387 amt = symtab_hdr->sh_info;
2388 amt *= sizeof (asection *);
2389 sections = bfd_malloc (amt);
2390 if (sections == NULL && amt != 0)
2391 goto error_return;
2393 isymend = isymbuf + symtab_hdr->sh_info;
2394 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
2396 asection *isec;
2398 if (isym->st_shndx == SHN_UNDEF)
2399 isec = bfd_und_section_ptr;
2400 else if (isym->st_shndx == SHN_ABS)
2401 isec = bfd_abs_section_ptr;
2402 else if (isym->st_shndx == SHN_COMMON)
2403 isec = bfd_com_section_ptr;
2404 else
2405 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
2407 *secpp = isec;
2410 if (! elf32_avr_relocate_section (output_bfd, link_info, input_bfd,
2411 input_section, data, internal_relocs,
2412 isymbuf, sections))
2413 goto error_return;
2415 if (sections != NULL)
2416 free (sections);
2417 if (isymbuf != NULL
2418 && symtab_hdr->contents != (unsigned char *) isymbuf)
2419 free (isymbuf);
2420 if (elf_section_data (input_section)->relocs != internal_relocs)
2421 free (internal_relocs);
2424 return data;
2426 error_return:
2427 if (sections != NULL)
2428 free (sections);
2429 if (isymbuf != NULL
2430 && symtab_hdr->contents != (unsigned char *) isymbuf)
2431 free (isymbuf);
2432 if (internal_relocs != NULL
2433 && elf_section_data (input_section)->relocs != internal_relocs)
2434 free (internal_relocs);
2435 return NULL;
2439 /* Determines the hash entry name for a particular reloc. It consists of
2440 the identifier of the symbol section and the added reloc addend and
2441 symbol offset relative to the section the symbol is attached to. */
2443 static char *
2444 avr_stub_name (const asection *symbol_section,
2445 const bfd_vma symbol_offset,
2446 const Elf_Internal_Rela *rela)
2448 char *stub_name;
2449 bfd_size_type len;
2451 len = 8 + 1 + 8 + 1 + 1;
2452 stub_name = bfd_malloc (len);
2454 sprintf (stub_name, "%08x+%08x",
2455 symbol_section->id & 0xffffffff,
2456 (unsigned int) ((rela->r_addend & 0xffffffff) + symbol_offset));
2458 return stub_name;
2462 /* Add a new stub entry to the stub hash. Not all fields of the new
2463 stub entry are initialised. */
2465 static struct elf32_avr_stub_hash_entry *
2466 avr_add_stub (const char *stub_name,
2467 struct elf32_avr_link_hash_table *htab)
2469 struct elf32_avr_stub_hash_entry *hsh;
2471 /* Enter this entry into the linker stub hash table. */
2472 hsh = avr_stub_hash_lookup (&htab->bstab, stub_name, TRUE, FALSE);
2474 if (hsh == NULL)
2476 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
2477 NULL, stub_name);
2478 return NULL;
2481 hsh->stub_offset = 0;
2482 return hsh;
2485 /* We assume that there is already space allocated for the stub section
2486 contents and that before building the stubs the section size is
2487 initialized to 0. We assume that within the stub hash table entry,
2488 the absolute position of the jmp target has been written in the
2489 target_value field. We write here the offset of the generated jmp insn
2490 relative to the trampoline section start to the stub_offset entry in
2491 the stub hash table entry. */
2493 static bfd_boolean
2494 avr_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
2496 struct elf32_avr_stub_hash_entry *hsh;
2497 struct bfd_link_info *info;
2498 struct elf32_avr_link_hash_table *htab;
2499 bfd *stub_bfd;
2500 bfd_byte *loc;
2501 bfd_vma target;
2502 bfd_vma starget;
2504 /* Basic opcode */
2505 bfd_vma jmp_insn = 0x0000940c;
2507 /* Massage our args to the form they really have. */
2508 hsh = avr_stub_hash_entry (bh);
2510 if (!hsh->is_actually_needed)
2511 return TRUE;
2513 info = (struct bfd_link_info *) in_arg;
2515 htab = avr_link_hash_table (info);
2516 if (htab == NULL)
2517 return FALSE;
2519 target = hsh->target_value;
2521 /* Make a note of the offset within the stubs for this entry. */
2522 hsh->stub_offset = htab->stub_sec->size;
2523 loc = htab->stub_sec->contents + hsh->stub_offset;
2525 stub_bfd = htab->stub_sec->owner;
2527 if (debug_stubs)
2528 printf ("Building one Stub. Address: 0x%x, Offset: 0x%x\n",
2529 (unsigned int) target,
2530 (unsigned int) hsh->stub_offset);
2532 /* We now have to add the information on the jump target to the bare
2533 opcode bits already set in jmp_insn. */
2535 /* Check for the alignment of the address. */
2536 if (target & 1)
2537 return FALSE;
2539 starget = target >> 1;
2540 jmp_insn |= ((starget & 0x10000) | ((starget << 3) & 0x1f00000)) >> 16;
2541 bfd_put_16 (stub_bfd, jmp_insn, loc);
2542 bfd_put_16 (stub_bfd, (bfd_vma) starget & 0xffff, loc + 2);
2544 htab->stub_sec->size += 4;
2546 /* Now add the entries in the address mapping table if there is still
2547 space left. */
2549 unsigned int nr;
2551 nr = htab->amt_entry_cnt + 1;
2552 if (nr <= htab->amt_max_entry_cnt)
2554 htab->amt_entry_cnt = nr;
2556 htab->amt_stub_offsets[nr - 1] = hsh->stub_offset;
2557 htab->amt_destination_addr[nr - 1] = target;
2561 return TRUE;
2564 static bfd_boolean
2565 avr_mark_stub_not_to_be_necessary (struct bfd_hash_entry *bh,
2566 void *in_arg ATTRIBUTE_UNUSED)
2568 struct elf32_avr_stub_hash_entry *hsh;
2570 hsh = avr_stub_hash_entry (bh);
2571 hsh->is_actually_needed = FALSE;
2573 return TRUE;
2576 static bfd_boolean
2577 avr_size_one_stub (struct bfd_hash_entry *bh, void *in_arg)
2579 struct elf32_avr_stub_hash_entry *hsh;
2580 struct elf32_avr_link_hash_table *htab;
2581 int size;
2583 /* Massage our args to the form they really have. */
2584 hsh = avr_stub_hash_entry (bh);
2585 htab = in_arg;
2587 if (hsh->is_actually_needed)
2588 size = 4;
2589 else
2590 size = 0;
2592 htab->stub_sec->size += size;
2593 return TRUE;
2596 void
2597 elf32_avr_setup_params (struct bfd_link_info *info,
2598 bfd *avr_stub_bfd,
2599 asection *avr_stub_section,
2600 bfd_boolean no_stubs,
2601 bfd_boolean deb_stubs,
2602 bfd_boolean deb_relax,
2603 bfd_vma pc_wrap_around,
2604 bfd_boolean call_ret_replacement)
2606 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2608 if (htab == NULL)
2609 return;
2610 htab->stub_sec = avr_stub_section;
2611 htab->stub_bfd = avr_stub_bfd;
2612 htab->no_stubs = no_stubs;
2614 debug_relax = deb_relax;
2615 debug_stubs = deb_stubs;
2616 avr_pc_wrap_around = pc_wrap_around;
2617 avr_replace_call_ret_sequences = call_ret_replacement;
2621 /* Set up various things so that we can make a list of input sections
2622 for each output section included in the link. Returns -1 on error,
2623 0 when no stubs will be needed, and 1 on success. It also sets
2624 information on the stubs bfd and the stub section in the info
2625 struct. */
2628 elf32_avr_setup_section_lists (bfd *output_bfd,
2629 struct bfd_link_info *info)
2631 bfd *input_bfd;
2632 unsigned int bfd_count;
2633 int top_id, top_index;
2634 asection *section;
2635 asection **input_list, **list;
2636 bfd_size_type amt;
2637 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2639 if (htab == NULL || htab->no_stubs)
2640 return 0;
2642 /* Count the number of input BFDs and find the top input section id. */
2643 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2644 input_bfd != NULL;
2645 input_bfd = input_bfd->link_next)
2647 bfd_count += 1;
2648 for (section = input_bfd->sections;
2649 section != NULL;
2650 section = section->next)
2651 if (top_id < section->id)
2652 top_id = section->id;
2655 htab->bfd_count = bfd_count;
2657 /* We can't use output_bfd->section_count here to find the top output
2658 section index as some sections may have been removed, and
2659 strip_excluded_output_sections doesn't renumber the indices. */
2660 for (section = output_bfd->sections, top_index = 0;
2661 section != NULL;
2662 section = section->next)
2663 if (top_index < section->index)
2664 top_index = section->index;
2666 htab->top_index = top_index;
2667 amt = sizeof (asection *) * (top_index + 1);
2668 input_list = bfd_malloc (amt);
2669 htab->input_list = input_list;
2670 if (input_list == NULL)
2671 return -1;
2673 /* For sections we aren't interested in, mark their entries with a
2674 value we can check later. */
2675 list = input_list + top_index;
2677 *list = bfd_abs_section_ptr;
2678 while (list-- != input_list);
2680 for (section = output_bfd->sections;
2681 section != NULL;
2682 section = section->next)
2683 if ((section->flags & SEC_CODE) != 0)
2684 input_list[section->index] = NULL;
2686 return 1;
2690 /* Read in all local syms for all input bfds, and create hash entries
2691 for export stubs if we are building a multi-subspace shared lib.
2692 Returns -1 on error, 0 otherwise. */
2694 static int
2695 get_local_syms (bfd *input_bfd, struct bfd_link_info *info)
2697 unsigned int bfd_indx;
2698 Elf_Internal_Sym *local_syms, **all_local_syms;
2699 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2700 bfd_size_type amt;
2702 if (htab == NULL)
2703 return -1;
2705 /* We want to read in symbol extension records only once. To do this
2706 we need to read in the local symbols in parallel and save them for
2707 later use; so hold pointers to the local symbols in an array. */
2708 amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2709 all_local_syms = bfd_zmalloc (amt);
2710 htab->all_local_syms = all_local_syms;
2711 if (all_local_syms == NULL)
2712 return -1;
2714 /* Walk over all the input BFDs, swapping in local symbols.
2715 If we are creating a shared library, create hash entries for the
2716 export stubs. */
2717 for (bfd_indx = 0;
2718 input_bfd != NULL;
2719 input_bfd = input_bfd->link_next, bfd_indx++)
2721 Elf_Internal_Shdr *symtab_hdr;
2723 /* We'll need the symbol table in a second. */
2724 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2725 if (symtab_hdr->sh_info == 0)
2726 continue;
2728 /* We need an array of the local symbols attached to the input bfd. */
2729 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2730 if (local_syms == NULL)
2732 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2733 symtab_hdr->sh_info, 0,
2734 NULL, NULL, NULL);
2735 /* Cache them for elf_link_input_bfd. */
2736 symtab_hdr->contents = (unsigned char *) local_syms;
2738 if (local_syms == NULL)
2739 return -1;
2741 all_local_syms[bfd_indx] = local_syms;
2744 return 0;
2747 #define ADD_DUMMY_STUBS_FOR_DEBUGGING 0
2749 bfd_boolean
2750 elf32_avr_size_stubs (bfd *output_bfd,
2751 struct bfd_link_info *info,
2752 bfd_boolean is_prealloc_run)
2754 struct elf32_avr_link_hash_table *htab;
2755 int stub_changed = 0;
2757 htab = avr_link_hash_table (info);
2758 if (htab == NULL)
2759 return FALSE;
2761 /* At this point we initialize htab->vector_base
2762 To the start of the text output section. */
2763 htab->vector_base = htab->stub_sec->output_section->vma;
2765 if (get_local_syms (info->input_bfds, info))
2767 if (htab->all_local_syms)
2768 goto error_ret_free_local;
2769 return FALSE;
2772 if (ADD_DUMMY_STUBS_FOR_DEBUGGING)
2774 struct elf32_avr_stub_hash_entry *test;
2776 test = avr_add_stub ("Hugo",htab);
2777 test->target_value = 0x123456;
2778 test->stub_offset = 13;
2780 test = avr_add_stub ("Hugo2",htab);
2781 test->target_value = 0x84210;
2782 test->stub_offset = 14;
2785 while (1)
2787 bfd *input_bfd;
2788 unsigned int bfd_indx;
2790 /* We will have to re-generate the stub hash table each time anything
2791 in memory has changed. */
2793 bfd_hash_traverse (&htab->bstab, avr_mark_stub_not_to_be_necessary, htab);
2794 for (input_bfd = info->input_bfds, bfd_indx = 0;
2795 input_bfd != NULL;
2796 input_bfd = input_bfd->link_next, bfd_indx++)
2798 Elf_Internal_Shdr *symtab_hdr;
2799 asection *section;
2800 Elf_Internal_Sym *local_syms;
2802 /* We'll need the symbol table in a second. */
2803 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2804 if (symtab_hdr->sh_info == 0)
2805 continue;
2807 local_syms = htab->all_local_syms[bfd_indx];
2809 /* Walk over each section attached to the input bfd. */
2810 for (section = input_bfd->sections;
2811 section != NULL;
2812 section = section->next)
2814 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2816 /* If there aren't any relocs, then there's nothing more
2817 to do. */
2818 if ((section->flags & SEC_RELOC) == 0
2819 || section->reloc_count == 0)
2820 continue;
2822 /* If this section is a link-once section that will be
2823 discarded, then don't create any stubs. */
2824 if (section->output_section == NULL
2825 || section->output_section->owner != output_bfd)
2826 continue;
2828 /* Get the relocs. */
2829 internal_relocs
2830 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2831 info->keep_memory);
2832 if (internal_relocs == NULL)
2833 goto error_ret_free_local;
2835 /* Now examine each relocation. */
2836 irela = internal_relocs;
2837 irelaend = irela + section->reloc_count;
2838 for (; irela < irelaend; irela++)
2840 unsigned int r_type, r_indx;
2841 struct elf32_avr_stub_hash_entry *hsh;
2842 asection *sym_sec;
2843 bfd_vma sym_value;
2844 bfd_vma destination;
2845 struct elf_link_hash_entry *hh;
2846 char *stub_name;
2848 r_type = ELF32_R_TYPE (irela->r_info);
2849 r_indx = ELF32_R_SYM (irela->r_info);
2851 /* Only look for 16 bit GS relocs. No other reloc will need a
2852 stub. */
2853 if (!((r_type == R_AVR_16_PM)
2854 || (r_type == R_AVR_LO8_LDI_GS)
2855 || (r_type == R_AVR_HI8_LDI_GS)))
2856 continue;
2858 /* Now determine the call target, its name, value,
2859 section. */
2860 sym_sec = NULL;
2861 sym_value = 0;
2862 destination = 0;
2863 hh = NULL;
2864 if (r_indx < symtab_hdr->sh_info)
2866 /* It's a local symbol. */
2867 Elf_Internal_Sym *sym;
2868 Elf_Internal_Shdr *hdr;
2869 unsigned int shndx;
2871 sym = local_syms + r_indx;
2872 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2873 sym_value = sym->st_value;
2874 shndx = sym->st_shndx;
2875 if (shndx < elf_numsections (input_bfd))
2877 hdr = elf_elfsections (input_bfd)[shndx];
2878 sym_sec = hdr->bfd_section;
2879 destination = (sym_value + irela->r_addend
2880 + sym_sec->output_offset
2881 + sym_sec->output_section->vma);
2884 else
2886 /* It's an external symbol. */
2887 int e_indx;
2889 e_indx = r_indx - symtab_hdr->sh_info;
2890 hh = elf_sym_hashes (input_bfd)[e_indx];
2892 while (hh->root.type == bfd_link_hash_indirect
2893 || hh->root.type == bfd_link_hash_warning)
2894 hh = (struct elf_link_hash_entry *)
2895 (hh->root.u.i.link);
2897 if (hh->root.type == bfd_link_hash_defined
2898 || hh->root.type == bfd_link_hash_defweak)
2900 sym_sec = hh->root.u.def.section;
2901 sym_value = hh->root.u.def.value;
2902 if (sym_sec->output_section != NULL)
2903 destination = (sym_value + irela->r_addend
2904 + sym_sec->output_offset
2905 + sym_sec->output_section->vma);
2907 else if (hh->root.type == bfd_link_hash_undefweak)
2909 if (! info->shared)
2910 continue;
2912 else if (hh->root.type == bfd_link_hash_undefined)
2914 if (! (info->unresolved_syms_in_objects == RM_IGNORE
2915 && (ELF_ST_VISIBILITY (hh->other)
2916 == STV_DEFAULT)))
2917 continue;
2919 else
2921 bfd_set_error (bfd_error_bad_value);
2923 error_ret_free_internal:
2924 if (elf_section_data (section)->relocs == NULL)
2925 free (internal_relocs);
2926 goto error_ret_free_local;
2930 if (! avr_stub_is_required_for_16_bit_reloc
2931 (destination - htab->vector_base))
2933 if (!is_prealloc_run)
2934 /* We are having a reloc that does't need a stub. */
2935 continue;
2937 /* We don't right now know if a stub will be needed.
2938 Let's rather be on the safe side. */
2941 /* Get the name of this stub. */
2942 stub_name = avr_stub_name (sym_sec, sym_value, irela);
2944 if (!stub_name)
2945 goto error_ret_free_internal;
2948 hsh = avr_stub_hash_lookup (&htab->bstab,
2949 stub_name,
2950 FALSE, FALSE);
2951 if (hsh != NULL)
2953 /* The proper stub has already been created. Mark it
2954 to be used and write the possibly changed destination
2955 value. */
2956 hsh->is_actually_needed = TRUE;
2957 hsh->target_value = destination;
2958 free (stub_name);
2959 continue;
2962 hsh = avr_add_stub (stub_name, htab);
2963 if (hsh == NULL)
2965 free (stub_name);
2966 goto error_ret_free_internal;
2969 hsh->is_actually_needed = TRUE;
2970 hsh->target_value = destination;
2972 if (debug_stubs)
2973 printf ("Adding stub with destination 0x%x to the"
2974 " hash table.\n", (unsigned int) destination);
2975 if (debug_stubs)
2976 printf ("(Pre-Alloc run: %i)\n", is_prealloc_run);
2978 stub_changed = TRUE;
2981 /* We're done with the internal relocs, free them. */
2982 if (elf_section_data (section)->relocs == NULL)
2983 free (internal_relocs);
2987 /* Re-Calculate the number of needed stubs. */
2988 htab->stub_sec->size = 0;
2989 bfd_hash_traverse (&htab->bstab, avr_size_one_stub, htab);
2991 if (!stub_changed)
2992 break;
2994 stub_changed = FALSE;
2997 free (htab->all_local_syms);
2998 return TRUE;
3000 error_ret_free_local:
3001 free (htab->all_local_syms);
3002 return FALSE;
3006 /* Build all the stubs associated with the current output file. The
3007 stubs are kept in a hash table attached to the main linker hash
3008 table. We also set up the .plt entries for statically linked PIC
3009 functions here. This function is called via hppaelf_finish in the
3010 linker. */
3012 bfd_boolean
3013 elf32_avr_build_stubs (struct bfd_link_info *info)
3015 asection *stub_sec;
3016 struct bfd_hash_table *table;
3017 struct elf32_avr_link_hash_table *htab;
3018 bfd_size_type total_size = 0;
3020 htab = avr_link_hash_table (info);
3021 if (htab == NULL)
3022 return FALSE;
3024 /* In case that there were several stub sections: */
3025 for (stub_sec = htab->stub_bfd->sections;
3026 stub_sec != NULL;
3027 stub_sec = stub_sec->next)
3029 bfd_size_type size;
3031 /* Allocate memory to hold the linker stubs. */
3032 size = stub_sec->size;
3033 total_size += size;
3035 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3036 if (stub_sec->contents == NULL && size != 0)
3037 return FALSE;
3038 stub_sec->size = 0;
3041 /* Allocate memory for the adress mapping table. */
3042 htab->amt_entry_cnt = 0;
3043 htab->amt_max_entry_cnt = total_size / 4;
3044 htab->amt_stub_offsets = bfd_malloc (sizeof (bfd_vma)
3045 * htab->amt_max_entry_cnt);
3046 htab->amt_destination_addr = bfd_malloc (sizeof (bfd_vma)
3047 * htab->amt_max_entry_cnt );
3049 if (debug_stubs)
3050 printf ("Allocating %i entries in the AMT\n", htab->amt_max_entry_cnt);
3052 /* Build the stubs as directed by the stub hash table. */
3053 table = &htab->bstab;
3054 bfd_hash_traverse (table, avr_build_one_stub, info);
3056 if (debug_stubs)
3057 printf ("Final Stub section Size: %i\n", (int) htab->stub_sec->size);
3059 return TRUE;
3062 #define ELF_ARCH bfd_arch_avr
3063 #define ELF_TARGET_ID AVR_ELF_DATA
3064 #define ELF_MACHINE_CODE EM_AVR
3065 #define ELF_MACHINE_ALT1 EM_AVR_OLD
3066 #define ELF_MAXPAGESIZE 1
3068 #define TARGET_LITTLE_SYM bfd_elf32_avr_vec
3069 #define TARGET_LITTLE_NAME "elf32-avr"
3071 #define bfd_elf32_bfd_link_hash_table_create elf32_avr_link_hash_table_create
3072 #define bfd_elf32_bfd_link_hash_table_free elf32_avr_link_hash_table_free
3074 #define elf_info_to_howto avr_info_to_howto_rela
3075 #define elf_info_to_howto_rel NULL
3076 #define elf_backend_relocate_section elf32_avr_relocate_section
3077 #define elf_backend_can_gc_sections 1
3078 #define elf_backend_rela_normal 1
3079 #define elf_backend_final_write_processing \
3080 bfd_elf_avr_final_write_processing
3081 #define elf_backend_object_p elf32_avr_object_p
3083 #define bfd_elf32_bfd_relax_section elf32_avr_relax_section
3084 #define bfd_elf32_bfd_get_relocated_section_contents \
3085 elf32_avr_get_relocated_section_contents
3087 #include "elf32-target.h"